@harmolody/ui 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harmolody-ui.mjs","names":[],"sources":["../../../projects/ui/src/lib/form-builder/services/options-loader.service.ts","../../../projects/ui/src/lib/form-builder/services/form-builder.service.ts","../../../projects/ui/src/lib/form-builder/services/field-resolver.service.ts","../../../projects/ui/src/lib/forms/form-helper/form-helper.ts","../../../projects/ui/src/lib/icon/icons.ts","../../../projects/ui/src/lib/config/ui-config.ts","../../../projects/ui/src/lib/icon/icon.ts","../../../projects/ui/src/lib/config/ui-localization.ts","../../../projects/ui/src/lib/form-builder/components/form-array-field/form-array-item.ts","../../../projects/ui/src/lib/form-builder/components/form-array-field/form-array-field.ts","../../../projects/ui/src/lib/form-builder/components/form-array-field/form-array-field.html","../../../projects/ui/src/lib/forms/utils/form-control-classes.ts","../../../projects/ui/src/lib/forms/autocomplete/autocomplete.ts","../../../projects/ui/src/lib/forms/autocomplete/autocomplete.html","../../../projects/ui/src/lib/forms/checkbox/checkbox.ts","../../../projects/ui/src/lib/forms/choice-chips/choice-chips.ts","../../../projects/ui/src/lib/forms/choice-chips/choice-chips.html","../../../projects/ui/src/lib/forms/date-input/date-input.ts","../../../projects/ui/src/lib/forms/email-input/email-input.ts","../../../projects/ui/src/lib/forms/file-input/file-input.ts","../../../projects/ui/src/lib/forms/form-description/form-description.ts","../../../projects/ui/src/lib/forms/form-error/form-error.ts","../../../projects/ui/src/lib/forms/form-hint/form-hint.ts","../../../projects/ui/src/lib/forms/form-label/form-label.ts","../../../projects/ui/src/lib/forms/form-note/form-note.ts","../../../projects/ui/src/lib/forms/utils/form-errors.ts","../../../projects/ui/src/lib/forms/form-field/form-field.ts","../../../projects/ui/src/lib/forms/form-field/form-field.html","../../../projects/ui/src/lib/forms/image-selector-input/image-selector-input.ts","../../../projects/ui/src/lib/forms/input/input.ts","../../../projects/ui/src/lib/forms/number-input/number-input.ts","../../../projects/ui/src/lib/forms/password-input/password-input.ts","../../../projects/ui/src/lib/forms/radio-group/radio-group.ts","../../../projects/ui/src/lib/forms/search-input/search-input.ts","../../../projects/ui/src/lib/forms/search-input/search-input.html","../../../projects/ui/src/lib/forms/select/select.ts","../../../projects/ui/src/lib/forms/select/select.html","../../../projects/ui/src/lib/forms/switch/switch.ts","../../../projects/ui/src/lib/forms/tel-input/tel-input.ts","../../../projects/ui/src/lib/forms/textarea/textarea.ts","../../../projects/ui/src/lib/forms/url-input/url-input.ts","../../../projects/ui/src/lib/form-builder/components/dynamic-field/dynamic-field.ts","../../../projects/ui/src/lib/form-builder/components/dynamic-field/dynamic-field.html","../../../projects/ui/src/lib/form-builder/components/dynamic-form.ts","../../../projects/ui/src/lib/form-builder/components/dynamic-form.html","../../../projects/ui/src/lib/forms/checkbox-dropdown/checkbox-dropdown.ts","../../../projects/ui/src/lib/forms/checkbox-dropdown/checkbox-dropdown.html","../../../projects/ui/src/lib/table/table-cell.directive.ts","../../../projects/ui/src/lib/table/table-column-selector/table-column-selector.ts","../../../projects/ui/src/lib/table/table-column-selector/table-column-selector.html","../../../projects/ui/src/lib/table/table.ts","../../../projects/ui/src/lib/table/table.html"],"sourcesContent":["import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { ApiOptionsConfig, SelectOption } from '../models';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, shareReplay } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class OptionsLoaderService {\n private readonly http = inject(HttpClient, { optional: true });\n private cache = new Map<string, Observable<SelectOption[]>>();\n\n loadOptions(\n config: ApiOptionsConfig,\n formValues: Record<string, any>,\n searchQuery?: string,\n apiConfig?: { baseUrl?: string; headers?: Record<string, string> },\n ): Observable<SelectOption[]> {\n const requestBody = this.buildRequest(config, formValues, searchQuery);\n const cacheKey = this.getCacheKey(config, requestBody, apiConfig);\n\n // Return cached if available\n if (config.cache !== false && this.cache.has(cacheKey)) {\n return this.cache.get(cacheKey)!;\n }\n\n const request$ = this.makeRequest(config, requestBody, apiConfig).pipe(\n map((response) => this.transformResponse(response, config)),\n shareReplay(1),\n catchError((err) => {\n console.error('Failed to load options:', err);\n return of([]);\n }),\n );\n\n if (config.cache !== false) {\n this.cache.set(cacheKey, request$);\n }\n return request$;\n }\n\n private buildRequest(\n config: ApiOptionsConfig,\n formValues: Record<string, any>,\n searchQuery?: string,\n ): any {\n // Use custom transformation if provided\n if (config.transformRequest) {\n return config.transformRequest(searchQuery || '', formValues);\n }\n\n const request: any = {};\n\n // Add search query\n if (searchQuery && config.searchParam) {\n request[config.searchParam] = searchQuery;\n }\n\n // Build filters and flatten them into query params\n const filters = this.buildFilters(config, formValues);\n\n // For GET requests, flatten filters into individual query params\n // For POST requests, keep as nested filters array\n if (config.method === 'GET') {\n // Flatten filters into query parameters\n filters.forEach((filter) => {\n if (filter.values && Array.isArray(filter.values)) {\n // For 'in' operator with multiple values\n request[filter.field] = filter.values;\n } else if (filter.value !== undefined && filter.value !== null) {\n // For single value filters\n request[filter.field] = filter.value;\n }\n });\n } else {\n // POST requests - keep filters as array\n if (filters.length > 0) {\n request.filters = filters;\n }\n }\n\n return request;\n }\n\n private buildFilters(config: ApiOptionsConfig, formValues: Record<string, any>): any[] {\n const filters: any[] = [];\n\n // Static filters\n if (config.filters) {\n filters.push(\n ...config.filters.map((f) => ({\n field: f.field,\n operator: f.operator,\n value: f.value,\n values: f.values,\n })),\n );\n }\n\n // Dynamic filters based on form values\n if (config.dynamicFilters) {\n for (const filter of config.dynamicFilters) {\n const value = formValues[filter.valueFrom];\n\n // Skip if whenNotEmpty is true and value is empty\n if (filter.whenNotEmpty && !value) {\n continue;\n }\n\n filters.push({\n field: filter.field,\n operator: filter.operator,\n value: value,\n });\n }\n }\n\n return filters;\n }\n\n private transformResponse(response: any, config: ApiOptionsConfig): SelectOption[] {\n // Use custom transformation if provided\n if (config.transformResponse) {\n return config.transformResponse(response);\n }\n\n // Extract data array from response using path\n let data = response;\n if (config.map?.data) {\n data = this.getNestedValue(response, config.map.data);\n }\n\n if (!Array.isArray(data)) {\n return [];\n }\n\n // Map to SelectOption format\n const labelPath = config.map?.label || 'label';\n const valuePath = config.map?.value || 'value';\n\n const options = data.map((item) => {\n const option = {\n label: this.getNestedValue(item, labelPath),\n value: this.getNestedValue(item, valuePath),\n ...item, // Include original data for reference\n };\n return option;\n });\n\n return options;\n }\n\n private getNestedValue(obj: any, path: string | string[]): any {\n if (!obj) return '';\n\n const keys = Array.isArray(path) ? path : path.split('.');\n return keys.reduce((acc, key) => acc?.[key], obj);\n }\n\n private makeRequest(\n config: ApiOptionsConfig,\n body: any,\n apiConfig?: { baseUrl?: string; headers?: Record<string, string> },\n ): Observable<any> {\n if (!this.http)\n throw new Error('API-backed fields require provideHttpClient() in the application.');\n const baseUrl = config.baseUrl ?? apiConfig?.baseUrl;\n let url = config.url;\n if (baseUrl && !url.startsWith('http://') && !url.startsWith('https://')) {\n url = `${baseUrl}${url.startsWith('/') ? url : '/' + url}`;\n }\n\n // Prepare headers\n const headers = apiConfig?.headers || {};\n\n if (config.method === 'POST') {\n return this.http.post(url, body, { headers });\n } else {\n // For GET requests, properly serialize query params\n let params = new HttpParams();\n\n // Add each parameter individually\n Object.keys(body).forEach((key) => {\n const value = body[key];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n // For arrays, add each value separately\n value.forEach((v) => {\n params = params.append(key, String(v));\n });\n } else {\n params = params.set(key, String(value));\n }\n }\n });\n\n return this.http.get(url, { params, headers });\n }\n }\n\n private getCacheKey(\n config: ApiOptionsConfig,\n requestBody: unknown,\n apiConfig?: { baseUrl?: string; headers?: Record<string, string> },\n ): string {\n return `${config.url}_${JSON.stringify({ config, requestBody, apiConfig })}`;\n }\n\n clearCache(url?: string): void {\n if (url) {\n // Clear specific URL cache\n for (const key of this.cache.keys()) {\n if (key.startsWith(url)) {\n this.cache.delete(key);\n }\n }\n } else {\n // Clear all cache\n this.cache.clear();\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { FormBuilder, FormGroup, ValidatorFn, Validators } from '@angular/forms';\nimport { FieldConfig, FormConfig } from '../models';\n\n@Injectable({ providedIn: 'root' })\nexport class FormBuilderService {\n private readonly fb = inject(FormBuilder);\n private customValidators = new Map<string, ValidatorFn>();\n\n buildForm(config: FormConfig): FormGroup {\n const group: Record<string, any> = {};\n\n // Sort fields by order if specified\n const sortedFields = [...config.fields].sort((a, b) => {\n const orderA = a.order ?? Number.MAX_VALUE;\n const orderB = b.order ?? Number.MAX_VALUE;\n return orderA - orderB;\n });\n\n for (const field of sortedFields) {\n if (field.type === 'array' && field.arrayFields) {\n // Handle FormArray\n const minItems = field.minItems || 0;\n const arrayControls: FormGroup[] = [];\n\n // Create initial items based on minItems or defaultValue\n const initialCount = Array.isArray(field.defaultValue)\n ? field.defaultValue.length\n : Math.max(minItems, minItems > 0 ? minItems : 0);\n\n for (let i = 0; i < initialCount; i++) {\n const itemGroup = this.createFormGroupFromFields(field.arrayFields);\n\n // If there's a defaultValue array, populate it\n if (Array.isArray(field.defaultValue) && field.defaultValue[i]) {\n itemGroup.patchValue(field.defaultValue[i]);\n }\n\n arrayControls.push(itemGroup);\n }\n\n group[field.key] = this.fb.array(arrayControls);\n } else {\n // Handle regular controls\n const validators = this.buildValidators(field);\n const defaultValue = field.defaultValue ?? this.getDefaultValue(field);\n\n group[field.key] = [{ value: defaultValue, disabled: field.disabled || false }, validators];\n }\n }\n\n return this.fb.group(group);\n }\n\n /**\n * Create a FormGroup from an array of field configurations\n * Used for creating array item groups\n */\n createFormGroupFromFields(fields: FieldConfig[]): FormGroup {\n const group: Record<string, any> = {};\n\n for (const field of fields) {\n const validators = this.buildValidators(field);\n const defaultValue = field.defaultValue ?? this.getDefaultValue(field);\n\n group[field.key] = [{ value: defaultValue, disabled: field.disabled || false }, validators];\n }\n\n return this.fb.group(group);\n }\n\n registerCustomValidator(name: string, validator: ValidatorFn): void {\n this.customValidators.set(name, validator);\n }\n\n getCustomValidator(name: string): ValidatorFn | undefined {\n return this.customValidators.get(name);\n }\n\n buildValidatorsFromConfig(field: FieldConfig): ValidatorFn[] {\n return this.buildValidators(field);\n }\n\n private buildValidators(field: FieldConfig): ValidatorFn[] {\n const validators: ValidatorFn[] = [];\n\n // Required validator\n if (field.required) {\n validators.push(Validators.required);\n }\n\n // Email validator for email type\n if (field.type === 'email') {\n validators.push(Validators.email);\n }\n\n // Number validators\n if (field.type === 'number') {\n if (field.min !== undefined) {\n validators.push(Validators.min(field.min));\n }\n if (field.max !== undefined) {\n validators.push(Validators.max(field.max));\n }\n }\n\n // Custom validation rules\n if (field.validation) {\n for (const rule of field.validation) {\n switch (rule.type) {\n case 'required':\n validators.push(Validators.required);\n break;\n case 'email':\n validators.push(Validators.email);\n break;\n case 'minLength':\n if (rule.value !== undefined) {\n validators.push(Validators.minLength(rule.value));\n }\n break;\n case 'maxLength':\n if (rule.value !== undefined) {\n validators.push(Validators.maxLength(rule.value));\n }\n break;\n case 'min':\n if (rule.value !== undefined) {\n validators.push(Validators.min(rule.value));\n }\n break;\n case 'max':\n if (rule.value !== undefined) {\n validators.push(Validators.max(rule.value));\n }\n break;\n case 'pattern':\n if (rule.value) {\n validators.push(Validators.pattern(rule.value));\n }\n break;\n case 'custom':\n if (rule.validator) {\n const customValidator = this.customValidators.get(rule.validator);\n if (customValidator) {\n validators.push(customValidator);\n } else {\n console.warn(`Custom validator '${rule.validator}' not found`);\n }\n }\n break;\n }\n }\n }\n\n return validators;\n }\n\n private getDefaultValue(field: FieldConfig): any {\n if (field.multiple) {\n return [];\n }\n\n switch (field.type) {\n case 'checkbox':\n return false;\n case 'number':\n return null;\n case 'array':\n return [];\n default:\n return '';\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FieldConfig, ConditionRule, OperatorType } from '../models';\n\n@Injectable({ providedIn: 'root' })\nexport class FieldResolverService {\n shouldShowField(field: FieldConfig, formValues: Record<string, any>): boolean {\n // Check if field is explicitly hidden\n if (field.hidden) {\n return false;\n }\n\n // Check showWhen conditions\n if (field.showWhen) {\n const conditions = Array.isArray(field.showWhen) ? field.showWhen : [field.showWhen];\n // All conditions must be true (AND logic)\n return conditions.every((condition) => this.evaluateCondition(condition, formValues));\n }\n\n // Check hideWhen conditions\n if (field.hideWhen) {\n const conditions = Array.isArray(field.hideWhen) ? field.hideWhen : [field.hideWhen];\n // If any condition is true, hide the field (OR logic)\n return !conditions.some((condition) => this.evaluateCondition(condition, formValues));\n }\n\n // Show by default\n return true;\n }\n\n getDependentFields(fieldKey: string, allFields: FieldConfig[]): FieldConfig[] {\n return allFields.filter((field) => {\n if (!field.dependsOn) return false;\n\n const dependencies = Array.isArray(field.dependsOn) ? field.dependsOn : [field.dependsOn];\n return dependencies.some((dep) => dep.field === fieldKey);\n });\n }\n\n getFieldsWithDependency(allFields: FieldConfig[]): Map<string, FieldConfig[]> {\n const dependencyMap = new Map<string, FieldConfig[]>();\n\n for (const field of allFields) {\n if (field.dependsOn) {\n const dependencies = Array.isArray(field.dependsOn) ? field.dependsOn : [field.dependsOn];\n\n for (const dep of dependencies) {\n const existing = dependencyMap.get(dep.field) || [];\n existing.push(field);\n dependencyMap.set(dep.field, existing);\n }\n }\n }\n\n return dependencyMap;\n }\n\n private evaluateCondition(condition: ConditionRule, formValues: Record<string, any>): boolean {\n const fieldValue = formValues[condition.field];\n\n switch (condition.operator) {\n case 'eq':\n return fieldValue === condition.value;\n\n case 'neq':\n return fieldValue !== condition.value;\n\n case 'in':\n return condition.values?.includes(fieldValue) || false;\n\n case 'nin':\n return !condition.values?.includes(fieldValue);\n\n case 'gt':\n return fieldValue > condition.value;\n\n case 'gte':\n return fieldValue >= condition.value;\n\n case 'lt':\n return fieldValue < condition.value;\n\n case 'lte':\n return fieldValue <= condition.value;\n\n case 'contains':\n if (typeof fieldValue === 'string' && typeof condition.value === 'string') {\n return fieldValue.toLowerCase().includes(condition.value.toLowerCase());\n }\n if (Array.isArray(fieldValue)) {\n return fieldValue.includes(condition.value);\n }\n return false;\n\n default:\n console.warn(`Unknown operator: ${condition.operator}`);\n return true;\n }\n }\n\n evaluateConditions(\n conditions: ConditionRule[],\n formValues: Record<string, any>,\n logic: 'AND' | 'OR' = 'AND',\n ): boolean {\n if (logic === 'AND') {\n return conditions.every((condition) => this.evaluateCondition(condition, formValues));\n } else {\n return conditions.some((condition) => this.evaluateCondition(condition, formValues));\n }\n }\n}\n","import {\n Component,\n ElementRef,\n input,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\n\ntype PopoverPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n@Component({\n selector: 'hui-form-helper',\n template: `\n <div class=\"relative flex ml-1\">\n <button\n #triggerButton\n type=\"button\"\n (click)=\"togglePopover()\"\n (blur)=\"onBlur()\"\n class=\"inline-flex items-center justify-center w-5 h-5 text-muted-foreground hover:text-text-muted focus:outline-none focus:ring-2 focus:ring-offset-1 focus:ring-purple-500 rounded-full\"\n [attr.aria-label]=\"'Help about ' + label()\"\n [attr.aria-describedby]=\"isOpen() ? 'popover-' + id() : null\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-help-circle\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\" />\n <path d=\"M12 16v.01\" />\n <path d=\"M12 13a2 2 0 0 0 .914 -3.782a1.98 1.98 0 0 0 -2.414 .483\" />\n </svg>\n </button>\n\n @if (isOpen()) {\n <div\n [id]=\"'popover-' + id()\"\n class=\"absolute z-50 w-64 p-3 bg-surface rounded-xl shadow-xl border border-border\"\n [class]=\"getPopoverPositionClasses()\"\n role=\"tooltip\"\n >\n <div class=\" text-text-secondary\">\n <ng-content></ng-content>\n </div>\n <div\n class=\"absolute w-2 h-2 bg-surface border-border transform rotate-45\"\n [class]=\"getArrowClasses()\"\n ></div>\n </div>\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': '\"inline-block\"',\n },\n})\nexport class FormHelperComponent {\n id = input<string>('');\n label = input<string>('');\n\n protected readonly isOpen = signal<boolean>(false);\n protected readonly position = signal<PopoverPosition>('bottom-left');\n\n private readonly triggerButton = viewChild<ElementRef<HTMLButtonElement>>('triggerButton');\n\n protected togglePopover(): void {\n if (!this.isOpen()) {\n this.calculatePosition();\n }\n this.isOpen.update((open) => !open);\n }\n\n protected onBlur(): void {\n setTimeout(() => {\n this.isOpen.set(false);\n }, 200);\n }\n\n private calculatePosition(): void {\n const button = this.triggerButton()?.nativeElement;\n if (!button) {\n this.position.set('bottom-left');\n return;\n }\n\n const rect = button.getBoundingClientRect();\n const popoverWidth = 256;\n const popoverHeight = 100;\n const padding = 16;\n\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n const spaceRight = window.innerWidth - rect.left;\n const spaceLeft = rect.right;\n\n const vertical = spaceBelow >= popoverHeight + padding ? 'bottom' : 'top';\n const horizontal = spaceRight >= popoverWidth + padding ? 'left' : 'right';\n\n this.position.set(`${vertical}-${horizontal}` as PopoverPosition);\n }\n\n protected getPopoverPositionClasses(): string {\n const pos = this.position();\n switch (pos) {\n case 'bottom-left':\n return 'left-0 top-full mt-2';\n case 'bottom-right':\n return 'right-0 top-full mt-2';\n case 'top-left':\n return 'left-0 bottom-full mb-2';\n case 'top-right':\n return 'right-0 bottom-full mb-2';\n default:\n return 'left-0 top-full mt-2';\n }\n }\n\n protected getArrowClasses(): string {\n const pos = this.position();\n switch (pos) {\n case 'bottom-left':\n return '-top-1 left-2 border-l border-t';\n case 'bottom-right':\n return '-top-1 right-2 border-l border-t';\n case 'top-left':\n return '-bottom-1 left-2 border-r border-b';\n case 'top-right':\n return '-bottom-1 right-2 border-r border-b';\n default:\n return '-top-1 left-2 border-l border-t';\n }\n }\n}\n","/**\n * SVG Icon definitions as objects\n * Each icon contains the SVG path data and optional viewBox\n */\n\nexport interface SvgIcon {\n path: string | string[];\n viewBox?: string;\n strokeWidth?: number;\n fill?: string;\n stroke?: string;\n}\n\nexport const ICONS: Record<string, SvgIcon> = {\n 'shopping-cart': {\n path: [\n 'M3 3h2l3 12h11l3-9H6',\n 'M10 20a1 1 0 1 0-2 0 1 1 0 0 0 2 0',\n 'M20 20a1 1 0 1 0-2 0 1 1 0 0 0 2 0',\n ],\n stroke: 'currentColor',\n },\n 'chart-no-axes-combined': {\n path: [\n 'M12 16v5',\n 'M16 14.639V21',\n 'M20 10.656V21',\n 'm22 3-8.646 8.646a.5.5 0 0 1-.708 0L9.354 8.354a.5.5 0 0 0-.707 0L2 15',\n 'M4 18.463V21',\n 'M8 14.656V21',\n ],\n stroke: 'currentColor',\n },\n 'list-ordered': {\n path: [\n 'M11 5h10',\n 'M11 12h10',\n 'M11 19h10',\n 'M4 4h1v5',\n 'M4 9h2',\n 'M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02',\n ],\n stroke: 'currentColor',\n },\n 'calendar-days': {\n path: [\n 'M8 2v3',\n 'M16 2v3',\n 'M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2',\n 'M3 9h18',\n 'M8 13h.01',\n 'M12 13h.01',\n 'M16 13h.01',\n 'M8 17h.01',\n 'M12 17h.01',\n 'M16 17h.01',\n ],\n stroke: 'currentColor',\n },\n 'calendar-range': {\n path: [\n 'M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2',\n 'M16 2v3',\n 'M3 9h18',\n 'M8 2v3',\n 'M17 13h-6',\n 'M13 17H7',\n 'M7 13h.01',\n 'M17 17h.01',\n ],\n stroke: 'currentColor',\n },\n headphones: {\n path: 'M3 14h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a9 9 0 0 1 18 0v7a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3',\n stroke: 'currentColor',\n },\n earth: {\n path: [\n 'M21.54 15H17a2 2 0 0 0-2 2v4.54',\n 'M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17',\n 'M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05',\n 'M12 2a10 10 0 1 0 0 20 10 10 0 1 0 0-20',\n ],\n stroke: 'currentColor',\n },\n trophy: {\n path: [\n 'M10 14.66V17a1 1 0 0 1-1 1 2 2 0 0 0-2 2v2',\n 'M14 14.66V17a1 1 0 0 0 1 1 2 2 0 0 1 2 2v2',\n 'M17.916 10H19.5A2.5 2.5 0 0 0 22 7.5V5a1 1 0 0 0-1-1h-3',\n 'M4 22h16',\n 'M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z',\n 'M6.084 10H4.5A2.5 2.5 0 0 1 2 7.5V5a1 1 0 0 1 1-1h3',\n ],\n stroke: 'currentColor',\n },\n 'map-pinned': {\n path: [\n 'M18 8c0 3.613-3.869 7.429-5.393 8.795a1 1 0 0 1-1.214 0C9.87 15.429 6 11.613 6 8a6 6 0 0 1 12 0',\n 'M12 6a2 2 0 1 0 0 4 2 2 0 1 0 0-4',\n 'M8.714 14h-3.71a1 1 0 0 0-.948.683l-2.004 6A1 1 0 0 0 3 22h18a1 1 0 0 0 .948-1.316l-2-6a1 1 0 0 0-.949-.684h-3.712',\n ],\n stroke: 'currentColor',\n },\n 'clock-3': {\n path: ['M12 2a10 10 0 1 0 0 20 10 10 0 1 0 0-20', 'M12 6v6h4'],\n stroke: 'currentColor',\n },\n 'trending-up': {\n path: ['M16 7h6v6', 'm22 7-8.5 8.5-5-5L2 17'],\n stroke: 'currentColor',\n },\n 'trending-down': {\n path: ['M16 17h6v-6', 'm22 17-8.5-8.5-5 5L2 7'],\n stroke: 'currentColor',\n },\n 'refresh-cw': {\n path: [\n 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8',\n 'M21 3v5h-5',\n 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16',\n 'M8 16H3v5',\n ],\n stroke: 'currentColor',\n },\n layers: {\n path: [\n 'M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z',\n 'M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12',\n 'M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17',\n ],\n stroke: 'currentColor',\n },\n activity: {\n path: 'M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2',\n stroke: 'currentColor',\n },\n 'alert-triangle': {\n path: [\n 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3',\n 'M12 9v4',\n 'M12 17h.01',\n ],\n stroke: 'currentColor',\n },\n sun: {\n path: [\n 'M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0',\n 'M4 12h-1',\n 'M21 12h-1',\n 'M12 4v-1',\n 'M12 21v-1',\n 'M6.4 6.4l-.7 -.7',\n 'M18.3 18.3l-.7 -.7',\n 'M6.4 17.6l-.7 .7',\n 'M18.3 5.7l-.7 .7',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n moon: {\n path: 'M12 3c.132 0 .263 .003 .393 .009a7.5 7.5 0 0 0 8.598 8.598a9 9 0 1 1 -8.991 -8.607z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'device-desktop': {\n path: [\n 'M3 4m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z',\n 'M7 20h10',\n 'M9 16v4',\n 'M15 16v4',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n language: {\n path: [\n 'M4 5h7',\n 'M7 4c0 4.846 0 7 .5 8',\n 'M10 8.5c0 3.407 -2.462 6.5 -6 6.5',\n 'M12 20l4 -9l4 9',\n 'M19.1 18h-6.2',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'layout-sidebar-left': {\n path: 'M18 3a3 3 0 0 1 2.995 2.824l.005 .176v12a3 3 0 0 1 -2.824 2.995l-.176 .005h-12a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-12a3 3 0 0 1 2.824 -2.995l.176 -.005h12zm0 2h-9v14h9a1 1 0 0 0 .993 -.883l.007 -.117v-12a1 1 0 0 0 -.883 -.993l-.117 -.007zm-4.387 4.21l.094 .083l2 2a1 1 0 0 1 .083 1.32l-.083 .094l-2 2a1 1 0 0 1 -1.497 -1.32l.083 -.094l1.292 -1.293l-1.292 -1.293a1 1 0 0 1 -.083 -1.32l.083 -.094a1 1 0 0 1 1.32 -.083z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'layout-sidebar-left-expand': {\n path: [\n 'M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z',\n 'M9 4v16',\n 'M14 10l2 2l-2 2',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'home-bolt': {\n path: [\n 'M5 12l-2 0l9 -9l9 9l-2 0',\n 'M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7',\n 'M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n users: {\n path: 'M12 11a5 5 0 1 0 0-10 5 5 0 0 0 0 10zm-5 2a5 5 0 0 0-5 5 3 3 0 0 0 3 3h14a3 3 0 0 0 3-3 5 5 0 0 0-5-5H7z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n disc: {\n path: [\n 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z',\n 'M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n music: {\n path: 'M9 18V5l12-2v13M9 18a3 3 0 1 1-6 0 3 3 0 0 1 6 0zm12-3a3 3 0 1 1-6 0 3 3 0 0 1 6 0zM9 5a3 3 0 1 1-6 0 3 3 0 0 1 6 0z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n settings: {\n path: 'M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.488.488 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'carousel-vertical': {\n path: [\n 'M19 8v8a1 1 0 0 1 -1 1h-12a1 1 0 0 1 -1 -1v-8a1 1 0 0 1 1 -1h12a1 1 0 0 1 1 1z',\n 'M7 22v-1a1 1 0 0 1 1 -1h8a1 1 0 0 1 1 1v1',\n 'M17 2v1a1 1 0 0 1 -1 1h-8a1 1 0 0 1 -1 -1v-1',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n shield: {\n path: [\n 'M12 3a12 12 0 0 0 8.5 3a12 12 0 0 1 -8.5 15a12 12 0 0 1 -8.5 -15a12 12 0 0 0 8.5 -3',\n 'M4 14l8 -3l8 3',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n playlist: {\n path: [\n 'M14 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0',\n 'M17 17v-13h4',\n 'M13 5h-10',\n 'M3 9l10 0',\n 'M9 13h-6',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'chevron-down': {\n path: 'M19 9l-7 7-7-7',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'chevron-right': {\n path: 'M9 5l7 7-7 7',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'chevron-left': {\n path: 'M15 5l-7 7l7 7',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n play: {\n path: 'M7 4v16l13 -8z',\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n strokeWidth: 0,\n },\n\n stop: {\n path: 'M6 6h12v12h-12z',\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n strokeWidth: 0,\n },\n\n 'alert-circle': {\n path: ['M12 2a10 10 0 1 0 0 20a10 10 0 0 0 0 -20z', 'M12 8v4', 'M12 16h.01'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n dashboard: {\n path: 'M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n album: {\n path: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14.5c-2.49 0-4.5-2.01-4.5-4.5S9.51 7.5 12 7.5s4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5zm0-5.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n plus: {\n path: ['M12 5l0 14', 'M5 12l14 0'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n edit: {\n path: 'M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a.996.996 0 0 0 0-1.41l-2.34-2.34a.996.996 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'edit-2': {\n path: [\n 'M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1',\n 'M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z',\n 'M16 5l3 3',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n delete: {\n path: 'M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n search: {\n path: [\n 'M11.5 21C16.7467 21 21 16.7467 21 11.5C21 6.25329 16.7467 2 11.5 2C6.25329 2 2 6.25329 2 11.5C2 16.7467 6.25329 21 11.5 21Z',\n 'M22 22L20 20',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n filter: {\n path: ['M2 5h20', 'M6 12h12', 'M9 19h6'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n mobile: {\n path: ['M5 4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2h-2.4', 'M8 18h.01'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n close: {\n path: ['M18 6 6 18', 'm6 6 12 12'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'close-x': {\n path: [\n 'M13.9902 10.0099L14.8302 9.16992',\n 'M9.16992 14.8301L11.9199 12.0801',\n 'M14.8299 14.8299L9.16992 9.16992',\n 'M4 6C2.75 7.67 2 9.75 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2C10.57 2 9.2 2.3 7.97 2.85',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n },\n\n reload: {\n path: [\n 'M14.55 21.67C18.84 20.54 22 16.64 22 12C22 6.48 17.56 2 12 2C5.33 2 2 7.56 2 7.56M2 7.56V3M2 7.56H4.01H6.44',\n 'M2 12C2 17.52 6.48 22 12 22',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n },\n\n 'eye-cancel': {\n path: [\n 'M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0',\n 'M12 18c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6',\n 'M19 19m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0',\n 'M17 21l4 -4',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n check: {\n path: 'M20 6 9 17l-5-5',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n eye: {\n path: 'M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'eye-off': {\n path: 'M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46A11.804 11.804 0 0 0 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n upload: {\n path: [\n 'M16.44 8.90039C20.04 9.21039 21.51 11.0604 21.51 15.1104V15.2404C21.51 19.7104 19.72 21.5004 15.25 21.5004H8.73998C4.26998 21.5004 2.47998 19.7104 2.47998 15.2404V15.1104C2.47998 11.0904 3.92998 9.24039 7.46998 8.91039',\n 'M12 15.0001V3.62012',\n 'M15.3499 5.85L11.9999 2.5L8.6499 5.85',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'upload-image': {\n path: [\n 'M9 10.75C7.48 10.75 6.25 9.52 6.25 8C6.25 6.48 7.48 5.25 9 5.25C10.52 5.25 11.75 6.48 11.75 8C11.75 9.52 10.52 10.75 9 10.75ZM9 6.75C8.31 6.75 7.75 7.31 7.75 8C7.75 8.69 8.31 9.25 9 9.25C9.69 9.25 10.25 8.69 10.25 8C10.25 7.31 9.69 6.75 9 6.75Z',\n 'M15 22.75H9C3.57 22.75 1.25 20.43 1.25 15V9C1.25 3.57 3.57 1.25 9 1.25H13C13.41 1.25 13.75 1.59 13.75 2C13.75 2.41 13.41 2.75 13 2.75H9C4.39 2.75 2.75 4.39 2.75 9V15C2.75 19.61 4.39 21.25 9 21.25H15C19.61 21.25 21.25 19.61 21.25 15V10C21.25 9.59 21.59 9.25 22 9.25C22.41 9.25 22.75 9.59 22.75 10V15C22.75 20.43 20.43 22.75 15 22.75Z',\n 'M18 8.74994C17.59 8.74994 17.25 8.40994 17.25 7.99994V1.99994C17.25 1.69994 17.43 1.41994 17.71 1.30994C17.99 1.19994 18.31 1.25994 18.53 1.46994L20.53 3.46994C20.82 3.75994 20.82 4.23994 20.53 4.52994C20.24 4.81994 19.76 4.81994 19.47 4.52994L18.75 3.80994V7.99994C18.75 8.40994 18.41 8.74994 18 8.74994Z',\n 'M15.9999 4.75043C15.8099 4.75043 15.6199 4.68043 15.4699 4.53043C15.1799 4.24043 15.1799 3.76043 15.4699 3.47043L17.4699 1.47043C17.7599 1.18043 18.2399 1.18043 18.5299 1.47043C18.8199 1.76043 18.8199 2.24043 18.5299 2.53043L16.5299 4.53043C16.3799 4.68043 16.1899 4.75043 15.9999 4.75043Z',\n 'M2.67005 19.6996C2.43005 19.6996 2.19005 19.5796 2.05005 19.3696C1.82005 19.0296 1.91005 18.5596 2.25005 18.3296L7.18005 15.0196C8.26005 14.2996 9.75005 14.3796 10.73 15.2096L11.06 15.4996C11.56 15.9296 12.41 15.9296 12.9 15.4996L17.06 11.9296C18.12 11.0196 19.7901 11.0196 20.8601 11.9296L22.49 13.3296C22.8 13.5996 22.84 14.0696 22.57 14.3896C22.3 14.6996 21.82 14.7396 21.51 14.4696L19.88 13.0696C19.38 12.6396 18.5401 12.6396 18.0401 13.0696L13.88 16.6396C12.82 17.5496 11.15 17.5496 10.08 16.6396L9.75005 16.3496C9.29005 15.9596 8.53005 15.9196 8.02005 16.2696L3.10005 19.5796C2.96005 19.6596 2.81005 19.6996 2.67005 19.6996Z',\n ],\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n strokeWidth: 0,\n },\n\n download: {\n path: 'M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n menu: {\n path: 'M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n menu2: {\n path: ['M3 7h18', 'M3 12h12', 'M3 17h18'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n },\n\n 'logout-alt': {\n path: [\n 'M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2',\n 'M9 12h12l-3 -3',\n 'M18 15l3 -3',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n user: {\n path: 'M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n bell: {\n path: 'M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n calendar: {\n path: 'M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n heart: {\n path: 'M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n star: {\n path: 'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'device-imac-heart': {\n path: [\n 'M10 17h-6a1 1 0 0 1 -1 -1v-12a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v7',\n 'M3 13h9',\n 'M10 17l-.5 4',\n 'M18 22l3.35 -3.284a2.143 2.143 0 0 0 .005 -3.071a2.242 2.242 0 0 0 -3.129 -.006l-.224 .22l-.223 -.22a2.242 2.242 0 0 0 -3.128 -.006a2.143 2.143 0 0 0 -.006 3.071l3.355 3.296z',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n radar: {\n path: [\n 'M21 12h-8a1 1 0 1 0 -1 1v8a9 9 0 0 0 9 -9',\n 'M16 9a5 5 0 1 0 -7 7',\n 'M20.486 9a9 9 0 1 0 -11.482 11.495',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n cards: {\n path: [\n 'M3.604 7.197l7.138 -3.109a.96 .96 0 0 1 1.27 .527l4.924 11.902a1 1 0 0 1 -.514 1.304l-7.137 3.109a.96 .96 0 0 1 -1.271 -.527l-4.924 -11.903a1 1 0 0 1 .514 -1.304z',\n 'M15 4h1a1 1 0 0 1 1 1v3.5',\n 'M20 6c.264 .112 .52 .217 .768 .315a1 1 0 0 1 .53 1.311l-2.298 5.374',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'report-analytics': {\n path: [\n 'M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2',\n 'M9 3m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z',\n 'M9 17v-5',\n 'M12 17v-1',\n 'M15 17v-3',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n folders: {\n path: [\n 'M9 3h3l2 2h5a2 2 0 0 1 2 2v7a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-9a2 2 0 0 1 2 -2',\n 'M17 16v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-9a2 2 0 0 1 2 -2h2',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n files: {\n path: [\n 'M15 3v4a1 1 0 0 0 1 1h4',\n 'M18 17h-7a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h4l5 5v7a2 2 0 0 1 -2 2z',\n 'M16 17v2a2 2 0 0 1 -2 2h-7a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'layout-sidebar-left-collapse': {\n path: [\n 'M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z',\n 'M9 4v16',\n 'M14 10l2 2l-2 2',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'layout-sidebar-left-expand-filled': {\n path: [\n 'M18 3a3 3 0 0 1 2.995 2.824l.005 .176v12a3 3 0 0 1 -2.824 2.995l-.176 .005h-12a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-12a3 3 0 0 1 2.824 -2.995l.176 -.005h12zm0 2h-9v14h9a1 1 0 0 0 .993 -.883l.007 -.117v-12a1 1 0 0 0 -.883 -.993l-.117 -.007zm-4.387 4.21l.094 .083l2 2a1 1 0 0 1 .083 1.32l-.083 .094l-2 2a1 1 0 0 1 -1.497 -1.32l.083 -.094l1.292 -1.293l-1.292 -1.293a1 1 0 0 1 -.083 -1.32l.083 -.094a1 1 0 0 1 1.32 -.083z',\n ],\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'menu-alt': {\n path: ['M4 8h16', 'M4 16h16'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'more-vertical': {\n path: [\n 'M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0',\n 'M12 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0',\n 'M12 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n dots: {\n path: [\n 'M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0',\n 'M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0',\n 'M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'mood-puzzled': {\n path: [\n 'M14.986 3.51a9 9 0 1 0 1.514 16.284c2.489 -1.437 4.181 -3.978 4.5 -6.794',\n 'M10 10h.01',\n 'M14 8h.01',\n 'M12 15c1 -1.333 2 -2 3 -2',\n 'M20 9v.01',\n 'M20 6a2.003 2.003 0 0 0 .914 -3.782a1.98 1.98 0 0 0 -2.414 .483',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'library-photo': {\n path: [\n 'M7 3m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z',\n 'M4.012 7.26a2.005 2.005 0 0 0 -1.012 1.737v10c0 1.1 .9 2 2 2h10c.75 0 1.158 -.385 1.5 -1',\n 'M17 7h.01',\n 'M7 13l3.644 -3.644a1.21 1.21 0 0 1 1.712 0l3.644 3.644',\n 'M15 12l1.644 -1.644a1.21 1.21 0 0 1 1.712 0l2.644 2.644',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n trash: {\n path: [\n 'M4 7l16 0',\n 'M10 11l0 6',\n 'M14 11l0 6',\n 'M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12',\n 'M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'rosette-discount-check': {\n path: 'M12.01 2.011a3.2 3.2 0 0 1 2.113 .797l.154 .145l.698 .698a1.2 1.2 0 0 0 .71 .341l.135 .008h1a3.2 3.2 0 0 1 3.195 3.018l.005 .182v1c0 .27 .092 .533 .258 .743l.09 .1l.697 .698a3.2 3.2 0 0 1 .147 4.382l-.145 .154l-.698 .698a1.2 1.2 0 0 0 -.341 .71l-.008 .135v1a3.2 3.2 0 0 1 -3.018 3.195l-.182 .005h-1a1.2 1.2 0 0 0 -.743 .258l-.1 .09l-.698 .697a3.2 3.2 0 0 1 -4.382 .147l-.154 -.145l-.698 -.698a1.2 1.2 0 0 0 -.71 -.341l-.135 -.008h-1a3.2 3.2 0 0 1 -3.195 -3.018l-.005 -.182v-1a1.2 1.2 0 0 0 -.258 -.743l-.09 -.1l-.697 -.698a3.2 3.2 0 0 1 -.147 -4.382l.145 -.154l.698 -.698a1.2 1.2 0 0 0 .341 -.71l.008 -.135v-1l.005 -.182a3.2 3.2 0 0 1 3.013 -3.013l.182 -.005h1a1.2 1.2 0 0 0 .743 -.258l.1 -.09l.698 -.697a3.2 3.2 0 0 1 2.269 -.944zm3.697 7.282a1 1 0 0 0 -1.414 0l-3.293 3.292l-1.293 -1.292l-.094 -.083a1 1 0 0 0 -1.32 1.497l2 2l.094 .083a1 1 0 0 0 1.32 -.083l4 -4l.083 -.094a1 1 0 0 0 -.083 -1.32z',\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n strokeWidth: 0,\n },\n 'brand-youtube': {\n path: [\n 'M2 8a4 4 0 0 1 4 -4h12a4 4 0 0 1 4 4v8a4 4 0 0 1 -4 4h-12a4 4 0 0 1 -4 -4v-8z',\n 'M10 9l5 3l-5 3z',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'square-rounded-check': {\n path: ['M9 12l2 2l4 -4', 'M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'progress-check': {\n path: [\n 'M10 20.777a8.942 8.942 0 0 1 -2.48 -.969',\n 'M14 3.223a9.003 9.003 0 0 1 0 17.554',\n 'M4.579 17.093a8.961 8.961 0 0 1 -1.227 -2.592',\n 'M3.124 10.5c.16 -.95 .468 -1.85 .9 -2.675l.169 -.305',\n 'M6.907 4.579a8.954 8.954 0 0 1 3.093 -1.356',\n 'M9 12l2 2l4 -4',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n\n 'chart-bar': {\n path: [\n 'M3 13a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v6a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n 'M15 9a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n 'M9 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n 'M4 20h14',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'category-2': {\n path: [\n 'M14 4h6v6h-6z',\n 'M4 14h6v6h-6z',\n 'M17 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0',\n 'M7 7m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'arrow-narrow-left': {\n path: ['M5 12l14 0', 'M5 12l4 4', 'M5 12l4 -4'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n restore: {\n path: [\n 'M3.06 13a9 9 0 1 0 .49 -4.087',\n 'M3 4.001v5h5',\n 'M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'toggle-right': {\n path: [\n 'M16 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0',\n 'M2 6m0 6a6 6 0 0 1 6 -6h8a6 6 0 0 1 6 6v0a6 6 0 0 1 -6 6h-8a6 6 0 0 1 -6 -6z',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n checks: {\n path: ['M7 12l5 5l10 -10', 'M2 12l5 5m5 -5l5 -5'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n coin: {\n path: [\n 'M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0',\n 'M14.8 9a2 2 0 0 0 -1.8 -1h-2a2 2 0 1 0 0 4h2a2 2 0 1 1 0 4h-2a2 2 0 0 1 -1.8 -1',\n 'M12 7v10',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n coins: {\n path: [\n 'M9 14c0 1.657 2.686 3 6 3s6 -1.343 6 -3s-2.686 -3 -6 -3s-6 1.343 -6 3',\n 'M9 14v4c0 1.656 2.686 3 6 3s6 -1.344 6 -3v-4',\n 'M3 6c0 1.072 1.144 2.062 3 2.598s4.144 .536 6 0c1.856 -.536 3 -1.526 3 -2.598c0 -1.072 -1.144 -2.062 -3 -2.598s-4.144 -.536 -6 0c-1.856 .536 -3 1.526 -3 2.598',\n 'M3 6v10c0 .888 .772 1.45 2 2',\n 'M3 11c0 .888 .772 1.45 2 2',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'loader-2': {\n path: 'M12 3a9 9 0 1 0 9 9',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'arrow-narrow-right-dashed': {\n path: ['M5 12h.5m3 0h1.5m3 0h6', 'M15 16l4 -4', 'M15 8l4 4'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'info-circle': {\n path: ['M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0', 'M12 9h.01', 'M11 12h1v4h1'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n lock: {\n path: [\n 'M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6z',\n 'M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0',\n 'M8 11v-4a4 4 0 1 1 8 0v4',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'file-description': {\n path: [\n 'M14 3v4a1 1 0 0 0 1 1h4',\n 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n 'M9 17h6',\n 'M9 13h6',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n speakerphone: {\n path: [\n 'M18 8a3 3 0 0 1 0 6',\n 'M10 8v11a1 1 0 0 1 -1 1h-1a1 1 0 0 1 -1 -1v-5',\n 'M12 8l4.524 -3.77a.9 .9 0 0 1 1.476 .692v12.156a.9 .9 0 0 1 -1.476 .692l-4.524 -3.77h-8a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1h8',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'ad-2': {\n path: [\n 'M11.933 5h-6.933v16h13v-8',\n 'M14 17h-5',\n 'M9 13h5v-4h-5v4',\n 'M15 5v-2',\n 'M18 6l2 -2',\n 'M19 9h2',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'bell-outline': {\n path: [\n 'M10 5a2 2 0 1 1 4 0a7 7 0 0 1 4 6v3a4 4 0 0 0 2 3h-16a4 4 0 0 0 2 -3v-3a7 7 0 0 1 4 -6',\n 'M9 17v1a3 3 0 0 0 6 0v-1',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n },\n 'lock-check': {\n path: [\n 'M19.96 8.96039C19.29 8.22039 18.28 7.79039 16.88 7.64039V6.88039C16.88 5.51039 16.3 4.19039 15.28 3.27039C14.25 2.33039 12.91 1.89039 11.52 2.02039C9.12999 2.25039 7.11999 4.56039 7.11999 7.06039V7.64039C5.71999 7.79039 4.70999 8.22039 4.03999 8.96039C3.06999 10.0404 3.09999 11.4804 3.20999 12.4804L3.90999 18.0504C4.11999 20.0004 4.90999 22.0004 9.20999 22.0004H14.79C19.09 22.0004 19.88 20.0004 20.09 18.0604L20.79 12.4704C20.9 11.4804 20.93 10.0404 19.96 8.96039ZM11.66 3.41039C12.66 3.32039 13.61 3.63039 14.35 4.30039C15.08 4.96039 15.49 5.90039 15.49 6.88039V7.58039H8.50999V7.06039C8.50999 5.28039 9.97999 3.57039 11.66 3.41039ZM12 18.5804C9.90999 18.5804 8.20999 16.8804 8.20999 14.7904C8.20999 12.7004 9.90999 11.0004 12 11.0004C14.09 11.0004 15.79 12.7004 15.79 14.7904C15.79 16.8804 14.09 18.5804 12 18.5804Z',\n 'M11.4299 16.64C11.2399 16.64 11.0499 16.57 10.8999 16.42L9.90988 15.43C9.61988 15.14 9.61988 14.66 9.90988 14.37C10.1999 14.08 10.6799 14.08 10.9699 14.37L11.4499 14.85L13.0499 13.37C13.3499 13.09 13.8299 13.11 14.1099 13.41C14.3899 13.71 14.3699 14.19 14.0699 14.47L11.9399 16.44C11.7899 16.57 11.6099 16.64 11.4299 16.64Z',\n ],\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n strokeWidth: 0,\n },\n briefcase: {\n path: [\n 'M22 13V17C22 20.5 20 22 17 22H7C4 22 2 20.5 2 17V13C2 10.35 3.15 8.85003 5 8.28003C5.6 8.09003 6.27 8 7 8H17C17.73 8 18.4 8.09003 19 8.28003C20.85 8.85003 22 10.35 22 13Z',\n 'M19 7V8.28003C18.4 8.09003 17.73 8 17 8H7C6.27 8 5.6 8.09003 5 8.28003V7C5 5.9 5.9 5 7 5H17C18.1 5 19 5.9 19 7Z',\n 'M16 3.51001V5H8V3.51001C8 2.68001 8.68001 2 9.51001 2H14.49C15.32 2 16 2.68001 16 3.51001Z',\n 'M9.07001 19.4506C9.79902 19.4506 10.39 18.8596 10.39 18.1306C10.39 17.4015 9.79902 16.8105 9.07001 16.8105C8.34099 16.8105 7.75 17.4015 7.75 18.1306C7.75 18.8596 8.34099 19.4506 9.07001 19.4506Z',\n 'M15.2499 17.2501V12.0801C15.2499 10.9801 14.5599 10.8201 13.8599 11.0201L11.2099 11.7401C10.7299 11.8701 10.3999 12.2501 10.3999 12.8001V13.7201V14.3401V18.1301',\n 'M13.9299 18.5697C14.6589 18.5697 15.2499 17.9787 15.2499 17.2497C15.2499 16.5207 14.6589 15.9297 13.9299 15.9297C13.2009 15.9297 12.6099 16.5207 12.6099 17.2497C12.6099 17.9787 13.2009 18.5697 13.9299 18.5697Z',\n 'M10.3999 14.3502L15.2499 13.0303',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n },\n 'shield-check': {\n path: [\n 'M21.5599 10.7405L20.1999 9.16055C19.9399 8.86055 19.7299 8.30055 19.7299 7.90055V6.20055C19.7299 5.14055 18.8599 4.27055 17.7999 4.27055H16.0999C15.7099 4.27055 15.1399 4.06055 14.8399 3.80055L13.2599 2.44055C12.5699 1.85055 11.4399 1.85055 10.7399 2.44055L9.16988 3.81055C8.86988 4.06055 8.29988 4.27055 7.90988 4.27055H6.17988C5.11988 4.27055 4.24988 5.14055 4.24988 6.20055V7.91055C4.24988 8.30055 4.03988 8.86055 3.78988 9.16055L2.43988 10.7505C1.85988 11.4405 1.85988 12.5605 2.43988 13.2505L3.78988 14.8405C4.03988 15.1405 4.24988 15.7005 4.24988 16.0905V17.8005C4.24988 18.8605 5.11988 19.7305 6.17988 19.7305H7.90988C8.29988 19.7305 8.86988 19.9405 9.16988 20.2005L10.7499 21.5605C11.4399 22.1505 12.5699 22.1505 13.2699 21.5605L14.8499 20.2005C15.1499 19.9405 15.7099 19.7305 16.1099 19.7305H17.8099C18.8699 19.7305 19.7399 18.8605 19.7399 17.8005V16.1005C19.7399 15.7105 19.9499 15.1405 20.2099 14.8405L21.5699 13.2605C22.1499 12.5705 22.1499 11.4305 21.5599 10.7405ZM16.1599 10.1105L11.3299 14.9405C11.1899 15.0805 10.9999 15.1605 10.7999 15.1605C10.5999 15.1605 10.4099 15.0805 10.2699 14.9405L7.84988 12.5205C7.55988 12.2305 7.55988 11.7505 7.84988 11.4605C8.13988 11.1705 8.61988 11.1705 8.90988 11.4605L10.7999 13.3505L15.0999 9.05055C15.3899 8.76055 15.8699 8.76055 16.1599 9.05055C16.4499 9.34055 16.4499 9.82055 16.1599 10.1105Z',\n ],\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n strokeWidth: 0,\n },\n\n 'mouse-square': {\n path: [\n 'M22 12V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22H12',\n 'M20.96 17.8405L19.33 18.3905C18.88 18.5405 18.52 18.8905 18.37 19.3505L17.82 20.9805C17.35 22.3905 15.37 22.3605 14.93 20.9505L13.08 15.0005C12.72 13.8205 13.81 12.7205 14.98 13.0905L20.94 14.9405C22.34 15.3805 22.36 17.3705 20.96 17.8405Z',\n ],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n },\n minus: {\n path: ['M16 12H18', 'M6 12H11.66'],\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n },\n moderation: {\n path: [\n 'M22 11.7493H12C11.59 11.7493 11.25 11.4093 11.25 10.9993V3.99931C11.25 3.63931 11.5 3.32932 11.85 3.25932L21.85 1.25932C22.07 1.21932 22.3 1.26932 22.47 1.41932C22.64 1.55932 22.74 1.77931 22.74 1.99931V10.9993C22.75 11.4093 22.41 11.7493 22 11.7493ZM12.75 10.2493H21.25V2.91932L12.75 4.6193V10.2493Z',\n 'M22 22.75C21.95 22.75 21.9 22.75 21.85 22.74L11.85 20.74C11.5 20.67 11.25 20.36 11.25 20V13C11.25 12.59 11.59 12.25 12 12.25H22C22.41 12.25 22.75 12.59 22.75 13V22C22.75 22.22 22.65 22.44 22.48 22.58C22.34 22.69 22.17 22.75 22 22.75ZM12.75 19.38L21.25 21.08V13.75H12.75V19.38Z',\n 'M10 11.7501H2C1.59 11.7501 1.25 11.4101 1.25 11.0001V6.00014C1.25 5.65014 1.50003 5.34013 1.84003 5.27013L9.84003 3.57015C10.06 3.52015 10.29 3.58014 10.47 3.72014C10.65 3.86014 10.75 4.08013 10.75 4.30013V11.0001C10.75 11.4101 10.41 11.7501 10 11.7501ZM2.75 10.2501H9.25V5.23015L2.75 6.61013V10.2501Z',\n 'M10 20.45C9.95 20.45 9.90003 20.44 9.84003 20.43L1.84003 18.73C1.49003 18.66 1.25 18.35 1.25 18V13C1.25 12.59 1.59 12.25 2 12.25H10C10.41 12.25 10.75 12.59 10.75 13V19.7C10.75 19.93 10.65 20.14 10.47 20.28C10.34 20.39 10.17 20.45 10 20.45ZM2.75 17.39L9.25 18.77V13.75H2.75V17.39Z',\n ],\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n strokeWidth: 0,\n },\n\n microphone: {\n path: [\n 'M19.1199 9.12035C18.7299 9.12035 18.4199 9.43035 18.4199 9.82035V11.4004C18.4199 14.9404 15.5399 17.8204 11.9999 17.8204C8.45993 17.8204 5.57993 14.9404 5.57993 11.4004V9.81035C5.57993 9.42035 5.26993 9.11035 4.87993 9.11035C4.48993 9.11035 4.17993 9.42035 4.17993 9.81035V11.3904C4.17993 15.4604 7.30993 18.8104 11.2999 19.1704V21.3004C11.2999 21.6904 11.6099 22.0004 11.9999 22.0004C12.3899 22.0004 12.6999 21.6904 12.6999 21.3004V19.1704C16.6799 18.8204 19.8199 15.4604 19.8199 11.3904V9.81035C19.8099 9.43035 19.4999 9.12035 19.1199 9.12035Z',\n 'M12.0001 2C9.56008 2 7.58008 3.98 7.58008 6.42V11.54C7.58008 13.98 9.56008 15.96 12.0001 15.96C14.4401 15.96 16.4201 13.98 16.4201 11.54V6.42C16.4201 3.98 14.4401 2 12.0001 2ZM13.3101 8.95C13.2401 9.21 13.0101 9.38 12.7501 9.38C12.7001 9.38 12.6501 9.37 12.6001 9.36C12.2101 9.25 11.8001 9.25 11.4101 9.36C11.0901 9.45 10.7801 9.26 10.7001 8.95C10.6101 8.64 10.8001 8.32 11.1101 8.24C11.7001 8.08 12.3201 8.08 12.9101 8.24C13.2101 8.32 13.3901 8.64 13.3101 8.95ZM13.8401 7.01C13.7501 7.25 13.5301 7.39 13.2901 7.39C13.2201 7.39 13.1601 7.38 13.0901 7.36C12.3901 7.1 11.6101 7.1 10.9101 7.36C10.6101 7.47 10.2701 7.31 10.1601 7.01C10.0501 6.71 10.2101 6.37 10.5101 6.27C11.4701 5.92 12.5301 5.92 13.4901 6.27C13.7901 6.38 13.9501 6.71 13.8401 7.01Z',\n ],\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n strokeWidth: 0,\n },\n};\n\n/**\n * Helper function to get icon data\n */\nexport function getIcon(name: string): SvgIcon | undefined {\n return ICONS[name];\n}\n\n/**\n * Helper function to check if icon exists\n */\nexport function hasIcon(name: string): boolean {\n return name in ICONS;\n}\n","import { InjectionToken, makeEnvironmentProviders, type EnvironmentProviders } from '@angular/core';\nimport type { SvgIcon } from '../icon/icons';\n\nexport type UiTranslator = (text: string, parameters?: Record<string, string | number>) => string;\n\nexport interface MediaSelectorRequest {\n mediaType: string;\n allowUpload: boolean;\n selectionMode: 'single' | 'multiple';\n}\n\nexport type MediaSelector = (request: MediaSelectorRequest) => Promise<string | null | undefined>;\n\nexport interface HarmolodyUiConfig {\n translate?: UiTranslator;\n icons?: Record<string, SvgIcon>;\n selectMedia?: MediaSelector;\n}\n\nexport const HARMOLODY_UI_CONFIG = new InjectionToken<HarmolodyUiConfig>('Harmolody UI config', {\n providedIn: 'root',\n factory: () => ({}),\n});\n\nexport const HARMOLODY_MEDIA_SELECTOR = new InjectionToken<MediaSelector | null>(\n 'Harmolody media selector',\n { providedIn: 'root', factory: () => null },\n);\n\nexport function provideHarmolodyUi(config: HarmolodyUiConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: HARMOLODY_UI_CONFIG, useValue: config },\n { provide: HARMOLODY_MEDIA_SELECTOR, useValue: config.selectMedia ?? null },\n ]);\n}\n","import { Component, computed, inject, input, ChangeDetectionStrategy } from '@angular/core';\nimport { getIcon } from './icons';\nimport { HARMOLODY_UI_CONFIG } from '../config/ui-config';\n\n@Component({\n selector: 'hui-icon',\n host: {\n '[class]': 'customClass()',\n '[attr.role]': 'ariaLabel() ? \"img\" : null',\n '[attr.aria-hidden]': 'ariaLabel() ? null : true',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n template: `\n @if (iconData()) {\n <svg\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n [attr.viewBox]=\"iconData()?.viewBox || '0 0 24 24'\"\n [attr.fill]=\"iconData()?.fill || 'none'\"\n [attr.stroke]=\"iconData()?.stroke || 'currentColor'\"\n [attr.stroke-width]=\"iconData()?.strokeWidth || 2\"\n [attr.stroke-linecap]=\"iconData()?.stroke ? 'round' : undefined\"\n [attr.stroke-linejoin]=\"iconData()?.stroke ? 'round' : undefined\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n @if (paths(); as pathList) {\n @for (path of pathList; track $index) {\n <path [attr.d]=\"path\" />\n }\n }\n </svg>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n `\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n svg {\n display: block;\n }\n `,\n ],\n})\nexport class IconComponent {\n private readonly config = inject(HARMOLODY_UI_CONFIG);\n /** Icon name from the icons constant */\n name = input.required<string>();\n\n /** Size in pixels */\n size = input<number>(24);\n\n /** Custom CSS classes */\n customClass = input<string>('');\n\n /** Accessible label for the icon */\n ariaLabel = input<string>('');\n\n /** Get icon data from the icons constant */\n protected readonly iconData = computed(() => {\n return this.config.icons?.[this.name()] ?? getIcon(this.name());\n });\n\n /** Convert path to array for consistent handling */\n protected readonly paths = computed(() => {\n const icon = this.iconData();\n if (!icon) return null;\n return Array.isArray(icon.path) ? icon.path : [icon.path];\n });\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HARMOLODY_UI_CONFIG } from './ui-config';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationService {\n private readonly config = inject(HARMOLODY_UI_CONFIG);\n\n translate(text: string | null | undefined, parameters?: Record<string, string | number>): string {\n if (!text) return '';\n if (this.config.translate) return this.config.translate(text, parameters);\n return text.replace(/\\{([^}]+)\\}/g, (placeholder: string, key: string) =>\n parameters?.[key] === undefined ? placeholder : String(parameters[key]),\n );\n }\n}\n","import { Component, forwardRef, input, ChangeDetectionStrategy } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { FieldConfig } from '../../models';\nimport { DynamicFieldComponent } from '../dynamic-field/dynamic-field';\n\n/**\n * Wrapper component to break circular dependency between FormArrayFieldComponent and DynamicFieldComponent\n */\n@Component({\n selector: 'hui-form-array-item',\n template: `\n <div [class]=\"layoutClass()\">\n @for (childField of fields(); track childField.key) {\n <hui-dynamic-field\n [field]=\"childField\"\n [form]=\"form()\"\n [fieldLayout]=\"fieldLayout()\"\n [apiConfig]=\"apiConfig()\"\n [validationStrategy]=\"validationStrategy()\"\n [formSubmitted]=\"formSubmitted()\"\n />\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ReactiveFormsModule, forwardRef(() => DynamicFieldComponent)],\n})\nexport class FormArrayItemComponent {\n fields = input.required<FieldConfig[]>();\n form = input.required<FormGroup>();\n fieldLayout = input<'column' | 'row' | 'stacked'>('column');\n apiConfig = input<{ baseUrl?: string; headers?: Record<string, string> }>();\n validationStrategy = input<'touched' | 'submit'>('touched');\n formSubmitted = input<boolean>(false);\n layoutClass = input<string>('space-y-4');\n}\n","import {\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormArray, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { FieldConfig } from '../../models';\nimport { FormBuilderService } from '../../services';\nimport { FormHelperComponent } from '../../../forms/form-helper/form-helper';\nimport { IconComponent } from '../../../icon';\nimport { LocalizationService } from '../../../config/ui-localization';\nimport { FormArrayItemComponent } from './form-array-item';\n\n@Component({\n selector: 'hui-form-array-field',\n templateUrl: './form-array-field.html',\n styleUrls: ['./form-array-field.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ReactiveFormsModule, IconComponent, FormArrayItemComponent, FormHelperComponent],\n})\nexport class FormArrayFieldComponent {\n field = input.required<FieldConfig>();\n form = input.required<FormGroup>();\n fieldLayout = input<'column' | 'row' | 'stacked'>('column');\n apiConfig = input<{ baseUrl?: string; headers?: Record<string, string> }>();\n validationStrategy = input<'touched' | 'submit'>('touched');\n formSubmitted = input<boolean>(false);\n\n private readonly formBuilder = inject(FormBuilderService);\n protected readonly localization = inject(LocalizationService);\n\n protected readonly expandedItems = signal<Set<number>>(new Set([0])); // First item expanded by default\n protected readonly arrayLength = signal<number>(0);\n\n protected readonly formArray = computed(() => {\n return this.form().get(this.field().key) as FormArray;\n });\n\n protected readonly items = computed(() => {\n const length = this.arrayLength();\n return Array.from({ length }, (_, i) => i);\n });\n\n constructor() {\n // Sync array length whenever the form or field changes\n effect(() => {\n const array = this.formArray();\n if (array) {\n this.arrayLength.set(array.length);\n }\n });\n }\n\n protected readonly canAddMore = computed(() => {\n const field = this.field();\n const maxItems = field.maxItems;\n const currentLength = this.arrayLength();\n return maxItems === undefined || currentLength < maxItems;\n });\n\n protected readonly canRemove = computed(() => {\n const field = this.field();\n const minItems = field.minItems || 0;\n const currentLength = this.arrayLength();\n const canRemoveAll = field.canRemoveAll !== false;\n\n if (!canRemoveAll && currentLength === 1) {\n return false;\n }\n\n return currentLength > minItems;\n });\n\n protected readonly addButtonLabel = computed(() => {\n return this.localization.translate(this.field().addButtonLabel || 'Add Item');\n });\n\n protected readonly removeButtonLabel = computed(() => {\n return this.localization.translate(this.field().removeButtonLabel || 'Remove');\n });\n\n protected readonly itemLabel = computed(() => {\n return (index: number): string => {\n const template = this.field().itemLabel || 'Item {index}';\n return this.localization\n .translate(template, { index: index + 1 })\n .replace('{index}', String(index + 1));\n };\n });\n\n protected getItemGroup(index: number): FormGroup {\n const array = this.formArray();\n return array.at(index) as FormGroup;\n }\n\n protected addItem(): void {\n if (!this.canAddMore()) return;\n\n const field = this.field();\n const array = this.formArray();\n\n if (!field.arrayFields || !array) return;\n\n const newGroup = this.formBuilder.createFormGroupFromFields(field.arrayFields);\n array.push(newGroup);\n\n // Update length signal\n this.arrayLength.set(array.length);\n\n // Expand the newly added item\n const newIndex = array.length - 1;\n this.expandedItems.update((set) => {\n set.add(newIndex);\n return new Set(set);\n });\n }\n\n protected removeItem(index: number): void {\n if (!this.canRemove()) return;\n\n const array = this.formArray();\n if (!array) return;\n\n array.removeAt(index);\n this.arrayLength.set(array.length);\n\n // Update expanded items indices\n this.expandedItems.update((set) => {\n const newSet = new Set<number>();\n set.forEach((i) => {\n if (i < index) {\n newSet.add(i);\n } else if (i > index) {\n newSet.add(i - 1);\n }\n });\n return newSet;\n });\n }\n\n protected toggleItem(index: number): void {\n this.expandedItems.update((set) => {\n const newSet = new Set(set);\n if (newSet.has(index)) {\n newSet.delete(index);\n } else {\n newSet.add(index);\n }\n return newSet;\n });\n }\n\n protected isExpanded(index: number): boolean {\n return this.expandedItems().has(index);\n }\n\n protected getArrayLayoutClass(): string {\n const field = this.field();\n const layout = field.arrayLayout || 'vertical';\n const columns = field.arrayColumns || 1;\n\n if (layout === 'grid' && columns > 1) {\n return [\n 'grid gap-2 grid-cols-1 md:grid-cols-1',\n 'grid gap-2 grid-cols-1 md:grid-cols-2',\n 'grid gap-2 grid-cols-1 md:grid-cols-3',\n ][Math.max(1, Math.min(columns, 3)) - 1];\n }\n\n return 'space-y-4';\n }\n}\n","<div\n [class]=\"\n fieldLayout() === 'row'\n ? 'form-array-field grid grid-cols-1 gap-2 md:grid-cols-[minmax(10rem,14rem)_minmax(0,1fr)] md:gap-x-6'\n : 'form-array-field'\n \"\n>\n <!-- Array Header -->\n <div class=\"mb-4\">\n <div class=\"flex flex-col\">\n <div class=\"flex items-center\">\n <label class=\"block font-medium text-text-secondary\">\n {{ localization.translate(field().label) }}\n @if (field().required) {\n <span class=\"text-red-500 ml-1\">*</span>\n }\n </label>\n @if (field().helper) {\n <hui-form-helper [id]=\"field().key + '-array-helper'\" [label]=\"field().label\">\n {{ localization.translate(field().helper) }}\n </hui-form-helper>\n }\n </div>\n @if (field().description) {\n <p class=\"text-muted-foreground\">{{ localization.translate(field().description) }}</p>\n }\n @if (field().hint) {\n <p class=\"text-sm text-muted-foreground mt-1\">\n {{ localization.translate(field().hint) }}\n </p>\n }\n </div>\n </div>\n\n <div>\n <div class=\"mb-4 flex justify-end\">\n <button\n type=\"button\"\n (click)=\"addItem()\"\n [disabled]=\"!canAddMore()\"\n class=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-linear-to-r from-purple-600 to-indigo-700 rounded hover:from-purple-700 hover:to-indigo-800 focus:outline-none focus:ring-2 focus:ring-purple-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <hui-icon name=\"plus\" [size]=\"16\" />\n <span>{{ addButtonLabel() }}</span>\n </button>\n </div>\n\n <!-- Array Items -->\n @if (items().length > 0) {\n <div class=\"space-y-3\">\n @for (itemIndex of items(); track itemIndex) {\n <div class=\"border border-border rounded bg-surface shadow-sm\">\n <!-- Item Header -->\n <div\n [class]=\"`flex items-center justify-between px-4 py-3 cursor-pointer hover:bg-surface transition-colors ${isExpanded(itemIndex) ? 'rounded-t-md border-b border-border' : 'rounded'}`\"\n (click)=\"toggleItem(itemIndex)\"\n >\n <div class=\"flex items-center gap-3\">\n <button\n type=\"button\"\n class=\"text-muted-foreground hover:text-text-secondary focus:outline-none flex items-center justify-center\"\n >\n <hui-icon\n [name]=\"isExpanded(itemIndex) ? 'chevron-down' : 'chevron-right'\"\n [size]=\"20\"\n />\n </button>\n <span class=\"font-medium text-text-primary\">\n {{ itemLabel()(itemIndex) }}\n </span>\n </div>\n\n <button\n type=\"button\"\n (click)=\"removeItem(itemIndex); $event.stopPropagation()\"\n [disabled]=\"!canRemove()\"\n class=\"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium text-red-600 bg-red-50 rounded hover:bg-red-100 focus:outline-none focus:ring-2 focus:ring-red-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n [attr.title]=\"removeButtonLabel()\"\n >\n <hui-icon name=\"trash\" [size]=\"14\" />\n <span>{{ removeButtonLabel() }}</span>\n </button>\n </div>\n\n <!-- Item Content -->\n @if (isExpanded(itemIndex)) {\n <div class=\"p-4\">\n <hui-form-array-item\n [fields]=\"field().arrayFields || []\"\n [form]=\"getItemGroup(itemIndex)\"\n [fieldLayout]=\"fieldLayout()\"\n [apiConfig]=\"apiConfig()\"\n [validationStrategy]=\"validationStrategy()\"\n [formSubmitted]=\"formSubmitted()\"\n [layoutClass]=\"getArrayLayoutClass()\"\n />\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"text-center py-8 px-4 border-2 border-dashed border-border rounded-lg bg-muted\">\n <hui-icon name=\"inbox\" [size]=\"48\" class=\"text-muted-foreground mx-auto mb-3\" />\n <p class=\"text-muted-foreground mb-3\">\n {{ localization.translate('No items added yet') }}\n </p>\n <button\n type=\"button\"\n (click)=\"addItem()\"\n class=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-purple-600 bg-surface border border-purple-600 rounded-lg hover:bg-purple-50 focus:outline-none focus:ring-2 focus:ring-purple-500\"\n >\n <hui-icon name=\"plus\" [size]=\"16\" />\n <span>{{ addButtonLabel() }}</span>\n </button>\n </div>\n }\n\n <!-- Min/Max Info -->\n @if (field().minItems || field().maxItems) {\n <div class=\"mt-2 text-sm text-muted-foreground\">\n @if (field().minItems && field().maxItems) {\n <span>\n {{\n localization.translate('{min} - {max} items', {\n min: field().minItems!,\n max: field().maxItems!,\n })\n }}\n </span>\n } @else if (field().minItems) {\n <span>{{\n localization.translate('Minimum {count} items', { count: field().minItems! })\n }}</span>\n } @else if (field().maxItems) {\n <span>{{\n localization.translate('Maximum {count} items', { count: field().maxItems! })\n }}</span>\n }\n </div>\n }\n </div>\n</div>\n","import { twMerge } from 'tailwind-merge';\n\nexport const FORM_CONTROL_BASE_CLASSES =\n 'w-full pl-3 pr-3 py-2 border rounded-lg shadow placeholder-gray-400 focus:outline-none focus:ring-1 bg-surface placeholder:text-md disabled:opacity-50 disabled:cursor-not-allowed';\n\nconst FORM_CONTROL_ERROR_CLASSES = 'border-red-300 focus:ring-red-500 focus:border-red-500';\nconst FORM_CONTROL_NORMAL_CLASSES =\n 'border-border focus:ring-purple-500 focus:border-purple-500 focus:shadow-purple-100';\n\ninterface FormControlClassOptions {\n invalid?: boolean;\n additionalClasses?: string;\n customClasses?: string;\n}\n\nexport function buildFormControlClasses(options: FormControlClassOptions = {}): string {\n const { invalid = false, additionalClasses = '', customClasses = '' } = options;\n\n return twMerge(\n FORM_CONTROL_BASE_CLASSES,\n invalid ? FORM_CONTROL_ERROR_CLASSES : FORM_CONTROL_NORMAL_CLASSES,\n additionalClasses,\n customClasses,\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { LocalizationService } from '../../config/ui-localization';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\nimport { IconComponent } from '../../icon';\nimport { debounceTime, distinctUntilChanged, Subject } from 'rxjs';\n\nexport interface AutocompleteOption {\n label: string;\n value: any;\n disabled?: boolean;\n [key: string]: any;\n}\n\n/**\n * Configuration for an action button alongside the autocomplete\n */\nexport interface AutocompleteActionButton {\n /** Icon name from the icon set */\n icon: string;\n /** Aria label for accessibility */\n ariaLabel: string;\n /** Tooltip text (optional) */\n tooltip?: string;\n}\n\n@Component({\n selector: 'hui-autocomplete',\n imports: [IconComponent],\n templateUrl: './autocomplete.html',\n styleUrls: ['./autocomplete.css'],\n host: {\n '[class]': '\"block w-full relative\"',\n '(document:click)': 'onDocumentClick($event)',\n '(window:resize)': 'onViewportChange()',\n '(window:scroll)': 'onViewportChange()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AutocompleteComponent),\n multi: true,\n },\n ],\n})\nexport class AutocompleteComponent implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef);\n protected readonly localization = inject(LocalizationService);\n private searchSubject = new Subject<string>();\n private readonly scrollParents: HTMLElement[] = [];\n private readonly onScrollParentChange = () => this.onViewportChange();\n\n // Inputs\n id = input<string>('');\n placeholder = input<string>('Search...');\n mode = input<'local' | 'server'>('local');\n options = input<AutocompleteOption[]>([]);\n serverResults = input<AutocompleteOption[]>([]);\n loading = input<boolean>(false);\n minChars = input<number>(1);\n debounce = input<number>(300);\n displayFn = input<((option: any) => string) | undefined>(undefined);\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n /** Enable multiple selection with checkboxes */\n multiple = input<boolean>(false);\n /** Action button configuration */\n action = input<AutocompleteActionButton | undefined>(undefined);\n\n // Outputs\n search = output<string>();\n select = output<any>();\n /** Emits when the action button is clicked */\n actionClick = output<void>();\n\n // State\n protected readonly inputValue = signal<string>('');\n protected readonly isOpen = signal<boolean>(false);\n protected readonly selectedIndex = signal<number>(-1);\n protected readonly value = signal<any>(null);\n protected readonly selectedValues = signal<any[]>([]);\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly dropdownPlacement = signal<'up' | 'down'>('down');\n protected readonly dropdownMaxHeight = signal<number>(240);\n protected readonly isInvalid = computed(() => this.invalid());\n protected readonly hasAction = computed(() => !!this.action());\n protected readonly isMultiple = computed(() => this.multiple());\n\n /** Display text for multi-select showing count of selected items */\n protected readonly displayText = computed(() => {\n if (!this.isMultiple()) return this.inputValue();\n const selected = this.selectedValues();\n if (selected.length === 0) return '';\n if (selected.length === 1) {\n const option = this.findOption(selected[0]);\n return option?.label || String(selected[0]);\n }\n return `${selected.length} items selected`;\n });\n\n // View children\n protected readonly inputElement = viewChild<ElementRef>('inputEl');\n protected readonly dropdownElement = viewChild<ElementRef>('dropdown');\n\n // Computed\n protected readonly filteredOptions = computed(() => {\n const query = this.inputValue();\n const modeValue = this.mode();\n\n if (modeValue === 'server') {\n return this.serverResults();\n }\n\n // Local filtering\n if (!query || query.length < this.minChars()) {\n return this.options();\n }\n\n const lowerQuery = query.toLowerCase();\n return this.options().filter((option) => option.label.toLowerCase().includes(lowerQuery));\n });\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({\n invalid: this.isInvalid(),\n additionalClasses: 'pl-3 pr-3',\n });\n });\n\n protected readonly dropdownClasses = computed(() => {\n const baseClasses =\n 'absolute z-50 w-full bg-surface border border-border rounded-xl shadow-xl overflow-auto p-2 gap-1 flex flex-col';\n const placementClasses =\n this.dropdownPlacement() === 'up' ? 'bottom-full mb-1' : 'top-full mt-1';\n\n return `${baseClasses} ${placementClasses}`;\n });\n\n private onChange: (value: any) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n // Setup debounced search\n this.searchSubject\n .pipe(debounceTime(this.debounce()), distinctUntilChanged())\n .subscribe((query) => {\n if (this.mode() === 'server' && query.length >= this.minChars()) {\n this.search.emit(query);\n }\n });\n\n // Watch for serverResults changes to update display value when options are loaded\n effect(() => {\n const results = this.serverResults();\n const currentValue = this.value();\n\n // If we have a value but the display is showing the raw ID (not a label),\n // try to find the matching option and update the display\n if (currentValue && results.length > 0) {\n const option = results.find((opt) => opt.value === currentValue);\n if (option && this.inputValue() !== option.label) {\n // Only update if the current input value looks like an ID (not a label)\n const currentInput = this.inputValue();\n const isShowingId = currentInput === String(currentValue) || currentInput === '';\n if (isShowingId) {\n this.inputValue.set(option.label);\n }\n }\n }\n });\n\n effect(() => {\n if (this.isOpen()) {\n this.registerScrollParents();\n setTimeout(() => this.updateDropdownPlacement());\n return;\n }\n\n this.unregisterScrollParents();\n });\n }\n\n ngOnDestroy(): void {\n this.unregisterScrollParents();\n this.searchSubject.complete();\n }\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const query = target.value;\n this.inputValue.set(query);\n this.isOpen.set(true);\n this.updateDropdownPlacement();\n this.selectedIndex.set(-1);\n\n if (!this.isMultiple()) {\n // Clear the value when user types to ensure form stays in sync\n // Only emit null if there was a previous value\n if (this.value() !== null) {\n this.value.set(null);\n this.onChange(null);\n }\n }\n\n // Emit search for server mode\n if (this.mode() === 'server') {\n this.searchSubject.next(query);\n }\n }\n\n protected onKeyDown(event: KeyboardEvent): void {\n const options = this.filteredOptions();\n\n if (this.isOpen()) {\n this.updateDropdownPlacement();\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.selectedIndex.update((i) => Math.min(i + 1, options.length - 1));\n this.scrollToSelected();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.selectedIndex.update((i) => Math.max(i - 1, -1));\n this.scrollToSelected();\n break;\n\n case 'Enter':\n event.preventDefault();\n const index = this.selectedIndex();\n if (index >= 0 && options[index]) {\n this.selectOption(options[index]);\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.isOpen.set(false);\n this.selectedIndex.set(-1);\n break;\n\n case 'Tab':\n this.isOpen.set(false);\n break;\n }\n }\n\n protected onFocus(): void {\n // Always open dropdown on focus if there are options or we're in server mode\n const hasOptions = this.mode() === 'server' || this.options().length > 0;\n if (hasOptions) {\n this.isOpen.set(true);\n this.updateDropdownPlacement();\n\n // If in server mode and (input is empty OR multi-select mode), trigger initial search\n if (this.mode() === 'server' && (this.inputValue().length === 0 || this.isMultiple())) {\n this.search.emit('');\n }\n }\n }\n\n protected onBlur(): void {\n this.onTouched();\n // Delay to allow click on option\n setTimeout(() => {\n this.isOpen.set(false);\n }, 200);\n }\n\n protected selectOption(option: AutocompleteOption): void {\n if (option.disabled) return;\n\n if (this.isMultiple()) {\n // Toggle selection for multi-select\n const currentValues = this.selectedValues();\n const index = currentValues.indexOf(option.value);\n\n if (index >= 0) {\n // Deselect\n const newValues = currentValues.filter((v) => v !== option.value);\n this.selectedValues.set(newValues);\n this.onChange(newValues);\n } else {\n // Select\n const newValues = [...currentValues, option.value];\n this.selectedValues.set(newValues);\n this.onChange(newValues);\n }\n this.select.emit(this.selectedValues());\n this.inputValue.set('');\n if (this.mode() === 'server') {\n this.search.emit('');\n }\n // Keep dropdown open for multi-select\n } else {\n // Single select\n this.value.set(option.value);\n this.inputValue.set(option.label);\n this.onChange(option.value);\n this.select.emit(option.value);\n this.isOpen.set(false);\n this.selectedIndex.set(-1);\n }\n }\n\n protected clearSelection(): void {\n if (this.isMultiple()) {\n this.selectedValues.set([]);\n this.onChange([]);\n } else {\n this.value.set(null);\n this.onChange(null);\n }\n this.inputValue.set('');\n this.isOpen.set(false);\n this.inputElement()?.nativeElement.focus();\n }\n\n protected onActionClick(): void {\n this.actionClick.emit();\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.contains(event.target)) {\n this.isOpen.set(false);\n }\n }\n\n protected onViewportChange(): void {\n if (!this.isOpen()) {\n return;\n }\n\n this.updateDropdownPlacement();\n }\n\n private updateDropdownPlacement(): void {\n const inputElement = this.inputElement()?.nativeElement as HTMLElement | undefined;\n if (!inputElement) {\n return;\n }\n\n const viewportPadding = 12;\n const preferredHeight = 240;\n const minimumHeight = 120;\n const rect = inputElement.getBoundingClientRect();\n const clippingParent = this.findClippingParent(inputElement);\n const clippingRect = clippingParent?.getBoundingClientRect();\n const boundaryTop = Math.max(viewportPadding, clippingRect?.top ?? viewportPadding);\n const boundaryBottom = Math.min(\n window.innerHeight - viewportPadding,\n clippingRect?.bottom ?? window.innerHeight - viewportPadding,\n );\n\n const spaceBelow = boundaryBottom - rect.bottom;\n const spaceAbove = rect.top - boundaryTop;\n const shouldOpenUp = spaceBelow < minimumHeight && spaceAbove > spaceBelow;\n const availableSpace = shouldOpenUp ? spaceAbove : spaceBelow;\n\n this.dropdownPlacement.set(shouldOpenUp ? 'up' : 'down');\n this.dropdownMaxHeight.set(Math.max(minimumHeight, Math.min(preferredHeight, availableSpace)));\n }\n\n private findClippingParent(element: HTMLElement): HTMLElement | null {\n let parent = element.parentElement;\n\n while (parent) {\n const styles = window.getComputedStyle(parent);\n const overflowY = styles.overflowY;\n const overflowX = styles.overflowX;\n const isClippingY = overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'hidden';\n const isClippingX = overflowX === 'auto' || overflowX === 'scroll' || overflowX === 'hidden';\n\n if (isClippingY || isClippingX) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return null;\n }\n\n private registerScrollParents(): void {\n this.unregisterScrollParents();\n\n const inputElement = this.inputElement()?.nativeElement as HTMLElement | undefined;\n if (!inputElement) {\n return;\n }\n\n let parent = inputElement.parentElement;\n while (parent) {\n const styles = window.getComputedStyle(parent);\n const overflowY = styles.overflowY;\n const overflowX = styles.overflowX;\n const isScrollableY = overflowY === 'auto' || overflowY === 'scroll';\n const isScrollableX = overflowX === 'auto' || overflowX === 'scroll';\n\n if (isScrollableY || isScrollableX) {\n parent.addEventListener('scroll', this.onScrollParentChange, { passive: true });\n this.scrollParents.push(parent);\n }\n\n parent = parent.parentElement;\n }\n }\n\n private unregisterScrollParents(): void {\n for (const parent of this.scrollParents) {\n parent.removeEventListener('scroll', this.onScrollParentChange);\n }\n\n this.scrollParents.length = 0;\n }\n\n private scrollToSelected(): void {\n setTimeout(() => {\n this.updateDropdownPlacement();\n const dropdown = this.dropdownElement()?.nativeElement;\n const selectedElement = dropdown?.querySelector('.selected');\n selectedElement?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n private getDisplayValue(value: any): string {\n const displayFunc = this.displayFn();\n if (displayFunc) {\n return displayFunc(value);\n }\n\n // Find option by value\n const allOptions = this.mode() === 'server' ? this.serverResults() : this.options();\n const option = allOptions.find((opt) => opt.value === value);\n return option?.label || String(value);\n }\n\n // ControlValueAccessor implementation\n writeValue(value: any): void {\n if (this.isMultiple()) {\n const values = Array.isArray(value) ? value : value ? [value] : [];\n this.selectedValues.set(values);\n this.inputValue.set('');\n } else {\n this.value.set(value);\n if (value) {\n const displayValue = this.getDisplayValue(value);\n this.inputValue.set(displayValue);\n } else {\n this.inputValue.set('');\n }\n }\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n\n /** Check if an option is selected (for multi-select) */\n protected isOptionSelected(option: AutocompleteOption): boolean {\n if (!this.isMultiple()) return false;\n return this.selectedValues().includes(option.value);\n }\n\n /** Find option by value in all available options */\n private findOption(value: any): AutocompleteOption | undefined {\n const allOptions = this.mode() === 'server' ? this.serverResults() : this.options();\n return allOptions.find((opt) => opt.value === value);\n }\n\n /** Get all selected option objects (for multi-select) */\n public getSelectedOptions(): AutocompleteOption[] {\n if (!this.isMultiple()) {\n const val = this.value();\n const option = val ? this.findOption(val) : undefined;\n return option ? [option] : [];\n }\n return this.selectedValues()\n .map((v) => this.findOption(v))\n .filter((opt): opt is AutocompleteOption => !!opt);\n }\n}\n","<div [class]=\"hasAction() ? 'flex items-center gap-2' : ''\">\n <div class=\"relative flex-1\">\n <div class=\"relative\">\n <input\n #inputEl\n [id]=\"id()\"\n type=\"text\"\n [value]=\"isMultiple() && !isOpen() && !inputValue() ? displayText() : inputValue()\"\n [placeholder]=\"localization.translate(placeholder())\"\n [disabled]=\"isDisabled()\"\n [readonly]=\"false\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [attr.aria-label]=\"localization.translate(ariaLabel() || placeholder())\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-autocomplete]=\"'list'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"id() + '-listbox'\"\n [attr.role]=\"'combobox'\"\n [class]=\"inputClasses()\"\n />\n\n <!-- Loading spinner -->\n @if (loading()) {\n <div class=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none\">\n <svg class=\"animate-spin h-5 w-5 text-muted-foreground\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle\n class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n ></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n </div>\n }\n\n <!-- Clear button -->\n @if (\n !loading() &&\n ((isMultiple() && selectedValues().length > 0) || (!isMultiple() && value())) &&\n !isDisabled()\n ) {\n <button\n type=\"button\"\n (click)=\"clearSelection()\"\n class=\"absolute inset-y-0 right-0 flex items-center pr-3\"\n [attr.aria-label]=\"localization.translate('Clear selection')\"\n >\n <svg\n class=\"h-5 w-5 text-muted-foreground hover:text-text-muted\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n }\n\n <!-- Dropdown arrow -->\n @if (\n !loading() &&\n ((isMultiple() && selectedValues().length === 0) || (!isMultiple() && !value()))\n ) {\n <div class=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none\">\n <svg\n class=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </div>\n }\n </div>\n\n <!-- Dropdown -->\n @if (isOpen() && !isDisabled()) {\n <div\n #dropdown\n [id]=\"id() + '-listbox'\"\n role=\"listbox\"\n (mousedown)=\"$event.preventDefault()\"\n [class]=\"dropdownClasses()\"\n [style.max-height.px]=\"dropdownMaxHeight()\"\n >\n @if (loading()) {\n <div class=\"px-3 py-2 text-muted-foreground text-center\">\n {{ localization.translate('Loading...') }}\n </div>\n } @else if (filteredOptions().length === 0) {\n <div class=\"px-3 py-2 text-muted-foreground text-center\">\n {{ localization.translate('No results found') }}\n </div>\n } @else {\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <div\n role=\"option\"\n [attr.aria-selected]=\"\n isMultiple() ? isOptionSelected(option) : value() === option.value\n \"\n [attr.aria-disabled]=\"option.disabled || null\"\n (click)=\"selectOption(option)\"\n [class]=\"\n 'px-3 py-2 cursor-pointer rounded flex items-center gap-2 ' +\n (i === selectedIndex() ? 'bg-blue-100 selected ' : '') +\n (isMultiple() && isOptionSelected(option)\n ? 'bg-blue-50 '\n : !isMultiple() && value() === option.value\n ? 'bg-blue-50 font-medium '\n : '') +\n (option.disabled ? 'opacity-50 cursor-not-allowed ' : 'hover:bg-surface')\n \"\n >\n @if (isMultiple()) {\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(option)\"\n class=\"h-4 w-4 text-purple-600 border-border rounded\"\n readonly\n />\n }\n <span class=\"flex-1\">{{ localization.translate(option.label) }}</span>\n </div>\n }\n }\n </div>\n }\n </div>\n\n @if (hasAction()) {\n <button\n type=\"button\"\n (click)=\"onActionClick()\"\n [attr.aria-label]=\"localization.translate(action()?.ariaLabel)\"\n [attr.title]=\"localization.translate(action()?.tooltip || action()?.ariaLabel)\"\n class=\"flex shrink-0 p-2 rounded border border-border bg-surface text-text-muted hover:bg-surface-hover hover:text-purple-600 focus:outline-none focus:ring-offset-1 transition-colors\"\n >\n <hui-icon [name]=\"action()!.icon\" [size]=\"20\" />\n </button>\n }\n</div>\n","import {\n Component,\n computed,\n forwardRef,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'hui-checkbox',\n template: `\n <div [class]=\"containerClasses()\">\n <input\n [id]=\"checkboxId()\"\n type=\"checkbox\"\n [checked]=\"value()\"\n (change)=\"onChange($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [class]=\"checkboxClasses()\"\n />\n @if (label()) {\n <label [for]=\"checkboxId()\" [class]=\"labelClasses()\">\n {{ label() }}\n </label>\n }\n </div>\n `,\n styles: `\n input[type='checkbox'] {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n width: 1.35rem;\n height: 1.35rem;\n border: 2px solid rgba(99, 99, 99, 0.3);\n border-radius: 0.45rem;\n cursor: pointer;\n position: relative;\n transition: all 0.15s ease-in-out;\n flex-shrink: 0;\n }\n\n input[type='checkbox']:hover:not(:disabled) {\n box-shadow: 0 0 0 3px rgba(147, 51, 234, 0.1);\n }\n\n input[type='checkbox']:focus {\n outline: none;\n border-color: #9333ea;\n }\n\n input[type='checkbox']:checked {\n background-color: #9333ea;\n border-color: #9333ea;\n }\n\n input[type='checkbox']:checked::after {\n content: '';\n position: absolute;\n left: 0.35rem;\n top: 0.155rem;\n width: 0.375rem;\n height: 0.625rem;\n border: solid white;\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n\n input[type='checkbox']:indeterminate {\n background-color: #9333ea;\n border-color: #9333ea;\n }\n\n input[type='checkbox']:indeterminate::after {\n content: '';\n position: absolute;\n left: 50%;\n top: 50%;\n width: 0.5rem;\n height: 0.125rem;\n background-color: white;\n transform: translate(-50%, -50%);\n }\n\n input[type='checkbox']:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background-color: #f3f4f6;\n }\n\n input[type='checkbox']:disabled:checked {\n background-color: #d1d5db;\n border-color: #d1d5db;\n }\n `,\n host: {\n '[class]': '\"block\"',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckboxComponent),\n multi: true,\n },\n ],\n})\nexport class CheckboxComponent implements ControlValueAccessor {\n id = input<string>('');\n label = input<string>('');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n class = input<string>('');\n fullWidth = input<boolean>(false);\n\n protected readonly value = signal<boolean>(false);\n protected readonly isDisabled = signal<boolean>(false);\n\n // Generate unique ID if not provided\n protected readonly checkboxId = computed(() => {\n const providedId = this.id();\n return providedId || `checkbox-${Math.random().toString(36).substring(2, 11)}`;\n });\n\n protected readonly checkboxClasses = computed(() => {\n const customClasses = this.class();\n return customClasses || '';\n });\n\n protected readonly containerClasses = computed(() =>\n this.fullWidth() ? 'flex w-full items-center' : 'flex items-center',\n );\n\n protected readonly labelClasses = computed(() => {\n const baseClasses = `ml-2 block select-none text-text-primary ${this.fullWidth() ? 'flex-1' : ''}`;\n const cursorClass = this.isDisabled() ? 'cursor-not-allowed opacity-50' : 'cursor-pointer';\n return `${baseClasses} ${cursorClass}`;\n });\n\n private onChangeFn: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n const value = target.checked;\n this.value.set(value);\n this.onChangeFn(value);\n }\n\n writeValue(value: boolean): void {\n this.value.set(value ?? false);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { LocalizationService } from '../../config/ui-localization';\nimport type { SelectOption } from '../../form-builder/models';\nimport { IconComponent } from '../../icon';\n\nexport type ChoiceChipsLayout = 'inline' | 'wrap';\nexport type ChoiceChipsValue = unknown | unknown[] | null;\n\nexport interface ChoiceChipsActionButton {\n icon: string;\n ariaLabel: string;\n tooltip?: string;\n}\n\nlet nextChoiceChipsId = 0;\n\n@Component({\n selector: 'hui-choice-chips',\n imports: [IconComponent],\n templateUrl: './choice-chips.html',\n host: {\n class: 'block',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ChoiceChipsComponent),\n multi: true,\n },\n ],\n})\nexport class ChoiceChipsComponent implements ControlValueAccessor {\n protected readonly localization = inject(LocalizationService);\n\n readonly id = input<string>('');\n readonly options = input<SelectOption[]>([]);\n readonly multiple = input<boolean>(false);\n readonly layout = input<ChoiceChipsLayout>('wrap');\n readonly ariaLabel = input<string>('');\n readonly ariaDescribedby = input<string>('');\n readonly invalid = input<boolean>(false);\n readonly action = input<ChoiceChipsActionButton | undefined>(undefined);\n\n readonly actionClick = output<void>();\n\n private readonly generatedId = `hui-choice-chips-${nextChoiceChipsId++}`;\n protected readonly value = signal<ChoiceChipsValue>(null);\n protected readonly isDisabled = signal(false);\n protected readonly controlId = computed(() => this.id() || this.generatedId);\n protected readonly groupClasses = computed(() =>\n this.layout() === 'inline'\n ? 'flex min-w-0 flex-1 flex-nowrap gap-2 overflow-x-auto py-0.5'\n : 'flex flex-1 flex-wrap gap-2 py-0.5',\n );\n\n private onChangeFn: (value: ChoiceChipsValue) => void = () => {};\n private onTouchedFn: () => void = () => {};\n\n protected optionId(index: number): string {\n return `${this.controlId()}-option-${index}`;\n }\n\n protected isSelected(option: SelectOption): boolean {\n const currentValue = this.value();\n const selectedValues = Array.isArray(currentValue)\n ? currentValue\n : currentValue === null || currentValue === ''\n ? []\n : [currentValue];\n\n return selectedValues.some((selectedValue) => Object.is(selectedValue, option.value));\n }\n\n protected optionClasses(option: SelectOption): string {\n const selectedClasses = this.isSelected(option)\n ? 'border-primary bg-primary/10 text-primary'\n : this.invalid()\n ? 'border-destructive bg-surface text-foreground hover:bg-surface-hover'\n : 'border-border bg-surface text-foreground hover:bg-surface-hover';\n const disabledClasses =\n this.isDisabled() || option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'cursor-pointer focus-within:ring-2 focus-within:ring-primary focus-within:ring-offset-2';\n\n return `inline-flex shrink-0 select-none items-center gap-1.5 rounded-full border px-3 py-2 font-medium transition-colors ${selectedClasses} ${disabledClasses}`;\n }\n\n protected selectOption(option: SelectOption): void {\n if (this.isDisabled() || option.disabled) {\n return;\n }\n\n if (this.multiple()) {\n const currentValue = this.value();\n const selectedValues = Array.isArray(currentValue) ? currentValue : [];\n const nextValue = this.isSelected(option)\n ? selectedValues.filter((selectedValue) => !Object.is(selectedValue, option.value))\n : [...selectedValues, option.value];\n\n this.value.set(nextValue);\n this.onChangeFn(nextValue);\n } else {\n this.value.set(option.value);\n this.onChangeFn(option.value);\n }\n\n this.onTouchedFn();\n }\n\n protected onBlur(): void {\n this.onTouchedFn();\n }\n\n protected onActionClick(): void {\n this.actionClick.emit();\n }\n\n writeValue(value: ChoiceChipsValue | undefined): void {\n if (this.multiple()) {\n this.value.set(Array.isArray(value) ? value : value == null || value === '' ? [] : [value]);\n return;\n }\n\n this.value.set(Array.isArray(value) ? (value[0] ?? null) : (value ?? null));\n }\n\n registerOnChange(fn: (value: ChoiceChipsValue) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","<div [class]=\"action() ? 'flex items-start gap-2' : ''\">\n <div\n [id]=\"controlId()\"\n [attr.role]=\"multiple() ? 'group' : 'radiogroup'\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-invalid]=\"invalid() || null\"\n [class]=\"groupClasses()\"\n >\n @for (option of options(); track $index; let index = $index) {\n <label [for]=\"optionId(index)\" [class]=\"optionClasses(option)\">\n <input\n [id]=\"optionId(index)\"\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [name]=\"controlId()\"\n [checked]=\"isSelected(option)\"\n [disabled]=\"isDisabled() || option.disabled\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n class=\"sr-only\"\n (change)=\"selectOption(option)\"\n (blur)=\"onBlur()\"\n />\n @if (isSelected(option)) {\n <hui-icon name=\"check\" [size]=\"16\" [ariaLabel]=\"localization.translate('Selected')\" />\n }\n <span>{{ localization.translate(option.label) }}</span>\n </label>\n } @empty {\n <p class=\"text-muted-foreground\">{{ localization.translate('No options available') }}</p>\n }\n </div>\n\n @if (action()) {\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"localization.translate(action()?.ariaLabel)\"\n [attr.title]=\"localization.translate(action()?.tooltip || action()?.ariaLabel)\"\n class=\"flex shrink-0 rounded-lg border border-border bg-surface p-2 text-muted-foreground transition-colors hover:bg-surface-hover hover:text-primary focus:outline-none focus:ring-1 focus:ring-primary disabled:cursor-not-allowed disabled:opacity-50\"\n (click)=\"onActionClick()\"\n >\n <hui-icon [name]=\"action()!.icon\" [size]=\"20\" />\n </button>\n }\n</div>\n","import {\n Component,\n computed,\n forwardRef,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\n\nexport type DateInputMode = 'date' | 'datetime-local' | 'month' | 'year';\n\n@Component({\n selector: 'hui-date-input',\n template: `\n <input\n [id]=\"id()\"\n [type]=\"inputType()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid()\"\n [class]=\"inputClasses()\"\n />\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateInputComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': '\"block w-full\"',\n },\n})\nexport class DateInputComponent implements ControlValueAccessor {\n id = input<string>('');\n mode = input<DateInputMode>('date');\n placeholder = input<string>('');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n class = input<string>('');\n min = input<string>('');\n max = input<string>('');\n\n protected readonly value = signal<string>('');\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.invalid());\n\n protected readonly inputType = computed(() => {\n const mode = this.mode();\n // For year mode, we use number input with custom handling\n if (mode === 'year') {\n return 'number';\n }\n return mode;\n });\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({\n invalid: this.isInvalid(),\n customClasses: this.class(),\n });\n });\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n let value = target.value;\n\n // Handle year mode specially\n if (this.mode() === 'year' && value) {\n // Ensure year is 4 digits\n const year = parseInt(value, 10);\n if (year >= 1000 && year <= 9999) {\n value = year.toString();\n }\n }\n\n this.value.set(value);\n this.onChange(value);\n }\n\n // ControlValueAccessor implementation\n writeValue(value: string): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n Component,\n computed,\n forwardRef,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\n\n@Component({\n selector: 'hui-email-input',\n template: `\n <input\n [id]=\"id()\"\n type=\"email\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [class]=\"inputClasses()\"\n />\n `,\n host: {\n '[class]': '\"block w-full\"',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EmailInputComponent),\n multi: true,\n },\n ],\n})\nexport class EmailInputComponent implements ControlValueAccessor {\n id = input<string>('');\n placeholder = input<string>('you@example.com');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n displayInvalid = input<boolean>(false);\n\n protected readonly value = signal<string>('');\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.displayInvalid());\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({ invalid: this.isInvalid() });\n });\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n this.value.set(value);\n this.onChange(value);\n }\n\n writeValue(value: string): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { IconComponent } from '../../icon';\nimport { twMerge } from 'tailwind-merge';\n\nexport interface FileInfo {\n file: File;\n name: string;\n size: number;\n type: string;\n}\n\n@Component({\n selector: 'hui-file-input',\n template: `\n <div class=\"space-y-3\">\n <!-- Drop Zone -->\n @if (enableDragDrop()) {\n <div\n class=\"relative\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div [class]=\"dropZoneClasses()\">\n <div class=\"flex flex-col items-center justify-center py-6 text-center\">\n <hui-icon name=\"cloud-upload\" [size]=\"40\" class=\"text-muted-foreground mb-2\" />\n <p class=\" text-text-muted mb-1\">\n <span class=\"font-medium text-purple-600\">Click to upload</span>\n or drag and drop\n </p>\n @if (accept()) {\n <p class=\"text-sm text-muted-foreground\">{{ acceptDescription() }}</p>\n }\n @if (maxSize()) {\n <p class=\"text-sm text-muted-foreground\">\n Max file size: {{ formatBytes(maxSize()!) }}\n </p>\n }\n </div>\n <input\n [id]=\"id()\"\n type=\"file\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onFileSelect($event)\"\n class=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed\"\n [attr.aria-label]=\"ariaLabel() || 'File upload'\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n />\n </div>\n </div>\n } @else {\n <!-- Simple File Input Button -->\n <div class=\"flex items-center gap-3\">\n <label [class]=\"buttonClasses()\">\n <hui-icon name=\"upload\" [size]=\"18\" class=\"mr-2\" />\n {{ placeholder() || 'Choose files' }}\n <input\n [id]=\"id()\"\n type=\"file\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onFileSelect($event)\"\n class=\"sr-only\"\n [attr.aria-label]=\"ariaLabel() || 'File upload'\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n />\n </label>\n @if (files().length === 0) {\n <span class=\" text-muted-foreground\">No files selected</span>\n }\n </div>\n }\n\n <!-- File List -->\n @if (files().length > 0) {\n <ul class=\"space-y-2\" role=\"list\" [attr.aria-label]=\"'Selected files'\">\n @for (fileInfo of files(); track fileInfo.name + fileInfo.size) {\n <li\n class=\"flex items-center justify-between p-3 bg-muted rounded-lg border border-border\"\n >\n <div class=\"flex items-center gap-3 min-w-0 flex-1\">\n <hui-icon\n [name]=\"getFileIcon(fileInfo.type)\"\n [size]=\"24\"\n class=\"text-muted-foreground shrink-0\"\n />\n <div class=\"min-w-0 flex-1\">\n <p class=\" font-medium text-text-secondary truncate\">{{ fileInfo.name }}</p>\n <p class=\"text-sm text-muted-foreground\">{{ formatBytes(fileInfo.size) }}</p>\n </div>\n </div>\n <button\n type=\"button\"\n (click)=\"removeFile(fileInfo)\"\n [disabled]=\"isDisabled()\"\n class=\"inline-flex size-9 shrink-0 items-center justify-center rounded-lg border border-red-200 bg-surface text-red-600 transition-colors hover:border-red-300 hover:bg-red-50 hover:text-red-700 disabled:cursor-not-allowed disabled:opacity-50\"\n [attr.aria-label]=\"'Remove ' + fileInfo.name\"\n [attr.title]=\"'Remove ' + fileInfo.name\"\n >\n <hui-icon name=\"trash\" [size]=\"18\" />\n </button>\n </li>\n }\n </ul>\n }\n\n <!-- Validation Messages -->\n @if (validationError()) {\n <p class=\" text-red-600 flex items-center gap-1\">\n <hui-icon name=\"exclamation-circle\" [size]=\"16\" />\n {{ validationError() }}\n </p>\n }\n </div>\n `,\n host: {\n '[class]': '\"block w-full\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FileInputComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconComponent],\n})\nexport class FileInputComponent implements ControlValueAccessor {\n id = input<string>('');\n placeholder = input<string>('');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n\n accept = input<string>('');\n multiple = input<boolean>(false);\n maxSize = input<number | undefined>(undefined);\n maxFiles = input<number | undefined>(undefined);\n enableDragDrop = input<boolean>(true);\n\n protected readonly files = signal<FileInfo[]>([]);\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly isDragOver = signal<boolean>(false);\n protected readonly validationError = signal<string>('');\n protected readonly isInvalid = computed(() => this.invalid() || !!this.validationError());\n\n protected readonly acceptDescription = computed(() => {\n const acceptValue = this.accept();\n if (!acceptValue) return '';\n\n const types = acceptValue.split(',').map((t) => t.trim());\n const descriptions: string[] = [];\n\n for (const type of types) {\n if (type.startsWith('.')) {\n descriptions.push(type.toUpperCase().slice(1));\n } else if (type.includes('/')) {\n const [category, subtype] = type.split('/');\n if (subtype === '*') {\n descriptions.push(category.charAt(0).toUpperCase() + category.slice(1) + ' files');\n } else {\n descriptions.push(subtype.toUpperCase());\n }\n }\n }\n\n return descriptions.join(', ');\n });\n\n protected readonly dropZoneClasses = computed(() => {\n const baseClasses = 'border-2 border-dashed rounded-lg transition-colors';\n const dragOverClasses = 'border-purple-500 bg-purple-50';\n const normalClasses = 'border-border hover:border-gray-400';\n const errorClasses = 'border-red-300 bg-red-50';\n const disabledClasses = this.isDisabled() ? 'opacity-50 cursor-not-allowed' : '';\n\n return twMerge(\n baseClasses,\n this.isInvalid() ? errorClasses : this.isDragOver() ? dragOverClasses : normalClasses,\n disabledClasses,\n );\n });\n\n protected readonly buttonClasses = computed(() => {\n const baseClasses =\n 'inline-flex items-center px-4 py-2 border rounded-md shadow-sm font-medium cursor-pointer transition-colors focus-within:outline-none';\n const normalClasses =\n 'border-border bg-surface text-text-secondary hover:bg-surface-hover focus-within:border-purple-500';\n const errorClasses =\n 'border-red-300 bg-surface text-red-700 hover:bg-red-50 focus-within:border-red-500';\n const disabledClasses = this.isDisabled()\n ? 'opacity-50 cursor-not-allowed pointer-events-none'\n : '';\n\n return twMerge(baseClasses, this.isInvalid() ? errorClasses : normalClasses, disabledClasses);\n });\n\n private onChange: (value: File[]) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onFileSelect(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.addFiles(Array.from(input.files));\n input.value = '';\n }\n }\n\n protected onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.isDisabled()) {\n this.isDragOver.set(true);\n }\n }\n\n protected onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n\n if (this.isDisabled()) return;\n\n const files = event.dataTransfer?.files;\n if (files) {\n this.addFiles(Array.from(files));\n }\n }\n\n protected removeFile(fileInfo: FileInfo): void {\n const currentFiles = this.files();\n const updatedFiles = currentFiles.filter(\n (f) => !(f.name === fileInfo.name && f.size === fileInfo.size),\n );\n this.files.set(updatedFiles);\n this.emitChange(updatedFiles);\n this.validationError.set('');\n }\n\n protected formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n protected getFileIcon(mimeType: string): string {\n if (mimeType.startsWith('image/')) return 'photo';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType.startsWith('audio/')) return 'music';\n if (mimeType.includes('pdf')) return 'document';\n if (mimeType.includes('word') || mimeType.includes('document')) return 'document-text';\n if (mimeType.includes('excel') || mimeType.includes('spreadsheet')) return 'table-cells';\n if (mimeType.includes('zip') || mimeType.includes('compressed')) return 'archive-box';\n return 'document';\n }\n\n private addFiles(newFiles: File[]): void {\n this.validationError.set('');\n this.onTouched();\n\n const maxSizeValue = this.maxSize();\n const maxFilesValue = this.maxFiles();\n const acceptValue = this.accept();\n const isMultiple = this.multiple();\n\n const validFiles: FileInfo[] = [];\n\n for (const file of newFiles) {\n if (acceptValue && !this.isFileTypeValid(file, acceptValue)) {\n this.validationError.set(`Invalid file type: ${file.name}`);\n continue;\n }\n\n if (maxSizeValue && file.size > maxSizeValue) {\n this.validationError.set(\n `File \"${file.name}\" exceeds maximum size of ${this.formatBytes(maxSizeValue)}`,\n );\n continue;\n }\n\n validFiles.push({\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n });\n }\n\n if (validFiles.length === 0) return;\n\n let updatedFiles: FileInfo[];\n\n if (isMultiple) {\n const currentFiles = this.files();\n updatedFiles = [...currentFiles, ...validFiles];\n\n if (maxFilesValue && updatedFiles.length > maxFilesValue) {\n this.validationError.set(`Maximum ${maxFilesValue} files allowed`);\n updatedFiles = updatedFiles.slice(0, maxFilesValue);\n }\n } else {\n updatedFiles = [validFiles[0]];\n }\n\n this.files.set(updatedFiles);\n this.emitChange(updatedFiles);\n }\n\n private isFileTypeValid(file: File, accept: string): boolean {\n const acceptTypes = accept.split(',').map((t) => t.trim().toLowerCase());\n const fileType = file.type.toLowerCase();\n const fileName = file.name.toLowerCase();\n\n return acceptTypes.some((type) => {\n if (type.startsWith('.')) {\n return fileName.endsWith(type);\n }\n if (type.endsWith('/*')) {\n const category = type.slice(0, -2);\n return fileType.startsWith(category + '/');\n }\n return fileType === type;\n });\n }\n\n private emitChange(fileInfos: FileInfo[]): void {\n const files = fileInfos.map((f) => f.file);\n this.onChange(files);\n }\n\n writeValue(value: File[] | null): void {\n if (!value || value.length === 0) {\n this.files.set([]);\n return;\n }\n\n const fileInfos: FileInfo[] = value.map((file) => ({\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n }));\n this.files.set(fileInfos);\n }\n\n registerOnChange(fn: (value: File[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import { Component, input, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'hui-form-description',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <p [id]=\"id()\" class=\"mt-1 text-text-muted\">\n <ng-content></ng-content>\n </p>\n `,\n})\nexport class FormDescriptionComponent {\n id = input<string>('');\n}\n","import { Component, input, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'hui-form-error',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (show()) {\n <p [id]=\"id()\" class=\"mt-2 text-red-600\" role=\"alert\">\n <ng-content></ng-content>\n </p>\n }\n `,\n})\nexport class FormErrorComponent {\n show = input<boolean>(true);\n id = input<string>('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n@Component({\n selector: 'hui-form-hint',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <p [id]=\"id()\" class=\"mt-2 text-muted-foreground\">\n <ng-content></ng-content>\n </p>\n `,\n})\nexport class FormHintComponent {\n id = input<string>('');\n}\n","import { Component, input, ChangeDetectionStrategy } from '@angular/core';\nimport { FieldType } from '../../form-builder';\n\n@Component({\n selector: 'hui-form-label',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <label\n [for]=\"type() === 'checkbox' || type() === 'radio' || type() === 'array' ? null : htmlFor()\"\n [class]=\"'block font-medium text-text-secondary ' + class()\"\n >\n <ng-content></ng-content>\n @if (required()) {\n <span class=\"text-red-500\" aria-label=\"required\">*</span>\n }\n </label>\n `,\n})\nexport class FormLabelComponent {\n htmlFor = input<string>('');\n required = input<boolean>(false);\n class = input<string>('');\n type = input<FieldType>('text');\n}\n","import { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'hui-form-note',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div [id]=\"id()\" [class]=\"noteClasses()\">\n <div class=\"flex items-start\">\n <svg class=\"w-5 h-5 mt-0.5 mr-2 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fill-rule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n <div>\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n `,\n})\nexport class FormNoteComponent {\n id = input<string>('');\n variant = input<'info' | 'warning' | 'success' | 'error' | 'neutral'>('info');\n customClasses = input<string>('');\n\n protected readonly noteClasses = computed(() => {\n const custom = this.customClasses();\n if (custom) {\n return `mt-2.5 p-2 rounded ${custom}`;\n }\n\n const variant = this.variant();\n const variantClasses = {\n info: 'bg-blue-50 border border-blue-200 text-blue-800',\n warning: 'bg-yellow-50 border border-yellow-200 text-yellow-800',\n success: 'bg-green-50 border border-green-200 text-green-800',\n error: 'bg-red-50 border border-red-200 text-red-800',\n neutral: 'bg-muted border border-border text-text-secondary',\n };\n\n return `mt-2.5 p-2 rounded ${variantClasses[variant]}`;\n });\n}\n","import { ValidationErrors } from '@angular/forms';\n\n/**\n * Maps Angular validation errors to user-friendly error messages\n */\nexport function getErrorMessage(\n errors: ValidationErrors | null | undefined,\n fieldName?: string,\n): string {\n if (!errors) {\n return '';\n }\n\n const field = fieldName || 'This field';\n\n // Required\n if (errors['required']) {\n return `${field} is required`;\n }\n\n // Email\n if (errors['email']) {\n return 'Please enter a valid email address';\n }\n\n // Min length\n if (errors['minlength']) {\n const requiredLength = errors['minlength'].requiredLength;\n return `${field} must be at least ${requiredLength} characters`;\n }\n\n // Max length\n if (errors['maxlength']) {\n const requiredLength = errors['maxlength'].requiredLength;\n return `${field} must not exceed ${requiredLength} characters`;\n }\n\n // Min value\n if (errors['min']) {\n const min = errors['min'].min;\n return `${field} must be at least ${min}`;\n }\n\n // Max value\n if (errors['max']) {\n const max = errors['max'].max;\n return `${field} must not exceed ${max}`;\n }\n\n // Pattern\n if (errors['pattern']) {\n return `${field} format is invalid`;\n }\n\n // Password mismatch (custom validator)\n if (errors['passwordMismatch']) {\n return 'Passwords do not match';\n }\n\n // URL validation\n if (errors['url']) {\n return 'Please enter a valid URL';\n }\n\n // Fallback for unknown errors\n return `${field} is invalid`;\n}\n\n/**\n * Gets all error messages for a control\n */\nexport function getErrorMessages(\n errors: ValidationErrors | null | undefined,\n fieldName?: string,\n): string[] {\n if (!errors) {\n return [];\n }\n\n return Object.keys(errors).map((key) => {\n const error = { [key]: errors[key] };\n return getErrorMessage(error, fieldName);\n });\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl } from '@angular/forms';\nimport { FieldType } from '../../form-builder';\nimport { FormDescriptionComponent } from '../form-description/form-description';\nimport { FormErrorComponent } from '../form-error/form-error';\nimport { FormHelperComponent } from '../form-helper/form-helper';\nimport { FormHintComponent } from '../form-hint/form-hint';\nimport { FormLabelComponent } from '../form-label/form-label';\nimport { FormNoteComponent } from '../form-note/form-note';\nimport { getErrorMessage } from '../utils/form-errors';\nimport { LocalizationService } from '../../config/ui-localization';\n\n@Component({\n selector: 'hui-form-field',\n imports: [\n FormLabelComponent,\n FormErrorComponent,\n FormHintComponent,\n FormHelperComponent,\n FormDescriptionComponent,\n FormNoteComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-field.html',\n})\nexport class FormFieldComponent {\n private readonly destroyRef = inject(DestroyRef);\n protected readonly localization = inject(LocalizationService);\n\n label = input<string>('');\n hint = input<string>('');\n helper = input<string>('');\n description = input<string>('');\n layout = input<'column' | 'row' | 'stacked'>('column');\n note = input<string>('');\n noteVariant = input<'info' | 'warning' | 'success' | 'error' | 'neutral'>('info');\n noteClasses = input<string>('');\n required = input<boolean>(false);\n fieldName = input<string>('');\n validationStrategy = input<'touched' | 'submit'>('touched');\n formSubmitted = input<boolean>(false);\n inputId = input<string>(''); // Accept inputId from parent\n type = input<FieldType>('text');\n\n // Accept FormControl directly as input - renamed to avoid conflict with [formControl] directive\n control = input<FormControl | null>(null);\n\n // Generate unique ID once per component instance - only used as fallback\n private readonly uniqueId = Math.random().toString(36).substring(2, 11);\n\n // Expose fieldId - use provided inputId or generate one\n public readonly fieldId = computed(() => {\n const providedId = this.inputId();\n if (providedId) {\n return providedId;\n }\n const name = this.fieldName() || this.label().toLowerCase().replace(/\\s+/g, '-');\n return `field-${name}-${this.uniqueId}`;\n });\n\n // Reactive signals for control state\n protected readonly controlTouched = signal<boolean>(false);\n protected readonly controlInvalid = signal<boolean>(false);\n protected readonly controlDisabled = signal<boolean>(false);\n protected readonly controlErrors = signal<any>(null);\n\n constructor() {\n // Subscribe to control state changes\n effect((onCleanup) => {\n const ctrl = this.control();\n\n if (!ctrl) {\n return;\n }\n\n // Set initial state immediately\n this.controlInvalid.set(ctrl.invalid);\n this.controlDisabled.set(ctrl.disabled);\n this.controlErrors.set(ctrl.errors);\n this.controlTouched.set(ctrl.touched);\n\n const subscription = ctrl.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.controlInvalid.set(ctrl.invalid);\n this.controlDisabled.set(ctrl.disabled);\n this.controlErrors.set(ctrl.errors);\n this.controlTouched.set(ctrl.touched);\n });\n onCleanup(() => subscription.unsubscribe());\n });\n }\n\n // Generate unique IDs for accessibility - use the fieldId\n protected readonly computedInputId = computed(() => this.fieldId());\n\n protected readonly hintId = computed(() => `${this.computedInputId()}-hint`);\n protected readonly descriptionId = computed(() => `${this.computedInputId()}-description`);\n protected readonly errorId = computed(() => `${this.computedInputId()}-error`);\n\n // Check if the control is disabled - now using reactive signal\n protected readonly isDisabled = computed(() => this.controlDisabled());\n\n // Check if the control has errors and should show them - now using reactive signals\n // Made public so it can be accessed by parent components/templates\n public readonly showError = computed(() => {\n const invalid = this.controlInvalid();\n if (!invalid) return false;\n\n const strategy = this.validationStrategy();\n const submitted = this.formSubmitted();\n const touched = this.controlTouched();\n\n // Show errors based on strategy\n if (strategy === 'submit') {\n // Only show errors after form submission attempt\n return submitted;\n } else {\n // Default: show errors when field is touched\n return touched;\n }\n });\n\n // Get the error message for the control - now using reactive signals\n protected readonly errorMessage = computed(() => {\n if (!this.showError()) {\n return '';\n }\n const errors = this.controlErrors();\n return getErrorMessage(errors, this.fieldName() || this.label());\n });\n}\n","<div\n [class]=\"\n (layout() === 'row'\n ? 'mb-4 grid grid-cols-1 gap-2 md:grid-cols-[minmax(10rem,14rem)_minmax(0,1fr)] md:gap-x-6'\n : 'mb-4') + (isDisabled() ? ' opacity-60 pointer-events-none' : '')\n \"\n>\n <div>\n @if (label()) {\n <div class=\"flex items-center\">\n <hui-form-label [type]=\"type()\" [htmlFor]=\"computedInputId()\" [required]=\"required()\">\n {{ localization.translate(label()) }}\n </hui-form-label>\n @if (helper()) {\n <hui-form-helper [id]=\"computedInputId() + '-helper'\" [label]=\"label()\">\n {{ localization.translate(helper()) }}\n </hui-form-helper>\n }\n </div>\n }\n @if (description()) {\n <hui-form-description [id]=\"descriptionId()\">\n {{ localization.translate(description()) }}\n </hui-form-description>\n }\n </div>\n\n <div [class]=\"layout() === 'row' ? '' : 'mt-2'\">\n <ng-content></ng-content>\n\n @if (hint() && !showError()) {\n <hui-form-hint [id]=\"hintId()\">\n {{ localization.translate(hint()) }}\n </hui-form-hint>\n }\n @if (note() && !showError()) {\n <hui-form-note\n [id]=\"computedInputId() + '-note'\"\n [variant]=\"noteVariant()\"\n [customClasses]=\"noteClasses()\"\n >\n {{ localization.translate(note()) }}\n </hui-form-note>\n }\n @if (showError()) {\n <hui-form-error [id]=\"errorId()\">\n {{ localization.translate(errorMessage()) }}\n </hui-form-error>\n }\n </div>\n</div>\n","import {\n Component,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { HARMOLODY_MEDIA_SELECTOR } from '../../config/ui-config';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\nimport { IconComponent } from '../../icon';\n\n@Component({\n selector: 'hui-image-selector-input',\n template: `\n <div class=\"space-y-2\">\n <!-- Image Preview (Optional) -->\n @if (showPreview() && value()) {\n <div class=\"relative group\">\n <div\n class=\"relative w-full h-48 bg-surface rounded-lg overflow-hidden border-2 border-border\"\n >\n <img\n [src]=\"value()!\"\n [alt]=\"altText() || 'Selected image'\"\n class=\"w-full h-full object-cover\"\n (error)=\"onImageError()\"\n />\n <!-- Hover Overlay -->\n <div\n class=\"absolute inset-0 bg-black/50 bg-opacity-0 group-hover:bg-opacity-40 transition-all duration-200 flex items-center justify-center\"\n >\n <button\n type=\"button\"\n (click)=\"clearSelection()\"\n [disabled]=\"isDisabled()\"\n class=\"opacity-0 group-hover:opacity-100 transition-opacity bg-red-600 hover:bg-red-700 text-white px-4 py-2 rounded shadow-lg disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <span class=\"flex items-center gap-2\">\n <hui-icon name=\"trash\" class=\"w-4 h-4\" />\n Remove\n </span>\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Input Field + Browse Button -->\n <div class=\"flex gap-2\">\n <div class=\"flex-1 relative\">\n <input\n [id]=\"id()\"\n type=\"text\"\n [value]=\"value() || ''\"\n [placeholder]=\"placeholder() || 'Select or enter image URL'\"\n [readonly]=\"!editableInput()\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [class]=\"inputClasses()\"\n />\n </div>\n\n <button\n type=\"button\"\n (click)=\"openMediaSelector()\"\n [disabled]=\"isDisabled() || !mediaSelector\"\n [class]=\"browseButtonClasses()\"\n [attr.title]=\"'Browse images'\"\n >\n <hui-icon name=\"library-photo\" [size]=\"20\" />\n </button>\n\n @if (value() && !isDisabled()) {\n <button\n type=\"button\"\n (click)=\"clearSelection()\"\n [class]=\"clearButtonClasses()\"\n [attr.title]=\"'Clear selection'\"\n >\n <hui-icon name=\"trash\" [size]=\"20\" />\n </button>\n }\n </div>\n\n <!-- Error State Message -->\n @if (imageError()) {\n <div class=\" text-red-600 flex items-center gap-1\">\n <hui-icon name=\"exclamation-circle\" class=\"w-4 h-4\" />\n Failed to load image\n </div>\n }\n </div>\n `,\n host: {\n '[class]': '\"block w-full\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ImageSelectorInputComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconComponent],\n})\nexport class ImageSelectorInputComponent implements ControlValueAccessor {\n protected readonly mediaSelector = inject(HARMOLODY_MEDIA_SELECTOR);\n\n id = input<string>('');\n placeholder = input<string>('');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n altText = input<string>('');\n\n // Configuration inputs for media selector\n mediaType = input<string>('Cover');\n allowUpload = input<boolean>(true);\n selectionMode = input<'single' | 'multiple'>('single');\n\n // Display options\n showPreview = input<boolean>(true);\n editableInput = input<boolean>(false);\n\n protected readonly value = signal<string | null>(null);\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly imageError = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.invalid());\n\n protected readonly inputClasses = computed(() => {\n const readonlyClasses = this.editableInput() ? '' : 'bg-muted cursor-pointer';\n return buildFormControlClasses({\n invalid: this.isInvalid(),\n additionalClasses: readonlyClasses,\n });\n });\n\n protected readonly browseButtonClasses = computed(() => {\n const baseClasses =\n 'w-10 h-10 border rounded-lg shadow-sm focus:outline-none focus:ring-1 transition-colors flex items-center justify-center bg-surface';\n const disabledClasses = 'disabled:opacity-50 disabled:cursor-not-allowed';\n const errorClasses =\n 'border-red-300 focus:ring-red-500 focus:border-red-500 text-red-700 hover:bg-red-50';\n const normalClasses =\n 'border-border focus:ring-purple-500 focus:border-purple-500 hover:bg-surface-hover text-text-secondary';\n\n return `${baseClasses} ${disabledClasses} ${this.isInvalid() ? errorClasses : normalClasses}`;\n });\n\n protected readonly clearButtonClasses = computed(() => {\n return 'px-3 py-2 border border-border rounded-lg shadow-sm hover:bg-surface-hover text-text-secondary transition-colors flex items-center justify-center focus:outline-none focus:ring-1 focus:ring-purple-500';\n });\n\n private onChange: (value: string | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected async openMediaSelector(): Promise<void> {\n if (this.isDisabled()) return;\n\n const select = this.mediaSelector;\n if (!select) return;\n const url = await select({\n mediaType: this.mediaType(),\n allowUpload: this.allowUpload(),\n selectionMode: this.selectionMode(),\n });\n if (url !== undefined) this.setImage(url);\n this.onTouched();\n }\n\n protected clearSelection(): void {\n this.setImage(null);\n this.imageError.set(false);\n }\n\n protected onImageError(): void {\n this.imageError.set(true);\n }\n\n protected onInputChange(event: Event): void {\n if (!this.editableInput()) return;\n\n const target = event.target as HTMLInputElement;\n const url = target.value.trim() || null;\n this.setImage(url);\n }\n\n private setImage(url: string | null): void {\n this.value.set(url);\n this.onChange(url);\n this.imageError.set(false);\n }\n\n writeValue(value: string | null): void {\n this.value.set(value ?? null);\n this.imageError.set(false);\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\n\n@Component({\n selector: 'hui-input',\n template: `\n <input\n [id]=\"id()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid()\"\n [class]=\"inputClasses()\"\n />\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': '\"block w-full\"',\n },\n})\nexport class InputComponent implements ControlValueAccessor {\n id = input<string>('');\n type = input<string>('text');\n placeholder = input<string>('');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n class = input<string>('');\n\n protected readonly value = signal<string>('');\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.invalid());\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({\n invalid: this.isInvalid(),\n customClasses: this.class(),\n });\n });\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n this.value.set(value);\n this.onChange(value);\n }\n\n // ControlValueAccessor implementation\n writeValue(value: string): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n Component,\n computed,\n forwardRef,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\n\n@Component({\n selector: 'hui-number-input',\n template: `\n <input\n [id]=\"id()\"\n type=\"number\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [class]=\"inputClasses()\"\n />\n `,\n host: {\n '[class]': '\"block w-full\"',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NumberInputComponent),\n multi: true,\n },\n ],\n})\nexport class NumberInputComponent implements ControlValueAccessor {\n id = input<string>('');\n placeholder = input<string>('');\n min = input<number | undefined>(undefined);\n max = input<number | undefined>(undefined);\n step = input<number>(1);\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n\n protected readonly value = signal<number | null>(null);\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.invalid());\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({ invalid: this.isInvalid() });\n });\n\n private onChange: (value: number | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const value = target.value === '' ? null : parseFloat(target.value);\n this.value.set(value);\n this.onChange(value);\n }\n\n writeValue(value: number | null): void {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value: number | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\n\n@Component({\n selector: 'hui-password-input',\n template: `\n <div class=\"relative\">\n <input\n [id]=\"id()\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [class]=\"inputClasses()\"\n />\n <button\n type=\"button\"\n (click)=\"togglePasswordVisibility()\"\n class=\"absolute inset-y-0 right-0 pr-3 flex items-center\"\n [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\"\n >\n @if (showPassword()) {\n <svg\n class=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\"\n />\n </svg>\n } @else {\n <svg\n class=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n />\n </svg>\n }\n </button>\n </div>\n `,\n host: {\n '[class]': '\"block w-full\"',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PasswordInputComponent),\n multi: true,\n },\n ],\n})\nexport class PasswordInputComponent implements ControlValueAccessor {\n id = input<string>('');\n placeholder = input<string>('');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n displayInvalid = input<boolean>(false);\n\n protected readonly value = signal<string>('');\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly showPassword = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.displayInvalid());\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({\n invalid: this.isInvalid(),\n additionalClasses: 'pr-3',\n });\n });\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected togglePasswordVisibility(): void {\n this.showPassword.update((show) => !show);\n }\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n this.value.set(value);\n this.onChange(value);\n }\n\n writeValue(value: string): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n Component,\n computed,\n forwardRef,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { twMerge } from 'tailwind-merge';\n\nexport interface RadioOption {\n label: string;\n value: string | number;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'hui-radio-group',\n template: `\n <div [attr.role]=\"'radiogroup'\" [attr.aria-label]=\"ariaLabel()\">\n @for (option of options(); track option.value) {\n <div class=\"flex items-center\" [class]=\"inline() ? 'inline-flex mr-4' : 'mb-2'\">\n <input\n [id]=\"id() + '-' + option.value\"\n type=\"radio\"\n [name]=\"name()\"\n [value]=\"option.value\"\n [checked]=\"value() === option.value\"\n (change)=\"onChange(option.value)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled() || option.disabled\"\n [class]=\"radioClasses()\"\n />\n <label\n [for]=\"id() + '-' + option.value\"\n class=\"ml-2 block text-text-primary\"\n [class.text-muted-foreground]=\"option.disabled\"\n >\n {{ option.label }}\n </label>\n </div>\n }\n </div>\n `,\n host: {\n '[class]': '\"block\"',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RadioGroupComponent),\n multi: true,\n },\n ],\n})\nexport class RadioGroupComponent implements ControlValueAccessor {\n id = input<string>('');\n name = input<string>('');\n options = input<RadioOption[]>([]);\n inline = input<boolean>(false);\n ariaLabel = input<string>('');\n class = input<string>('');\n\n protected readonly value = signal<string | number | null>(null);\n protected readonly isDisabled = signal<boolean>(false);\n\n protected readonly radioClasses = computed(() => {\n const baseClasses = 'h-4 w-4 text-blue-600 border-border';\n const customClasses = this.class();\n return twMerge(baseClasses, customClasses);\n });\n\n private onChangeFn: (value: string | number | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onChange(value: string | number): void {\n this.value.set(value);\n this.onChangeFn(value);\n }\n\n writeValue(value: string | number | null): void {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value: string | number | null) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { LocalizationService } from '../../config/ui-localization';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\nimport { IconComponent } from '../../icon';\n\n@Component({\n selector: 'hui-search-input',\n imports: [IconComponent],\n templateUrl: './search-input.html',\n styleUrl: './search-input.css',\n host: {\n class: 'block w-full',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SearchInputComponent),\n multi: true,\n },\n ],\n})\nexport class SearchInputComponent implements ControlValueAccessor {\n protected readonly localization = inject(LocalizationService);\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Search...');\n readonly showClear = input<boolean>(true);\n readonly clearLabel = input<string>('Clear search');\n readonly ariaLabel = input<string>('');\n readonly ariaDescribedby = input<string>('');\n readonly invalid = input<boolean>(false);\n readonly class = input<string>('');\n\n /** Emitted when Enter is pressed and after the clear action. */\n readonly search = output<string>();\n /** Emitted only when the clear action is used. */\n readonly cleared = output<void>();\n\n protected readonly inputElement = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n protected readonly value = signal('');\n protected readonly isDisabled = signal(false);\n protected readonly hasValue = computed(() => this.value().length > 0);\n protected readonly accessibleLabel = computed(() =>\n this.localization.translate(this.ariaLabel() || this.placeholder()),\n );\n protected readonly inputClasses = computed(() =>\n buildFormControlClasses({\n invalid: this.invalid(),\n additionalClasses: 'border-border bg-surface pl-10 pr-3 shadow-none',\n customClasses: this.class(),\n }),\n );\n\n private onChangeFn: (value: string) => void = () => {};\n private onTouchedFn: () => void = () => {};\n\n protected onInput(event: Event): void {\n const nextValue = (event.target as HTMLInputElement).value;\n this.value.set(nextValue);\n this.onChangeFn(nextValue);\n }\n\n protected submitSearch(): void {\n this.search.emit(this.value());\n }\n\n protected clear(): void {\n if (this.isDisabled()) {\n return;\n }\n\n this.value.set('');\n this.onChangeFn('');\n this.onTouchedFn();\n this.cleared.emit();\n this.search.emit('');\n this.inputElement()?.nativeElement.focus();\n }\n\n protected markTouched(): void {\n this.onTouchedFn();\n }\n\n writeValue(value: string | null | undefined): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","<div class=\"relative\">\n <hui-icon\n name=\"search\"\n [size]=\"18\"\n [ariaLabel]=\"localization.translate('Search')\"\n customClass=\"pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2 text-muted-foreground\"\n />\n\n <input\n #searchInput\n [id]=\"id()\"\n type=\"search\"\n inputmode=\"search\"\n autocomplete=\"off\"\n [placeholder]=\"localization.translate(placeholder())\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"accessibleLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-invalid]=\"invalid() || null\"\n [class]=\"inputClasses()\"\n (input)=\"onInput($event)\"\n (blur)=\"markTouched()\"\n (keydown.enter)=\"submitSearch()\"\n />\n\n @if (hasValue() && showClear() && !isDisabled()) {\n <button\n type=\"button\"\n [attr.aria-label]=\"localization.translate(clearLabel())\"\n [attr.title]=\"localization.translate(clearLabel())\"\n class=\"absolute inset-y-0 right-0 z-10 flex items-center pr-3 text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:text-primary\"\n (click)=\"clear()\"\n >\n <hui-icon name=\"close-x\" [size]=\"18\" [ariaLabel]=\"localization.translate(clearLabel())\" />\n </button>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { LocalizationService } from '../../config/ui-localization';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\nimport { IconComponent } from '../../icon';\n\nexport type SelectValue = string | number;\nexport type SelectControlValue = SelectValue | SelectValue[] | null;\nexport type SelectDropdownAlign = 'left' | 'right';\nexport type SelectDropdownPlacement = 'top' | 'bottom';\nexport type SelectDropdownWidth = 'trigger' | 'content';\n\nexport interface SelectOption {\n label: string;\n value: SelectValue;\n disabled?: boolean;\n}\n\n/** Configuration for an action button alongside the select. */\nexport interface SelectActionButton {\n /** Icon name from the icon set. */\n icon: string;\n /** Aria label for accessibility. */\n ariaLabel: string;\n /** Tooltip text. */\n tooltip?: string;\n}\n\nlet nextSelectId = 0;\n\n@Component({\n selector: 'hui-select',\n imports: [IconComponent],\n templateUrl: './select.html',\n styleUrl: './select.css',\n host: {\n class: 'block',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectComponent),\n multi: true,\n },\n ],\n})\nexport class SelectComponent implements ControlValueAccessor, OnDestroy {\n protected readonly localization = inject(LocalizationService);\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('');\n readonly options = input<SelectOption[]>([]);\n readonly ariaLabel = input<string>('');\n readonly ariaDescribedby = input<string>('');\n readonly invalid = input<boolean>(false);\n readonly class = input<string>('');\n /** Allows the control to emit an array and keep the dropdown open while selecting. */\n readonly multiple = input<boolean>(false);\n /** Horizontal edge used to anchor the dropdown panel. */\n readonly dropdownAlign = input<SelectDropdownAlign>('left');\n /** Matches the trigger width by default, or expands to fit option content. */\n readonly dropdownWidth = input<SelectDropdownWidth>('trigger');\n /** Maximum height for the scrollable options area before viewport constraints are applied. */\n readonly maxDropdownHeight = input<number>(256);\n /** Space retained between the dropdown and the viewport edge. */\n readonly viewportPadding = input<number>(12);\n /** Prevents compact layouts and short values from collapsing the control. */\n readonly minWidth = input<string>('12rem');\n /** Action button configuration. */\n readonly action = input<SelectActionButton | undefined>(undefined);\n\n /** Emits when the action button is clicked. */\n readonly actionClick = output<void>();\n\n private readonly generatedId = `hui-select-${nextSelectId++}`;\n private typeaheadQuery = '';\n private typeaheadTimer: ReturnType<typeof setTimeout> | undefined;\n private placementTimer: ReturnType<typeof setTimeout> | undefined;\n private viewportListenersRegistered = false;\n private dropdownResizeObserver: ResizeObserver | undefined;\n private readonly onViewportChange = () => this.scheduleDropdownPlacementUpdate();\n\n protected readonly triggerElement = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n protected readonly dropdownElement = viewChild<ElementRef<HTMLElement>>('dropdown');\n protected readonly dropdownHeaderElement = viewChild<ElementRef<HTMLElement>>('dropdownHeader');\n protected readonly optionsViewportElement = viewChild<ElementRef<HTMLElement>>('optionsViewport');\n protected readonly value = signal<SelectControlValue>(null);\n protected readonly isOpen = signal(false);\n protected readonly activeIndex = signal(-1);\n protected readonly isDisabled = signal(false);\n protected readonly dropdownPlacement = signal<SelectDropdownPlacement>('bottom');\n protected readonly availableOptionsHeight = signal(256);\n protected readonly isInvalid = computed(() => this.invalid());\n protected readonly hasAction = computed(() => !!this.action());\n protected readonly controlId = computed(() => this.id() || this.generatedId);\n protected readonly listboxId = computed(() => `${this.controlId()}-listbox`);\n\n protected readonly selectedValues = computed<SelectValue[]>(() => {\n const currentValue = this.value();\n const values = Array.isArray(currentValue)\n ? currentValue\n : currentValue === null\n ? []\n : [currentValue];\n\n // An empty string is the conventional unselected form value unless an option owns it.\n return values.filter((selectedValue) => selectedValue !== '' || !!this.findOption(''));\n });\n\n protected readonly selectedCount = computed(() => this.selectedValues().length);\n protected readonly hasSelection = computed(() => this.selectedCount() > 0);\n protected readonly displayLabel = computed(() => {\n const selected = this.selectedValues();\n if (selected.length === 0) {\n return this.localization.translate(\n this.placeholder() || (this.multiple() ? 'Select options' : 'Select an option'),\n );\n }\n\n if (this.multiple() && selected.length > 1) {\n return this.localization.translate('{count} items selected', { count: selected.length });\n }\n\n const option = this.findOption(selected[0]);\n return this.localization.translate(option?.label ?? String(selected[0]));\n });\n\n protected readonly panelLabel = computed(() =>\n this.localization.translate(\n this.placeholder() || (this.multiple() ? 'Select options' : 'Select an option'),\n ),\n );\n\n protected readonly triggerClasses = computed(() =>\n buildFormControlClasses({\n invalid: this.isInvalid(),\n additionalClasses:\n 'flex min-h-10 items-center justify-between gap-3 bg-surface pr-3 text-left shadow-none',\n customClasses: this.class(),\n }),\n );\n\n protected readonly dropdownClasses = computed(() => {\n const alignmentClass = this.dropdownAlign() === 'right' ? 'right-0' : 'left-0';\n const placementClass =\n this.dropdownPlacement() === 'top' ? 'bottom-full mb-1' : 'top-full mt-1';\n const widthClass =\n this.dropdownWidth() === 'content' ? 'w-max min-w-full max-w-[calc(100vw-1.5rem)]' : 'w-full';\n\n return `absolute z-30 overflow-hidden rounded-xl border border-border bg-surface shadow-xl ${alignmentClass} ${placementClass} ${widthClass}`;\n });\n\n private onChangeFn: (value: SelectControlValue) => void = () => {};\n private onTouchedFn: () => void = () => {};\n\n protected toggleDropdown(): void {\n if (this.isDisabled()) {\n return;\n }\n\n if (this.isOpen()) {\n this.closeDropdown();\n return;\n }\n\n this.openDropdown();\n }\n\n protected closeDropdown(markTouched = true): void {\n if (!this.isOpen()) {\n return;\n }\n\n this.isOpen.set(false);\n this.activeIndex.set(-1);\n this.resetTypeahead();\n this.stopDropdownPositionTracking();\n if (markTouched) {\n this.onTouchedFn();\n }\n }\n\n protected selectOption(option: SelectOption): void {\n if (option.disabled || this.isDisabled()) {\n return;\n }\n\n if (this.multiple()) {\n const selected = this.selectedValues();\n const nextValue = this.includesValue(selected, option.value)\n ? selected.filter((value) => !Object.is(value, option.value))\n : [...selected, option.value];\n\n this.value.set(nextValue);\n this.onChangeFn(nextValue);\n this.scheduleDropdownPlacementUpdate();\n return;\n }\n\n this.value.set(option.value);\n this.onChangeFn(option.value);\n this.closeDropdown();\n this.triggerElement()?.nativeElement.focus();\n }\n\n protected clearAll(event: MouseEvent): void {\n event.stopPropagation();\n this.value.set([]);\n this.onChangeFn([]);\n this.activeIndex.set(this.findNextEnabledIndex(-1, 1));\n this.scheduleDropdownPlacementUpdate();\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown(1);\n } else {\n this.moveActiveOption(1);\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown(-1);\n } else {\n this.moveActiveOption(-1);\n }\n break;\n case 'Home':\n if (this.isOpen()) {\n event.preventDefault();\n this.activeIndex.set(this.findNextEnabledIndex(-1, 1));\n this.scrollActiveOptionIntoView();\n }\n break;\n case 'End':\n if (this.isOpen()) {\n event.preventDefault();\n this.activeIndex.set(this.findNextEnabledIndex(this.options().length, -1));\n this.scrollActiveOptionIntoView();\n }\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown();\n } else {\n const option = this.options()[this.activeIndex()];\n if (option) {\n this.selectOption(option);\n }\n }\n break;\n case 'Escape':\n if (this.isOpen()) {\n event.preventDefault();\n this.closeDropdown(false);\n }\n break;\n case 'Tab':\n this.closeDropdown();\n break;\n default:\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n this.handleTypeahead(event.key);\n }\n }\n }\n\n protected isOptionSelected(option: SelectOption): boolean {\n return this.includesValue(this.selectedValues(), option.value);\n }\n\n protected optionId(index: number): string {\n return `${this.listboxId()}-option-${index}`;\n }\n\n protected optionClasses(option: SelectOption, index: number): string {\n const stateClasses = this.isOptionSelected(option)\n ? 'bg-primary/10 text-primary'\n : index === this.activeIndex()\n ? 'bg-muted'\n : '';\n\n return `mb-1 flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-foreground transition-colors last:mb-0 hover:bg-surface-hover disabled:cursor-not-allowed disabled:opacity-50 ${stateClasses}`;\n }\n\n protected onActionClick(): void {\n this.actionClick.emit();\n }\n\n writeValue(value: SelectControlValue | undefined): void {\n if (this.multiple()) {\n const multipleValue = Array.isArray(value) ? value : value == null ? [] : [value];\n this.value.set(multipleValue);\n return;\n }\n\n this.value.set(Array.isArray(value) ? (value[0] ?? null) : (value ?? null));\n }\n\n registerOnChange(fn: (value: SelectControlValue) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n if (isDisabled) {\n this.closeDropdown(false);\n }\n }\n\n ngOnDestroy(): void {\n this.resetTypeahead();\n this.stopDropdownPositionTracking();\n }\n\n private openDropdown(direction: 1 | -1 = 1): void {\n if (this.options().length === 0) {\n this.isOpen.set(true);\n this.activeIndex.set(-1);\n this.startDropdownPositionTracking();\n return;\n }\n\n this.isOpen.set(true);\n const selectedIndex = this.options().findIndex(\n (option) => !option.disabled && this.isOptionSelected(option),\n );\n this.activeIndex.set(\n selectedIndex >= 0\n ? selectedIndex\n : this.findNextEnabledIndex(direction > 0 ? -1 : this.options().length, direction),\n );\n this.startDropdownPositionTracking();\n this.scrollActiveOptionIntoView();\n }\n\n private startDropdownPositionTracking(): void {\n if (!this.viewportListenersRegistered) {\n window.addEventListener('resize', this.onViewportChange);\n document.addEventListener('scroll', this.onViewportChange, true);\n window.visualViewport?.addEventListener('resize', this.onViewportChange);\n window.visualViewport?.addEventListener('scroll', this.onViewportChange);\n this.viewportListenersRegistered = true;\n }\n\n this.scheduleDropdownPlacementUpdate();\n }\n\n private stopDropdownPositionTracking(): void {\n if (this.placementTimer) {\n clearTimeout(this.placementTimer);\n this.placementTimer = undefined;\n }\n\n this.dropdownResizeObserver?.disconnect();\n this.dropdownResizeObserver = undefined;\n\n if (!this.viewportListenersRegistered) {\n return;\n }\n\n window.removeEventListener('resize', this.onViewportChange);\n document.removeEventListener('scroll', this.onViewportChange, true);\n window.visualViewport?.removeEventListener('resize', this.onViewportChange);\n window.visualViewport?.removeEventListener('scroll', this.onViewportChange);\n this.viewportListenersRegistered = false;\n }\n\n private scheduleDropdownPlacementUpdate(): void {\n if (!this.isOpen()) {\n return;\n }\n\n if (this.placementTimer) {\n clearTimeout(this.placementTimer);\n }\n\n this.placementTimer = setTimeout(() => {\n this.placementTimer = undefined;\n this.updateDropdownPlacement();\n });\n }\n\n private updateDropdownPlacement(): void {\n const trigger = this.triggerElement()?.nativeElement;\n const dropdown = this.dropdownElement()?.nativeElement;\n const header = this.dropdownHeaderElement()?.nativeElement;\n const optionsViewport = this.optionsViewportElement()?.nativeElement;\n if (!trigger || !dropdown || !header || !optionsViewport) {\n return;\n }\n\n const triggerRect = trigger.getBoundingClientRect();\n const placementViewport = this.getPlacementViewport(trigger);\n const gap = 4;\n const padding = Math.max(0, this.viewportPadding());\n const availableBelow = Math.max(\n 0,\n placementViewport.bottom - triggerRect.bottom - padding - gap,\n );\n const availableAbove = Math.max(0, triggerRect.top - placementViewport.top - padding - gap);\n const headerHeight = header.getBoundingClientRect().height;\n const preferredOptionsHeight = Math.min(\n Math.max(0, this.maxDropdownHeight()),\n optionsViewport.scrollHeight,\n );\n const preferredPanelHeight = headerHeight + preferredOptionsHeight;\n const placement: SelectDropdownPlacement =\n availableBelow < preferredPanelHeight && availableAbove > availableBelow ? 'top' : 'bottom';\n const availablePanelHeight = placement === 'top' ? availableAbove : availableBelow;\n const nextOptionsHeight = Math.max(\n 0,\n Math.min(preferredOptionsHeight, availablePanelHeight - headerHeight),\n );\n\n this.dropdownPlacement.set(placement);\n this.availableOptionsHeight.set(nextOptionsHeight);\n\n if (!this.dropdownResizeObserver && typeof ResizeObserver !== 'undefined') {\n this.dropdownResizeObserver = new ResizeObserver(() =>\n this.scheduleDropdownPlacementUpdate(),\n );\n }\n\n this.dropdownResizeObserver?.observe(dropdown);\n this.dropdownResizeObserver?.observe(optionsViewport);\n placementViewport.containers.forEach((container) =>\n this.dropdownResizeObserver?.observe(container),\n );\n }\n\n private getPlacementViewport(trigger: HTMLElement): {\n top: number;\n bottom: number;\n containers: HTMLElement[];\n } {\n const visualViewport = window.visualViewport;\n const viewportTop = visualViewport?.offsetTop ?? 0;\n const viewportHeight = visualViewport?.height ?? window.innerHeight;\n let top = viewportTop;\n let bottom = viewportTop + viewportHeight;\n const containers: HTMLElement[] = [];\n let ancestor = trigger.parentElement;\n\n while (ancestor && ancestor !== document.documentElement) {\n const overflowY = window.getComputedStyle(ancestor).overflowY;\n if (['auto', 'scroll', 'hidden', 'clip', 'overlay'].includes(overflowY)) {\n const rect = ancestor.getBoundingClientRect();\n const containerTop = rect.top + ancestor.clientTop;\n const containerBottom = containerTop + ancestor.clientHeight;\n top = Math.max(top, containerTop);\n bottom = Math.min(bottom, containerBottom);\n containers.push(ancestor);\n }\n\n ancestor = ancestor.parentElement;\n }\n\n return { top, bottom: Math.max(top, bottom), containers };\n }\n\n private moveActiveOption(direction: 1 | -1): void {\n const nextIndex = this.findNextEnabledIndex(this.activeIndex(), direction);\n if (nextIndex >= 0) {\n this.activeIndex.set(nextIndex);\n this.scrollActiveOptionIntoView();\n }\n }\n\n private findNextEnabledIndex(startIndex: number, direction: 1 | -1): number {\n const options = this.options();\n let index = startIndex + direction;\n\n while (index >= 0 && index < options.length) {\n if (!options[index].disabled) {\n return index;\n }\n index += direction;\n }\n\n return -1;\n }\n\n private handleTypeahead(key: string): void {\n this.typeaheadQuery += key.toLocaleLowerCase();\n if (this.typeaheadTimer) {\n clearTimeout(this.typeaheadTimer);\n }\n this.typeaheadTimer = setTimeout(() => this.resetTypeahead(), 500);\n\n const matchIndex = this.options().findIndex(\n (option) =>\n !option.disabled && option.label.toLocaleLowerCase().startsWith(this.typeaheadQuery),\n );\n if (matchIndex < 0) {\n return;\n }\n\n if (!this.isOpen()) {\n this.isOpen.set(true);\n this.startDropdownPositionTracking();\n }\n this.activeIndex.set(matchIndex);\n this.scrollActiveOptionIntoView();\n }\n\n private resetTypeahead(): void {\n this.typeaheadQuery = '';\n if (this.typeaheadTimer) {\n clearTimeout(this.typeaheadTimer);\n this.typeaheadTimer = undefined;\n }\n }\n\n private scrollActiveOptionIntoView(): void {\n setTimeout(() => {\n document\n .getElementById(this.optionId(this.activeIndex()))\n ?.scrollIntoView?.({ block: 'nearest' });\n });\n }\n\n private findOption(value: SelectValue): SelectOption | undefined {\n return this.options().find((option) => Object.is(option.value, value));\n }\n\n private includesValue(values: SelectValue[], value: SelectValue): boolean {\n return values.some((selectedValue) => Object.is(selectedValue, value));\n }\n}\n","<div [class]=\"hasAction() ? 'flex items-center gap-2' : ''\">\n <div class=\"relative flex-1\">\n <button\n #trigger\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [id]=\"controlId()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"listboxId()\"\n [attr.aria-activedescendant]=\"isOpen() && activeIndex() >= 0 ? optionId(activeIndex()) : null\"\n [class]=\"triggerClasses()\"\n (click)=\"toggleDropdown()\"\n (keydown)=\"onTriggerKeydown($event)\"\n [style.min-width]=\"minWidth()\"\n >\n <span\n class=\"min-w-0 flex-1 truncate\"\n [class.text-muted-foreground]=\"!hasSelection()\"\n [title]=\"hasSelection() ? displayLabel() : ''\"\n >\n {{ displayLabel() }}\n </span>\n\n <span class=\"ml-auto flex shrink-0 items-center gap-2\">\n @if (multiple() && selectedCount() > 0) {\n <span\n class=\"inline-flex min-w-5 items-center justify-center rounded-full bg-primary/10 px-1.5 py-0.5 text-sm font-semibold text-primary\"\n aria-hidden=\"true\"\n >\n {{ selectedCount() }}\n </span>\n }\n <hui-icon\n name=\"chevron-down\"\n [size]=\"18\"\n [ariaLabel]=\"localization.translate('Toggle options')\"\n customClass=\"text-muted-foreground transition-transform\"\n [class.rotate-180]=\"isOpen()\"\n />\n </span>\n </button>\n\n @if (isOpen() && !isDisabled()) {\n <div\n #dropdown\n [id]=\"listboxId()\"\n role=\"listbox\"\n [attr.aria-label]=\"ariaLabel() || panelLabel()\"\n [attr.aria-multiselectable]=\"multiple() || null\"\n [attr.data-placement]=\"dropdownPlacement()\"\n [class]=\"dropdownClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n >\n <div\n #dropdownHeader\n class=\"flex items-center justify-between gap-3 border-b border-border px-4 py-2.5\"\n >\n <span class=\"truncate font-medium text-foreground\">{{ panelLabel() }}</span>\n @if (multiple() && selectedCount() > 0) {\n <button\n type=\"button\"\n class=\"shrink-0 text-muted-foreground transition-colors hover:text-foreground\"\n (click)=\"clearAll($event)\"\n >\n {{ localization.translate('Clear all') }}\n </button>\n }\n </div>\n\n <div\n #optionsViewport\n class=\"overflow-y-auto p-2\"\n [style.max-height.px]=\"availableOptionsHeight()\"\n >\n @for (option of options(); track option.value; let index = $index) {\n <button\n type=\"button\"\n role=\"option\"\n tabindex=\"-1\"\n [id]=\"optionId(index)\"\n [disabled]=\"option.disabled\"\n [attr.aria-selected]=\"isOptionSelected(option)\"\n [attr.aria-disabled]=\"option.disabled || null\"\n [class]=\"optionClasses(option, index)\"\n (click)=\"selectOption(option)\"\n >\n <span class=\"min-w-0 flex-1 truncate\">{{\n localization.translate(option.label)\n }}</span>\n @if (isOptionSelected(option)) {\n <hui-icon\n name=\"check\"\n [size]=\"17\"\n [ariaLabel]=\"localization.translate('Selected')\"\n customClass=\"text-primary\"\n />\n }\n </button>\n } @empty {\n <p class=\"px-3 py-5 text-center text-muted-foreground\">\n {{ localization.translate('No options available') }}\n </p>\n }\n </div>\n </div>\n\n <div class=\"fixed inset-0 z-20\" aria-hidden=\"true\" (click)=\"closeDropdown()\"></div>\n }\n </div>\n\n @if (hasAction()) {\n <button\n type=\"button\"\n (click)=\"onActionClick()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"localization.translate(action()?.ariaLabel)\"\n [attr.title]=\"localization.translate(action()?.tooltip || action()?.ariaLabel)\"\n class=\"flex shrink-0 rounded-lg border border-border bg-surface p-2 text-muted-foreground transition-colors hover:bg-surface-hover hover:text-primary focus:outline-none focus:ring-1 focus:ring-primary disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <hui-icon [name]=\"action()!.icon\" [size]=\"20\" />\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, forwardRef, input, signal } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'hui-switch',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'inline-flex',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SwitchComponent),\n multi: true,\n },\n ],\n template: `\n <button\n [id]=\"id()\"\n type=\"button\"\n role=\"switch\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\"\n (blur)=\"onTouched()\"\n class=\"relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border border-transparent p-0.5 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n [class.bg-primary]=\"checked()\"\n [class.bg-border]=\"!checked()\"\n >\n <span\n aria-hidden=\"true\"\n class=\"pointer-events-none block size-5 rounded-full bg-surface shadow-sm transition-transform\"\n [class.translate-x-5]=\"checked()\"\n [class.translate-x-0]=\"!checked()\"\n ></span>\n </button>\n `,\n})\nexport class SwitchComponent implements ControlValueAccessor {\n id = input<string>('');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n\n protected readonly checked = signal(false);\n protected readonly disabled = signal(false);\n private onChange: (value: boolean) => void = () => undefined;\n protected onTouched: () => void = () => undefined;\n\n protected toggle(): void {\n if (this.disabled()) return;\n this.checked.update((value) => !value);\n this.onChange(this.checked());\n }\n\n writeValue(value: boolean): void {\n this.checked.set(Boolean(value));\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n}\n","import {\n Component,\n computed,\n forwardRef,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\n\n@Component({\n selector: 'hui-tel-input',\n template: `\n <input\n [id]=\"id()\"\n type=\"tel\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"tel\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [class]=\"inputClasses()\"\n />\n `,\n host: {\n '[class]': '\"block w-full\"',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TelInputComponent),\n multi: true,\n },\n ],\n})\nexport class TelInputComponent implements ControlValueAccessor {\n id = input<string>('');\n placeholder = input<string>('+1 (555) 000-0000');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n\n protected readonly value = signal<string>('');\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.invalid());\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({ invalid: this.isInvalid() });\n });\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n this.value.set(value);\n this.onChange(value);\n }\n\n writeValue(value: string): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n Component,\n computed,\n forwardRef,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\n\n@Component({\n selector: 'hui-textarea',\n template: `\n <textarea\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n [rows]=\"rows()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [class]=\"inputClasses()\"\n ></textarea>\n `,\n host: {\n '[class]': '\"block w-full\"',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TextareaComponent),\n multi: true,\n },\n ],\n})\nexport class TextareaComponent implements ControlValueAccessor {\n id = input<string>('');\n placeholder = input<string>('');\n rows = input<number>(4);\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n class = input<string>('');\n\n protected readonly value = signal<string>('');\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.invalid());\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({\n invalid: this.isInvalid(),\n additionalClasses: 'resize-vertical',\n customClasses: this.class(),\n });\n });\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n const value = target.value;\n this.value.set(value);\n this.onChange(value);\n }\n\n writeValue(value: string): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n Component,\n computed,\n forwardRef,\n input,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { buildFormControlClasses } from '../utils/form-control-classes';\n\n@Component({\n selector: 'hui-url-input',\n template: `\n <input\n [id]=\"id()\"\n type=\"url\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [class]=\"inputClasses()\"\n />\n `,\n host: {\n '[class]': '\"block w-full\"',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => UrlInputComponent),\n multi: true,\n },\n ],\n})\nexport class UrlInputComponent implements ControlValueAccessor {\n id = input<string>('');\n placeholder = input<string>('https://example.com');\n ariaLabel = input<string>('');\n ariaDescribedby = input<string>('');\n invalid = input<boolean>(false);\n\n protected readonly value = signal<string>('');\n protected readonly isDisabled = signal<boolean>(false);\n protected readonly isInvalid = computed(() => this.invalid());\n\n protected readonly inputClasses = computed(() => {\n return buildFormControlClasses({ invalid: this.isInvalid() });\n });\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n this.value.set(value);\n this.onChange(value);\n }\n\n writeValue(value: string): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { FormArrayFieldComponent } from '../form-array-field/form-array-field';\nimport { ConditionRule, FieldConfig, SelectOption } from '../../models';\nimport { OptionsLoaderService } from '../../services';\nimport { AutocompleteComponent } from '../../../forms/autocomplete/autocomplete';\nimport { CheckboxComponent } from '../../../forms/checkbox/checkbox';\nimport { ChoiceChipsComponent } from '../../../forms/choice-chips/choice-chips';\nimport { DateInputComponent } from '../../../forms/date-input/date-input';\nimport { EmailInputComponent } from '../../../forms/email-input/email-input';\nimport { FileInputComponent } from '../../../forms/file-input/file-input';\nimport { FormFieldComponent } from '../../../forms/form-field/form-field';\nimport { ImageSelectorInputComponent } from '../../../forms/image-selector-input/image-selector-input';\nimport { InputComponent } from '../../../forms/input/input';\nimport { NumberInputComponent } from '../../../forms/number-input/number-input';\nimport { PasswordInputComponent } from '../../../forms/password-input/password-input';\nimport { RadioGroupComponent } from '../../../forms/radio-group/radio-group';\nimport { SearchInputComponent } from '../../../forms/search-input/search-input';\nimport { SelectComponent } from '../../../forms/select/select';\nimport { SwitchComponent } from '../../../forms/switch/switch';\nimport { TelInputComponent } from '../../../forms/tel-input/tel-input';\nimport { TextareaComponent } from '../../../forms/textarea/textarea';\nimport { UrlInputComponent } from '../../../forms/url-input/url-input';\nimport { LocalizationService } from '../../../config/ui-localization';\n\n@Component({\n selector: 'hui-dynamic-field',\n templateUrl: './dynamic-field.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ReactiveFormsModule,\n FormFieldComponent,\n forwardRef(() => FormArrayFieldComponent),\n InputComponent,\n EmailInputComponent,\n PasswordInputComponent,\n TextareaComponent,\n SelectComponent,\n CheckboxComponent,\n SwitchComponent,\n ChoiceChipsComponent,\n RadioGroupComponent,\n NumberInputComponent,\n TelInputComponent,\n UrlInputComponent,\n SearchInputComponent,\n AutocompleteComponent,\n DateInputComponent,\n ImageSelectorInputComponent,\n FileInputComponent,\n ],\n})\nexport class DynamicFieldComponent {\n field = input.required<FieldConfig>();\n form = input.required<FormGroup>();\n fieldLayout = input<'column' | 'row' | 'stacked'>('column');\n apiConfig = input<{ baseUrl?: string; headers?: Record<string, string> }>();\n validationStrategy = input<'touched' | 'submit'>('touched');\n formSubmitted = input<boolean>(false);\n\n /** Emits when a field's action button is clicked, with the field key */\n actionClick = output<{ fieldKey: string }>();\n\n private readonly optionsLoader = inject(OptionsLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly localization = inject(LocalizationService);\n\n protected readonly options = signal<SelectOption[]>([]);\n protected readonly loading = signal(false);\n\n // Reactive control state tracking\n private readonly controlTouched = signal<boolean>(false);\n private readonly controlInvalid = signal<boolean>(false);\n\n // Generate unique ID for each field\n protected readonly fieldId = computed(() => {\n const fieldKey = this.field().key;\n const uniqueSuffix = Math.random().toString(36).substring(2, 11);\n return `field-${fieldKey}-${uniqueSuffix}`;\n });\n\n protected readonly control = computed(() => {\n return this.form().get(this.field().key) as FormControl;\n });\n\n // Compute whether to show error state on input\n protected readonly showError = computed(() => {\n const ctrl = this.control();\n if (!ctrl) return false;\n\n // Use reactive signals instead of direct property access\n const invalid = this.controlInvalid();\n const touched = this.controlTouched();\n\n if (!invalid) return false;\n\n const strategy = this.validationStrategy();\n const submitted = this.formSubmitted();\n\n // Show errors based on strategy\n if (strategy === 'submit') {\n return submitted;\n } else {\n // Default: show errors when field is touched\n return touched;\n }\n });\n\n // Track form changes to trigger visibility re-evaluation\n private readonly formChangeSignal = signal<number>(0);\n\n // Compute whether the field should be visible based on showWhen/hideWhen conditions\n protected readonly isVisible = computed(() => {\n // Trigger reactivity when form changes\n this.formChangeSignal();\n\n const field = this.field();\n const form = this.form();\n\n // If explicitly hidden, don't show\n if (field.hidden) {\n return false;\n }\n\n // Evaluate showWhen conditions\n if (field.showWhen) {\n const showConditions = Array.isArray(field.showWhen) ? field.showWhen : [field.showWhen];\n const shouldShow = showConditions.every((condition) =>\n this.evaluateCondition(condition, form),\n );\n\n if (!shouldShow) {\n return false;\n }\n }\n\n // Evaluate hideWhen conditions\n if (field.hideWhen) {\n const hideConditions = Array.isArray(field.hideWhen) ? field.hideWhen : [field.hideWhen];\n const shouldHide = hideConditions.some((condition) =>\n this.evaluateCondition(condition, form),\n );\n if (shouldHide) {\n return false;\n }\n }\n\n return true;\n });\n\n constructor() {\n // Track control state changes for reactive error display\n effect(() => {\n const ctrl = this.control();\n\n if (!ctrl) {\n return;\n }\n\n // Set initial state\n this.controlInvalid.set(ctrl.invalid);\n this.controlTouched.set(ctrl.touched);\n\n // Subscribe to status changes\n ctrl.statusChanges?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.controlInvalid.set(ctrl.invalid);\n this.controlTouched.set(ctrl.touched);\n });\n\n // Subscribe to events (includes touch events)\n ctrl.events?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.controlInvalid.set(ctrl.invalid);\n this.controlTouched.set(ctrl.touched);\n });\n });\n\n // Watch for form value changes to trigger visibility re-evaluation\n effect(() => {\n const form = this.form();\n\n // Subscribe to form value changes\n form.valueChanges?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.formChangeSignal.update((v) => v + 1);\n });\n });\n\n // Initial load when field signal changes\n effect(() => {\n const field = this.field();\n const form = this.form();\n\n // Load options on initial render if configured to do so\n const shouldLoadOnInit = field.optionsFromApi?.loadOnInit !== false;\n if (shouldLoadOnInit) {\n this.loadOptions();\n }\n\n // Set up dependency watchers\n if (field.dependsOn && field.optionsFromApi) {\n const dependencies = Array.isArray(field.dependsOn) ? field.dependsOn : [field.dependsOn];\n\n // Watch each dependency field for changes\n dependencies.forEach((dep) => {\n if (dep.refreshOn === 'change') {\n const dependentControl = form.get(dep.field);\n if (dependentControl) {\n dependentControl.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.loadOptions();\n });\n }\n }\n });\n }\n });\n }\n\n // Evaluate a single condition\n private evaluateCondition(condition: ConditionRule, form: FormGroup): boolean {\n const control = form.get(condition.field);\n if (!control) {\n return false;\n }\n\n const fieldValue = control.value;\n const { operator, value, values } = condition;\n\n // Normalize empty values: treat empty strings, null, and undefined as equivalent\n const isFieldEmpty = fieldValue === null || fieldValue === undefined || fieldValue === '';\n const isConditionValueEmpty = value === null || value === undefined || value === '';\n\n switch (operator) {\n case 'eq':\n // Handle empty value comparisons\n if (isConditionValueEmpty) {\n return isFieldEmpty;\n }\n return fieldValue === value;\n case 'neq':\n // Handle empty value comparisons\n if (isConditionValueEmpty) {\n return !isFieldEmpty;\n }\n return fieldValue !== value;\n case 'in':\n return values ? values.includes(fieldValue) : false;\n case 'nin':\n return values ? !values.includes(fieldValue) : true;\n case 'gt':\n return fieldValue > value;\n case 'gte':\n return fieldValue >= value;\n case 'lt':\n return fieldValue < value;\n case 'lte':\n return fieldValue <= value;\n case 'contains':\n return typeof fieldValue === 'string' && typeof value === 'string'\n ? fieldValue.includes(value)\n : false;\n default:\n return false;\n }\n }\n\n protected loadOptions(searchQuery?: string): void {\n const field = this.field();\n\n // Use static options\n if (field.options && !searchQuery) {\n this.options.set(field.options);\n return;\n }\n\n // Load from API\n if (field.optionsFromApi) {\n this.loading.set(true);\n const formValues = this.form().getRawValue();\n\n this.optionsLoader\n .loadOptions(field.optionsFromApi, formValues, searchQuery, this.apiConfig())\n .subscribe({\n next: (options) => {\n this.options.set(options);\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Failed to load options:', err);\n this.loading.set(false);\n },\n });\n }\n }\n\n protected onSearch(query: string): void {\n this.loadOptions(query);\n }\n\n protected onAutocompleteSelect(value: any): void {}\n\n /** Emit action click event with the field key */\n protected onFieldActionClick(): void {\n this.actionClick.emit({ fieldKey: this.field().key });\n }\n\n /** Reload options - can be called from parent component after creating new item */\n public reloadOptions(): void {\n this.loadOptions();\n }\n\n /** Get the selected option object for autocomplete/select fields */\n public getSelectedOption(): SelectOption | SelectOption[] | undefined {\n const field = this.field();\n if (field.type !== 'autocomplete' && field.type !== 'select') {\n return undefined;\n }\n\n const control = this.control();\n if (!control) return undefined;\n\n const selectedValue = control.value;\n if (!selectedValue) return undefined;\n\n const options = this.options();\n\n // Handle multiple selection\n if (field.multiple && Array.isArray(selectedValue)) {\n return selectedValue\n .map((val) => options.find((opt) => opt.value === val))\n .filter((opt): opt is SelectOption => !!opt);\n }\n\n // Handle single selection\n return options.find((opt) => opt.value === selectedValue);\n }\n}\n","@if (isVisible()) {\n @switch (field().type) {\n <!-- Array Field - uses forwardRef to break circular dependency -->\n @case ('array') {\n <div [class]=\"field().containerClass || ''\">\n <hui-form-array-field\n [field]=\"field()\"\n [form]=\"form()\"\n [fieldLayout]=\"fieldLayout()\"\n [apiConfig]=\"apiConfig()\"\n [validationStrategy]=\"validationStrategy()\"\n [formSubmitted]=\"formSubmitted()\"\n />\n </div>\n }\n\n <!-- All other fields with FormFieldComponent wrapper -->\n @default {\n <div [class]=\"field().containerClass || ''\">\n <hui-form-field\n [label]=\"localization.translate(field().label)\"\n [layout]=\"fieldLayout()\"\n [required]=\"field().required || false\"\n [hint]=\"localization.translate(field().hint)\"\n [helper]=\"localization.translate(field().helper)\"\n [description]=\"localization.translate(field().description)\"\n [note]=\"localization.translate(field().note)\"\n [noteVariant]=\"field().noteVariant || 'info'\"\n [noteClasses]=\"field().noteClasses || ''\"\n [fieldName]=\"localization.translate(field().label)\"\n [validationStrategy]=\"validationStrategy()\"\n [formSubmitted]=\"formSubmitted()\"\n [control]=\"control()\"\n [inputId]=\"fieldId()\"\n [type]=\"field().type\"\n >\n @switch (field().type) {\n @case ('checkbox') {\n <hui-checkbox\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [ariaLabel]=\"localization.translate(field().label)\"\n />\n }\n @case ('switch') {\n <hui-switch\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [ariaLabel]=\"localization.translate(field().label)\"\n />\n }\n @case ('text') {\n <hui-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [invalid]=\"showError()\"\n />\n }\n @case ('email') {\n <hui-email-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [displayInvalid]=\"showError()\"\n />\n }\n @case ('password') {\n <hui-password-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [displayInvalid]=\"showError()\"\n />\n }\n @case ('textarea') {\n <hui-textarea\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [rows]=\"field().rows || 4\"\n [invalid]=\"showError()\"\n />\n }\n @case ('number') {\n <hui-number-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [min]=\"field().min\"\n [max]=\"field().max\"\n [step]=\"field().step || 1\"\n [invalid]=\"showError()\"\n />\n }\n @case ('tel') {\n <hui-tel-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [invalid]=\"showError()\"\n />\n }\n @case ('url') {\n <hui-url-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [invalid]=\"showError()\"\n />\n }\n @case ('select') {\n @if (field().optionPresentation === 'chips') {\n <hui-choice-chips\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [options]=\"options()\"\n [multiple]=\"field().multiple || false\"\n [layout]=\"field().chipLayout || 'wrap'\"\n [ariaLabel]=\"localization.translate(field().label)\"\n [invalid]=\"showError()\"\n [action]=\"field().action\"\n (actionClick)=\"onFieldActionClick()\"\n />\n } @else if (field().searchable) {\n <hui-search-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder || 'Search...')\"\n (search)=\"onSearch($any($event).target.value)\"\n />\n <!-- TODO: Add dropdown with filtered options -->\n } @else {\n <hui-select\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder || 'Select...')\"\n [options]=\"options()\"\n [multiple]=\"field().multiple || false\"\n [invalid]=\"showError()\"\n [action]=\"field().action\"\n (actionClick)=\"onFieldActionClick()\"\n />\n }\n }\n @case ('autocomplete') {\n <hui-autocomplete\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder || 'Search...')\"\n [mode]=\"field().optionsFromApi ? 'server' : 'local'\"\n [options]=\"options()\"\n [serverResults]=\"options()\"\n [loading]=\"loading()\"\n [minChars]=\"field().minSearchLength || 1\"\n [multiple]=\"field().multiple || false\"\n [invalid]=\"showError()\"\n [action]=\"field().action\"\n (search)=\"onSearch($event)\"\n (select)=\"onAutocompleteSelect($event)\"\n (actionClick)=\"onFieldActionClick()\"\n />\n }\n @case ('radio') {\n <hui-radio-group [id]=\"fieldId()\" [formControl]=\"control()\" [options]=\"options()\" />\n }\n @case ('search') {\n <hui-search-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder || 'Search...')\"\n (search)=\"onSearch($any($event).target.value)\"\n />\n }\n @case ('date') {\n <hui-date-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [mode]=\"field().dateMode || 'date'\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [min]=\"field().minDate || ''\"\n [max]=\"field().maxDate || ''\"\n [invalid]=\"showError()\"\n />\n }\n @case ('datetime') {\n <hui-date-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n mode=\"datetime-local\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [min]=\"field().minDate || ''\"\n [max]=\"field().maxDate || ''\"\n [invalid]=\"showError()\"\n />\n }\n @case ('month') {\n <hui-date-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n mode=\"month\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [min]=\"field().minDate || ''\"\n [max]=\"field().maxDate || ''\"\n [invalid]=\"showError()\"\n />\n }\n @case ('year') {\n <hui-date-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n mode=\"year\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [min]=\"field().minDate || ''\"\n [max]=\"field().maxDate || ''\"\n [invalid]=\"showError()\"\n />\n }\n @case ('image-selector') {\n <hui-image-selector-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [mediaType]=\"field().mediaType || 'Cover'\"\n [allowUpload]=\"field().allowUpload ?? true\"\n [altText]=\"field().altText || ''\"\n [showPreview]=\"field().showPreview ?? true\"\n [editableInput]=\"field().editableInput ?? false\"\n [invalid]=\"showError()\"\n />\n }\n @case ('file') {\n <hui-file-input\n [id]=\"fieldId()\"\n [formControl]=\"control()\"\n [placeholder]=\"localization.translate(field().placeholder)\"\n [accept]=\"field().accept || ''\"\n [multiple]=\"field().multiple ?? false\"\n [maxSize]=\"field().maxSize\"\n [maxFiles]=\"field().maxFiles\"\n [enableDragDrop]=\"field().enableDragDrop ?? true\"\n [invalid]=\"showError()\"\n />\n }\n }\n </hui-form-field>\n </div>\n }\n }\n}\n","import {\n Component,\n computed,\n effect,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n signal,\n viewChildren,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormArray, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFieldComponent } from './dynamic-field/dynamic-field';\nimport { FieldConfig, FormAction, FormConfig, FormFieldsetConfig } from '../models';\nimport { FieldResolverService, FormBuilderService } from '../services';\nimport { IconComponent } from '../../icon';\nimport { LocalizationService } from '../../config/ui-localization';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'hui-dynamic-form',\n templateUrl: './dynamic-form.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ReactiveFormsModule, DynamicFieldComponent, IconComponent],\n})\nexport class DynamicFormComponent implements OnInit, OnDestroy {\n config = input.required<FormConfig>();\n initialValues = input<Record<string, any>>({});\n\n // Outputs\n formSubmit = output<any>();\n reset = output<void>();\n cancel = output<void>();\n valueChange = output<any>();\n /** Emits when form values change with full selected objects for autocomplete/select fields */\n fieldChange = output<{ values: any; selectedObjects: Record<string, any> }>();\n actionClick = output<{ action: FormAction; formValue: any; isValid: boolean }>();\n /** Emits when a field's action button is clicked (e.g., \"Create New\" button) */\n fieldActionClick = output<{ fieldKey: string; formValue: any }>();\n\n // View children to access dynamic field components\n private readonly dynamicFields = viewChildren(DynamicFieldComponent);\n\n private readonly formBuilder = inject(FormBuilderService);\n private readonly fieldResolver = inject(FieldResolverService);\n protected readonly localization = inject(LocalizationService);\n private readonly destroy$ = new Subject<void>();\n private isSubmitting = false;\n private initialized = false;\n\n protected readonly form = signal<FormGroup>(new FormGroup({}));\n protected readonly formValues = signal<Record<string, any>>({});\n protected readonly submitting = signal<boolean>(false);\n protected readonly submitted = signal<boolean>(false); // Track if form has been submitted\n protected readonly busy = computed(() => this.submitting() || this.form().disabled);\n\n constructor() {\n effect(() => {\n const config = this.config();\n if (this.initialized) this.addMissingControls(config);\n });\n }\n\n protected readonly visibleFields = computed(() => {\n const fields = this.config().fields;\n const values = this.formValues();\n\n return fields.filter((field) => this.fieldResolver.shouldShowField(field, values));\n });\n\n protected readonly visibleFieldsets = computed(() => {\n const visibleByKey = new Map(this.visibleFields().map((field) => [field.key, field]));\n\n return (this.config().fieldsets || [])\n .map((fieldset) => ({\n config: fieldset,\n fields: fieldset.fields\n .map((key) => visibleByKey.get(key))\n .filter((field): field is FieldConfig => field !== undefined),\n }))\n .filter((fieldset) => fieldset.fields.length > 0);\n });\n\n protected readonly ungroupedFields = computed(() => {\n const groupedKeys = new Set(\n (this.config().fieldsets || []).flatMap((fieldset) => fieldset.fields),\n );\n return this.visibleFields().filter((field) => !groupedKeys.has(field.key));\n });\n\n protected readonly layoutClass = computed(() => {\n const layout = this.config().layout || 'vertical';\n const columns = this.config().columns || 1;\n\n if (layout === 'grid') {\n return [\n 'grid gap-4 grid-cols-1 md:grid-cols-1',\n 'grid gap-4 grid-cols-1 md:grid-cols-2',\n 'grid gap-4 grid-cols-1 md:grid-cols-3',\n ][Math.max(1, Math.min(columns, 3)) - 1];\n }\n\n return 'space-y-4';\n });\n\n /** Whether the form uses custom actions array */\n protected readonly hasCustomActions = computed(() => {\n const actions = this.config().actions;\n return actions && actions.length > 0;\n });\n\n /** Sorted and filtered actions */\n protected readonly sortedActions = computed(() => {\n const actions = this.config().actions || [];\n return actions\n .filter((action) => !action.hidden)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n });\n\n protected getFieldColumnClass(field: any): string {\n const layout = this.config().layout || 'vertical';\n\n // If not grid layout, no special classes needed\n if (layout !== 'grid') {\n return '';\n }\n\n // Check if field should span full width\n if (field.fullWidth) {\n return 'col-span-full';\n }\n\n // Check if field has custom column span\n if (field.columnSpan) {\n return ['md:col-span-1', 'md:col-span-2', 'md:col-span-3'][\n Math.max(1, Math.min(field.columnSpan, this.config().columns || 1, 3)) - 1\n ];\n }\n\n return '';\n }\n\n protected getFieldsetClass(fieldset: FormFieldsetConfig): string {\n const base = 'rounded-xl border border-border bg-surface p-4 sm:p-6';\n return `${base} ${fieldset.cssClass || ''}`.trim();\n }\n\n ngOnInit(): void {\n this.initializeForm();\n this.initialized = true;\n this.addMissingControls(this.config());\n this.setupDependencies();\n this.setupValueChangeListener();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private initializeForm(): void {\n const formGroup = this.formBuilder.buildForm(this.config());\n this.form.set(formGroup);\n\n // Set initial values if provided\n const initial = this.initialValues();\n if (Object.keys(initial).length > 0) {\n this.patchInitialValues(formGroup, initial);\n }\n\n // Initialize formValues signal\n this.formValues.set(formGroup.getRawValue());\n\n // Update validators for initially hidden fields\n this.updateHiddenFieldValidators();\n }\n\n private addMissingControls(config: FormConfig): void {\n const form = this.form();\n let added = false;\n for (const field of config.fields) {\n if (form.contains(field.key)) continue;\n const source = this.formBuilder.buildForm({ fields: [field] });\n const control = source.get(field.key);\n if (!control) continue;\n source.removeControl(field.key);\n form.addControl(field.key, control);\n added = true;\n }\n if (!added) return;\n this.formValues.set(form.getRawValue());\n this.updateHiddenFieldValidators();\n }\n\n private patchInitialValues(formGroup: FormGroup, initial: Record<string, unknown>): void {\n const scalarValues: Record<string, unknown> = { ...initial };\n for (const field of this.config().fields) {\n if (field.type !== 'array' || !field.arrayFields) continue;\n delete scalarValues[field.key];\n const values = initial[field.key];\n const formArray = formGroup.get(field.key) as FormArray | null;\n if (!formArray || !Array.isArray(values)) continue;\n formArray.clear();\n for (const value of values) {\n const itemGroup = this.formBuilder.createFormGroupFromFields(field.arrayFields);\n if (typeof value === 'object' && value !== null) itemGroup.patchValue(value);\n formArray.push(itemGroup);\n }\n }\n formGroup.patchValue(scalarValues);\n }\n\n private setupValueChangeListener(): void {\n this.form()\n .valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe((values) => {\n this.formValues.set(this.form().getRawValue());\n this.valueChange.emit(values);\n\n // Emit field change event with selected objects if any field has emitSelectedObject enabled\n const hasEmitSelectedObjectFields = this.config().fields.some(\n (f) => (f.type === 'autocomplete' || f.type === 'select') && f.emitSelectedObject,\n );\n if (hasEmitSelectedObjectFields) {\n const selectedObjects = this.getSelectedObjects();\n this.fieldChange.emit({ values, selectedObjects });\n }\n\n this.updateHiddenFieldValidators();\n });\n }\n\n private updateHiddenFieldValidators(): void {\n const formValues = this.form().getRawValue();\n const fields = this.config().fields;\n\n for (const field of fields) {\n const control = this.form().get(field.key);\n if (!control) continue;\n\n const isVisible = this.fieldResolver.shouldShowField(field, formValues);\n\n if (!isVisible) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n } else {\n const validators = this.formBuilder.buildValidatorsFromConfig(field);\n control.setValidators(validators);\n control.updateValueAndValidity({ emitEvent: false });\n }\n }\n }\n\n private setupDependencies(): void {\n const dependencyMap = this.fieldResolver.getFieldsWithDependency(this.config().fields);\n\n // Watch for changes in fields that have dependents\n for (const [fieldKey, dependentFields] of dependencyMap.entries()) {\n const control = this.form().get(fieldKey);\n if (!control) continue;\n\n control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\n for (const dependentField of dependentFields) {\n const dependencies = Array.isArray(dependentField.dependsOn)\n ? dependentField.dependsOn\n : [dependentField.dependsOn];\n\n for (const dep of dependencies) {\n if (dep && dep.field === fieldKey) {\n // Clear dependent field if configured\n if (dep && dep.clearOnChange) {\n const dependentControl = this.form().get(dependentField.key);\n dependentControl?.reset();\n }\n }\n }\n }\n });\n }\n }\n\n protected onSubmit(): void {\n // Mark form as submitted (for validation display)\n this.submitted.set(true);\n\n // Prevent double submission\n if (this.isSubmitting) {\n return;\n }\n\n if (this.form().invalid) {\n this.form().markAllAsTouched();\n return;\n }\n\n this.isSubmitting = true;\n this.submitting.set(true);\n\n const formValue = this.form().getRawValue();\n this.form().disable({ emitEvent: false });\n this.formSubmit.emit(formValue);\n }\n\n /**\n * Call this method to reset the submitting state and re-enable the form\n * Should be called from parent component after async operation completes\n */\n public finishSubmit(): void {\n this.isSubmitting = false;\n this.submitting.set(false);\n this.form().enable({ emitEvent: false });\n for (const field of this.config().fields) {\n if (field.disabled) this.form().get(field.key)?.disable({ emitEvent: false });\n }\n }\n\n public validate(): boolean {\n this.submitted.set(true);\n if (this.form().invalid) {\n this.form().markAllAsTouched();\n return false;\n }\n return true;\n }\n\n public getRawValue<T>(): T {\n return this.form().getRawValue() as T;\n }\n\n public onReset(): void {\n this.form().reset();\n this.reset.emit();\n }\n\n public onCancel(): void {\n this.cancel.emit();\n }\n\n /** Handle custom action button click */\n protected onActionClick(action: FormAction): void {\n // Handle built-in action types\n if (action.type === 'submit') {\n this.onSubmit();\n return;\n }\n\n if (action.type === 'reset') {\n this.onReset();\n return;\n }\n\n // Emit custom action event\n this.actionClick.emit({\n action,\n formValue: this.form().getRawValue(),\n isValid: this.form().valid,\n });\n }\n\n /** Check if an action button should be disabled */\n protected isActionDisabled(action: FormAction): boolean {\n if (action.disableOnSubmitting && this.submitting()) {\n return true;\n }\n if (action.disableOnInvalid && this.form().invalid) {\n return true;\n }\n return false;\n }\n\n /** Get CSS classes for an action button based on variant */\n protected getActionClass(action: FormAction): string {\n // Base classes for all buttons\n const baseClasses =\n 'py-2 px-4 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed';\n\n // Variant-specific classes\n const variantClasses: Record<string, string> = {\n primary:\n 'bg-linear-to-r from-purple-600 to-indigo-600 text-white hover:from-purple-700 hover:to-indigo-700 focus:ring-purple-500',\n secondary: 'bg-border text-text-secondary hover:bg-gray-300 focus:ring-gray-500',\n outline:\n 'border border-border bg-transparent text-text-secondary hover:bg-surface-hover focus:ring-gray-500',\n danger: 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500',\n success: 'bg-green-600 text-white hover:bg-green-700 focus:ring-green-500',\n link: 'bg-transparent text-purple-600 hover:text-purple-800 hover:underline focus:ring-purple-500',\n };\n\n const variant = action.variant || 'secondary';\n const variantClass = variantClasses[variant] || variantClasses['secondary'];\n\n // Combine base + variant + custom classes (custom classes can extend/override)\n const customClass = action.cssClass || '';\n return `${baseClasses} ${variantClass} ${customClass}`.trim();\n }\n\n /** Handle field action button click (e.g., \"Create New\" button on select/autocomplete) */\n protected onFieldActionClick(event: { fieldKey: string }): void {\n this.fieldActionClick.emit({\n fieldKey: event.fieldKey,\n formValue: this.form().getRawValue(),\n });\n }\n\n /**\n * Reload options for a specific field (useful after creating a new item via action button)\n * @param fieldKey The key of the field to reload options for\n */\n public reloadFieldOptions(fieldKey: string): void {\n const field = this.getField(fieldKey);\n if (field) {\n field.reloadOptions();\n }\n }\n\n /**\n * Reload options for a field and set the newly created value\n * @param fieldKey The key of the field to reload and set value for\n * @param newValue The value to set after reloading (e.g., the ID of the newly created item)\n */\n public reloadFieldOptionsAndSetValue(fieldKey: string, newValue: any): void {\n const field = this.getField(fieldKey);\n if (field) {\n field.reloadOptions();\n // Set the value after a small delay to allow options to load\n setTimeout(() => {\n this.form().get(fieldKey)?.setValue(newValue);\n }, 500);\n }\n }\n\n /** Get a dynamic field component by field key */\n public getField(fieldKey: string): DynamicFieldComponent | undefined {\n return this.dynamicFields().find((field) => field.field().key === fieldKey);\n }\n\n /**\n * Set value for a specific field\n * @param fieldKey The key of the field to set value for\n * @param value The value to set\n */\n public setFieldValue(fieldKey: string, value: any): void {\n this.form().get(fieldKey)?.setValue(value);\n }\n\n /**\n * Get selected objects for all autocomplete/select fields\n * @returns Record of field keys to their selected option objects\n */\n private getSelectedObjects(): Record<string, any> {\n const selectedObjects: Record<string, any> = {};\n const fields = this.dynamicFields();\n\n for (const field of fields) {\n const fieldConfig = field.field();\n if (\n (fieldConfig.type === 'autocomplete' || fieldConfig.type === 'select') &&\n fieldConfig.emitSelectedObject\n ) {\n const selectedOption = field.getSelectedOption();\n if (selectedOption) {\n selectedObjects[fieldConfig.key] = selectedOption;\n }\n }\n }\n\n return selectedObjects;\n }\n}\n","<form [formGroup]=\"form()\" (ngSubmit)=\"onSubmit()\" class=\"dynamic-form\">\n <div class=\"space-y-6\">\n @for (fieldset of visibleFieldsets(); track fieldset.config.key) {\n <fieldset [class]=\"getFieldsetClass(fieldset.config)\">\n <legend class=\"px-2 text-base font-semibold text-foreground\">\n {{ localization.translate(fieldset.config.legend) }}\n </legend>\n @if (fieldset.config.description) {\n <p class=\"mb-5 text-sm text-muted-foreground\">\n {{ localization.translate(fieldset.config.description) }}\n </p>\n }\n\n <div [class]=\"layoutClass()\">\n @for (field of fieldset.fields; track field.key) {\n <div [class]=\"getFieldColumnClass(field)\">\n <hui-dynamic-field\n [field]=\"field\"\n [form]=\"form()\"\n [fieldLayout]=\"config().fieldLayout || 'column'\"\n [apiConfig]=\"config().apiConfig\"\n [validationStrategy]=\"config().validationStrategy || 'touched'\"\n [formSubmitted]=\"submitted()\"\n (actionClick)=\"onFieldActionClick($event)\"\n />\n </div>\n }\n </div>\n </fieldset>\n }\n\n @if (ungroupedFields().length > 0) {\n <div [class]=\"layoutClass()\">\n @for (field of ungroupedFields(); track field.key) {\n <div [class]=\"getFieldColumnClass(field)\">\n <hui-dynamic-field\n [field]=\"field\"\n [form]=\"form()\"\n [fieldLayout]=\"config().fieldLayout || 'column'\"\n [apiConfig]=\"config().apiConfig\"\n [validationStrategy]=\"config().validationStrategy || 'touched'\"\n [formSubmitted]=\"submitted()\"\n (actionClick)=\"onFieldActionClick($event)\"\n />\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Form Actions -->\n <div\n [class]=\"\n 'flex flex-wrap items-center justify-end gap-3 mt-6 pt-4' +\n (config().actionsWrapper?.cssClass ? ' ' + config().actionsWrapper?.cssClass : '')\n \"\n >\n @if (!hasCustomActions() && config().showCancelButton?.hidden !== true) {\n <button\n type=\"button\"\n (click)=\"cancel.emit()\"\n [disabled]=\"busy()\"\n class=\"inline-flex items-center gap-2 py-2 px-4 bg-surface text-foreground border border-border rounded-lg hover:bg-card focus-visible:ring-2 focus-visible:ring-primary disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium\"\n >\n <hui-icon name=\"close\" [size]=\"18\" />\n {{ localization.translate(config().showCancelButton?.label || 'Cancel') }}\n </button>\n }\n @if (hasCustomActions()) {\n <!-- Custom Actions -->\n @for (action of sortedActions(); track action.key) {\n <button\n [type]=\"action.type === 'submit' ? 'submit' : 'button'\"\n (click)=\"action.type === 'submit' ? null : onActionClick(action)\"\n [disabled]=\"isActionDisabled(action)\"\n [class]=\"getActionClass(action)\"\n >\n @if (action.type === 'submit' && submitting()) {\n <span class=\"flex items-center justify-center gap-2\">\n <hui-icon name=\"loader-2\" class=\"h-5 w-5 animate-spin\" />\n <span>{{ localization.translate('Submitting...') }}</span>\n </span>\n } @else {\n <span class=\"flex items-center gap-2\">\n @if (action.icon && action.iconPosition !== 'right') {\n <hui-icon [name]=\"action.icon\" class=\"h-5 w-5\" />\n }\n <span>{{ localization.translate(action.label) }}</span>\n @if (action.icon && action.iconPosition === 'right') {\n <hui-icon [name]=\"action.icon\" class=\"h-5 w-5\" />\n }\n </span>\n }\n </button>\n }\n } @else {\n @if (!config().resetButton?.hidden) {\n <button\n type=\"button\"\n (click)=\"onReset()\"\n [disabled]=\"busy()\"\n class=\"inline-flex items-center gap-2 py-2 px-4 bg-surface text-foreground border border-border rounded-lg hover:bg-card focus-visible:ring-2 focus-visible:ring-primary disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium\"\n [class]=\"config().resetButton?.cssClass || ''\"\n >\n <hui-icon name=\"reload\" [size]=\"18\" />\n {{ localization.translate(config().resetButton?.label || 'Reset') }}\n </button>\n }\n <!-- Default Submit/Reset Buttons -->\n @if (!config().submitButton?.hidden) {\n <button\n type=\"submit\"\n [disabled]=\"form().invalid || busy()\"\n class=\"inline-flex items-center gap-2 py-2 px-4 bg-primary text-primary-foreground rounded-lg focus-visible:ring-2 focus-visible:ring-primary disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium\"\n [class]=\"config().submitButton?.cssClass || ''\"\n >\n @if (submitting()) {\n <span class=\"flex items-center justify-center gap-2\">\n <hui-icon name=\"loader-2\" class=\"h-5 w-5 animate-spin\" />\n <span>{{ localization.translate('Submitting...') }}</span>\n </span>\n } @else {\n <hui-icon name=\"check\" [size]=\"18\" />\n <span>{{ localization.translate(config().submitButton?.label || 'Submit') }}</span>\n }\n </button>\n }\n }\n </div>\n</form>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '../checkbox/checkbox';\nimport { IconComponent } from '../../icon';\n\nexport interface CheckboxDropdownOption {\n label: string;\n value: string | boolean;\n checked?: boolean;\n}\n\n@Component({\n selector: 'hui-checkbox-dropdown',\n imports: [CommonModule, FormsModule, IconComponent, CheckboxComponent],\n templateUrl: './checkbox-dropdown.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./checkbox-dropdown.css'],\n})\nexport class CheckboxDropdownComponent {\n // Inputs\n readonly label = input<string>('Filters');\n readonly options = input.required<CheckboxDropdownOption[]>();\n readonly buttonClass = input<string>('');\n readonly icon = input<string>('checks');\n\n // Outputs\n readonly selectionChange = output<CheckboxDropdownOption[]>();\n\n // State\n protected readonly isOpen = signal<boolean>(false);\n protected readonly selectedOptions = signal<CheckboxDropdownOption[]>([]);\n\n // Computed\n protected readonly selectedCount = computed(() => this.selectedOptions().length);\n protected readonly displayLabel = computed(() => {\n const count = this.selectedCount();\n return count > 0 ? `${this.label()} (${count})` : this.label();\n });\n\n constructor() {\n // Initialize selected options from input\n effect(() => {\n const opts = this.options().filter((opt) => opt.checked);\n this.selectedOptions.set(opts);\n });\n }\n\n protected toggleDropdown(): void {\n this.isOpen.update((open) => !open);\n }\n\n protected closeDropdown(): void {\n this.isOpen.set(false);\n }\n\n protected onCheckboxChange(option: CheckboxDropdownOption, checked: boolean): void {\n const selected = this.selectedOptions();\n if (checked) {\n if (selected.some((opt) => opt.value === option.value)) {\n return;\n }\n this.selectedOptions.set([...selected, option]);\n } else {\n this.selectedOptions.set(selected.filter((opt) => opt.value !== option.value));\n }\n this.selectionChange.emit(this.selectedOptions());\n }\n\n protected isChecked(option: CheckboxDropdownOption): boolean {\n return this.selectedOptions().some((opt) => opt.value === option.value);\n }\n\n protected clearAll(): void {\n this.selectedOptions.set([]);\n this.selectionChange.emit([]);\n }\n}\n","<div class=\"relative inline-block\">\n <button\n type=\"button\"\n (click)=\"toggleDropdown()\"\n [class]=\"\n 'flex items-center gap-2 px-3 py-2 font-medium text-text-secondary bg-surface border border-border rounded hover:bg-surface-hover transition-colors ' +\n buttonClass()\n \"\n >\n @if (icon()) {\n <hui-icon [name]=\"icon()\" [size]=\"16\" />\n }\n <span>{{ displayLabel() }}</span>\n <svg\n class=\"w-4 h-4 transition-transform\"\n [class.rotate-180]=\"isOpen()\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n @if (isOpen()) {\n <div\n class=\"absolute right-0 z-30 mt-1 w-64 bg-surface border border-border rounded-xl shadow-xl\"\n >\n <div class=\"flex items-center justify-between px-4 py-2 border-b border-border\">\n <span class=\"font-medium text-text-secondary\">{{ label() }}</span>\n @if (selectedCount() > 0) {\n <button\n type=\"button\"\n (click)=\"clearAll()\"\n class=\"text-sm text-muted-foreground hover:text-text-secondary transition-colors\"\n >\n Clear All\n </button>\n }\n </div>\n\n <div class=\"mb-2 max-h-64 overflow-y-auto px-4 py-2\">\n @for (option of options(); track option.value) {\n <div class=\"mb-1.5 w-full py-0.5\">\n <hui-checkbox\n [fullWidth]=\"true\"\n [label]=\"option.label\"\n [ngModel]=\"isChecked(option)\"\n (ngModelChange)=\"onCheckboxChange(option, $event)\"\n />\n </div>\n }\n </div>\n </div>\n\n <div (click)=\"closeDropdown()\" class=\"fixed inset-0 z-20\"></div>\n }\n</div>\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { TableCellContext } from './table.model';\n\n@Directive({\n selector: 'ng-template[huiTableCell]',\n})\nexport class TableCellDirective<T = unknown> {\n readonly columnKey = input.required<string>({ alias: 'huiTableCell' });\n readonly templateRef = inject(TemplateRef<TableCellContext<T>>);\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, output, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '../../forms';\nimport { TableColumn } from '../table.model';\nimport { twMerge } from 'tailwind-merge';\n\n@Component({\n selector: 'hui-table-column-selector',\n templateUrl: './table-column-selector.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, CheckboxComponent],\n})\nexport class TableColumnSelectorComponent {\n // Inputs\n readonly allColumns = input.required<TableColumn[]>();\n readonly visibleColumnKeys = input.required<string[]>();\n readonly class = input<string>('');\n\n // Outputs\n readonly visibleColumnsChange = output<string[]>();\n\n // State\n protected readonly isOpen = signal(false);\n\n // Computed\n protected readonly hideableColumns = computed(() =>\n this.allColumns().filter((col) => col.hideable !== false),\n );\n\n protected readonly buttonClasses = computed(() => {\n const baseClasses =\n 'inline-flex items-center gap-2 px-3 py-2 font-medium text-text-secondary bg-card rounded hover:bg-surface-hover focus:outline-none focus:ring-offset-2 transition-colors border border-border';\n return twMerge(baseClasses, this.class());\n });\n\n protected readonly allSelected = computed(() => {\n const hideable = this.hideableColumns();\n const visible = this.visibleColumnKeys();\n return hideable.length > 0 && hideable.every((col) => visible.includes(col.key));\n });\n\n protected readonly someSelected = computed(() => {\n const hideable = this.hideableColumns();\n const visible = this.visibleColumnKeys();\n const selectedCount = hideable.filter((col) => visible.includes(col.key)).length;\n return selectedCount > 0 && selectedCount < hideable.length;\n });\n\n protected toggleDropdown(): void {\n this.isOpen.update((open) => !open);\n }\n\n protected closeDropdown(): void {\n this.isOpen.set(false);\n }\n\n protected isColumnVisible(key: string): boolean {\n return this.visibleColumnKeys().includes(key);\n }\n\n protected toggleColumn(key: string): void {\n const visible = [...this.visibleColumnKeys()];\n const index = visible.indexOf(key);\n\n if (index > -1) {\n // Don't allow hiding the last visible column\n if (visible.length <= 1) {\n return;\n }\n visible.splice(index, 1);\n } else {\n visible.push(key);\n }\n\n this.visibleColumnsChange.emit(visible);\n }\n\n protected onColumnVisibilityChange(key: string, checked: boolean): void {\n const currentlyVisible = this.isColumnVisible(key);\n\n if (checked === currentlyVisible) {\n return;\n }\n\n if (!checked && this.visibleColumnKeys().length <= 1) {\n return;\n }\n\n this.toggleColumn(key);\n }\n\n protected selectAll(): void {\n const allKeys = this.allColumns().map((col) => col.key);\n this.visibleColumnsChange.emit(allKeys);\n }\n\n protected deselectAll(): void {\n // Keep at least one column visible - keep the first hideable column\n const firstKey = this.hideableColumns()[0]?.key;\n if (firstKey) {\n const pinned = this.allColumns()\n .filter((col) => col.hideable === false)\n .map((col) => col.key);\n this.visibleColumnsChange.emit(pinned.length ? pinned : [firstKey]);\n }\n }\n\n protected resetToDefault(): void {\n // Reset to all columns visible\n const allKeys = this.allColumns().map((col) => col.key);\n this.visibleColumnsChange.emit(allKeys);\n }\n}\n","<div class=\"relative\">\n <!-- Toggle Button -->\n <button\n type=\"button\"\n (click)=\"toggleDropdown()\"\n [class]=\"buttonClasses()\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"true\"\n >\n <!-- Columns Icon -->\n <svg class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2\"\n />\n </svg>\n <span>Columns</span>\n <!-- Chevron -->\n <svg\n class=\"w-4 h-4 transition-transform\"\n [class.rotate-180]=\"isOpen()\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n <!-- Dropdown Menu -->\n @if (isOpen()) {\n <div\n class=\"absolute right-0 mt-2 w-64 bg-surface rounded-xl shadow-xl border border-border z-50\"\n >\n <!-- Header -->\n <div class=\"px-4 py-3 border-b border-border\">\n <div class=\"flex items-center justify-between\">\n <h3 class=\"font-semibold text-text-primary\">Show Columns</h3>\n <button\n type=\"button\"\n (click)=\"closeDropdown()\"\n class=\"text-muted-foreground hover:text-text-muted focus:outline-none\"\n aria-label=\"Close\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Quick Actions -->\n <div class=\"px-4 py-2 border-b border-border flex items-center justify-between\">\n <button\n type=\"button\"\n (click)=\"selectAll()\"\n class=\"text-sm font-medium text-purple-600 hover:text-purple-700 focus:outline-none\"\n >\n Select All\n </button>\n <button\n type=\"button\"\n (click)=\"deselectAll()\"\n class=\"text-sm font-medium text-text-muted hover:text-text-secondary focus:outline-none\"\n >\n Deselect All\n </button>\n <button\n type=\"button\"\n (click)=\"resetToDefault()\"\n class=\"text-sm font-medium text-blue-600 hover:text-blue-700 focus:outline-none\"\n >\n Reset\n </button>\n </div>\n\n <!-- Column List -->\n <div class=\"max-h-80 overflow-y-auto py-2\">\n @for (column of hideableColumns(); track column.key) {\n <div\n class=\"px-4 py-2 hover:bg-surface-hover transition-colors\"\n [class.opacity-50]=\"!isColumnVisible(column.key) && visibleColumnKeys().length === 1\"\n >\n <hui-checkbox\n [label]=\"column.label\"\n [ngModel]=\"isColumnVisible(column.key)\"\n (ngModelChange)=\"onColumnVisibilityChange(column.key, $event)\"\n />\n </div>\n }\n @if (hideableColumns().length === 0) {\n <div class=\"px-4 py-3 text-muted-foreground text-center\">\n No hideable columns available\n </div>\n }\n </div>\n\n <!-- Footer Info -->\n <div class=\"px-4 py-2 border-t border-border bg-muted rounded-b-lg\">\n <p class=\"text-sm text-muted-foreground\">\n {{ visibleColumnKeys().length }} of {{ hideableColumns().length }} columns visible\n </p>\n </div>\n </div>\n\n <!-- Backdrop -->\n <div class=\"fixed inset-0 z-40\" (click)=\"closeDropdown()\" aria-hidden=\"true\"></div>\n }\n</div>\n","import { CommonModule, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n output,\n signal,\n ChangeDetectionStrategy,\n TemplateRef,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { CheckboxComponent } from '../forms';\nimport { IconComponent } from '../icon';\nimport { LocalizationService } from '../config/ui-localization';\nimport { TableCellDirective } from './table-cell.directive';\nimport {\n type TableAction,\n ColumnAlign,\n SortDirection,\n TableCellContext,\n TableColumn,\n TableConfig,\n TableRowReorderEvent,\n TableSort,\n} from './table.model';\n\n@Component({\n selector: 'hui-table',\n host: { '(keydown.escape)': 'closeAllDropdowns()' },\n imports: [\n CommonModule,\n FormsModule,\n RouterModule,\n CheckboxComponent,\n IconComponent,\n NgComponentOutlet,\n ],\n templateUrl: './table.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./table.css', './table-dropdown.css'],\n})\nexport class TableComponent<T = any> {\n protected readonly localization = inject(LocalizationService);\n protected readonly instanceId = `hui-table-${Math.random().toString(36).slice(2, 11)}`;\n\n // Inputs\n readonly config = input.required<TableConfig<T>>();\n\n // Outputs\n readonly sortChange = output<TableSort>();\n readonly pageChange = output<number>();\n readonly pageSizeChange = output<number>();\n readonly selectionChange = output<T[]>();\n readonly rowReorder = output<TableRowReorderEvent<T>>();\n\n private readonly customCellTemplates = contentChildren<TableCellDirective<T>>(TableCellDirective);\n private inputDataReference: T[] | undefined;\n\n // Math helper for template\n protected readonly Math = Math;\n\n constructor() {\n effect(() => {\n const data = this.config().data || [];\n if (data !== this.inputDataReference) {\n this.inputDataReference = data;\n this.tableRows.set([...data]);\n }\n });\n\n effect(() => {\n const sort = this.config().sort;\n if (!sort) return;\n const current = this.currentSort();\n if (current.column !== sort.column || current.direction !== sort.direction) {\n this.currentSort.set(sort);\n }\n });\n\n // Sync internal selection state with external config\n effect(() => {\n const selection = this.config().selection;\n if (selection?.selectedRows) {\n const newSelectedKeys = new Set<string | number>();\n const data = this.config().data;\n\n selection.selectedRows.forEach((selectedRow) => {\n const index = data.indexOf(selectedRow);\n if (index !== -1) {\n const rowKey = this.getRowKey(selectedRow, index);\n newSelectedKeys.add(rowKey);\n }\n });\n\n this.selectedRows.set(newSelectedKeys);\n }\n });\n\n effect((onCleanup) => {\n if (this.openDropdowns().size === 0) return;\n const closeDropdowns = () => this.closeAllDropdowns();\n const onScroll = (event: Event): void => {\n if (event.target instanceof Element && event.target.closest('.table-dropdown-menu')) return;\n closeDropdowns();\n };\n const timer = setTimeout(() => {\n document.addEventListener('click', closeDropdowns);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', closeDropdowns);\n });\n onCleanup(() => {\n clearTimeout(timer);\n document.removeEventListener('click', closeDropdowns);\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', closeDropdowns);\n });\n });\n }\n\n // Internal state\n protected readonly selectedRows = signal<Set<string | number>>(new Set());\n protected readonly currentSort = signal<TableSort>({ column: '', direction: null });\n protected readonly openDropdowns = signal<Set<string>>(new Set());\n protected readonly tableRows = signal<T[]>([]);\n protected readonly draggedRowIndex = signal<number | null>(null);\n protected readonly dragOverRowIndex = signal<number | null>(null);\n protected readonly isTableScrolled = signal(false);\n protected readonly dropdownPosition = signal<{\n top: number | null;\n bottom: number | null;\n left: number;\n }>({ top: null, bottom: null, left: 0 });\n\n // Computed\n protected readonly hasActions = computed(() => {\n const actions = this.config().actions;\n return actions && actions.length > 0;\n });\n\n protected readonly hasSelection = computed(() => {\n const selection = this.config().selection;\n return selection && selection.mode !== 'none';\n });\n\n protected readonly isMultiSelect = computed(() => {\n return this.config().selection?.mode === 'multiple';\n });\n\n protected readonly showRowNumbers = computed(() => {\n return this.config().showRowNumbers || false;\n });\n\n protected readonly hasStickyHeader = computed(\n () => this.config().stickyHeader !== false || Boolean(this.config().maxHeight),\n );\n\n protected readonly shouldRenderHeader = computed(\n () => this.config().showHeader !== false || Boolean(this.config().showHeaderOnlyOnScroll),\n );\n\n protected readonly isHeaderVisible = computed(() =>\n this.config().showHeaderOnlyOnScroll\n ? this.isTableScrolled()\n : this.config().showHeader !== false,\n );\n\n protected readonly tableMaxHeight = computed(() => {\n if (!this.hasStickyHeader()) return null;\n return this.config().maxHeight || '600px';\n });\n\n protected readonly hasRowReordering = computed(() => Boolean(this.config().rowReorder?.enabled));\n\n protected readonly allRowsSelected = computed(() => {\n const data = this.displayedData();\n if (!data.length) return false;\n return data.every((row) => this.isRowSelected(row));\n });\n\n protected readonly someRowsSelected = computed(() => {\n const data = this.displayedData();\n if (!data.length) return false;\n const selected = data.filter((row) => this.isRowSelected(row));\n return selected.length > 0 && selected.length < data.length;\n });\n\n protected readonly displayedData = computed(() => {\n return this.tableRows();\n });\n\n protected readonly totalPages = computed(() => {\n const pagination = this.config().pagination;\n if (!pagination) return 0;\n return Math.ceil(pagination.total / pagination.pageSize);\n });\n\n protected readonly pageNumbers = computed(() => {\n const total = this.totalPages();\n const current = this.config().pagination?.page || 1;\n const delta = 2;\n const range: number[] = [];\n const rangeWithDots: (number | string)[] = [];\n let l: number | undefined;\n\n for (let i = 1; i <= total; i++) {\n if (i === 1 || i === total || (i >= current - delta && i <= current + delta)) {\n range.push(i);\n }\n }\n\n for (const i of range) {\n if (l) {\n if (i - l === 2) {\n rangeWithDots.push(l + 1);\n } else if (i - l !== 1) {\n rangeWithDots.push('...');\n }\n }\n rangeWithDots.push(i);\n l = i;\n }\n\n return rangeWithDots;\n });\n\n // Methods\n protected getRowKey(row: T, index: number): string | number {\n const rowKey = this.config().rowKey;\n if (typeof rowKey === 'function') {\n return rowKey(row);\n }\n if (rowKey) {\n return row[rowKey] as string | number;\n }\n return index;\n }\n\n protected getCellValue(row: T, column: any, index: number): any {\n const keys = column.key.split('.');\n let value: any = row;\n\n for (const key of keys) {\n value = value?.[key];\n if (value === undefined || value === null) break;\n }\n\n if (column.render) {\n // If the nested value is null/undefined, pass the whole row to the\n // renderer as some renderers expect the full row (legacy usage).\n const renderArg = value === undefined || value === null ? row : value;\n try {\n return column.render(renderArg, row, index);\n } catch (e) {\n // Fallback: if renderer throws, try calling with the raw value.\n try {\n return column.render(value, row, index);\n } catch (err) {\n return '-';\n }\n }\n }\n\n return value === '' || value === null || value === undefined ? '-' : value;\n }\n\n protected getCellTemplate(column: TableColumn<T>): TemplateRef<TableCellContext<T>> | undefined {\n return (\n column.template ??\n this.customCellTemplates().find((cell) => cell.columnKey() === column.key)?.templateRef\n );\n }\n\n protected getCellIcon(row: T, column: TableColumn<T>, index: number): string {\n return this.resolveColumnValue(column.icon, row, column, index) || '';\n }\n\n protected getCellIconClass(row: T, column: TableColumn<T>, index: number): string {\n return this.resolveColumnValue(column.iconClass, row, column, index) || '';\n }\n\n protected getCellIconLabel(row: T, column: TableColumn<T>, index: number): string {\n return this.resolveColumnValue(column.iconLabel, row, column, index) || column.label;\n }\n\n private resolveColumnValue(\n configValue: string | ((value: any, row: T, index: number) => string) | undefined,\n row: T,\n column: TableColumn<T>,\n index: number,\n ): string | undefined {\n return typeof configValue === 'function'\n ? configValue(this.getCellValue(row, column, index), row, index)\n : configValue;\n }\n\n protected getCellClass(row: T, column: any): string {\n if (typeof column.cellClass === 'function') {\n return column.cellClass(this.getCellValue(row, column, 0), row);\n }\n return column.cellClass || '';\n }\n\n protected getRowClass(row: T, index: number): string {\n const rowClass = this.config().rowClass;\n if (typeof rowClass === 'function') {\n return rowClass(row, index);\n }\n return rowClass || '';\n }\n\n protected onSort(columnKey: string): void {\n const column = this.config().columns.find((col) => col.key === columnKey);\n if (!column?.sortable) return;\n\n const current = this.currentSort();\n let direction: SortDirection = 'asc';\n\n if (current.column === columnKey) {\n if (current.direction === 'asc') {\n direction = 'desc';\n } else if (current.direction === 'desc') {\n direction = null;\n }\n }\n\n const newSort = { column: direction ? columnKey : '', direction };\n this.currentSort.set(newSort);\n this.sortChange.emit(newSort);\n\n if (this.config().onSort) {\n this.config().onSort!(newSort);\n }\n }\n\n protected getSortIcon(columnKey: string): string {\n const current = this.currentSort();\n if (current.column !== columnKey || !current.direction) {\n return 'M7 10l5 5 5-5H7z';\n }\n if (current.direction === 'asc') {\n return 'M7 14l5-5 5 5H7z';\n }\n return 'M7 10l5 5 5-5H7z';\n }\n\n protected isSorted(columnKey: string): boolean {\n return this.currentSort().column === columnKey;\n }\n\n protected isRowSelected(row: T): boolean {\n const data = this.displayedData();\n const index = data.indexOf(row);\n const key = this.getRowKey(row, index !== -1 ? index : 0);\n return this.selectedRows().has(key);\n }\n\n protected toggleRowSelection(row: T, index: number): void {\n const key = this.getRowKey(row, index);\n const selected = new Set(this.selectedRows());\n\n if (this.isMultiSelect()) {\n if (selected.has(key)) {\n selected.delete(key);\n } else {\n selected.add(key);\n }\n } else {\n if (selected.has(key)) {\n selected.clear();\n } else {\n selected.clear();\n selected.add(key);\n }\n }\n\n this.selectedRows.set(selected);\n this.emitSelection();\n }\n\n protected toggleAllRows(): void {\n const data = this.displayedData();\n const selected = new Set(this.selectedRows());\n\n if (this.allRowsSelected()) {\n selected.clear();\n } else {\n data.forEach((row, index) => {\n const key = this.getRowKey(row, index);\n selected.add(key);\n });\n }\n\n this.selectedRows.set(selected);\n this.emitSelection();\n }\n\n private emitSelection(): void {\n const data = this.displayedData();\n const selected = data.filter((row) => this.isRowSelected(row));\n this.selectionChange.emit(selected);\n\n const selection = this.config().selection;\n if (selection?.onSelectionChange) {\n selection.onSelectionChange(selected);\n }\n }\n\n protected isRowReorderDisabled(row: T, index: number): boolean {\n return this.config().rowReorder?.disabled?.(row, index) ?? false;\n }\n\n protected onRowReorderHandleClick(row: T, index: number, event: Event): void {\n event.stopPropagation();\n if (this.isRowReorderDisabled(row, index)) {\n this.config().rowReorder?.onDisabledAttempt?.(row, index);\n }\n }\n\n protected onRowDragStart(event: DragEvent, index: number): void {\n const row = this.displayedData()[index];\n if (!row || this.isRowReorderDisabled(row, index)) {\n event.preventDefault();\n if (row) this.config().rowReorder?.onDisabledAttempt?.(row, index);\n return;\n }\n\n this.draggedRowIndex.set(index);\n event.dataTransfer?.setData('text/plain', String(this.getRowKey(row, index)));\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n }\n\n protected onRowDragOver(event: DragEvent, index: number): void {\n const draggedIndex = this.draggedRowIndex();\n const row = this.displayedData()[index];\n if (draggedIndex === null || !row || this.isRowReorderDisabled(row, index)) return;\n\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dragOverRowIndex.set(index);\n }\n\n protected onRowDrop(event: DragEvent, currentIndex: number): void {\n event.preventDefault();\n const previousIndex = this.draggedRowIndex();\n const targetRow = this.displayedData()[currentIndex];\n if (!targetRow || this.isRowReorderDisabled(targetRow, currentIndex)) {\n this.clearRowDragState();\n return;\n }\n if (previousIndex === null || previousIndex === currentIndex) {\n this.clearRowDragState();\n return;\n }\n\n const data = [...this.displayedData()];\n const [row] = data.splice(previousIndex, 1);\n if (!row) {\n this.clearRowDragState();\n return;\n }\n\n data.splice(currentIndex, 0, row);\n this.tableRows.set(data);\n\n const reorderEvent: TableRowReorderEvent<T> = {\n row,\n previousIndex,\n currentIndex,\n data: [...data],\n };\n this.rowReorder.emit(reorderEvent);\n this.config().rowReorder?.onReorder?.(reorderEvent);\n this.clearRowDragState();\n }\n\n protected clearRowDragState(): void {\n this.draggedRowIndex.set(null);\n this.dragOverRowIndex.set(null);\n }\n\n protected onPageChange(page: number | string): void {\n if (typeof page === 'string') return;\n\n this.pageChange.emit(page);\n\n const config = this.config();\n if (config.onPageChange) {\n config.onPageChange(page);\n }\n }\n\n protected onPageSizeChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n const pageSize = parseInt(target.value, 10);\n\n this.pageSizeChange.emit(pageSize);\n\n const config = this.config();\n if (config.onPageSizeChange) {\n config.onPageSizeChange(pageSize);\n }\n }\n\n protected getVisibleActions(row: T): TableAction<T>[] {\n const collect = (actions: TableAction<T>[], parentDisabled = false): TableAction<T>[] =>\n actions.flatMap((action) => {\n if (action.hidden?.(row)) return [];\n const disabled = parentDisabled || Boolean(action.disabled?.(row));\n if (action.submenu?.length) return collect(action.submenu, disabled);\n return [\n { ...action, icon: action.icon || 'arrow-narrow-right-dashed', disabled: () => disabled },\n ];\n });\n const items = collect(this.config().actions ?? []).filter(\n (action, index, actions) =>\n !action.divider || (index > 0 && index < actions.length - 1 && !actions[index - 1].divider),\n );\n if (!items.some((action) => !action.divider)) return [];\n return [\n { label: 'More actions', title: 'More actions', icon: 'more-vertical', submenu: items },\n ];\n }\n\n protected isActionDisabled(action: TableAction<T>, row: T): boolean {\n return action.disabled ? action.disabled(row) : false;\n }\n\n protected getActionVariantClass(variant?: string): string {\n switch (variant) {\n case 'primary':\n return 'bg-primary/12 text-primary hover:bg-primary/20';\n case 'secondary':\n return 'bg-secondary/12 text-secondary hover:bg-secondary/20';\n case 'danger':\n return 'bg-destructive/12 text-destructive hover:bg-destructive/20';\n case 'success':\n return 'bg-success-500/12 text-success-600 hover:bg-success-500/20';\n default:\n return 'bg-surface text-text-secondary hover:bg-surface-hover';\n }\n }\n\n protected getActionSubmenuVariantClass(variant?: string): string {\n switch (variant) {\n case 'primary':\n return 'hover:bg-primary/12 text-primary';\n case 'secondary':\n return 'hover:bg-secondary/12 text-secondary';\n case 'danger':\n return 'text-destructive hover:bg-destructive/12';\n case 'success':\n return 'hover:bg-success-500/12 text-success-600';\n default:\n return 'hover:bg-surface-hover text-text-secondary';\n }\n }\n\n protected getAlignClass(align?: string): string {\n switch (align) {\n case 'center':\n return 'text-center';\n case 'right':\n return 'text-right';\n default:\n return 'text-left';\n }\n }\n\n protected getHeaderAlign(column: TableColumn<T>): ColumnAlign {\n return column.headerAlign ?? this.config().headerAlign ?? column.align ?? 'left';\n }\n\n protected getHeaderContentAlignClass(column: TableColumn<T>): string {\n switch (this.getHeaderAlign(column)) {\n case 'center':\n return 'justify-center';\n case 'right':\n return 'justify-end';\n default:\n return 'justify-start';\n }\n }\n\n protected onTableScroll(event: Event): void {\n this.isTableScrolled.set((event.currentTarget as HTMLElement).scrollTop > 0);\n }\n\n protected getResponsiveHideClass(column: any): string {\n if (!column.hideOnScreens || column.hideOnScreens.length === 0) {\n return '';\n }\n\n const classes: string[] = [];\n\n for (const screen of column.hideOnScreens) {\n switch (screen) {\n case 'sm':\n classes.push('max-sm:hidden');\n break;\n case 'md':\n classes.push('max-md:hidden');\n break;\n case 'lg':\n classes.push('max-lg:hidden');\n break;\n case 'xl':\n classes.push('max-xl:hidden');\n break;\n }\n }\n\n return classes.join(' ');\n }\n\n protected getRowNumber(index: number): number {\n const pagination = this.config().pagination;\n if (pagination) {\n return (pagination.page - 1) * pagination.pageSize + index + 1;\n }\n return index + 1;\n }\n\n protected getComponentInputs(row: T, column: any, index: number): Record<string, any> {\n if (!column.componentInputs) {\n return {};\n }\n const value = this.getCellValue(row, column, index);\n return column.componentInputs(row, value, index);\n }\n\n protected getLinkUrl(row: T, column: TableColumn<T>): string | null {\n if (column.linkGenerator) {\n return column.linkGenerator(row);\n }\n if (column.type && !['text', 'link'].includes(column.type)) return null;\n return null;\n }\n\n protected onRowClick(row: T, index: number, event: Event): void {\n // Don't trigger row click if clicking on interactive elements\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) {\n return;\n }\n\n const config = this.config();\n if (config.onRowClick) {\n config.onRowClick(row, index);\n }\n }\n\n protected onLinkClick(row: T, column: any, event: Event): void {\n event.stopPropagation();\n // Call onClick handler if present (navigation will happen via routerLink)\n if (column.onClick) {\n column.onClick(row);\n }\n }\n\n protected toggleDropdown(\n rowIndex: number,\n actionIndex: number,\n buttonElement?: HTMLElement,\n ): void {\n const dropdownKey = `${rowIndex}-${actionIndex}`;\n const dropdowns = new Set(this.openDropdowns());\n\n if (dropdowns.has(dropdownKey)) {\n dropdowns.delete(dropdownKey);\n } else {\n dropdowns.clear(); // Close all other dropdowns\n dropdowns.add(dropdownKey);\n\n // Calculate and store position when opening\n if (buttonElement) {\n this.dropdownPosition.set(this.calculateDropdownPosition(buttonElement));\n }\n }\n\n this.openDropdowns.set(dropdowns);\n }\n\n protected isDropdownOpen(rowIndex: number, actionIndex: number): boolean {\n const dropdownKey = `${rowIndex}-${actionIndex}`;\n return this.openDropdowns().has(dropdownKey);\n }\n\n protected closeAllDropdowns(): void {\n this.openDropdowns.set(new Set());\n }\n\n protected hasSubmenu(action: any): boolean {\n return action.submenu && action.submenu.length > 0;\n }\n\n protected handleActionClick(action: any, row: T, index: number, event: Event): void {\n event.stopPropagation();\n\n if (this.hasSubmenu(action)) {\n return; // Dropdown toggle is handled separately\n }\n\n if (action.onClick && !this.isActionDisabled(action, row)) {\n action.onClick(row, index);\n }\n }\n\n protected getDropdownId(rowIndex: number, actionIndex: number): string {\n return `${this.instanceId}-dropdown-${rowIndex}-${actionIndex}`;\n }\n\n private calculateDropdownPosition(buttonElement: HTMLElement): {\n top: number | null;\n bottom: number | null;\n left: number;\n } {\n if (!buttonElement) {\n return { top: null, bottom: null, left: 0 };\n }\n\n const rect = buttonElement.getBoundingClientRect();\n const dropdownWidth = 224; // w-56 = 14rem = 224px\n const dropdownHeight = 200; // approximate height for determining direction\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const spacing = 8;\n\n // Determine vertical position (below or above button)\n const spaceBelow = viewportHeight - rect.bottom;\n const showAbove = spaceBelow < dropdownHeight + spacing && rect.top > dropdownHeight + spacing;\n\n // Use bottom positioning when showing above (more reliable than estimating height)\n const top = showAbove ? null : rect.bottom + spacing;\n const bottom = showAbove ? viewportHeight - rect.top + spacing : null;\n\n // Determine horizontal position (align right edge with button, but keep in viewport)\n let left = rect.right - dropdownWidth;\n if (left < spacing) {\n left = spacing;\n }\n if (left + dropdownWidth > viewportWidth - spacing) {\n left = viewportWidth - dropdownWidth - spacing;\n }\n\n return { top, bottom, left };\n }\n}\n","<div\n class=\"bg-background rounded-2xl border border-border overflow-hidden relative\"\n [class.border]=\"config().bordered\"\n [class.border-border]=\"config().bordered\"\n>\n <!-- Loading Overlay -->\n @if (config().loading && displayedData().length > 0) {\n <div class=\"absolute inset-0 z-20 flex items-center justify-center\">\n <div class=\"flex flex-col items-center gap-3\">\n <svg class=\"animate-spin h-8 w-8 text-primary\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle\n class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n ></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n <span\n class=\"font-medium text-muted-foreground bg-background rounded-full shadow-sm px-2.5 py-2\"\n >{{ localization.translate('Refreshing data...') }}</span\n >\n </div>\n </div>\n }\n\n <!-- Table Wrapper -->\n <div\n class=\"table-scroll-container overflow-x-auto\"\n [class.overflow-y-auto]=\"hasStickyHeader()\"\n [style.max-height]=\"tableMaxHeight()\"\n (scroll)=\"onTableScroll($event)\"\n >\n <table class=\"w-full border-collapse\">\n <!-- Table Header -->\n @if (shouldRenderHeader()) {\n <thead\n class=\"bg-surface border-b border-border\"\n [class.table-header-scrolled]=\"hasStickyHeader() && isTableScrolled()\"\n [class.table-header-on-scroll]=\"config().showHeaderOnlyOnScroll\"\n [class.table-header-visible]=\"isHeaderVisible()\"\n [attr.aria-hidden]=\"!isHeaderVisible()\"\n >\n <tr>\n <!-- Row Reorder Column -->\n @if (hasRowReordering()) {\n <th\n class=\"w-12 px-3 py-3\"\n [class.sticky]=\"hasStickyHeader()\"\n [class.top-0]=\"hasStickyHeader()\"\n [class.z-10]=\"hasStickyHeader()\"\n [class.bg-surface]=\"hasStickyHeader()\"\n >\n <span class=\"sr-only\">{{ localization.translate('Reorder') }}</span>\n </th>\n }\n\n <!-- Selection Column -->\n @if (hasSelection()) {\n <th\n class=\"w-12 px-6 py-3\"\n [class.sticky]=\"hasStickyHeader()\"\n [class.top-0]=\"hasStickyHeader()\"\n [class.z-10]=\"hasStickyHeader()\"\n [class.bg-surface]=\"hasStickyHeader()\"\n >\n <div class=\"flex items-center justify-center\">\n @if (isMultiSelect()) {\n <hui-checkbox\n [id]=\"instanceId + '-select-all'\"\n [class]=\"''\"\n [ariaLabel]=\"localization.translate('Select all rows')\"\n [ngModel]=\"allRowsSelected()\"\n (ngModelChange)=\"toggleAllRows()\"\n />\n }\n </div>\n </th>\n }\n\n <!-- Row Number Column -->\n @if (showRowNumbers()) {\n <th\n class=\"w-10 text-center text-sm font-medium text-muted-foreground uppercase tracking-wider\"\n [class]=\"config().compact ? 'px-3 py-2 ' : 'px-2 py-3'\"\n [class.sticky]=\"hasStickyHeader()\"\n [class.top-0]=\"hasStickyHeader()\"\n [class.z-10]=\"hasStickyHeader()\"\n [class.bg-surface]=\"hasStickyHeader()\"\n >\n {{ localization.translate('No.') }}\n </th>\n }\n\n <!-- Data Columns -->\n @for (column of config().columns; track column.key) {\n <th\n [class]=\"\n 'text-sm font-medium text-muted-foreground uppercase tracking-wider ' +\n getAlignClass(getHeaderAlign(column)) +\n (config().compact ? ' px-3 py-2 ' : ' px-6 py-3') +\n ' ' +\n getResponsiveHideClass(column)\n \"\n [class.sticky]=\"hasStickyHeader()\"\n [class.top-0]=\"hasStickyHeader()\"\n [class.z-10]=\"hasStickyHeader()\"\n [class.bg-surface]=\"hasStickyHeader()\"\n [class.cursor-pointer]=\"column.sortable\"\n [class.select-none]=\"column.sortable\"\n [class.hover:bg-surface]=\"column.sortable\"\n [class.transition-colors]=\"column.sortable\"\n [class.text-primary]=\"isSorted(column.key)\"\n [style.width]=\"column.width\"\n scope=\"col\"\n [attr.tabindex]=\"column.sortable ? 0 : null\"\n [attr.aria-sort]=\"\n column.sortable\n ? isSorted(column.key)\n ? currentSort().direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none'\n : null\n \"\n (keydown.enter)=\"column.sortable ? onSort(column.key) : null\"\n (keydown.space)=\"\n column.sortable ? onSort(column.key) : null; $event.preventDefault()\n \"\n (click)=\"column.sortable ? onSort(column.key) : null\"\n >\n <div class=\"flex items-center gap-2\" [class]=\"getHeaderContentAlignClass(column)\">\n <span>{{ localization.translate(column.label) }}</span>\n @if (column.sortable) {\n <svg\n class=\"transition-colors\"\n [class.text-muted-foreground]=\"!isSorted(column.key)\"\n [class.text-primary]=\"isSorted(column.key)\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n >\n <path [attr.d]=\"getSortIcon(column.key)\" />\n </svg>\n }\n </div>\n </th>\n }\n\n <!-- Actions Column -->\n @if (hasActions()) {\n <th\n class=\"w-32 text-right text-sm font-medium text-muted-foreground uppercase tracking-wider\"\n [class]=\"config().compact ? 'px-3 py-2 ' : 'px-6 py-3'\"\n [class.sticky]=\"hasStickyHeader()\"\n [class.top-0]=\"hasStickyHeader()\"\n [class.z-10]=\"hasStickyHeader()\"\n [class.bg-surface]=\"hasStickyHeader()\"\n >\n {{ localization.translate('Actions') }}\n </th>\n }\n </tr>\n </thead>\n }\n\n <!-- Table Body -->\n <tbody class=\"bg-card divide-y divide-border/50\">\n <!-- Loading State (Initial Load Only) -->\n @if (config().loading && displayedData().length === 0) {\n <tr>\n <td\n [attr.colspan]=\"\n config().columns.length +\n (hasRowReordering() ? 1 : 0) +\n (hasSelection() ? 1 : 0) +\n (showRowNumbers() ? 1 : 0) +\n (hasActions() ? 1 : 0)\n \"\n class=\"py-12\"\n >\n <div class=\"flex items-center justify-center text-muted-foreground\">\n <svg class=\"animate-spin h-8 w-8 text-primary\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle\n class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n ></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n <span class=\"ml-3\">{{ localization.translate('Loading...') }}</span>\n </div>\n </td>\n </tr>\n }\n\n <!-- Empty State -->\n @if (!config().loading && displayedData().length === 0) {\n <tr>\n <td\n [attr.colspan]=\"\n config().columns.length +\n (hasRowReordering() ? 1 : 0) +\n (hasSelection() ? 1 : 0) +\n (showRowNumbers() ? 1 : 0) +\n (hasActions() ? 1 : 0)\n \"\n class=\"py-12\"\n >\n <div class=\"flex flex-col items-center justify-center text-muted-foreground\">\n <hui-icon name=\"mood-puzzled\" [size]=\"48\" class=\"text-muted-foreground\" />\n <p class=\"font-medium\">\n {{ localization.translate(config().emptyMessage || 'No data available') }}\n </p>\n </div>\n </td>\n </tr>\n }\n\n <!-- Data Rows -->\n @for (row of displayedData(); track getRowKey(row, $index); let i = $index) {\n <tr\n class=\"transition-colors\"\n [class]=\"getRowClass(row, i)\"\n [class.bg-surface/50]=\"config().striped && i % 2 === 1\"\n [class.table-row-hoverable]=\"config().hoverable\"\n [class.table-row-selected]=\"isRowSelected(row)\"\n [class.opacity-50]=\"draggedRowIndex() === i\"\n [class.outline-2]=\"dragOverRowIndex() === i && draggedRowIndex() !== i\"\n [class.outline-primary]=\"dragOverRowIndex() === i && draggedRowIndex() !== i\"\n [class.cursor-pointer]=\"config().onRowClick\"\n (dragover)=\"onRowDragOver($event, i)\"\n (drop)=\"onRowDrop($event, i)\"\n (click)=\"config().onRowClick ? onRowClick(row, i, $event) : null\"\n >\n <!-- Row Reorder Handle -->\n @if (hasRowReordering()) {\n <td class=\"w-12 px-3 py-3 text-center\">\n <button\n type=\"button\"\n [draggable]=\"!isRowReorderDisabled(row, i)\"\n class=\"inline-flex items-center justify-center rounded p-1 text-muted-foreground hover:bg-surface-hover hover:text-foreground\"\n [class.cursor-grab]=\"!isRowReorderDisabled(row, i)\"\n [class.cursor-not-allowed]=\"isRowReorderDisabled(row, i)\"\n [class.opacity-30]=\"isRowReorderDisabled(row, i)\"\n [attr.aria-disabled]=\"isRowReorderDisabled(row, i)\"\n [attr.aria-label]=\"localization.translate('Move row {row}', { row: i + 1 })\"\n [attr.title]=\"\n localization.translate(\n isRowReorderDisabled(row, i) ? 'This row cannot be moved' : 'Drag to reorder'\n )\n \"\n (dragstart)=\"onRowDragStart($event, i)\"\n (dragend)=\"clearRowDragState()\"\n (click)=\"onRowReorderHandleClick(row, i, $event)\"\n >\n <hui-icon\n name=\"dots\"\n [size]=\"20\"\n [ariaLabel]=\"localization.translate('Drag to reorder')\"\n />\n </button>\n </td>\n }\n\n <!-- Selection Cell -->\n @if (hasSelection()) {\n <td class=\"px-6 py-4\">\n <div class=\"flex items-center justify-center\">\n <hui-checkbox\n [id]=\"instanceId + '-row-' + i\"\n [class]=\"''\"\n [ariaLabel]=\"localization.translate('Select row {row}', { row: i + 1 })\"\n [ngModel]=\"isRowSelected(row)\"\n (ngModelChange)=\"toggleRowSelection(row, i)\"\n />\n </div>\n </td>\n }\n\n <!-- Row Number Cell -->\n @if (showRowNumbers()) {\n <td\n class=\"w-10 text-center text-muted-foreground font-medium\"\n [class]=\"config().compact ? 'px-3 py-2 text-sm' : 'px-2 py-2'\"\n >\n {{ getRowNumber(i) }}\n </td>\n }\n\n <!-- Data Cells -->\n @for (column of config().columns; track column.key) {\n <td\n [class]=\"\n ' text-foreground ' +\n getAlignClass(column.align) +\n ' ' +\n getCellClass(row, column) +\n (config().compact ? ' px-3 py-2 text-sm' : ' px-6 py-3') +\n ' ' +\n getResponsiveHideClass(column)\n \"\n >\n <!-- Custom Cell Content -->\n @if (getCellTemplate(column); as cellTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate;\n context: {\n $implicit: getCellValue(row, column, i),\n row: row,\n index: i,\n column: column,\n }\n \"\n ></ng-container>\n }\n <!-- Image Type -->\n @else if (column.type === 'image') {\n <div class=\"flex items-center\">\n <img\n [src]=\"getCellValue(row, column, i)\"\n [alt]=\"column.label\"\n [class]=\"column.imageClass || 'w-10 h-10 rounded-full object-cover'\"\n (error)=\"$any($event.target).src = column.imageFallback || ''\"\n />\n </div>\n }\n <!-- Icon Type -->\n @else if (column.type === 'icon') {\n <span\n class=\"inline-flex items-center\"\n [attr.title]=\"getCellIconLabel(row, column, i)\"\n >\n <hui-icon\n [name]=\"getCellIcon(row, column, i)\"\n [size]=\"column.iconSize || 22\"\n [customClass]=\"getCellIconClass(row, column, i)\"\n [ariaLabel]=\"getCellIconLabel(row, column, i)\"\n />\n </span>\n }\n <!-- Component Type -->\n @else if (column.type === 'component' && column.component) {\n <ng-container\n *ngComponentOutlet=\"\n column.component;\n inputs: getComponentInputs(row, column, i)\n \"\n ></ng-container>\n }\n <!-- Link Type -->\n @else if (getLinkUrl(row, column)) {\n @if (column.linkTarget === '_blank') {\n <!-- External link - use href with target=\"_blank\" -->\n <a\n [href]=\"getLinkUrl(row, column)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-primary hover:text-primary/80 hover:underline font-medium\"\n (click)=\"$event.stopPropagation()\"\n >\n @if (column.render) {\n <span [innerHTML]=\"getCellValue(row, column, i)\"></span>\n } @else {\n {{ getCellValue(row, column, i) }}\n }\n </a>\n } @else {\n <!-- Internal link - use routerLink for Angular routing -->\n <a\n [routerLink]=\"getLinkUrl(row, column)\"\n class=\"text-primary hover:text-primary/80 hover:underline font-medium\"\n (click)=\"onLinkClick(row, column, $event)\"\n >\n @if (column.render) {\n <span [innerHTML]=\"getCellValue(row, column, i)\"></span>\n } @else {\n {{ getCellValue(row, column, i) }}\n }\n </a>\n }\n }\n <!-- Text Type (Default) -->\n @else {\n @if (column.render) {\n <span\n [class]=\"column.type === 'text' ? '' : 'whitespace-nowrap'\"\n [innerHTML]=\"getCellValue(row, column, i)\"\n ></span>\n } @else {\n <span [class]=\"column.type === 'text' ? '' : 'whitespace-nowrap'\">\n {{ getCellValue(row, column, i) }}\n </span>\n }\n }\n </td>\n }\n\n <!-- Actions Cell -->\n @if (hasActions()) {\n <td [class]=\"config().compact ? 'px-3 py-2' : 'px-6 py-3'\">\n <div class=\"flex items-center justify-end gap-2\">\n @for (action of getVisibleActions(row); track $index; let actionIdx = $index) {\n @if (!hasSubmenu(action)) {\n <!-- Regular Action Button -->\n <button\n type=\"button\"\n (click)=\"handleActionClick(action, row, i, $event)\"\n [disabled]=\"isActionDisabled(action, row)\"\n [class]=\"\n 'inline-flex items-center justify-center p-2 rounded transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary disabled:opacity-50 disabled:cursor-not-allowed ' +\n getActionVariantClass(action.variant)\n \"\n [attr.title]=\"localization.translate(action.title || action.label)\"\n [attr.aria-label]=\"localization.translate(action.label)\"\n >\n @if (action.icon) {\n <hui-icon [name]=\"action.icon\" [size]=\"18\" />\n } @else {\n <span class=\"font-medium\">{{\n localization.translate(action.label)\n }}</span>\n }\n </button>\n } @else {\n <!-- Dropdown Action Button -->\n <div class=\"relative\" [id]=\"getDropdownId(i, actionIdx)\">\n <button\n #dropdownButton\n type=\"button\"\n (click)=\"\n toggleDropdown(i, actionIdx, dropdownButton); $event.stopPropagation()\n \"\n [disabled]=\"isActionDisabled(action, row)\"\n [class]=\"\n 'inline-flex items-center justify-center gap-1 p-2 rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary/50 disabled:opacity-50 disabled:cursor-not-allowed ' +\n getActionVariantClass(action.variant)\n \"\n [attr.title]=\"localization.translate(action.title || action.label)\"\n [attr.aria-label]=\"localization.translate(action.label)\"\n [attr.aria-expanded]=\"isDropdownOpen(i, actionIdx)\"\n >\n @if (action.icon) {\n <hui-icon [name]=\"action.icon\" [size]=\"18\" />\n } @else {\n <span class=\"font-medium\">{{\n localization.translate(action.label)\n }}</span>\n }\n </button>\n\n <!-- Dropdown Menu -->\n @if (isDropdownOpen(i, actionIdx)) {\n <div\n class=\"table-dropdown-menu w-56 max-h-[min(24rem,calc(100vh-2rem))] overflow-y-auto overscroll-contain bg-surface rounded-xl shadow-xl border border-border p-2\"\n [style.top.px]=\"dropdownPosition().top\"\n [style.bottom.px]=\"dropdownPosition().bottom\"\n [style.left.px]=\"dropdownPosition().left\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (\n subAction of action.submenu;\n track subAction.label;\n let subIdx = $index\n ) {\n @if (subAction.divider) {\n <div class=\"my-1 border-t border-border\"></div>\n } @else if (!subAction.hidden || !subAction.hidden(row)) {\n <button\n type=\"button\"\n (click)=\"\n subAction.onClick ? subAction.onClick(row, i) : null;\n closeAllDropdowns();\n $event.stopPropagation()\n \"\n [disabled]=\"isActionDisabled(subAction, row)\"\n [class]=\"\n 'w-full text-left px-4 py-2 rounded flex items-center gap-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed ' +\n getActionSubmenuVariantClass(subAction.variant)\n \"\n >\n @if (subAction.icon) {\n <hui-icon [name]=\"subAction.icon\" [size]=\"18\" />\n }\n <span>{{ localization.translate(subAction.label) }}</span>\n </button>\n }\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n @if (config().pagination && !config().loading) {\n <div\n [class]=\"\n config().pagination?.layout === 'stacked'\n ? 'flex flex-col items-stretch gap-3 border-t border-border bg-surface px-3 py-3'\n : 'flex flex-wrap flex-col md:flex-row items-start md:items-center justify-between px-6 py-3 border-t border-border bg-surface gap-4'\n \"\n >\n <!-- Results Info -->\n <div class=\"flex flex-wrap items-center gap-2 md:gap-4 w-full md:w-auto\">\n <span class=\"text-muted-foreground hidden lg:inline\">\n {{ localization.translate('Showing') }}\n <span class=\"font-medium\">{{\n (config().pagination!.page - 1) * config().pagination!.pageSize + 1\n }}</span>\n {{ localization.translate('to') }}\n <span class=\"font-medium\">{{\n Math.min(\n config().pagination!.page * config().pagination!.pageSize,\n config().pagination!.total\n )\n }}</span>\n {{ localization.translate('of') }}\n <span class=\"font-medium\">{{ config().pagination!.total }}</span>\n {{ localization.translate('results') }}\n </span>\n\n <!-- Page Size Selector -->\n @if (config().pagination!.pageSizeOptions) {\n <div class=\"flex items-center gap-2\">\n <label for=\"pageSize\" class=\"text-muted-foreground\">{{\n localization.translate('Rows per page:')\n }}</label>\n <select\n id=\"pageSize\"\n [value]=\"config().pagination!.pageSize\"\n (change)=\"onPageSizeChange($event)\"\n class=\"ml-2 px-2 py-1 border bg-surface border-border rounded focus:outline-none focus:border-primary\"\n >\n @for (size of config().pagination!.pageSizeOptions; track size) {\n <option [value]=\"size\" [selected]=\"size === config().pagination!.pageSize\">\n {{ size }}\n </option>\n }\n </select>\n </div>\n }\n </div>\n\n <!-- Page Controls -->\n <div class=\"flex flex-wrap items-center gap-1 w-full md:w-auto justify-center\">\n <!-- Previous Button -->\n <button\n type=\"button\"\n (click)=\"onPageChange(config().pagination!.page - 1)\"\n [disabled]=\"config().pagination!.page === 1\"\n class=\"flex items-center justify-center w-9 h-9 rounded border border-border/50 bg-surface text-muted-foreground hover:bg-surface/50 focus:outline-none focus:ring-2 focus:ring-primary disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent transition-colors\"\n [attr.aria-label]=\"localization.translate('Previous page')\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n <!-- Page Numbers -->\n @for (page of pageNumbers(); track page) {\n @if (page === '...') {\n <span class=\"px-3 py-1 text-muted-foreground\">...</span>\n } @else {\n <button\n type=\"button\"\n (click)=\"onPageChange(page)\"\n class=\"flex items-center justify-center w-9 h-9 rounded border border-border/50 font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-primary\"\n [class.bg-primary]=\"page === config().pagination!.page\"\n [class.bg-surface]=\"page !== config().pagination!.page\"\n [class.border-primary]=\"page === config().pagination!.page\"\n [class.text-primary-foreground]=\"page === config().pagination!.page\"\n [class.hover:bg-primary-dark]=\"page === config().pagination!.page\"\n [class.text-muted-foreground]=\"page !== config().pagination!.page\"\n [class.hover:bg-surface/50]=\"page !== config().pagination!.page\"\n [attr.aria-label]=\"localization.translate('Page {page}', { page: page })\"\n [attr.aria-current]=\"page === config().pagination!.page ? 'page' : null\"\n >\n {{ page }}\n </button>\n }\n }\n\n <!-- Next Button -->\n <button\n type=\"button\"\n (click)=\"onPageChange(config().pagination!.page + 1)\"\n [disabled]=\"config().pagination!.page >= totalPages() || totalPages() === 0\"\n class=\"flex items-center justify-center w-9 h-9 rounded border border-border/50 bg-surface text-muted-foreground hover:bg-surface/50 focus:outline-none focus:ring-2 focus:ring-primary disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent transition-colors\"\n [attr.aria-label]=\"localization.translate('Next page')\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n </div>\n }\n</div>\n"],"mappings":"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wBAAwB;EAC9C,QAAQ;CACT;CACD,cAAc;EACZ,MAAM;GACJ;GACA;GACA;GACA;EACD;EACD,QAAQ;CACT;CACD,QAAQ;EACN,MAAM;GACJ;GACA;GACA;EACD;EACD,QAAQ;CACT;CACD,UAAU;EACR,MAAM;EACN,QAAQ;CACT;CACD,kBAAkB;EAChB,MAAM;GACJ;GACA;GACA;EACD;EACD,QAAQ;CACT;CACD,KAAK;EACH,MAAM;GACJ;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,MAAM;EACJ,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,kBAAkB;EAChB,MAAM;GACJ;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,UAAU;EACR,MAAM;GACJ;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,uBAAuB;EACrB,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,8BAA8B;EAC5B,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,aAAa;EACX,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,OAAO;EACL,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,MAAM;EACJ,MAAM,CACJ,gIACA,oDACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,OAAO;EACL,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,UAAU;EACR,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,qBAAqB;EACnB,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;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AAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,UAAU;EACR,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,OAAO;EACL,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,MAAM;EACJ,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,qBAAqB;EACnB,MAAM;GACJ;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,OAAO;EACL,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,OAAO;EACL,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,oBAAoB;EAClB,MAAM;GACJ;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,SAAS;EACP,MAAM,CACJ,qFACA,iEACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,OAAO;EACL,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,gCAAgC;EAC9B,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,qCAAqC;EACnC,MAAM,CACJ,maACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,YAAY;EACV,MAAM,CAAC,WAAW,UAAU;EAC5B,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,iBAAiB;EACf,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,MAAM;EACJ,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,gBAAgB;EACd,MAAM;GACJ;GACA;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,iBAAiB;EACf,MAAM;GACJ;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,OAAO;EACL,MAAM;GACJ;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,0BAA0B;EACxB,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,iBAAiB;EACf,MAAM,CACJ,iFACA,iBACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,wBAAwB;EACtB,MAAM,CAAC,kBAAkB,8DAA8D;EACvF,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,kBAAkB;EAChB,MAAM;GACJ;GACA;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,aAAa;EACX,MAAM;GACJ;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,cAAc;EACZ,MAAM;GACJ;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,qBAAqB;EACnB,MAAM;GAAC;GAAc;GAAa;EAAY;EAC9C,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,SAAS;EACP,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,gBAAgB;EACd,MAAM,CACJ,4CACA,8EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,QAAQ;EACN,MAAM,CAAC,oBAAoB,qBAAqB;EAChD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,MAAM;EACJ,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,OAAO;EACL,MAAM;GACJ;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,YAAY;EACV,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,6BAA6B;EAC3B,MAAM;GAAC;GAA0B;GAAe;EAAW;EAC3D,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,eAAe;EACb,MAAM;GAAC;GAAwC;GAAa;EAAc;EAC1E,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,MAAM;EACJ,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,oBAAoB;EAClB,MAAM;GACJ;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,cAAc;EACZ,MAAM;GACJ;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,QAAQ;EACN,MAAM;GACJ;GACA;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,gBAAgB;EACd,MAAM,CACJ,0FACA,0BACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,cAAc;EACZ,MAAM,CACJ,wzBACA,qUACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,WAAW;EACT,MAAM;GACJ;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,gBAAgB;EACd,MAAM,CACJ,o0CACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CAED,gBAAgB;EACd,MAAM,CACJ,8DACA,iPACD;EACD,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,OAAO;EACL,MAAM,CAAC,aAAa,aAAa;EACjC,SAAS;EA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"}