{"version":3,"file":"ngx-core-components-inputs.mjs","sources":["../../../projects/ngx-core-components/inputs/utils/mask.util.ts","../../../projects/ngx-core-components/inputs/textbox/textbox.component.ts","../../../projects/ngx-core-components/inputs/checkbox/checkbox.component.ts","../../../projects/ngx-core-components/inputs/radio/radio-group.component.ts","../../../projects/ngx-core-components/inputs/dropdown/dropdown.component.ts","../../../projects/ngx-core-components/inputs/multi-select/multi-select.component.ts","../../../projects/ngx-core-components/inputs/autocomplete/autocomplete.component.ts","../../../projects/ngx-core-components/inputs/date-picker/date-picker.component.ts","../../../projects/ngx-core-components/inputs/slider/slider.component.ts","../../../projects/ngx-core-components/inputs/switch/switch.component.ts","../../../projects/ngx-core-components/inputs/rating/rating.component.ts","../../../projects/ngx-core-components/inputs/numeric-textbox/numeric-textbox.component.ts","../../../projects/ngx-core-components/inputs/textarea/textarea.component.ts","../../../projects/ngx-core-components/inputs/color-picker/color-picker.component.ts","../../../projects/ngx-core-components/inputs/time-picker/time-picker.component.ts","../../../projects/ngx-core-components/inputs/date-range-picker/date-range-picker.component.ts","../../../projects/ngx-core-components/inputs/file-upload/file-upload.component.ts","../../../projects/ngx-core-components/inputs/tag-input/tag-input.component.ts","../../../projects/ngx-core-components/inputs/file-preview/file-preview.component.ts","../../../projects/ngx-core-components/inputs/segmented-control/segmented-control.component.ts","../../../projects/ngx-core-components/inputs/form-builder/form-builder.component.ts","../../../projects/ngx-core-components/inputs/form-builder/form-designer.component.ts","../../../projects/ngx-core-components/inputs/signature-pad/signature-pad.component.ts","../../../projects/ngx-core-components/inputs/services/form-error.service.ts","../../../projects/ngx-core-components/inputs/pipes/form-error.pipe.ts","../../../projects/ngx-core-components/inputs/directives/mask.directive.ts","../../../projects/ngx-core-components/inputs/public-api.ts","../../../projects/ngx-core-components/inputs/ngx-core-components-inputs.ts"],"sourcesContent":["/**\n * Pure pattern masking utility functions.\n * Built-in presets: 'phone', 'ssn', 'credit-card', 'date-iso', or custom pattern string (e.g., '(###) ###-####')\n * Tokens:\n * '#' = digit (0-9)\n * 'A' = uppercase letter (A-Z)\n * 'a' = lowercase letter (a-z)\n * '*' = alphanumeric (0-9, A-Z, a-z)\n */\n\nexport interface MaskResult {\n  masked: string;\n  unmasked: string;\n}\n\nexport function getPresetMask(preset: string): string {\n  switch (preset.toLowerCase()) {\n    case 'phone':\n    case 'us-phone':\n      return '(###) ###-####';\n    case 'ssn':\n      return '###-##-####';\n    case 'credit-card':\n    case 'card':\n      return '#### #### #### ####';\n    case 'date':\n      return '##/##/####';\n    case 'time':\n      return '##:##';\n    case 'zip':\n    case 'zipcode':\n      return '#####-####';\n    default:\n      return preset; // custom pattern\n  }\n}\n\nexport function applyMask(value: string, pattern: string): MaskResult {\n  if (!value || !pattern) return { masked: value || '', unmasked: value || '' };\n\n  const maskPattern = getPresetMask(pattern);\n  let masked = '';\n  let unmasked = '';\n  let valIdx = 0;\n\n  for (let pIdx = 0; pIdx < maskPattern.length && valIdx < value.length; pIdx++) {\n    const pChar = maskPattern[pIdx];\n    const vChar = value[valIdx];\n\n    if (pChar === '#') {\n      if (/\\d/.test(vChar)) {\n        masked += vChar;\n        unmasked += vChar;\n        valIdx++;\n      } else {\n        valIdx++; // skip non-matching char\n        pIdx--;   // stay on pattern char\n      }\n    } else if (pChar === 'A') {\n      if (/[a-zA-Z]/.test(vChar)) {\n        const upper = vChar.toUpperCase();\n        masked += upper;\n        unmasked += upper;\n        valIdx++;\n      } else {\n        valIdx++;\n        pIdx--;\n      }\n    } else if (pChar === 'a') {\n      if (/[a-zA-Z]/.test(vChar)) {\n        const lower = vChar.toLowerCase();\n        masked += lower;\n        unmasked += lower;\n        valIdx++;\n      } else {\n        valIdx++;\n        pIdx--;\n      }\n    } else if (pChar === '*') {\n      if (/[a-zA-Z0-9]/.test(vChar)) {\n        masked += vChar;\n        unmasked += vChar;\n        valIdx++;\n      } else {\n        valIdx++;\n        pIdx--;\n      }\n    } else {\n      // Literal delimiter char\n      masked += pChar;\n      if (vChar === pChar) {\n        valIdx++;\n      }\n    }\n  }\n\n  return { masked, unmasked };\n}\n\nexport function unmaskValue(value: string, pattern: string): string {\n  return applyMask(value, pattern).unmasked;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed, forwardRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { applyMask } from '../utils/mask.util';\n\n@Component({\n  selector: 'ngx-textbox',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => TextBoxComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <div class=\"ngx-textbox\" [class.focused]=\"isFocused()\" [class.has-error]=\"_resolvedStatus() === 'error'\" [class.disabled]=\"disabled()\">\n      @if (label()) {\n        <label class=\"ngx-textbox-label\">{{ label() }}</label>\n      }\n      <div class=\"ngx-textbox-wrap\" [class]=\"'status-' + _resolvedStatus()\">\n        <ng-content select=\"[prefix]\" />\n        @if (prefixIcon()) {\n          <span class=\"ngx-textbox-affix ngx-textbox-prefix\" aria-hidden=\"true\">{{ prefixIcon() }}</span>\n        }\n        <input\n          class=\"ngx-textbox-input\"\n          [type]=\"_currentType()\"\n          [value]=\"_displayValue()\"\n          [placeholder]=\"isFocused() || !label() ? placeholder() : ''\"\n          [disabled]=\"disabled()\"\n          [readOnly]=\"readonly()\"\n          [attr.maxlength]=\"maxlength() > 0 ? maxlength() : null\"\n          [attr.aria-invalid]=\"_resolvedStatus() === 'error' ? 'true' : null\"\n          (input)=\"onInput($event)\"\n          (focus)=\"onFocus()\"\n          (blur)=\"onBlur()\"\n        />\n        \n        <!-- Status Indicator Icons -->\n        @if (_resolvedStatus() === 'success') {\n          <span class=\"status-icon status-icon-success\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n          </span>\n        } @else if (_resolvedStatus() === 'warning') {\n          <span class=\"status-icon status-icon-warning\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\n          </span>\n        } @else if (_resolvedStatus() === 'error') {\n          <span class=\"status-icon status-icon-error\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\n          </span>\n        }\n\n        @if (type() === 'password' && passwordToggle() && !disabled()) {\n          <button class=\"ngx-textbox-password-toggle\" type=\"button\" (click)=\"togglePasswordVisibility()\" [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\">\n            @if (showPassword()) {\n              <svg viewBox=\"0 0 24 24\" style=\"width: 16px; height: 16px; fill: currentColor;\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.82l2.92 2.92C21.06 15.39 22 13.79 22 12c0-4.27-4.02-8-10-8-1.64 0-3.2.28-4.63.78l2.81 2.81c.56-.23 1.17-.36 1.82-.36zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 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.47 5.7c-2.76 0-5-2.24-5-5v-.06l8.06 8.06c-.92.35-1.92.56-3.06.56z\"/></svg>\n            } @else {\n              <svg viewBox=\"0 0 24 24\" style=\"width: 16px; height: 16px; fill: currentColor;\"><path d=\"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\"/></svg>\n            }\n          </button>\n        }\n        @if (clearable() && !!_displayValue() && !disabled() && !readonly()) {\n          <button class=\"ngx-textbox-clear\" type=\"button\" (click)=\"clearValue()\" aria-label=\"Clear\">✕</button>\n        }\n        @if (suffixIcon()) {\n          <span class=\"ngx-textbox-affix ngx-textbox-suffix\" aria-hidden=\"true\">{{ suffixIcon() }}</span>\n        }\n        <ng-content select=\"[suffix]\" />\n      </div>\n      <div class=\"ngx-textbox-footer\">\n        @if (error()) {\n          <div class=\"ngx-textbox-error\" [attr.id]=\"'err-' + _id\">{{ error() }}</div>\n        } @else if (hint()) {\n          <div class=\"ngx-textbox-hint\">{{ hint() }}</div>\n        } @else {\n          <div></div>\n        }\n        @if (maxlength() > 0 && showCharCount()) {\n          <div class=\"ngx-textbox-charcount\">{{ _displayValue().length }} / {{ maxlength() }}</div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      --ngx-input-bg: #ffffff;\n      --ngx-input-text: #0f172a;\n      --ngx-input-border: #cbd5e1;\n      --ngx-input-focus-border: #4f46e5;\n      --ngx-input-focus-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);\n      --ngx-input-disabled-bg: #f1f5f9;\n      --ngx-input-label: #475569;\n      --ngx-input-label-active: #4f46e5;\n      --ngx-input-placeholder: #94a3b8;\n      \n      --ngx-input-success-border: #10b981;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15);\n      --ngx-input-warning-border: #f59e0b;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(245, 158, 11, 0.15);\n      --ngx-input-error-border: #ef4444;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);\n    }\n    \n    :host-context(body.dark),\n    :host-context(.dark),\n    :host-context(.dark-theme) {\n      --ngx-input-bg: #0f172a;\n      --ngx-input-text: #f8fafc;\n      --ngx-input-border: #334155;\n      --ngx-input-focus-border: #818cf8;\n      --ngx-input-focus-shadow: 0 0 0 3px rgba(129, 140, 248, 0.25);\n      --ngx-input-disabled-bg: #1e293b;\n      --ngx-input-label: #94a3b8;\n      --ngx-input-label-active: #818cf8;\n      --ngx-input-placeholder: #475569;\n      \n      --ngx-input-success-border: #34d399;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(52, 211, 153, 0.25);\n      --ngx-input-warning-border: #fbbf24;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(251, 191, 36, 0.25);\n      --ngx-input-error-border: #f87171;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(248, 113, 113, 0.25);\n    }\n\n    .ngx-textbox { position: relative; font-family: inherit; }\n    \n    .ngx-textbox-label {\n      display: inline-flex;\n      align-items: center;\n      font-size: 12px;\n      font-weight: 600;\n      color: var(--ngx-input-label);\n      margin-bottom: 6px;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n    \n    .focused .ngx-textbox-label {\n      color: var(--ngx-input-label-active);\n      transform: translateX(2px);\n    }\n    \n    .ngx-textbox-wrap {\n      position: relative;\n      display: flex;\n      align-items: center;\n      border: 1px solid var(--ngx-input-border);\n      border-radius: var(--ngx-input-radius, 8px);\n      background: var(--ngx-input-bg);\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    .focused .ngx-textbox-wrap {\n      border-color: var(--ngx-input-focus-border);\n      box-shadow: var(--ngx-input-focus-shadow), 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    /* Validation status outline colors */\n    .ngx-textbox-wrap.status-success {\n      border-color: var(--ngx-input-success-border);\n    }\n    .focused .ngx-textbox-wrap.status-success {\n      box-shadow: var(--ngx-input-success-shadow), 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    .ngx-textbox-wrap.status-warning {\n      border-color: var(--ngx-input-warning-border);\n    }\n    .focused .ngx-textbox-wrap.status-warning {\n      box-shadow: var(--ngx-input-warning-shadow), 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    .ngx-textbox-wrap.status-error {\n      border-color: var(--ngx-input-error-border);\n    }\n    .focused .ngx-textbox-wrap.status-error {\n      box-shadow: var(--ngx-input-error-shadow), 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    .disabled .ngx-textbox-wrap {\n      background: var(--ngx-input-disabled-bg);\n      cursor: not-allowed;\n      opacity: 0.7;\n      box-shadow: none;\n    }\n    \n    .ngx-textbox-input {\n      flex: 1;\n      min-width: 0;\n      padding: 10px 14px;\n      border: none;\n      outline: none;\n      background: transparent;\n      font-size: 14px;\n      color: var(--ngx-input-text);\n      font-family: inherit;\n    }\n    .ngx-textbox-input::placeholder {\n      color: var(--ngx-input-placeholder);\n      opacity: 0.8;\n    }\n    .ngx-textbox-input:disabled { cursor: not-allowed; }\n    \n    /* Status indicators */\n    .status-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      padding: 0 8px;\n      flex-shrink: 0;\n      animation: icon-scale-in 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;\n    }\n    .status-icon-success { color: var(--ngx-input-success-border); }\n    .status-icon-warning { color: var(--ngx-input-warning-border); }\n    .status-icon-error { color: var(--ngx-input-error-border); }\n    \n    @keyframes icon-scale-in {\n      from { transform: scale(0.6); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n\n    .ngx-textbox-footer {\n      display: flex;\n      justify-content: space-between;\n      align-items: flex-start;\n      margin-top: 5px;\n      font-size: 12px;\n    }\n    \n    .ngx-textbox-error {\n      color: var(--ngx-input-error-border);\n      font-weight: 550;\n      animation: slide-down 0.2s ease-out;\n    }\n    .ngx-textbox-hint {\n      color: var(--ngx-input-label);\n    }\n    .ngx-textbox-charcount {\n      color: var(--ngx-input-label);\n      font-size: 11px;\n      margin-left: auto;\n    }\n    \n    @keyframes slide-down {\n      from { transform: translateY(-4px); opacity: 0; }\n      to { transform: translateY(0); opacity: 1; }\n    }\n\n    .ngx-textbox-affix { display: flex; align-items: center; padding: 0 10px; color: var(--ngx-input-label); font-size: 14px; flex-shrink: 0; }\n    \n    .ngx-textbox-clear {\n      background: none; border: none; cursor: pointer; color: var(--ngx-input-placeholder); font-size: 12px;\n      padding: 0 8px; line-height: 1; display: flex; align-items: center; flex-shrink: 0;\n      transition: color 0.15s;\n    }\n    .ngx-textbox-clear:hover { color: var(--ngx-input-text); }\n    \n    .ngx-textbox-password-toggle {\n      background: none; border: none; cursor: pointer; color: var(--ngx-input-placeholder); font-size: 14px;\n      padding: 0 8px; display: flex; align-items: center; justify-content: center; flex-shrink: 0;\n      transition: color 0.15s;\n    }\n    .ngx-textbox-password-toggle:hover { color: var(--ngx-input-text); }\n  `]\n})\nexport class TextBoxComponent implements ControlValueAccessor {\n  value = input<string>('');\n  label = input<string>('');\n  placeholder = input<string>('');\n  type = input<string>('text');\n  disabled = input<boolean>(false);\n  readonly = input<boolean>(false);\n  error = input<string>('');\n  hint = input<string>('');\n  maxlength = input<number>(0);\n  clearable = input<boolean>(false);\n  showCharCount = input<boolean>(false);\n  prefixIcon = input<string>('');\n  suffixIcon = input<string>('');\n  passwordToggle = input<boolean>(false);\n  mask = input<string>('');\n\n  // Enterprise status state\n  status = input<'default' | 'success' | 'warning' | 'error'>('default');\n\n  valueChange = output<string>();\n  unmaskedValueChange = output<string>();\n  focusChange = output<boolean>();\n\n  isFocused = signal(false);\n  showPassword = signal(false);\n  _cvaValue = signal<string>('');\n  private _cvaActive = false;\n  private _onChange: (v: string) => void = () => {};\n  private _onTouched: () => void = () => {};\n\n  _id = 'ngx-txt-' + Math.random().toString(36).substring(2, 9);\n\n  _resolvedStatus = computed(() => {\n    if (this.error()) return 'error';\n    return this.status();\n  });\n\n  /** Merges reactive-form value (CVA) with template binding (input()). CVA takes precedence. */\n  _displayValue = computed(() => this._cvaActive ? this._cvaValue() : this.value());\n\n  _currentType = computed(() => {\n    if (this.type() === 'password' && this.showPassword()) {\n      return 'text';\n    }\n    return this.type();\n  });\n\n  togglePasswordVisibility(): void {\n    if (this.disabled()) return;\n    this.showPassword.update(v => !v);\n  }\n\n  onInput(e: Event): void {\n    let v = (e.target as HTMLInputElement).value;\n    const pattern = this.mask();\n    if (pattern) {\n      const { masked, unmasked } = applyMask(v, pattern);\n      (e.target as HTMLInputElement).value = masked;\n      v = masked;\n      this.unmaskedValueChange.emit(unmasked);\n    }\n    this._cvaValue.set(v);\n    this._onChange(v);\n    this.valueChange.emit(v);\n  }\n\n  onFocus(): void {\n    this.isFocused.set(true);\n    this.focusChange.emit(true);\n  }\n\n  onBlur(): void {\n    this.isFocused.set(false);\n    this.focusChange.emit(false);\n    this._onTouched();\n  }\n\n  clearValue(): void {\n    this._cvaValue.set('');\n    this._onChange('');\n    this.valueChange.emit('');\n  }\n\n  // ControlValueAccessor\n  writeValue(val: string): void {\n    this._cvaActive = true;\n    this._cvaValue.set(val ?? '');\n  }\n\n  registerOnChange(fn: (v: 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    // disabled is controlled via input() for template usage;\n    // reactive-form disable/enable is handled at the FormControl level.\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed, forwardRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n  selector: 'ngx-checkbox',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => CheckboxComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <div class=\"ngx-checkbox-container\" [class.has-error]=\"_resolvedStatus() === 'error'\" [class.disabled]=\"disabled()\" [class.status-success]=\"_resolvedStatus() === 'success'\" [class.status-warning]=\"_resolvedStatus() === 'warning'\">\n      <div class=\"ngx-checkbox-row\">\n        <span\n          class=\"ngx-checkbox-box\"\n          [class.checked]=\"_displayChecked()\"\n          [class.indeterminate]=\"indeterminate()\"\n          (click)=\"toggle()\"\n          (keydown.space)=\"$event.preventDefault(); toggle()\"\n          (keydown.enter)=\"$event.preventDefault(); toggle()\"\n          role=\"checkbox\"\n          [attr.aria-checked]=\"indeterminate() ? 'mixed' : _displayChecked()\"\n          [attr.aria-disabled]=\"disabled()\"\n          [attr.tabindex]=\"disabled() ? null : '0'\"\n        >\n          @if (_displayChecked() && !indeterminate()) {\n            <svg class=\"ngx-checkbox-icon\" viewBox=\"0 0 12 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path d=\"M1 5L4.5 8.5L11 1\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n          } @else if (indeterminate()) {\n            <span class=\"ngx-checkbox-dash\"></span>\n          }\n        </span>\n        @if (label()) {\n          <span class=\"ngx-checkbox-label\" (click)=\"toggle()\">{{ label() }}</span>\n        }\n      </div>\n      \n      @if (error()) {\n        <div class=\"ngx-checkbox-error\">{{ error() }}</div>\n      } @else if (hint()) {\n        <div class=\"ngx-checkbox-hint\">{{ hint() }}</div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: inline-block;\n      --ngx-input-success-border: #10b981;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(16, 185, 129, 0.2);\n      --ngx-input-warning-border: #f59e0b;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(245, 158, 11, 0.2);\n      --ngx-input-error-border: #ef4444;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2);\n      \n      --ngx-checkbox-border: #cbd5e1;\n      --ngx-checkbox-bg: #ffffff;\n      --ngx-checkbox-active: #4f46e5;\n      --ngx-checkbox-radius: 6px;\n      --ngx-checkbox-text: #0f172a;\n    }\n    \n    :host-context(body.dark),\n    :host-context(.dark),\n    :host-context(.dark-theme) {\n      --ngx-checkbox-border: #475569;\n      --ngx-checkbox-bg: #0f172a;\n      --ngx-checkbox-active: #818cf8;\n      --ngx-checkbox-text: #f8fafc;\n      \n      --ngx-input-success-border: #34d399;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(52, 211, 153, 0.3);\n      --ngx-input-warning-border: #fbbf24;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(251, 191, 36, 0.3);\n      --ngx-input-error-border: #f87171;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(248, 113, 113, 0.3);\n    }\n    \n    .ngx-checkbox-container {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n      font-family: inherit;\n    }\n    \n    .ngx-checkbox-row {\n      display: inline-flex;\n      align-items: center;\n      gap: 10px;\n    }\n    \n    .ngx-checkbox-box {\n      width: 20px;\n      height: 20px;\n      flex-shrink: 0;\n      border: 2px solid var(--ngx-checkbox-border);\n      border-radius: var(--ngx-checkbox-radius);\n      background: var(--ngx-checkbox-bg);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      cursor: pointer;\n      outline: none;\n    }\n    \n    .disabled .ngx-checkbox-box {\n      cursor: not-allowed;\n      opacity: 0.55;\n      background: #f1f5f9;\n      border-color: #cbd5e1;\n    }\n    \n    :host-context(.dark) .disabled .ngx-checkbox-box,\n    :host-context(.dark-theme) .disabled .ngx-checkbox-box {\n      background: #1e293b;\n      border-color: #334155;\n    }\n    \n    .ngx-checkbox-box.checked,\n    .ngx-checkbox-box.indeterminate {\n      background: var(--ngx-checkbox-active);\n      border-color: var(--ngx-checkbox-active);\n      color: #ffffff;\n    }\n    \n    .ngx-checkbox-box:hover:not(.disabled) {\n      border-color: var(--ngx-checkbox-active);\n      transform: scale(1.05);\n    }\n    \n    .ngx-checkbox-box:focus-visible {\n      border-color: var(--ngx-checkbox-active);\n      box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.25);\n    }\n    \n    .status-success .ngx-checkbox-box { border-color: var(--ngx-input-success-border); }\n    .status-success .ngx-checkbox-box.checked { background: var(--ngx-input-success-border); }\n    .status-success .ngx-checkbox-box:focus-visible { box-shadow: var(--ngx-input-success-shadow); }\n    \n    .status-warning .ngx-checkbox-box { border-color: var(--ngx-input-warning-border); }\n    .status-warning .ngx-checkbox-box.checked { background: var(--ngx-input-warning-border); }\n    .status-warning .ngx-checkbox-box:focus-visible { box-shadow: var(--ngx-input-warning-shadow); }\n    \n    .has-error .ngx-checkbox-box { border-color: var(--ngx-input-error-border); }\n    .has-error .ngx-checkbox-box.checked { background: var(--ngx-input-error-border); }\n    .has-error .ngx-checkbox-box:focus-visible { box-shadow: var(--ngx-input-error-shadow); }\n    \n    .ngx-checkbox-icon {\n      width: 12px;\n      height: 10px;\n      animation: checkmark-draw 0.18s cubic-bezier(0.12, 0.4, 0.29, 1.46) forwards;\n    }\n    \n    .ngx-checkbox-dash {\n      width: 10px;\n      height: 2px;\n      background: #ffffff;\n      border-radius: 1px;\n      animation: dash-draw 0.15s ease-out forwards;\n    }\n    \n    .ngx-checkbox-label {\n      font-size: 14px;\n      color: var(--ngx-checkbox-text);\n      cursor: pointer;\n      user-select: none;\n      transition: color 0.15s ease;\n    }\n    .disabled .ngx-checkbox-label {\n      cursor: not-allowed;\n      opacity: 0.55;\n    }\n    \n    .ngx-checkbox-error {\n      color: var(--ngx-input-error-border);\n      font-size: 12px;\n      font-weight: 550;\n      margin-left: 30px;\n      animation: slide-down 0.2s ease-out;\n    }\n    .ngx-checkbox-hint {\n      color: #64748b;\n      font-size: 12px;\n      margin-left: 30px;\n    }\n    \n    @keyframes checkmark-draw {\n      from { transform: scale(0.6); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n    \n    @keyframes dash-draw {\n      from { transform: scaleX(0.5); opacity: 0; }\n      to { transform: scaleX(1); opacity: 1; }\n    }\n    \n    @keyframes slide-down {\n      from { transform: translateY(-4px); opacity: 0; }\n      to { transform: translateY(0); opacity: 1; }\n    }\n  `],\n})\nexport class CheckboxComponent implements ControlValueAccessor {\n  label = input<string>('');\n  checked = input<boolean>(false);\n  disabled = input<boolean>(false);\n  indeterminate = input<boolean>(false);\n\n  // Enterprise validation signals\n  status = input<'default' | 'success' | 'warning' | 'error'>('default');\n  error = input<string>('');\n  hint = input<string>('');\n\n  checkedChange = output<boolean>();\n\n  _checked = signal<boolean>(false);\n  private _cvaActive = false;\n\n  private _onChange: (val: boolean) => void = () => {};\n  private _onTouched: () => void = () => {};\n\n  _displayChecked = computed(() => this._cvaActive ? this._checked() : this.checked());\n\n  _resolvedStatus = computed(() => {\n    if (this.error()) return 'error';\n    return this.status();\n  });\n\n  toggle(): void {\n    if (this.disabled()) return;\n    const next = !this._displayChecked();\n    this._checked.set(next);\n    this._onChange(next);\n    this._onTouched();\n    this.checkedChange.emit(next);\n  }\n\n  // ControlValueAccessor\n  writeValue(val: boolean): void {\n    this._cvaActive = true;\n    this._checked.set(!!val);\n  }\n\n  registerOnChange(fn: (val: boolean) => 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    // Handled at form control template level\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed, forwardRef, ElementRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface RadioOption {\n  label: string;\n  value: unknown;\n  disabled?: boolean;\n}\n\n@Component({\n  selector: 'ngx-radio-group',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => RadioGroupComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <div\n      class=\"ngx-radio-group-container\"\n      [class.has-error]=\"_resolvedStatus() === 'error'\"\n      [class.disabled]=\"disabled()\"\n      [class.status-success]=\"_resolvedStatus() === 'success'\"\n      [class.status-warning]=\"_resolvedStatus() === 'warning'\"\n    >\n      @if (label()) {\n        <span class=\"ngx-radio-group-label\">{{ label() }}</span>\n      }\n      <div\n        class=\"ngx-radio-group-options\"\n        [class.inline]=\"inline()\"\n        role=\"radiogroup\"\n        [attr.aria-label]=\"label()\"\n      >\n        @for (opt of options(); track opt.value; let idx = $index) {\n          <label\n            class=\"ngx-radio\"\n            [class.disabled]=\"disabled() || !!opt.disabled\"\n            [class.checked]=\"isChecked(opt.value)\"\n          >\n            <span\n              class=\"ngx-radio-btn\"\n              [class.checked]=\"isChecked(opt.value)\"\n              (click)=\"select(opt)\"\n              role=\"radio\"\n              [attr.aria-checked]=\"isChecked(opt.value)\"\n              [attr.aria-disabled]=\"disabled() || opt.disabled\"\n              [attr.tabindex]=\"getTabindex(opt, idx)\"\n              (keydown)=\"onOptionKeyDown($event, opt, idx)\"\n            >\n              <span class=\"ngx-radio-dot\" [class.visible]=\"isChecked(opt.value)\"></span>\n            </span>\n            <span class=\"ngx-radio-label\" (click)=\"select(opt)\">{{ opt.label }}</span>\n          </label>\n        }\n      </div>\n      \n      @if (error()) {\n        <div class=\"ngx-radio-error\">{{ error() }}</div>\n      } @else if (hint()) {\n        <div class=\"ngx-radio-hint\">{{ hint() }}</div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      --ngx-input-success-border: #10b981;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(16, 185, 129, 0.2);\n      --ngx-input-warning-border: #f59e0b;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(245, 158, 11, 0.2);\n      --ngx-input-error-border: #ef4444;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2);\n      \n      --ngx-radio-border: #cbd5e1;\n      --ngx-radio-bg: #ffffff;\n      --ngx-radio-active: #4f46e5;\n      --ngx-radio-text: #0f172a;\n    }\n    \n    :host-context(body.dark),\n    :host-context(.dark),\n    :host-context(.dark-theme) {\n      --ngx-radio-border: #475569;\n      --ngx-radio-bg: #0f172a;\n      --ngx-radio-active: #818cf8;\n      --ngx-radio-text: #f8fafc;\n      \n      --ngx-input-success-border: #34d399;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(52, 211, 153, 0.3);\n      --ngx-input-warning-border: #fbbf24;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(251, 191, 36, 0.3);\n      --ngx-input-error-border: #f87171;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(248, 113, 113, 0.3);\n    }\n    \n    .ngx-radio-group-container {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      font-family: inherit;\n    }\n    \n    .ngx-radio-group-label {\n      display: block;\n      font-size: 13px;\n      color: var(--ngx-radio-border);\n      font-weight: 600;\n      margin-bottom: 4px;\n    }\n    \n    .ngx-radio-group-options {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n    }\n    .ngx-radio-group-options.inline {\n      flex-direction: row;\n      flex-wrap: wrap;\n      gap: 20px;\n    }\n    \n    .ngx-radio {\n      display: inline-flex;\n      align-items: center;\n      gap: 10px;\n      cursor: pointer;\n      user-select: none;\n    }\n    .ngx-radio.disabled {\n      cursor: not-allowed;\n      opacity: 0.55;\n    }\n    \n    .ngx-radio-btn {\n      width: 20px;\n      height: 20px;\n      flex-shrink: 0;\n      border: 2px solid var(--ngx-radio-border);\n      border-radius: 50%;\n      background: var(--ngx-radio-bg);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      outline: none;\n    }\n    \n    .ngx-radio-btn.checked {\n      border-color: var(--ngx-radio-active);\n    }\n    \n    .ngx-radio-btn:hover:not(.disabled) {\n      border-color: var(--ngx-radio-active);\n      transform: scale(1.05);\n    }\n    \n    .ngx-radio-btn:focus-visible {\n      border-color: var(--ngx-radio-active);\n      box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.25);\n    }\n    \n    .status-success .ngx-radio-btn { border-color: var(--ngx-input-success-border); }\n    .status-success .ngx-radio-btn.checked { border-color: var(--ngx-input-success-border); }\n    .status-success .ngx-radio-dot { background: var(--ngx-input-success-border); }\n    .status-success .ngx-radio-btn:focus-visible { box-shadow: var(--ngx-input-success-shadow); }\n    \n    .status-warning .ngx-radio-btn { border-color: var(--ngx-input-warning-border); }\n    .status-warning .ngx-radio-btn.checked { border-color: var(--ngx-input-warning-border); }\n    .status-warning .ngx-radio-dot { background: var(--ngx-input-warning-border); }\n    .status-warning .ngx-radio-btn:focus-visible { box-shadow: var(--ngx-input-warning-shadow); }\n    \n    .has-error .ngx-radio-btn { border-color: var(--ngx-input-error-border); }\n    .has-error .ngx-radio-btn.checked { border-color: var(--ngx-input-error-border); }\n    .has-error .ngx-radio-dot { background: var(--ngx-input-error-border); }\n    .has-error .ngx-radio-btn:focus-visible { box-shadow: var(--ngx-input-error-shadow); }\n    \n    .ngx-radio-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      background: var(--ngx-radio-active);\n      opacity: 0;\n      transform: scale(0.4);\n      transition: opacity 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275),\n                  transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n    }\n    .ngx-radio-dot.visible {\n      opacity: 1;\n      transform: scale(1);\n    }\n    \n    .ngx-radio-label {\n      font-size: 14px;\n      color: var(--ngx-radio-text);\n      transition: color 0.15s ease;\n    }\n    .disabled .ngx-radio-label {\n      cursor: not-allowed;\n      opacity: 0.55;\n    }\n    \n    .ngx-radio-error {\n      color: var(--ngx-input-error-border);\n      font-size: 12px;\n      font-weight: 550;\n      animation: slide-down 0.2s ease-out;\n    }\n    .ngx-radio-hint {\n      color: #64748b;\n      font-size: 12px;\n    }\n    \n    @keyframes slide-down {\n      from { transform: translateY(-4px); opacity: 0; }\n      to { transform: translateY(0); opacity: 1; }\n    }\n  `],\n})\nexport class RadioGroupComponent implements ControlValueAccessor {\n  options = input<RadioOption[]>([]);\n  label = input<string>('');\n  value = input<unknown>(null);\n  disabled = input<boolean>(false);\n  inline = input<boolean>(false);\n\n  // Enterprise validation signals\n  status = input<'default' | 'success' | 'warning' | 'error'>('default');\n  error = input<string>('');\n  hint = input<string>('');\n\n  valueChange = output<unknown>();\n\n  _value = signal<unknown>(null);\n  private _cvaActive = false;\n\n  private _onChange: (val: unknown) => void = () => {};\n  private _onTouched: () => void = () => {};\n\n  _activeValue = computed(() => this._cvaActive ? this._value() : this.value());\n\n  _resolvedStatus = computed(() => {\n    if (this.error()) return 'error';\n    return this.status();\n  });\n\n  constructor(private el: ElementRef) {}\n\n  isChecked(val: unknown): boolean {\n    return this._activeValue() === val;\n  }\n\n  select(opt: RadioOption): void {\n    if (this.disabled() || opt.disabled) return;\n    this._value.set(opt.value);\n    this._onChange(opt.value);\n    this._onTouched();\n    this.valueChange.emit(opt.value);\n  }\n\n  getTabindex(opt: RadioOption, idx: number): string {\n    if (this.disabled() || opt.disabled) return '-1';\n    \n    const activeVal = this._activeValue();\n    const opts = this.options();\n    \n    if (activeVal !== null && activeVal !== undefined) {\n      return this.isChecked(opt.value) ? '0' : '-1';\n    }\n    \n    const firstEnabledIdx = opts.findIndex(o => !o.disabled);\n    return idx === firstEnabledIdx ? '0' : '-1';\n  }\n\n  onOptionKeyDown(event: KeyboardEvent, opt: RadioOption, idx: number): void {\n    if (this.disabled()) return;\n    \n    let nextIdx = idx;\n    const opts = this.options();\n    \n    if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n      event.preventDefault();\n      do {\n        nextIdx = (nextIdx + 1) % opts.length;\n      } while (opts[nextIdx].disabled && nextIdx !== idx);\n      \n      this.select(opts[nextIdx]);\n      this.focusOption(nextIdx);\n    } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n      event.preventDefault();\n      do {\n        nextIdx = (nextIdx - 1 + opts.length) % opts.length;\n      } while (opts[nextIdx].disabled && nextIdx !== idx);\n      \n      this.select(opts[nextIdx]);\n      this.focusOption(nextIdx);\n    }\n  }\n\n  private focusOption(idx: number): void {\n    setTimeout(() => {\n      const radioBtns = this.el.nativeElement.querySelectorAll('.ngx-radio-btn');\n      if (radioBtns[idx]) {\n        (radioBtns[idx] as HTMLElement).focus();\n      }\n    });\n  }\n\n  // ControlValueAccessor\n  writeValue(val: unknown): void {\n    this._cvaActive = true;\n    this._value.set(val ?? null);\n  }\n\n  registerOnChange(fn: (val: unknown) => 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    // Handled at form control template level\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed,\n  HostListener, ElementRef, inject, forwardRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NGX_CORE_I18N } from 'ngx-core-components/i18n';\n\nexport interface DropdownOption {\n  label: string;\n  value: unknown;\n  disabled?: boolean;\n}\n\n@Component({\n  selector: 'ngx-dropdown',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => DropdownComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <div\n      class=\"ngx-dropdown\"\n      [class.open]=\"isOpen()\"\n      [class.disabled]=\"disabled()\"\n      [class.has-error]=\"!!error()\"\n    >\n      @if (label()) {\n        <label [id]=\"uid + '-label'\" class=\"ngx-dropdown-label\">\n          {{ label() }}\n          @if (required()) { <span class=\"ngx-dropdown-required\" aria-hidden=\"true\">*</span> }\n        </label>\n      }\n\n      <!-- Trigger -->\n      <div\n        class=\"ngx-dropdown-trigger\"\n        [id]=\"uid + '-trigger'\"\n        role=\"combobox\"\n        [attr.aria-expanded]=\"isOpen()\"\n        [attr.aria-haspopup]=\"'listbox'\"\n        [attr.aria-controls]=\"isOpen() ? uid + '-popup' : null\"\n        [attr.aria-activedescendant]=\"isOpen() && focusedIndex() >= 0 ? uid + '-opt-' + focusedIndex() : null\"\n        [attr.aria-autocomplete]=\"filterable() ? 'list' : 'none'\"\n        [attr.aria-labelledby]=\"label() ? uid + '-label' : null\"\n        [attr.tabindex]=\"disabled() ? -1 : 0\"\n        (click)=\"toggle()\"\n        (keydown)=\"onTriggerKey($event)\"\n        [attr.aria-label]=\"!label() ? (selectedLabel() || effectivePlaceholder()) : null\"\n        [attr.aria-disabled]=\"disabled()\"\n      >\n        <span class=\"trigger-text\" [class.placeholder]=\"!selectedLabel()\">\n          {{ selectedLabel() || effectivePlaceholder() }}\n        </span>\n        <span class=\"trigger-arrow\" [class.open]=\"isOpen()\">&#9660;</span>\n      </div>\n\n      <!-- Popup -->\n      @if (isOpen()) {\n        <div \n          class=\"ngx-dropdown-popup\" \n          [id]=\"uid + '-popup'\" \n          role=\"listbox\"\n          aria-live=\"polite\"\n          [attr.aria-labelledby]=\"label() ? uid + '-label' : null\"\n        >\n          @if (filterable()) {\n            <div class=\"popup-search\">\n              <input\n                #filterInput\n                class=\"popup-search-input\"\n                [placeholder]=\"i18n.dropdown.searchPlaceholder\"\n                [value]=\"filterText()\"\n                (input)=\"filterText.set($any($event.target).value)\"\n                (keydown)=\"onFilterKey($event)\"\n                role=\"searchbox\"\n                aria-label=\"Search options\"\n              />\n            </div>\n          }\n          <div class=\"popup-list\">\n            @for (opt of filteredOptions(); track opt.value; let i = $index) {\n              <div\n                class=\"popup-item\"\n                [id]=\"uid + '-opt-' + i\"\n                [class.selected]=\"isSelected(opt)\"\n                [class.focused]=\"focusedIndex() === i\"\n                [class.disabled]=\"opt.disabled\"\n                role=\"option\"\n                [attr.aria-selected]=\"isSelected(opt)\"\n                [attr.aria-disabled]=\"opt.disabled\"\n                (click)=\"selectOption(opt)\"\n                (mouseenter)=\"focusedIndex.set(i)\"\n              >{{ opt.label }}</div>\n            }\n            @if (filteredOptions().length === 0) {\n              <div class=\"popup-empty\" role=\"status\">{{ i18n.dropdown.noResults }}</div>\n            }\n          </div>\n        </div>\n      }\n      @if (error()) {\n        <div [id]=\"uid + '-error'\" class=\"ngx-dropdown-error\" role=\"alert\">{{ error() }}</div>\n      } @else if (hint()) {\n        <div [id]=\"uid + '-hint'\" class=\"ngx-dropdown-hint\">{{ hint() }}</div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-dropdown { position: relative; font-family: inherit; }\n    .ngx-dropdown-label { display: block; font-size: 13px; color: var(--ngx-input-label, #6c757d); margin-bottom: 4px; font-weight: 500; }\n    \n    .ngx-dropdown-trigger {\n      display: flex; align-items: center; justify-content: space-between;\n      padding: 8px 12px; border: 1px solid var(--ngx-input-border, #ced4da);\n      border-radius: var(--ngx-input-radius, 8px); background: var(--ngx-input-bg, #fff);\n      cursor: pointer; user-select: none; font-size: 14px;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      outline: none;\n    }\n    .ngx-dropdown-trigger:hover { border-color: var(--ngx-input-focus, #4f46e5); }\n    .ngx-dropdown-trigger:focus-visible {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.15));\n      outline: none;\n    }\n    \n    .open .ngx-dropdown-trigger {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.15));\n    }\n    .disabled .ngx-dropdown-trigger { background: var(--ngx-input-disabled-bg, #f8f9fa); cursor: not-allowed; color: var(--ngx-color-text-disabled, #767b83); }\n    .trigger-text { flex: 1; color: var(--ngx-input-text, #212529); }\n    .trigger-text.placeholder { color: var(--ngx-color-text-disabled, #767b83); }\n    .trigger-arrow { font-size: 10px; color: #6c757d; transition: transform 0.15s; }\n    .trigger-arrow.open { transform: rotate(180deg); }\n    .ngx-dropdown-popup {\n      position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 1000;\n      background: var(--ngx-input-bg, #fff); border: 1px solid var(--ngx-input-border, #ced4da);\n      border-radius: var(--ngx-input-radius, 8px); box-shadow: var(--shadow-lg, 0 10px 15px -3px rgba(0,0,0,0.1));\n      overflow: hidden;\n      transform-origin: top;\n      animation: popup-slide 0.18s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n    @keyframes popup-slide {\n      from { opacity: 0; transform: translateY(-4px) scaleY(0.95); }\n      to { opacity: 1; transform: translateY(0) scaleY(1); }\n    }\n    .popup-search { padding: 8px; border-bottom: 1px solid var(--ngx-input-border, #ced4da); }\n    .popup-search-input {\n      width: 100%; padding: 6px 10px; border: 1px solid var(--ngx-input-border, #ced4da);\n      border-radius: var(--radius-sm, 6px); font-size: 13px; outline: none; font-family: inherit;\n      background: var(--bg-primary); color: var(--text-primary);\n      transition: all 0.15s ease;\n    }\n    .popup-search-input:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      background: var(--bg-secondary);\n    }\n    .popup-list { max-height: 240px; overflow-y: auto; }\n    .popup-item {\n      padding: 8px 12px; font-size: 14px; cursor: pointer;\n      color: var(--ngx-input-text, #212529); transition: all 0.12s;\n    }\n    .popup-item:hover, .popup-item.focused { background: var(--ngx-grid-hover-bg, #f1f3f5); color: var(--ngx-input-focus, #4f46e5); }\n    .popup-item.selected { background: var(--ngx-grid-selected-bg, #e8f0fe); color: var(--ngx-input-focus, #4f46e5); font-weight: 600; }\n    .popup-item.disabled { color: var(--ngx-color-text-disabled, #767b83); cursor: not-allowed; }\n    .popup-item.disabled:hover { background: none; }\n    .popup-empty { padding: 12px; text-align: center; color: var(--ngx-color-text-disabled, #767b83); font-size: 13px; }\n    .has-error .ngx-dropdown-trigger { border-color: var(--ngx-input-error, #e74c3c); }\n    .has-error.focused .ngx-dropdown-trigger, .has-error.open .ngx-dropdown-trigger { box-shadow: 0 0 0 2px rgba(231,76,60,0.18); }\n    .ngx-dropdown-error { font-size: 12px; color: var(--ngx-input-error, #e74c3c); margin-top: 4px; }\n    .ngx-dropdown-hint { font-size: 12px; color: var(--ngx-input-label, #6c757d); margin-top: 4px; }\n    .ngx-dropdown-required { color: var(--ngx-input-error, #e74c3c); margin-left: 2px; }\n  `]\n})\nexport class DropdownComponent implements ControlValueAccessor {\n  options = input<DropdownOption[]>([]);\n  value = input<unknown>(null);\n  label = input<string>('');\n  placeholder = input<string | null>(null);\n  disabled = input<boolean>(false);\n  filterable = input<boolean>(false);\n  required = input<boolean>(false);\n  error = input<string>('');\n  hint = input<string>('');\n\n  valueChange = output<unknown>();\n\n  i18n = inject(NGX_CORE_I18N);\n  effectivePlaceholder = computed(() => this.placeholder() ?? this.i18n.dropdown.selectPlaceholder);\n\n  isOpen = signal(false);\n  filterText = signal('');\n  focusedIndex = signal(-1);\n  _cvaValue = signal<unknown>(null);\n  private _cvaActive = false;\n  private _onChange: (v: unknown) => void = () => {};\n  private _onTouched: () => void = () => {};\n\n  uid = 'ngx-dd-' + Math.random().toString(36).substring(2, 9);\n  private el = inject(ElementRef);\n\n  _activeValue = computed(() => this._cvaActive ? this._cvaValue() : this.value());\n\n  selectedLabel = computed(() => {\n    const opt = this.options().find(o => o.value === this._activeValue());\n    return opt?.label ?? '';\n  });\n\n  filteredOptions = computed(() => {\n    const f = this.filterText().toLowerCase();\n    return f ? this.options().filter(o => o.label.toLowerCase().includes(f)) : this.options();\n  });\n\n  isSelected(opt: DropdownOption): boolean { return opt.value === this._activeValue(); }\n\n  toggle(): void {\n    if (this.disabled()) return;\n    this.isOpen.update(v => !v);\n    if (this.isOpen()) {\n      const opts = this.filteredOptions();\n      const selectedIndex = opts.findIndex(o => o.value === this._activeValue());\n      this.focusedIndex.set(selectedIndex >= 0 ? selectedIndex : (opts.length > 0 ? 0 : -1));\n      \n      // Auto-focus search input if filterable\n      if (this.filterable()) {\n        setTimeout(() => {\n          const inputEl = this.el.nativeElement.querySelector('.popup-search-input');\n          inputEl?.focus();\n        }, 50);\n      }\n    } else {\n      this.filterText.set('');\n      this.focusedIndex.set(-1);\n      this._onTouched();\n    }\n  }\n\n  selectOption(opt: DropdownOption): void {\n    if (opt.disabled) return;\n    this._cvaActive = true;\n    this._cvaValue.set(opt.value);\n    this._onChange(opt.value);\n    this._onTouched();\n    this.valueChange.emit(opt.value);\n    this.isOpen.set(false);\n    this.filterText.set('');\n    \n    // Return focus to trigger\n    setTimeout(() => {\n      const triggerEl = this.el.nativeElement.querySelector('.ngx-dropdown-trigger');\n      triggerEl?.focus();\n    }, 0);\n  }\n\n  onTriggerKey(e: KeyboardEvent): void {\n    if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.toggle(); }\n    if (e.key === 'Escape') {\n      this.isOpen.set(false);\n      this._onTouched();\n    }\n    if (e.key === 'ArrowDown') { e.preventDefault(); if (!this.isOpen()) this.isOpen.set(true); else this.moveFocus(1); }\n    if (e.key === 'ArrowUp') { e.preventDefault(); this.moveFocus(-1); }\n  }\n\n  onFilterKey(e: KeyboardEvent): void {\n    if (e.key === 'ArrowDown') { e.preventDefault(); this.moveFocus(1); }\n    if (e.key === 'ArrowUp') { e.preventDefault(); this.moveFocus(-1); }\n    if (e.key === 'Enter') {\n      const opts = this.filteredOptions();\n      const i = this.focusedIndex();\n      if (i >= 0 && i < opts.length) this.selectOption(opts[i]);\n    }\n    if (e.key === 'Escape') {\n      this.isOpen.set(false);\n      this.filterText.set('');\n      this.focusedIndex.set(-1);\n      this._onTouched();\n      // Return focus to trigger\n      setTimeout(() => {\n        const triggerEl = this.el.nativeElement.querySelector('.ngx-dropdown-trigger');\n        triggerEl?.focus();\n      }, 0);\n    }\n  }\n\n  private moveFocus(delta: number): void {\n    const opts = this.filteredOptions();\n    const n = opts.length;\n    if (n <= 0) {\n      this.focusedIndex.set(-1);\n      return;\n    }\n    \n    let idx = this.focusedIndex();\n    const start = idx;\n    \n    do {\n      idx += delta;\n      if (idx < 0) idx = n - 1;\n      if (idx >= n) idx = 0;\n      if (idx === start) break;\n    } while (opts[idx].disabled);\n\n    if (!opts[idx].disabled) {\n      this.focusedIndex.set(idx);\n    }\n  }\n\n  @HostListener('document:click', ['$event'])\n  onDocClick(e: MouseEvent): void {\n    if (!this.el.nativeElement.contains(e.target)) {\n      if (this.isOpen()) {\n        this.isOpen.set(false);\n        this.filterText.set('');\n        this.focusedIndex.set(-1);\n        this._onTouched();\n      }\n    }\n  }\n\n  // ControlValueAccessor\n  writeValue(val: unknown): void {\n    this._cvaActive = true;\n    this._cvaValue.set(val ?? null);\n  }\n\n  registerOnChange(fn: (v: unknown) => 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    // disabled is controlled via input() for template usage.\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed,\n  HostListener, ElementRef, inject, forwardRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NGX_CORE_I18N } from 'ngx-core-components/i18n';\nimport { DropdownOption } from '../dropdown/dropdown.component';\n\n@Component({\n  selector: 'ngx-multi-select',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MultiSelectComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <div class=\"ngx-multi-select\" [class.open]=\"isOpen()\" [class.disabled]=\"disabled()\">\n      @if (label()) {\n        <label class=\"ms-label\">{{ label() }}</label>\n      }\n      <!-- Trigger -->\n      <div\n        class=\"ms-trigger\"\n        tabindex=\"0\"\n        (click)=\"toggle()\"\n        (keydown)=\"onTriggerKey($event)\"\n        role=\"combobox\"\n        aria-haspopup=\"listbox\"\n        [attr.aria-expanded]=\"isOpen()\"\n      >\n        <div class=\"ms-tags\">\n          @for (val of displayValues(); track val.value) {\n            <span class=\"ms-tag\">\n              {{ val.label }}\n              <button class=\"ms-tag-remove\" (click)=\"removeValue(val.value, $event)\" [attr.aria-label]=\"'Remove ' + val.label\">&#10005;</button>\n            </span>\n          }\n          @if (displayValues().length === 0) {\n            <span class=\"ms-placeholder\">{{ effectivePlaceholder() }}</span>\n          }\n        </div>\n        <span class=\"ms-arrow\" [class.open]=\"isOpen()\">&#9660;</span>\n      </div>\n\n      <!-- Popup -->\n      @if (isOpen()) {\n        <div class=\"ms-popup\">\n          @if (filterable()) {\n            <div class=\"ms-search\">\n              <input\n                class=\"ms-search-input\"\n                [placeholder]=\"i18n.multiSelect.searchPlaceholder\"\n                [value]=\"filterText()\"\n                (input)=\"filterText.set($any($event.target).value)\"\n                (click)=\"$event.stopPropagation()\"\n              />\n            </div>\n          }\n          <div class=\"ms-list\">\n            <!-- Select All -->\n            <label class=\"ms-item ms-select-all\">\n              <input\n                type=\"checkbox\"\n                [checked]=\"allSelected()\"\n                [indeterminate]=\"someSelected() && !allSelected()\"\n                (change)=\"toggleAll()\"\n              />\n              <span>{{ allSelected() ? i18n.multiSelect.deselectAll : i18n.multiSelect.selectAll }}</span>\n            </label>\n            <div class=\"ms-divider\"></div>\n            @for (opt of filteredOptions(); track opt.value; let i = $index) {\n              <label\n                class=\"ms-item\"\n                [class.checked]=\"isChecked(opt)\"\n                [class.disabled]=\"opt.disabled\"\n                [class.focused]=\"focusedIndex() === i\"\n                (mouseenter)=\"focusedIndex.set(i)\"\n              >\n                <input\n                  type=\"checkbox\"\n                  [checked]=\"isChecked(opt)\"\n                  [disabled]=\"!!opt.disabled\"\n                  (change)=\"toggleOption(opt)\"\n                  (click)=\"$event.stopPropagation()\"\n                />\n                <span>{{ opt.label }}</span>\n              </label>\n            }\n            @if (filteredOptions().length === 0) {\n              <div class=\"ms-empty\">{{ i18n.dropdown.noResults }}</div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-multi-select { position: relative; font-family: inherit; }\n    .ms-label { display: block; font-size: 13px; color: var(--ngx-input-label, #6c757d); margin-bottom: 4px; font-weight: 500; }\n    .ms-trigger {\n      display: flex; align-items: center; min-height: 38px;\n      padding: 4px 8px 4px 4px; border: 1px solid var(--ngx-input-border, #ced4da);\n      border-radius: var(--ngx-input-radius, 8px); background: var(--ngx-input-bg, #fff);\n      cursor: pointer; user-select: none; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n    .ms-trigger:hover { border-color: var(--ngx-input-focus, #4f46e5); }\n    .open .ms-trigger { border-color: var(--ngx-input-focus, #4f46e5); box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.15)); }\n    .disabled .ms-trigger { background: var(--ngx-input-disabled-bg, #f8f9fa); cursor: not-allowed; opacity: 0.7; }\n    .ms-tags { display: flex; flex-wrap: wrap; gap: 4px; flex: 1; align-items: center; }\n    .ms-tag {\n      display: inline-flex; align-items: center; gap: 4px;\n      background: var(--ngx-input-tag-bg, #e0e7ff); color: var(--ngx-input-tag-color, #4f46e5);\n      padding: 2px 6px 2px 8px; border-radius: 4px; font-size: 12px; font-weight: 500;\n      border: 1px solid rgba(79, 70, 229, 0.15);\n    }\n    .ms-tag-remove {\n      background: none; border: none; cursor: pointer; padding: 0 2px;\n      color: var(--ngx-input-tag-color, #4f46e5); font-size: 10px; line-height: 1;\n      opacity: 0.6; transition: opacity 0.12s;\n    }\n    .ms-tag-remove:hover { opacity: 1; }\n    .ms-placeholder { color: #adb5bd; font-size: 14px; padding: 0 4px; }\n    .ms-arrow { font-size: 10px; color: #6c757d; transition: transform 0.15s; margin-left: auto; }\n    .ms-arrow.open { transform: rotate(180deg); }\n    .ms-popup {\n      position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 1000;\n      background: var(--ngx-input-bg, #fff); border: 1px solid var(--ngx-input-border, #ced4da);\n      border-radius: var(--ngx-input-radius, 8px); box-shadow: var(--shadow-lg, 0 10px 15px -3px rgba(0,0,0,0.1)); overflow: hidden;\n      transform-origin: top;\n      animation: popup-slide 0.18s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n    @keyframes popup-slide {\n      from { opacity: 0; transform: translateY(-4px) scaleY(0.95); }\n      to { opacity: 1; transform: translateY(0) scaleY(1); }\n    }\n    .ms-search { padding: 8px; border-bottom: 1px solid var(--ngx-input-border, #ced4da); }\n    .ms-search-input {\n      width: 100%; padding: 6px 10px; border: 1px solid var(--ngx-input-border, #ced4da);\n      border-radius: var(--radius-sm, 6px); font-size: 13px; outline: none; font-family: inherit;\n      background: var(--bg-primary); color: var(--text-primary);\n      transition: all 0.15s ease;\n    }\n    .ms-search-input:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      background: var(--bg-secondary);\n    }\n    .ms-list { max-height: 240px; overflow-y: auto; }\n    .ms-item {\n      display: flex; align-items: center; gap: 10px; padding: 8px 12px;\n      cursor: pointer; font-size: 14px; color: var(--ngx-input-text, #212529);\n      transition: all 0.12s;\n    }\n    .ms-item:hover, .ms-item.focused { background: var(--ngx-grid-hover-bg, #f1f3f5); color: var(--ngx-input-focus, #4f46e5); }\n    .ms-item.checked { background: var(--ngx-grid-selected-bg, #e8f0fe); color: var(--ngx-input-focus, #4f46e5); }\n    .ms-item.disabled { color: #adb5bd; cursor: not-allowed; }\n    .ms-item input[type=\"checkbox\"] { width: 14px; height: 14px; cursor: pointer; accent-color: var(--ngx-input-focus, #4f46e5); }\n    .ms-select-all { font-weight: 600; }\n    .ms-divider { height: 1px; background: var(--ngx-input-border, #eee); margin: 2px 0; }\n    .ms-empty { padding: 12px; text-align: center; color: #adb5bd; font-size: 13px; }\n  `]\n})\nexport class MultiSelectComponent implements ControlValueAccessor {\n  options = input<DropdownOption[]>([]);\n  values = input<unknown[]>([]);\n  label = input<string>('');\n  placeholder = input<string | null>(null);\n  disabled = input<boolean>(false);\n  filterable = input<boolean>(false);\n  maxTags = input<number>(Infinity);\n\n  valuesChange = output<unknown[]>();\n\n  i18n = inject(NGX_CORE_I18N);\n  effectivePlaceholder = computed(() => this.placeholder() ?? this.i18n.dropdown.selectPlaceholder);\n\n  isOpen = signal(false);\n  filterText = signal('');\n  focusedIndex = signal(-1);\n  _cvaValues = signal<unknown[]>([]);\n  private _cvaActive = signal(false);\n  private _onChange: (v: unknown[]) => void = () => {};\n  private _onTouched: () => void = () => {};\n\n  private el = inject(ElementRef);\n\n  _activeValues = computed(() => this._cvaActive() ? this._cvaValues() : this.values());\n\n  displayValues = computed(() =>\n    this._activeValues()\n      .slice(0, this.maxTags() === Infinity ? undefined : this.maxTags())\n      .map(v => ({ value: v, label: this.options().find(o => o.value === v)?.label ?? String(v) }))\n  );\n\n  filteredOptions = computed(() => {\n    const f = this.filterText().toLowerCase();\n    return f ? this.options().filter(o => o.label.toLowerCase().includes(f)) : this.options();\n  });\n\n  allSelected = computed(() => this.options().every(o => this._activeValues().includes(o.value)));\n  someSelected = computed(() => this.options().some(o => this._activeValues().includes(o.value)));\n\n  isChecked(opt: DropdownOption): boolean { return this._activeValues().includes(opt.value); }\n\n  toggle(): void {\n    if (this.disabled()) return;\n    this.isOpen.update(v => !v);\n  }\n\n  toggleOption(opt: DropdownOption): void {\n    if (opt.disabled) return;\n    const cur = this._activeValues();\n    const next = cur.includes(opt.value) ? cur.filter(v => v !== opt.value) : [...cur, opt.value];\n    this._cvaValues.set(next);\n    this._onChange(next);\n    this._onTouched();\n    this.valuesChange.emit(next);\n  }\n\n  removeValue(val: unknown, e: MouseEvent): void {\n    e.stopPropagation();\n    const next = this._activeValues().filter(v => v !== val);\n    this._cvaValues.set(next);\n    this._onChange(next);\n    this.valuesChange.emit(next);\n  }\n\n  toggleAll(): void {\n    const next = this.allSelected() ? [] : this.options().filter(o => !o.disabled).map(o => o.value);\n    this._cvaValues.set(next);\n    this._onChange(next);\n    this.valuesChange.emit(next);\n  }\n\n  onTriggerKey(e: KeyboardEvent): void {\n    if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.toggle(); }\n    if (e.key === 'Escape') this.isOpen.set(false);\n  }\n\n  @HostListener('document:click', ['$event'])\n  onDocClick(e: MouseEvent): void {\n    if (!this.el.nativeElement.contains(e.target)) {\n      this.isOpen.set(false);\n      this.filterText.set('');\n    }\n  }\n\n  // ControlValueAccessor\n  writeValue(val: unknown[]): void {\n    this._cvaActive.set(true);\n    this._cvaValues.set(Array.isArray(val) ? val : []);\n  }\n\n  registerOnChange(fn: (v: unknown[]) => 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    // disabled is controlled via input() for template usage.\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed,\n  forwardRef, HostListener, ElementRef, inject\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NGX_CORE_I18N } from 'ngx-core-components/i18n';\nimport { DropdownOption } from '../dropdown/dropdown.component';\n\n@Component({\n  selector: 'ngx-autocomplete',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => AutocompleteComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <div\n      class=\"ngx-autocomplete\"\n      [class.open]=\"isOpen()\"\n      [class.focused]=\"isFocused()\"\n      [class.has-error]=\"!!error()\"\n      [class.disabled]=\"disabled()\"\n    >\n      @if (label()) {\n        <label class=\"ngx-ac-label\">{{ label() }}</label>\n      }\n      <div class=\"ngx-ac-wrap\">\n        <input\n          class=\"ngx-ac-input\"\n          [placeholder]=\"effectivePlaceholder()\"\n          [disabled]=\"disabled()\"\n          [value]=\"_inputText()\"\n          (input)=\"onInput($event)\"\n          (focus)=\"onFocus()\"\n          (blur)=\"onBlur()\"\n          (keydown)=\"onKeyDown($event)\"\n          role=\"combobox\"\n          [attr.aria-expanded]=\"isOpen()\"\n          aria-autocomplete=\"list\"\n          aria-haspopup=\"listbox\"\n        />\n        @if (_inputText()) {\n          <button class=\"ngx-ac-clear\" (click)=\"clear()\" [attr.aria-label]=\"i18n.autocomplete.clearSelection\">&#10005;</button>\n        }\n      </div>\n\n      <!-- Suggestion panel — floats above DOM via absolute positioning -->\n      @if (isOpen()) {\n        <div class=\"ngx-ac-panel\" role=\"listbox\" aria-live=\"polite\">\n          @for (opt of filteredOptions(); track opt.value; let i = $index) {\n            <div\n              class=\"ngx-ac-item\"\n              [class.focused]=\"focusedIndex() === i\"\n              [class.disabled]=\"opt.disabled\"\n              role=\"option\"\n              [attr.aria-selected]=\"isSelected(opt)\"\n              (mousedown)=\"selectOption(opt)\"\n              (mouseenter)=\"focusedIndex.set(i)\"\n            >{{ opt.label }}</div>\n          }\n          @if (filteredOptions().length === 0) {\n            <div class=\"ngx-ac-empty\" role=\"status\" style=\"padding: 12px; text-align: center; color: #767b83; font-size: 13px;\">\n              {{ i18n.autocomplete.noResults }}\n            </div>\n          }\n        </div>\n      }\n\n      @if (error()) {\n        <div class=\"ngx-ac-error\">{{ error() }}</div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; }\n    .ngx-autocomplete { position: relative; font-family: inherit; }\n    .ngx-ac-label { display: block; font-size: 13px; color: var(--ngx-input-label, #6c757d); margin-bottom: 4px; font-weight: 500; }\n    .ngx-ac-wrap {\n      display: flex; align-items: center;\n      border: 1px solid var(--ngx-input-border, #ced4da);\n      border-radius: var(--ngx-input-radius, 4px);\n      background: var(--ngx-input-bg, #fff);\n      transition: border-color 0.15s, box-shadow 0.15s;\n    }\n    .focused .ngx-ac-wrap {\n      border-color: var(--ngx-input-focus, #4a90d9);\n      box-shadow: 0 0 0 2px rgba(74,144,217,0.18);\n    }\n    .has-error .ngx-ac-wrap { border-color: var(--ngx-input-error, #e74c3c); }\n    .disabled .ngx-ac-wrap { background: #f8f9fa; }\n    .ngx-ac-input {\n      flex: 1; padding: 8px 12px; border: none; outline: none;\n      background: transparent; font-size: 14px; color: var(--ngx-input-text, #212529);\n      font-family: inherit;\n    }\n    .ngx-ac-input:disabled { cursor: not-allowed; color: var(--ngx-color-text-disabled, #767b83); }\n    .ngx-ac-clear {\n      padding: 0 10px; background: none; border: none; cursor: pointer;\n      color: var(--ngx-color-text-disabled, #767b83); font-size: 14px; line-height: 1;\n    }\n    .ngx-ac-panel {\n      position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 1000;\n      background: var(--ngx-input-bg, #fff);\n      border: 1px solid var(--ngx-input-border, #ced4da);\n      border-radius: var(--ngx-input-radius, 4px);\n      box-shadow: 0 4px 16px rgba(0,0,0,0.12);\n      max-height: 240px; overflow-y: auto;\n    }\n    .ngx-ac-item {\n      padding: 8px 12px; font-size: 14px; cursor: pointer;\n      color: var(--ngx-input-text, #212529); transition: background 0.1s;\n    }\n    .ngx-ac-item:hover, .ngx-ac-item.focused { background: var(--ngx-input-hover-bg, #f1f3f5); }\n    .ngx-ac-item.disabled { color: var(--ngx-color-text-disabled, #767b83); cursor: not-allowed; pointer-events: none; }\n    .ngx-ac-error { font-size: 12px; color: var(--ngx-input-error, #e74c3c); margin-top: 4px; }\n  `],\n})\nexport class AutocompleteComponent implements ControlValueAccessor {\n  options = input<DropdownOption[]>([]);\n  label = input<string>('');\n  placeholder = input<string | null>(null);\n  disabled = input<boolean>(false);\n  error = input<string>('');\n  minLength = input<number>(1);\n\n  valueChange = output<unknown>();\n\n  i18n = inject(NGX_CORE_I18N);\n  effectivePlaceholder = computed(() => this.placeholder() ?? this.i18n.common.search);\n\n  _inputText = signal<string>('');\n  _selectedValue = signal<unknown>(null);\n  isOpen = signal(false);\n  isFocused = signal(false);\n  focusedIndex = signal(-1);\n\n  private _onChange: (val: unknown) => void = () => {};\n  private _onTouched: () => void = () => {};\n  private el = inject(ElementRef);\n\n  filteredOptions = computed(() => {\n    const text = this._inputText().toLowerCase();\n    if (text.length < this.minLength()) return [];\n    return this.options().filter(o => o.label.toLowerCase().includes(text));\n  });\n\n  isSelected(opt: DropdownOption): boolean {\n    return this._selectedValue() === opt.value;\n  }\n\n  onInput(e: Event): void {\n    const text = (e.target as HTMLInputElement).value;\n    this._inputText.set(text);\n    this._selectedValue.set(null);\n    this.isOpen.set(text.length >= this.minLength());\n    this.focusedIndex.set(-1);\n  }\n\n  onFocus(): void {\n    this.isFocused.set(true);\n    if (this._inputText().length >= this.minLength()) {\n      this.isOpen.set(true);\n    }\n  }\n\n  onBlur(): void {\n    this.isFocused.set(false);\n    this._onTouched();\n    setTimeout(() => this.isOpen.set(false), 150);\n  }\n\n  onKeyDown(e: KeyboardEvent): void {\n    const n = this.filteredOptions().length;\n    if (e.key === 'ArrowDown') {\n      e.preventDefault();\n      this.focusedIndex.update(i => Math.min(n - 1, i + 1));\n    } else if (e.key === 'ArrowUp') {\n      e.preventDefault();\n      this.focusedIndex.update(i => Math.max(-1, i - 1));\n    } else if (e.key === 'Enter') {\n      const idx = this.focusedIndex();\n      if (idx >= 0 && idx < n) this.selectOption(this.filteredOptions()[idx]);\n    } else if (e.key === 'Escape') {\n      this.isOpen.set(false);\n    }\n  }\n\n  selectOption(opt: DropdownOption): void {\n    if (opt.disabled) return;\n    this._inputText.set(opt.label);\n    this._selectedValue.set(opt.value);\n    this.isOpen.set(false);\n    this._onChange(opt.value);\n    this._onTouched();\n    this.valueChange.emit(opt.value);\n  }\n\n  clear(): void {\n    this._inputText.set('');\n    this._selectedValue.set(null);\n    this.isOpen.set(false);\n    this._onChange(null);\n    this.valueChange.emit(null);\n  }\n\n  @HostListener('document:click', ['$event'])\n  onDocClick(e: MouseEvent): void {\n    if (!this.el.nativeElement.contains(e.target)) {\n      this.isOpen.set(false);\n    }\n  }\n\n  // ControlValueAccessor\n  writeValue(val: unknown): void {\n    if (val === null || val === undefined) {\n      this._inputText.set('');\n      this._selectedValue.set(null);\n      return;\n    }\n    const match = this.options().find(o => o.value === val);\n    this._inputText.set(match?.label ?? String(val));\n    this._selectedValue.set(val);\n  }\n\n  registerOnChange(fn: (val: unknown) => 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    // disabled handled via input()\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed, forwardRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\nexport interface DatePreset {\n  label: string;\n  getValue: () => Date;\n}\n\n@Component({\n  selector: 'ngx-date-picker',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => DatePickerComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <div class=\"ngx-date-picker\" [class.has-error]=\"status() === 'error'\" [class.disabled]=\"disabled()\">\n      @if (label()) {\n        <label class=\"ngx-date-label\">{{ label() }}</label>\n      }\n      <div class=\"ngx-date-wrap\" (click)=\"toggleCalendar()\">\n        <span class=\"ngx-date-icon\">📅</span>\n        <input\n          class=\"ngx-date-input\"\n          type=\"text\"\n          readonly\n          [value]=\"displayValue()\"\n          [placeholder]=\"placeholder()\"\n          [disabled]=\"disabled()\"\n        />\n        @if (clearable() && _resolvedValue() && !disabled()) {\n          <button type=\"button\" class=\"ngx-date-clear\" (click)=\"clearValue($event)\">✕</button>\n        }\n      </div>\n\n      @if (isOpen()) {\n        <div class=\"ngx-date-popover\" (click)=\"$event.stopPropagation()\">\n          @if (showPresets()) {\n            <div class=\"ngx-date-presets\">\n              <span class=\"presets-title\">Presets:</span>\n              @for (preset of activePresets(); track preset.label) {\n                <button type=\"button\" class=\"preset-chip\" (click)=\"selectPreset(preset)\">{{ preset.label }}</button>\n              }\n            </div>\n          }\n\n          <div class=\"calendar-header\">\n            <button type=\"button\" class=\"cal-nav\" (click)=\"prevMonth()\">‹</button>\n            <span class=\"cal-title\">{{ monthName() }} {{ currentYear() }}</span>\n            <button type=\"button\" class=\"cal-nav\" (click)=\"nextMonth()\">›</button>\n          </div>\n\n          <div class=\"calendar-grid\">\n            <span class=\"day-header\" *ngFor=\"let d of ['Su','Mo','Tu','We','Th','Fr','Sa']\">{{ d }}</span>\n            <button\n              *ngFor=\"let cell of calendarDays()\"\n              type=\"button\"\n              class=\"day-cell\"\n              [class.other-month]=\"!cell.inMonth\"\n              [class.selected]=\"isSelected(cell.date)\"\n              [class.today]=\"isToday(cell.date)\"\n              (click)=\"selectDate(cell.date)\"\n            >\n              {{ cell.date.getDate() }}\n            </button>\n          </div>\n        </div>\n      }\n\n      @if (error()) {\n        <div class=\"ngx-date-error\">{{ error() }}</div>\n      } @else if (hint()) {\n        <div class=\"ngx-date-hint\">{{ hint() }}</div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; position: relative; }\n    .ngx-date-picker { font-family: var(--ngx-font-family, inherit); }\n    .ngx-date-label { display: block; font-size: 12px; font-weight: 700; color: #475569; margin-bottom: 4px; }\n    .ngx-date-wrap { display: flex; align-items: center; border: 1px solid #cbd5e1; border-radius: 8px; background: #ffffff; padding: 8px 12px; cursor: pointer; gap: 8px; }\n    .ngx-date-input { border: none; background: transparent; outline: none; flex: 1; font-size: 13px; color: #0f172a; cursor: pointer; }\n    .ngx-date-icon { font-size: 14px; }\n    .ngx-date-clear { border: none; background: transparent; cursor: pointer; color: #94a3b8; font-size: 12px; }\n    .ngx-date-popover { position: absolute; top: 100%; left: 0; margin-top: 4px; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 12px; box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1); padding: 14px; z-index: 1000; width: 280px; }\n    .ngx-date-presets { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 12px; padding-bottom: 10px; border-bottom: 1px solid #f1f5f9; align-items: center; }\n    .presets-title { font-size: 10px; font-weight: 700; color: #94a3b8; text-transform: uppercase; margin-right: 4px; }\n    .preset-chip { border: 1px solid #e2e8f0; background: #f8fafc; border-radius: 6px; padding: 2px 8px; font-size: 11px; cursor: pointer; color: #334155; transition: all 0.15s; }\n    .preset-chip:hover { border-color: #4f46e5; color: #4f46e5; background: #eef2ff; }\n    .calendar-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }\n    .cal-title { font-weight: 700; font-size: 13px; color: #0f172a; }\n    .cal-nav { border: none; background: #f8fafc; border-radius: 6px; width: 24px; height: 24px; cursor: pointer; font-size: 14px; }\n    .calendar-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; text-align: center; }\n    .day-header { font-size: 10px; font-weight: 700; color: #94a3b8; padding: 4px 0; }\n    .day-cell { border: none; background: transparent; padding: 6px 0; font-size: 12px; border-radius: 6px; cursor: pointer; color: #0f172a; }\n    .day-cell:hover { background: #f1f5f9; }\n    .day-cell.other-month { color: #cbd5e1; }\n    .day-cell.selected { background: #4f46e5 !important; color: #ffffff !important; font-weight: 700; }\n    .day-cell.today { font-weight: 700; color: #4f46e5; text-decoration: underline; }\n    .ngx-date-error { font-size: 11px; color: #ef4444; margin-top: 4px; }\n    .ngx-date-hint { font-size: 11px; color: #64748b; margin-top: 4px; }\n  `]\n})\nexport class DatePickerComponent implements ControlValueAccessor {\n  value = input<Date | string | null>(null);\n  label = input<string>('');\n  placeholder = input<string>('Select date...');\n  disabled = input<boolean>(false);\n  status = input<'normal' | 'success' | 'warning' | 'error'>('normal');\n  error = input<string>('');\n  hint = input<string>('');\n  clearable = input<boolean>(true);\n  showPresets = input<boolean>(true);\n\n  valueChange = output<any>();\n\n  isOpen = signal<boolean>(false);\n  currentMonth = signal<number>(new Date().getMonth());\n  currentYear = signal<number>(new Date().getFullYear());\n\n  private _cvaValue = signal<Date | null>(null);\n  private _cvaActive = false;\n\n  _resolvedValue = computed<Date | null>(() => {\n    const raw = this._cvaActive ? this._cvaValue() : this.value();\n    if (!raw) return null;\n    return raw instanceof Date ? raw : new Date(raw);\n  });\n\n  activePresets = computed<DatePreset[]>(() => [\n    { label: 'Today', getValue: () => new Date() },\n    { label: 'Yesterday', getValue: () => { const d = new Date(); d.setDate(d.getDate() - 1); return d; } },\n    { label: 'Last 7 Days', getValue: () => { const d = new Date(); d.setDate(d.getDate() - 7); return d; } },\n    { label: 'First of Month', getValue: () => new Date(new Date().getFullYear(), new Date().getMonth(), 1) },\n  ]);\n\n  displayValue = computed(() => {\n    const val = this._resolvedValue();\n    if (!val) return '';\n    return val.toLocaleDateString();\n  });\n\n  monthName = computed(() => {\n    const months = ['January','February','March','April','May','June','July','August','September','October','November','December'];\n    return months[this.currentMonth()];\n  });\n\n  calendarDays = computed(() => {\n    const m = this.currentMonth();\n    const y = this.currentYear();\n    const firstDay = new Date(y, m, 1).getDay();\n    const daysInMonth = new Date(y, m + 1, 0).getDate();\n    const daysInPrevMonth = new Date(y, m, 0).getDate();\n\n    const cells: { date: Date; inMonth: boolean }[] = [];\n\n    // Prev month padding\n    for (let i = firstDay - 1; i >= 0; i--) {\n      cells.push({ date: new Date(y, m - 1, daysInPrevMonth - i), inMonth: false });\n    }\n    // Current month days\n    for (let i = 1; i <= daysInMonth; i++) {\n      cells.push({ date: new Date(y, m, i), inMonth: true });\n    }\n    // Next month padding\n    const remaining = 42 - cells.length;\n    for (let i = 1; i <= remaining; i++) {\n      cells.push({ date: new Date(y, m + 1, i), inMonth: false });\n    }\n\n    return cells;\n  });\n\n  private onChange: (val: Date | null) => void = () => {};\n  private onTouched: () => void = () => {};\n\n  writeValue(val: Date | string | null): void {\n    this._cvaActive = true;\n    this._cvaValue.set(val ? (val instanceof Date ? val : new Date(val)) : null);\n  }\n\n  registerOnChange(fn: (val: Date | null) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  toggleCalendar(): void {\n    if (this.disabled()) return;\n    this.isOpen.update(v => !v);\n  }\n\n  selectDate(d: Date): void {\n    this._cvaValue.set(d);\n    this.onChange(d);\n    this.valueChange.emit(d);\n    this.isOpen.set(false);\n  }\n\n  selectPreset(preset: DatePreset): void {\n    const date = preset.getValue();\n    this.currentMonth.set(date.getMonth());\n    this.currentYear.set(date.getFullYear());\n    this.selectDate(date);\n  }\n\n  clearValue(e: MouseEvent): void {\n    e.stopPropagation();\n    this._cvaValue.set(null);\n    this.onChange(null);\n    this.valueChange.emit(null);\n  }\n\n  prevMonth(): void {\n    if (this.currentMonth() === 0) {\n      this.currentMonth.set(11);\n      this.currentYear.update(y => y - 1);\n    } else {\n      this.currentMonth.update(m => m - 1);\n    }\n  }\n\n  nextMonth(): void {\n    if (this.currentMonth() === 11) {\n      this.currentMonth.set(0);\n      this.currentYear.update(y => y + 1);\n    } else {\n      this.currentMonth.update(m => m + 1);\n    }\n  }\n\n  isSelected(d: Date): boolean {\n    const val = this._resolvedValue();\n    if (!val) return false;\n    return val.toDateString() === d.toDateString();\n  }\n\n  isToday(d: Date): boolean {\n    return new Date().toDateString() === d.toDateString();\n  }\n}\n","import { Component, OnInit, input, output, signal, computed } from '@angular/core';\n\n@Component({\n  selector: 'ngx-slider',\n  standalone: true,\n  template: `\n    <div class=\"ngx-slider\">\n      @if (label()) { <label class=\"slider-label\">{{ label() }}@if (showValue()) { <span class=\"slider-value\">{{ range() ? (low() + ' – ' + high()) : value() }}</span> }</label> }\n      <div class=\"slider-track-wrap\">\n        @if (!range()) {\n          <input type=\"range\" class=\"slider-input\" [min]=\"min()\" [max]=\"max()\" [step]=\"step()\" [value]=\"value()\" [disabled]=\"disabled()\" (input)=\"onInput($event)\" />\n          <div class=\"slider-fill\" [style.width.%]=\"pct()\"></div>\n        } @else {\n          <div class=\"slider-range-container\">\n            <input type=\"range\" class=\"slider-input slider-low\" [min]=\"min()\" [max]=\"max()\" [step]=\"step()\" [value]=\"low()\" [disabled]=\"disabled()\" (input)=\"onLow($event)\" />\n            <input type=\"range\" class=\"slider-input slider-high\" [min]=\"min()\" [max]=\"max()\" [step]=\"step()\" [value]=\"high()\" [disabled]=\"disabled()\" (input)=\"onHigh($event)\" />\n            <div class=\"slider-fill-range\" [style.left.%]=\"lowPct()\" [style.right.%]=\"highPct()\"></div>\n          </div>\n        }\n      </div>\n      @if (showTicks()) {\n        <div class=\"slider-ticks\">\n          <span>{{ min() }}</span><span>{{ max() }}</span>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; }\n    .ngx-slider { width: 100%; }\n    .slider-label { display: flex; justify-content: space-between; font-size: 12px; font-weight: 600; color: var(--ngx-input-label, #495057); margin-bottom: 8px; }\n    .slider-value { font-weight: 400; color: var(--ngx-input-text, #212529); }\n    .slider-track-wrap { position: relative; padding: 10px 0; }\n    .slider-input { width: 100%; -webkit-appearance: none; appearance: none; height: 5px; background: transparent; border-radius: 4px; outline: none; cursor: pointer; position: relative; z-index: 5; }\n    .slider-input::-webkit-slider-thumb { -webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%; background: var(--ngx-slider-thumb, #1a73e8); cursor: pointer; box-shadow: 0 2px 6px rgba(26, 115, 232, 0.3); border: 2px solid #fff; transition: all 0.2s ease; }\n    .slider-input::-webkit-slider-thumb:hover { box-shadow: 0 3px 10px rgba(26, 115, 232, 0.4); transform: scale(1.1); }\n    .slider-input::-moz-range-thumb { width: 18px; height: 18px; border-radius: 50%; background: var(--ngx-slider-thumb, #1a73e8); cursor: pointer; box-shadow: 0 2px 6px rgba(26, 115, 232, 0.3); border: 2px solid #fff; transition: all 0.2s ease; }\n    .slider-input::-moz-range-thumb:hover { box-shadow: 0 3px 10px rgba(26, 115, 232, 0.4); transform: scale(1.1); }\n    .slider-input::-moz-range-track { background: transparent; border: none; }\n    .slider-input:disabled { opacity: 0.5; cursor: not-allowed; }\n    .slider-range-container { position: relative; height: 20px; margin: 8px 0; }\n    .slider-range-container::before { content: ''; position: absolute; height: 5px; background: var(--ngx-slider-track, #dee2e6); border-radius: 4px; width: 100%; top: 50%; left: 0; transform: translateY(-50%); z-index: 1; }\n    .slider-range-container .slider-input { position: absolute; top: 50%; left: 0; transform: translateY(-50%); margin: 0; }\n    .slider-range-container .slider-input::-webkit-slider-runnable-track { height: 5px; background: transparent; border: none; }\n    .slider-fill { position: absolute; height: 5px; background: linear-gradient(90deg, var(--ngx-slider-thumb, #1a73e8), var(--ngx-slider-thumb, #1a73e8)); border-radius: 4px; bottom: 10px; left: 0; pointer-events: none; z-index: 2; }\n    .slider-fill-range { position: absolute; height: 5px; background: linear-gradient(90deg, var(--ngx-slider-thumb, #1a73e8), var(--ngx-slider-thumb, #1a73e8)); border-radius: 4px; top: 50%; transform: translateY(-50%); pointer-events: none; z-index: 3; }\n    .slider-input.slider-low { position: relative; z-index: 5; }\n    .slider-input.slider-high { position: relative; z-index: 4; }\n    .slider-ticks { display: flex; justify-content: space-between; font-size: 10px; color: #adb5bd; margin-top: 4px; padding: 0 5px; }\n  `]\n})\nexport class SliderComponent implements OnInit {\n  label = input('');\n  min = input(0);\n  max = input(100);\n  step = input(1);\n  range = input(false);\n  disabled = input(false);\n  showValue = input(true);\n  showTicks = input(false);\n\n  /** Initial value for single-handle mode. */\n  initialValue = input<number>(0);\n  /** Initial low value for range mode. */\n  initialLow = input<number>(20);\n  /** Initial high value for range mode. */\n  initialHigh = input<number>(80);\n\n  value = signal(0);\n  low = signal(20);\n  high = signal(80);\n  valueChange = output<number>();\n  rangeChange = output<[number, number]>();\n\n  ngOnInit(): void {\n    this.value.set(this.clamp(this.initialValue(), this.min(), this.max()));\n    this.low.set(this.clamp(this.initialLow(), this.min(), this.max()));\n    this.high.set(this.clamp(this.initialHigh(), this.min(), this.max()));\n  }\n\n  pct = computed(() => {\n    const min = this.min();\n    const max = this.max();\n    const denom = Math.max(1, max - min);\n    return ((this.clamp(this.value(), min, max) - min) / denom) * 100;\n  });\n\n  lowPct = computed(() => {\n    const min = this.min();\n    const max = this.max();\n    const denom = Math.max(1, max - min);\n    return ((this.clamp(this.low(), min, max) - min) / denom) * 100;\n  });\n\n  highPct = computed(() => {\n    const min = this.min();\n    const max = this.max();\n    const denom = Math.max(1, max - min);\n    return 100 - (((this.clamp(this.high(), min, max) - min) / denom) * 100);\n  });\n\n  private clamp(v: number, min: number, max: number): number {\n    return Math.min(max, Math.max(min, v));\n  }\n\n  private stepSize(): number {\n    const step = this.step();\n    return Number.isFinite(step) && step > 0 ? step : 1;\n  }\n\n  onInput(e: Event): void {\n    const target = e.target as HTMLInputElement;\n    const next = this.clamp(+target.value, this.min(), this.max());\n    target.value = String(next);\n    this.value.set(next);\n    this.valueChange.emit(next);\n  }\n\n  onLow(e: Event): void {\n    const target = e.target as HTMLInputElement;\n    const min = this.min();\n    const max = this.max();\n    const step = this.stepSize();\n    const currentHigh = this.clamp(this.high(), min, max);\n    const upperBound = this.clamp(currentHigh - step, min, max);\n    const nextLow = this.clamp(+target.value, min, upperBound);\n\n    target.value = String(nextLow);\n    this.low.set(nextLow);\n\n    if (currentHigh !== this.high()) {\n      this.high.set(currentHigh);\n    }\n\n    this.rangeChange.emit([nextLow, currentHigh]);\n  }\n\n  onHigh(e: Event): void {\n    const target = e.target as HTMLInputElement;\n    const min = this.min();\n    const max = this.max();\n    const step = this.stepSize();\n    const currentLow = this.clamp(this.low(), min, max);\n    const lowerBound = this.clamp(currentLow + step, min, max);\n    const nextHigh = this.clamp(+target.value, lowerBound, max);\n\n    target.value = String(nextHigh);\n    this.high.set(nextHigh);\n\n    if (currentLow !== this.low()) {\n      this.low.set(currentLow);\n    }\n\n    this.rangeChange.emit([currentLow, nextHigh]);\n  }\n}\n","import { Component, input, output, signal, computed, forwardRef, model } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n  selector: 'ngx-switch',\n  standalone: true,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => SwitchComponent),\n      multi: true\n    }\n  ],\n  template: `\n    <div\n      class=\"ngx-switch-container\"\n      [class.has-error]=\"_resolvedStatus() === 'error'\"\n      [class.disabled]=\"disabled()\"\n      [class.status-success]=\"_resolvedStatus() === 'success'\"\n      [class.status-warning]=\"_resolvedStatus() === 'warning'\"\n    >\n      <div class=\"ngx-switch-row\">\n        @if (offLabel()) {\n          <span class=\"switch-off-label\" [class.active]=\"!checked()\" (click)=\"disabled() ? null : (!checked() ? null : toggle())\">{{ offLabel() }}</span>\n        }\n        <span\n          class=\"switch-track\"\n          [class.checked]=\"checked()\"\n          [class]=\"'size-' + size()\"\n          (click)=\"toggle()\"\n          (keydown.space)=\"$event.preventDefault(); toggle()\"\n          (keydown.enter)=\"$event.preventDefault(); toggle()\"\n          role=\"switch\"\n          [attr.aria-checked]=\"checked()\"\n          [attr.aria-disabled]=\"disabled()\"\n          [attr.tabindex]=\"disabled() ? null : '0'\"\n        >\n          <span class=\"switch-thumb\"></span>\n        </span>\n        @if (onLabel()) {\n          <span class=\"switch-on-label\" [class.active]=\"checked()\" (click)=\"disabled() ? null : (checked() ? null : toggle())\">{{ onLabel() }}</span>\n        }\n      </div>\n      \n      @if (error()) {\n        <div class=\"ngx-switch-error\">{{ error() }}</div>\n      } @else if (hint()) {\n        <div class=\"ngx-switch-hint\">{{ hint() }}</div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: inline-block;\n      --ngx-input-success-border: #10b981;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(16, 185, 129, 0.2);\n      --ngx-input-warning-border: #f59e0b;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(245, 158, 11, 0.2);\n      --ngx-input-error-border: #ef4444;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2);\n      \n      --ngx-switch-off-bg: #cbd5e1;\n      --ngx-switch-on-bg: #4f46e5;\n      --ngx-switch-thumb-bg: #ffffff;\n      --ngx-switch-text: #475569;\n      --ngx-switch-text-active: #0f172a;\n    }\n    \n    :host-context(body.dark),\n    :host-context(.dark),\n    :host-context(.dark-theme) {\n      --ngx-switch-off-bg: #475569;\n      --ngx-switch-on-bg: #818cf8;\n      --ngx-switch-text: #94a3b8;\n      --ngx-switch-text-active: #f8fafc;\n      \n      --ngx-input-success-border: #34d399;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(52, 211, 153, 0.3);\n      --ngx-input-warning-border: #fbbf24;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(251, 191, 36, 0.3);\n      --ngx-input-error-border: #f87171;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(248, 113, 113, 0.3);\n    }\n    \n    .ngx-switch-container {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n      font-family: inherit;\n    }\n    \n    .ngx-switch-row {\n      display: inline-flex;\n      align-items: center;\n      gap: 10px;\n    }\n    \n    .switch-track {\n      position: relative;\n      border-radius: 999px;\n      background: var(--ngx-switch-off-bg);\n      transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n      flex-shrink: 0;\n      cursor: pointer;\n      outline: none;\n      box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);\n    }\n    \n    .switch-track.size-sm { width: 34px; height: 20px; }\n    .switch-track.size-md { width: 44px; height: 24px; }\n    .switch-track.size-lg { width: 56px; height: 30px; }\n    \n    .switch-track.checked {\n      background: var(--ngx-switch-on-bg);\n    }\n    \n    .switch-thumb {\n      position: absolute;\n      top: 2px;\n      left: 2px;\n      border-radius: 50%;\n      background: var(--ngx-switch-thumb-bg);\n      box-shadow: 0 2px 5px rgba(0,0,0,0.15), 0 1px 1px rgba(0,0,0,0.1);\n      transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);\n      pointer-events: none;\n    }\n    \n    .size-sm .switch-thumb { width: 16px; height: 16px; }\n    .size-md .switch-thumb { width: 20px; height: 20px; }\n    .size-lg .switch-thumb { width: 26px; height: 26px; }\n    \n    .size-sm.checked .switch-thumb { transform: translateX(14px); }\n    .size-md.checked .switch-thumb { transform: translateX(20px); }\n    .size-lg.checked .switch-thumb { transform: translateX(26px); }\n    \n    .switch-track:focus-visible {\n      box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.25), inset 0 1px 3px rgba(0,0,0,0.1);\n    }\n    \n    .switch-track:hover:not(.disabled) .switch-thumb {\n      transform: scale(1.05) translateX(0);\n    }\n    .size-sm.checked:hover:not(.disabled) .switch-thumb { transform: scale(1.05) translateX(14px); }\n    .size-md.checked:hover:not(.disabled) .switch-thumb { transform: scale(1.05) translateX(20px); }\n    .size-lg.checked:hover:not(.disabled) .switch-thumb { transform: scale(1.05) translateX(26px); }\n    \n    .disabled {\n      opacity: 0.55;\n      cursor: not-allowed;\n    }\n    .disabled .switch-track {\n      cursor: not-allowed;\n      pointer-events: none;\n    }\n    \n    .switch-off-label, .switch-on-label {\n      font-size: 13px;\n      color: var(--ngx-switch-text);\n      cursor: pointer;\n      user-select: none;\n      transition: color 0.15s ease;\n    }\n    .switch-off-label.active, .switch-on-label.active {\n      color: var(--ngx-switch-text-active);\n      font-weight: 600;\n    }\n    \n    .status-success .switch-track.checked { background: var(--ngx-input-success-border); }\n    .status-success .switch-track:focus-visible { box-shadow: var(--ngx-input-success-shadow), inset 0 1px 3px rgba(0,0,0,0.1); }\n    \n    .status-warning .switch-track.checked { background: var(--ngx-input-warning-border); }\n    .status-warning .switch-track:focus-visible { box-shadow: var(--ngx-input-warning-shadow), inset 0 1px 3px rgba(0,0,0,0.1); }\n    \n    .has-error .switch-track.checked { background: var(--ngx-input-error-border); }\n    .has-error .switch-track:focus-visible { box-shadow: var(--ngx-input-error-shadow), inset 0 1px 3px rgba(0,0,0,0.1); }\n    \n    .ngx-switch-error {\n      color: var(--ngx-input-error-border);\n      font-size: 12px;\n      font-weight: 550;\n      animation: slide-down 0.2s ease-out;\n    }\n    .ngx-switch-hint {\n      color: #64748b;\n      font-size: 12px;\n    }\n    \n    @keyframes slide-down {\n      from { transform: translateY(-4px); opacity: 0; }\n      to { transform: translateY(0); opacity: 1; }\n    }\n  `]\n})\nexport class SwitchComponent implements ControlValueAccessor {\n  checked = model(false);\n  onLabel = input('On');\n  offLabel = input('Off');\n  size = input<'sm' | 'md' | 'lg'>('md');\n  disabled = input(false);\n\n  // Enterprise validation signals\n  status = input<'default' | 'success' | 'warning' | 'error'>('default');\n  error = input<string>('');\n  hint = input<string>('');\n\n  private _onChange: (val: boolean) => void = () => {};\n  private _onTouched: () => void = () => {};\n\n  _resolvedStatus = computed(() => {\n    if (this.error()) return 'error';\n    return this.status();\n  });\n\n  toggle(): void {\n    if (this.disabled()) return;\n    this.checked.update(v => !v);\n    this._onChange(this.checked());\n    this._onTouched();\n  }\n\n  // ControlValueAccessor\n  writeValue(val: boolean): void {\n    this.checked.set(!!val);\n  }\n\n  registerOnChange(fn: (val: boolean) => 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    // Handled via disabled input\n  }\n}\n","import { Component, input, output, signal, computed, forwardRef, model } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n  selector: 'ngx-rating',\n  standalone: true,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => RatingComponent),\n      multi: true\n    }\n  ],\n  template: `\n    <div\n      class=\"ngx-rating-container\"\n      [class.has-error]=\"_resolvedStatus() === 'error'\"\n      [class.disabled]=\"readonly()\"\n      [class.status-success]=\"_resolvedStatus() === 'success'\"\n      [class.status-warning]=\"_resolvedStatus() === 'warning'\"\n    >\n      @if (label()) {\n        <span class=\"rating-label\">{{ label() }}</span>\n      }\n      <div class=\"ngx-rating-row\">\n        <div\n          class=\"rating-stars\"\n          [attr.tabindex]=\"readonly() ? null : '0'\"\n          role=\"slider\"\n          [attr.aria-valuenow]=\"current()\"\n          [attr.aria-valuemin]=\"0\"\n          [attr.aria-valuemax]=\"max()\"\n          [attr.aria-label]=\"label() || 'Rating'\"\n          [attr.aria-disabled]=\"readonly()\"\n          (keydown)=\"onKeyDown($event)\"\n        >\n          @for (star of stars(); track star) {\n            <span\n              class=\"rating-star\"\n              [class.filled]=\"(hovered() || current()) >= star\"\n              [class.hovered]=\"hovered() >= star\"\n              (mouseenter)=\"readonly() ? null : hovered.set(star)\"\n              (mouseleave)=\"readonly() ? null : hovered.set(0)\"\n              (click)=\"readonly() ? null : setRating(star)\"\n            >\n              @if ((hovered() || current()) >= star) {\n                ★\n              } @else {\n                ☆\n              }\n            </span>\n          }\n        </div>\n        @if (showValue()) {\n          <span class=\"rating-value\">{{ current() }}/{{ max() }}</span>\n        }\n      </div>\n      \n      @if (error()) {\n        <div class=\"ngx-rating-error\">{{ error() }}</div>\n      } @else if (hint()) {\n        <div class=\"ngx-rating-hint\">{{ hint() }}</div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: inline-block;\n      --ngx-input-success-border: #10b981;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(16, 185, 129, 0.2);\n      --ngx-input-warning-border: #f59e0b;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(245, 158, 11, 0.2);\n      --ngx-input-error-border: #ef4444;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2);\n      \n      --ngx-rating-empty: #cbd5e1;\n      --ngx-rating-filled: #f59e0b;\n      --ngx-rating-hover: #d97706;\n      --ngx-rating-text: #64748b;\n    }\n    \n    :host-context(body.dark),\n    :host-context(.dark),\n    :host-context(.dark-theme) {\n      --ngx-rating-empty: #475569;\n      --ngx-rating-filled: #fbbf24;\n      --ngx-rating-hover: #f59e0b;\n      --ngx-rating-text: #94a3b8;\n      \n      --ngx-input-success-border: #34d399;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(52, 211, 153, 0.3);\n      --ngx-input-warning-border: #fbbf24;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(251, 191, 36, 0.3);\n      --ngx-input-error-border: #f87171;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(248, 113, 113, 0.3);\n    }\n    \n    .ngx-rating-container {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n      font-family: inherit;\n    }\n    \n    .rating-label {\n      font-size: 13px;\n      font-weight: 600;\n      color: var(--ngx-rating-text);\n      margin-bottom: 2px;\n    }\n    \n    .ngx-rating-row {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n    }\n    \n    .rating-stars {\n      display: flex;\n      gap: 4px;\n      padding: 4px 8px;\n      border-radius: 8px;\n      border: 1px solid transparent;\n      outline: none;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n    \n    .rating-stars:focus-visible {\n      border-color: #cbd5e1;\n      box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);\n      background: rgba(79, 70, 229, 0.03);\n    }\n    :host-context(.dark) .rating-stars:focus-visible,\n    :host-context(.dark-theme) .rating-stars:focus-visible {\n      border-color: #475569;\n      background: rgba(129, 140, 248, 0.05);\n    }\n    \n    .rating-star {\n      font-size: 24px;\n      line-height: 1;\n      color: var(--ngx-rating-empty);\n      cursor: pointer;\n      user-select: none;\n      transition: color 0.15s ease, transform 0.15s cubic-bezier(0.34, 1.56, 0.64, 1);\n    }\n    \n    .disabled .rating-star {\n      cursor: not-allowed;\n      opacity: 0.75;\n    }\n    \n    .rating-star.filled {\n      color: var(--ngx-rating-filled);\n    }\n    \n    .rating-star.hovered {\n      color: var(--ngx-rating-hover);\n      transform: scale(1.25) rotate(5deg);\n    }\n    \n    .rating-value {\n      font-size: 13px;\n      font-weight: 600;\n      color: var(--ngx-rating-text);\n      min-width: 32px;\n    }\n    \n    .status-success .rating-stars:focus-visible {\n      box-shadow: var(--ngx-input-success-shadow);\n      border-color: var(--ngx-input-success-border);\n    }\n    .status-warning .rating-stars:focus-visible {\n      box-shadow: var(--ngx-input-warning-shadow);\n      border-color: var(--ngx-input-warning-border);\n    }\n    .has-error .rating-stars:focus-visible {\n      box-shadow: var(--ngx-input-error-shadow);\n      border-color: var(--ngx-input-error-border);\n    }\n    \n    .ngx-rating-error {\n      color: var(--ngx-input-error-border);\n      font-size: 12px;\n      font-weight: 550;\n      margin-left: 10px;\n      animation: slide-down 0.2s ease-out;\n    }\n    .ngx-rating-hint {\n      color: #64748b;\n      font-size: 12px;\n      margin-left: 10px;\n    }\n    \n    @keyframes slide-down {\n      from { transform: translateY(-4px); opacity: 0; }\n      to { transform: translateY(0); opacity: 1; }\n    }\n  `]\n})\nexport class RatingComponent implements ControlValueAccessor {\n  max = input(5);\n  label = input('');\n  readonly = input(false);\n  showValue = input(false);\n\n  // Enterprise validation signals\n  status = input<'default' | 'success' | 'warning' | 'error'>('default');\n  error = input<string>('');\n  hint = input<string>('');\n\n  value = model(0);\n  current = computed(() => this.value());\n  hovered = signal(0);\n  ratingChange = output<number>();\n\n  private _onChange: (v: number) => void = () => {};\n  private _onTouched: () => void = () => {};\n\n  stars = computed(() => Array.from({ length: this.max() }, (_, i) => i + 1));\n\n  _resolvedStatus = computed(() => {\n    if (this.error()) return 'error';\n    return this.status();\n  });\n\n  setRating(star: number): void {\n    if (this.readonly()) return;\n    this.value.set(star);\n    this._onChange(star);\n    this._onTouched();\n    this.ratingChange.emit(star);\n  }\n\n  onKeyDown(event: KeyboardEvent): void {\n    if (this.readonly()) return;\n    \n    const maxVal = this.max();\n    const curr = this.value();\n    \n    if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {\n      event.preventDefault();\n      this.setRating(Math.min(maxVal, curr + 1));\n    } else if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {\n      event.preventDefault();\n      this.setRating(Math.max(0, curr - 1));\n    } else if (event.key === 'Home') {\n      event.preventDefault();\n      this.setRating(0);\n    } else if (event.key === 'End') {\n      event.preventDefault();\n      this.setRating(maxVal);\n    }\n  }\n\n  // ControlValueAccessor\n  writeValue(val: number): void {\n    this.value.set(val ?? 0);\n  }\n\n  registerOnChange(fn: (v: number) => void): void {\n    this._onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this._onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    // Handled via readonly or template-level disabled\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed, forwardRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n  selector: 'ngx-numeric-textbox',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => NumericTextBoxComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <div class=\"ngx-numeric-textbox\" [class.focused]=\"isFocused()\" [class.has-error]=\"status() === 'error'\" [class.disabled]=\"disabled()\">\n      @if (label()) {\n        <label class=\"ngx-numeric-label\">{{ label() }}</label>\n      }\n      <div class=\"ngx-numeric-wrap\" [class]=\"'status-' + status()\">\n        @if (currency() && currencyPosition() === 'prefix') {\n          <span class=\"ngx-numeric-affix ngx-numeric-prefix\">{{ currency() }}</span>\n        }\n        @if (prefixIcon()) {\n          <span class=\"ngx-numeric-affix ngx-numeric-prefix\">{{ prefixIcon() }}</span>\n        }\n        <input\n          class=\"ngx-numeric-input\"\n          type=\"text\"\n          inputmode=\"decimal\"\n          [value]=\"formattedValue()\"\n          [placeholder]=\"placeholder()\"\n          [disabled]=\"disabled()\"\n          [readOnly]=\"readonly()\"\n          (input)=\"onInput($event)\"\n          (focus)=\"onFocus()\"\n          (blur)=\"onBlur()\"\n          (keydown)=\"onKeyDown($event)\"\n        />\n        @if (currency() && currencyPosition() === 'suffix') {\n          <span class=\"ngx-numeric-affix ngx-numeric-suffix\">{{ currency() }}</span>\n        }\n        @if (showSpinners() && !disabled() && !readonly()) {\n          <div class=\"ngx-numeric-spinners\">\n            <button type=\"button\" class=\"spinner-btn spinner-up\" (click)=\"stepUp()\" tabindex=\"-1\">▲</button>\n            <button type=\"button\" class=\"spinner-btn spinner-down\" (click)=\"stepDown()\" tabindex=\"-1\">▼</button>\n          </div>\n        }\n        @if (clearable() && value() !== null && !disabled()) {\n          <button type=\"button\" class=\"ngx-numeric-clear\" (click)=\"clearValue()\">✕</button>\n        }\n      </div>\n      @if (error()) {\n        <div class=\"ngx-numeric-error\">{{ error() }}</div>\n      } @else if (hint()) {\n        <div class=\"ngx-numeric-hint\">{{ hint() }}</div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; }\n    .ngx-numeric-textbox { font-family: var(--ngx-font-family, inherit); }\n    .ngx-numeric-label { display: block; font-size: 12px; font-weight: 700; color: var(--ngx-input-label, #475569); margin-bottom: 4px; }\n    .ngx-numeric-wrap { display: flex; align-items: center; border: 1px solid var(--ngx-input-border, #cbd5e1); border-radius: var(--ngx-input-radius, 8px); background: var(--ngx-input-bg, #ffffff); overflow: hidden; transition: all 0.15s; }\n    .ngx-numeric-wrap:focus-within { border-color: var(--ngx-input-focus, #4f46e5); box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.12); }\n    .ngx-numeric-wrap.status-error { border-color: #ef4444; }\n    .ngx-numeric-affix { padding: 0 10px; font-size: 13px; font-weight: 600; color: #64748b; background: #f8fafc; height: 38px; display: flex; align-items: center; }\n    .ngx-numeric-input { flex: 1; border: none; background: transparent; outline: none; padding: 8px 12px; font-size: 13px; color: var(--ngx-input-text, #0f172a); width: 100%; font-variant-numeric: tabular-nums; }\n    .ngx-numeric-spinners { display: flex; flex-direction: column; border-left: 1px solid #e2e8f0; height: 38px; }\n    .spinner-btn { flex: 1; border: none; background: #f8fafc; font-size: 8px; cursor: pointer; color: #64748b; padding: 0 6px; transition: background 0.15s; }\n    .spinner-btn:hover { background: #e2e8f0; color: #4f46e5; }\n    .ngx-numeric-clear { border: none; background: transparent; cursor: pointer; color: #94a3b8; padding: 0 8px; font-size: 12px; }\n    .ngx-numeric-error { font-size: 11px; color: #ef4444; margin-top: 4px; }\n    .ngx-numeric-hint { font-size: 11px; color: #64748b; margin-top: 4px; }\n  `]\n})\nexport class NumericTextBoxComponent implements ControlValueAccessor {\n  value = input<number | null>(null);\n  min = input<number | null>(null);\n  max = input<number | null>(null);\n  step = input<number>(1);\n  decimals = input<number | null>(null);\n  useGrouping = input<boolean>(true);\n  currency = input<string>('');\n  currencyPosition = input<'prefix' | 'suffix'>('prefix');\n  label = input<string>('');\n  placeholder = input<string>('');\n  disabled = input<boolean>(false);\n  readonly = input<boolean>(false);\n  status = input<'normal' | 'success' | 'warning' | 'error'>('normal');\n  error = input<string>('');\n  hint = input<string>('');\n  prefixIcon = input<string>('');\n  showSpinners = input<boolean>(true);\n  clearable = input<boolean>(false);\n\n  valueChange = output<any>();\n\n  isFocused = signal<boolean>(false);\n\n  private _cvaValue = signal<number | null>(null);\n  private _cvaActive = false;\n\n  _resolvedValue = computed<number | null>(() => this._cvaActive ? this._cvaValue() : this.value());\n\n  formattedValue = computed(() => {\n    const val = this._resolvedValue();\n    if (val === null || val === undefined) return '';\n\n    if (this.isFocused()) {\n      return String(val);\n    }\n\n    const dec = this.decimals();\n    const formatter = new Intl.NumberFormat('en-US', {\n      useGrouping: this.useGrouping(),\n      minimumFractionDigits: dec ?? 0,\n      maximumFractionDigits: dec ?? 20,\n    });\n    return formatter.format(val);\n  });\n\n  private onChange: (val: number | null) => void = () => {};\n  private onTouched: () => void = () => {};\n\n  writeValue(val: number | null): void {\n    this._cvaActive = true;\n    this._cvaValue.set(val);\n  }\n\n  registerOnChange(fn: (val: 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    // handled via signal input\n  }\n\n  onInput(event: Event): void {\n    const inputVal = (event.target as HTMLInputElement).value;\n    const num = parseFloat(inputVal.replace(/,/g, ''));\n    if (isNaN(num)) {\n      this.updateValue(null);\n    } else {\n      this.updateValue(this.clamp(num));\n    }\n  }\n\n  onFocus(): void {\n    this.isFocused.set(true);\n  }\n\n  onBlur(): void {\n    this.isFocused.set(false);\n    this.onTouched();\n  }\n\n  onKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'ArrowUp') {\n      event.preventDefault();\n      this.stepUp();\n    } else if (event.key === 'ArrowDown') {\n      event.preventDefault();\n      this.stepDown();\n    }\n  }\n\n  stepUp(): void {\n    const current = this._resolvedValue() ?? 0;\n    this.updateValue(this.clamp(current + this.step()));\n  }\n\n  stepDown(): void {\n    const current = this._resolvedValue() ?? 0;\n    this.updateValue(this.clamp(current - this.step()));\n  }\n\n  clearValue(): void {\n    this.updateValue(null);\n  }\n\n  private clamp(val: number): number {\n    let result = val;\n    const minVal = this.min();\n    const maxVal = this.max();\n    if (minVal !== null && result < minVal) result = minVal;\n    if (maxVal !== null && result > maxVal) result = maxVal;\n\n    const dec = this.decimals();\n    if (dec !== null && dec >= 0) {\n      result = parseFloat(result.toFixed(dec));\n    }\n    return result;\n  }\n\n  private updateValue(val: number | null): void {\n    this._cvaValue.set(val);\n    this.onChange(val);\n    this.valueChange.emit(val);\n  }\n}\n","import { Component, input, output, signal, computed } from '@angular/core';\n\n@Component({\n  selector: 'ngx-textarea',\n  standalone: true,\n  template: `\n    <div class=\"ngx-textarea-container\" [class.focused]=\"focused()\" [class.has-error]=\"_resolvedStatus() === 'error'\" [class.disabled]=\"disabled()\">\n      @if (label()) {\n        <label class=\"textarea-label\">{{ label() }}</label>\n      }\n      <div class=\"ngx-textarea-wrap\" [class]=\"'status-' + _resolvedStatus()\">\n        <ng-content select=\"[prefix]\" />\n        <textarea\n          class=\"ngx-textarea\"\n          [rows]=\"rows()\"\n          [placeholder]=\"placeholder()\"\n          [disabled]=\"disabled()\"\n          [attr.maxlength]=\"maxlength() > 0 ? maxlength() : null\"\n          [value]=\"value()\"\n          [class.auto-resize]=\"autoResize()\"\n          [attr.aria-invalid]=\"_resolvedStatus() === 'error' ? 'true' : null\"\n          (input)=\"onInput($event)\"\n          (focus)=\"focused.set(true)\"\n          (blur)=\"focused.set(false)\"\n        ></textarea>\n        \n        <!-- Status Indicator Icons -->\n        @if (_resolvedStatus() === 'success') {\n          <span class=\"status-icon status-icon-success\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n          </span>\n        } @else if (_resolvedStatus() === 'warning') {\n          <span class=\"status-icon status-icon-warning\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\n          </span>\n        } @else if (_resolvedStatus() === 'error') {\n          <span class=\"status-icon status-icon-error\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\n          </span>\n        }\n        <ng-content select=\"[suffix]\" />\n      </div>\n      \n      <div class=\"textarea-footer\">\n        @if (error()) { <span class=\"textarea-error\">{{ error() }}</span> }\n        @else if (hint()) { <span class=\"textarea-hint\">{{ hint() }}</span> }\n        @else { <span></span> }\n        @if (maxlength() > 0) { <span class=\"textarea-counter\" [class.near-limit]=\"charCount() > maxlength() * 0.8\">{{ charCount() }}/{{ maxlength() }}</span> }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      --ngx-input-bg: #ffffff;\n      --ngx-input-text: #0f172a;\n      --ngx-input-border: #cbd5e1;\n      --ngx-input-focus-border: #4f46e5;\n      --ngx-input-focus-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);\n      --ngx-input-disabled-bg: #f1f5f9;\n      --ngx-input-label: #475569;\n      --ngx-input-label-active: #4f46e5;\n      --ngx-input-placeholder: #94a3b8;\n      \n      --ngx-input-success-border: #10b981;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15);\n      --ngx-input-warning-border: #f59e0b;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(245, 158, 11, 0.15);\n      --ngx-input-error-border: #ef4444;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);\n    }\n    \n    :host-context(body.dark),\n    :host-context(.dark),\n    :host-context(.dark-theme) {\n      --ngx-input-bg: #0f172a;\n      --ngx-input-text: #f8fafc;\n      --ngx-input-border: #334155;\n      --ngx-input-focus-border: #818cf8;\n      --ngx-input-focus-shadow: 0 0 0 3px rgba(129, 140, 248, 0.25);\n      --ngx-input-disabled-bg: #1e293b;\n      --ngx-input-label: #94a3b8;\n      --ngx-input-label-active: #818cf8;\n      --ngx-input-placeholder: #475569;\n      \n      --ngx-input-success-border: #34d399;\n      --ngx-input-success-shadow: 0 0 0 3px rgba(52, 211, 153, 0.25);\n      --ngx-input-warning-border: #fbbf24;\n      --ngx-input-warning-shadow: 0 0 0 3px rgba(251, 191, 36, 0.25);\n      --ngx-input-error-border: #f87171;\n      --ngx-input-error-shadow: 0 0 0 3px rgba(248, 113, 113, 0.25);\n    }\n\n    .ngx-textarea-container { position: relative; font-family: inherit; }\n    \n    .textarea-label {\n      display: inline-flex;\n      align-items: center;\n      font-size: 12px;\n      font-weight: 600;\n      color: var(--ngx-input-label);\n      margin-bottom: 6px;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n    \n    .focused .textarea-label {\n      color: var(--ngx-input-label-active);\n      transform: translateX(2px);\n    }\n    \n    .ngx-textarea-wrap {\n      position: relative;\n      display: flex;\n      align-items: flex-start;\n      border: 1px solid var(--ngx-input-border);\n      border-radius: var(--ngx-input-radius, 8px);\n      background: var(--ngx-input-bg);\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    .focused .ngx-textarea-wrap {\n      border-color: var(--ngx-input-focus-border);\n      box-shadow: var(--ngx-input-focus-shadow), 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    /* Validation status outline colors */\n    .ngx-textarea-wrap.status-success {\n      border-color: var(--ngx-input-success-border);\n    }\n    .focused .ngx-textarea-wrap.status-success {\n      box-shadow: var(--ngx-input-success-shadow), 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    .ngx-textarea-wrap.status-warning {\n      border-color: var(--ngx-input-warning-border);\n    }\n    .focused .ngx-textarea-wrap.status-warning {\n      box-shadow: var(--ngx-input-warning-shadow), 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    .ngx-textarea-wrap.status-error {\n      border-color: var(--ngx-input-error-border);\n    }\n    .focused .ngx-textarea-wrap.status-error {\n      box-shadow: var(--ngx-input-error-shadow), 0 1px 2px rgba(0, 0, 0, 0.05);\n    }\n    \n    .disabled .ngx-textarea-wrap {\n      background: var(--ngx-input-disabled-bg);\n      cursor: not-allowed;\n      opacity: 0.7;\n      box-shadow: none;\n    }\n    \n    .ngx-textarea {\n      flex: 1;\n      min-width: 0;\n      padding: 10px 14px;\n      border: none;\n      outline: none;\n      background: transparent;\n      font-size: 14px;\n      color: var(--ngx-input-text);\n      font-family: inherit;\n      resize: vertical;\n      box-sizing: border-box;\n    }\n    .ngx-textarea::placeholder {\n      color: var(--ngx-input-placeholder);\n      opacity: 0.8;\n    }\n    .ngx-textarea:disabled { cursor: not-allowed; }\n    \n    /* Status indicators */\n    .status-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      padding: 10px 12px 0 0; /* Align with standard textarea text height */\n      flex-shrink: 0;\n      animation: icon-scale-in 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;\n    }\n    .status-icon-success { color: var(--ngx-input-success-border); }\n    .status-icon-warning { color: var(--ngx-input-warning-border); }\n    .status-icon-error { color: var(--ngx-input-error-border); }\n    \n    @keyframes icon-scale-in {\n      from { transform: scale(0.6); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n\n    .textarea-footer {\n      display: flex;\n      justify-content: space-between;\n      align-items: flex-start;\n      margin-top: 5px;\n      font-size: 12px;\n    }\n    \n    .textarea-error {\n      color: var(--ngx-input-error-border);\n      font-weight: 550;\n      animation: slide-down 0.2s ease-out;\n    }\n    .textarea-hint {\n      color: var(--ngx-input-label);\n    }\n    .textarea-counter {\n      color: var(--ngx-input-label);\n      font-size: 11px;\n      margin-left: auto;\n    }\n    .textarea-counter.near-limit {\n      color: var(--ngx-input-error-border);\n      font-weight: 600;\n    }\n    \n    @keyframes slide-down {\n      from { transform: translateY(-4px); opacity: 0; }\n      to { transform: translateY(0); opacity: 1; }\n    }\n  `]\n})\nexport class TextareaComponent {\n  label = input('');\n  placeholder = input('');\n  rows = input(4);\n  maxlength = input(0);\n  disabled = input(false);\n  autoResize = input(false);\n  hint = input('');\n  error = input('');\n  value = signal('');\n  focused = signal(false);\n  \n  // Enterprise status state\n  status = input<'default' | 'success' | 'warning' | 'error'>('default');\n\n  charCount = computed(() => this.value().length);\n  valueChange = output<string>();\n\n  _resolvedStatus = computed(() => {\n    if (this.error()) return 'error';\n    return this.status();\n  });\n\n  onInput(e: Event): void {\n    const v = (e.target as HTMLTextAreaElement).value;\n    this.value.set(v);\n    this.valueChange.emit(v);\n  }\n}\n","import { Component, input, output, signal } from '@angular/core';\n\nconst COLORS = [\n  '#000000','#434343','#666666','#999999','#b7b7b7','#cccccc','#d9d9d9','#ffffff',\n  '#ff0000','#ff9900','#ffff00','#00ff00','#00ffff','#4a86e8','#0000ff','#9900ff',\n  '#ff00ff','#e06666','#f6b26b','#ffd966','#93c47d','#76d7ea','#6fa8dc','#8e7cc3',\n  '#c27ba0','#ea9999','#f9cb9c','#ffe599','#b6d7a8','#a2c4c9','#9fc5e8','#b4a7d6',\n];\n\n@Component({\n  selector: 'ngx-color-picker',\n  standalone: true,\n  template: `\n    <div class=\"ngx-color-picker\">\n      @if (label()) { <label class=\"cp-label\">{{ label() }}</label> }\n      <div class=\"cp-trigger\" (click)=\"toggleOpen()\">\n        <span class=\"cp-swatch\" [style.background]=\"value()\"></span>\n        <span class=\"cp-hex\">{{ value() }}</span>\n        <span class=\"cp-arrow\">▾</span>\n      </div>\n      @if (open()) {\n        <div class=\"cp-panel\">\n          <div class=\"cp-swatches\">\n            @for (c of colors; track c) {\n              <button class=\"cp-swatch-btn\" [style.background]=\"c\" [class.selected]=\"value() === c\" [attr.title]=\"c\" (click)=\"pick(c)\"></button>\n            }\n          </div>\n          <div class=\"cp-hex-row\">\n            <span class=\"cp-hex-label\">#</span>\n            <input class=\"cp-hex-input\" type=\"text\" [value]=\"value().replace('#','')\" maxlength=\"6\" placeholder=\"rrggbb\" (change)=\"onHexInput($event)\" />\n            <input class=\"cp-native\" type=\"color\" [value]=\"value()\" (input)=\"onNativeInput($event)\" />\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: inline-block; position: relative; }\n    .ngx-color-picker { position: relative; }\n    .cp-label { display: block; font-size: 12px; font-weight: 600; color: var(--ngx-input-label, #495057); margin-bottom: 4px; }\n    .cp-trigger { display: inline-flex; align-items: center; gap: 8px; padding: 6px 10px; border: 1px solid var(--ngx-input-border, #ced4da); border-radius: var(--ngx-input-radius, 6px); cursor: pointer; background: var(--ngx-input-bg, #fff); font-size: 13px; }\n    .cp-swatch { width: 18px; height: 18px; border-radius: 3px; border: 1px solid rgba(0,0,0,0.15); flex-shrink: 0; }\n    .cp-hex { color: var(--ngx-input-text, #212529); font-family: monospace; }\n    .cp-arrow { font-size: 10px; color: #6c757d; }\n    .cp-panel { position: absolute; top: calc(100% + 4px); left: 0; background: var(--ngx-input-bg, #fff); border: 1px solid var(--ngx-input-border, #ced4da); border-radius: 8px; box-shadow: 0 8px 32px rgba(0,0,0,0.15); z-index: 1000; padding: 12px; min-width: 200px; }\n    .cp-swatches { display: grid; grid-template-columns: repeat(8, 1fr); gap: 4px; margin-bottom: 10px; }\n    .cp-swatch-btn { width: 20px; height: 20px; border: 1px solid rgba(0,0,0,0.12); border-radius: 3px; cursor: pointer; padding: 0; }\n    .cp-swatch-btn.selected { outline: 2px solid #1a73e8; outline-offset: 1px; }\n    .cp-hex-row { display: flex; align-items: center; gap: 4px; }\n    .cp-hex-label { color: #6c757d; font-weight: 600; }\n    .cp-hex-input { flex: 1; padding: 5px 8px; border: 1px solid var(--ngx-input-border, #ced4da); border-radius: 4px; font-size: 13px; font-family: monospace; outline: none; }\n    .cp-native { width: 28px; height: 28px; border: none; padding: 0; cursor: pointer; background: none; border-radius: 4px; }\n  `]\n})\nexport class ColorPickerComponent {\n  label = input('');\n  value = signal('#1a73e8');\n  open = signal(false);\n  colorChange = output<string>();\n  colors = COLORS;\n\n  pick(color: string): void { this.value.set(color); this.colorChange.emit(color); this.open.set(false); }\n  onHexInput(e: Event): void { const v = (e.target as HTMLInputElement).value; if (/^[0-9a-fA-F]{6}$/.test(v)) this.pick('#' + v); }\n    toggleOpen(): void { this.open.update(v => !v); }\n    onNativeInput(e: Event): void { const v = (e.target as HTMLInputElement).value; if (v) this.pick(v); }\n}\n","import { Component, computed, effect, input, output, signal } from '@angular/core';\n\n@Component({\n  selector: 'ngx-time-picker',\n  standalone: true,\n  template: `\n    <div class=\"ngx-time-picker\">\n      @if (label()) { <label class=\"tp-label\">{{ label() }}</label> }\n      <div class=\"tp-input-wrap\" [class.focused]=\"focused()\" (focusin)=\"focused.set(true)\" (focusout)=\"onFocusOut($event)\">\n        <input\n          class=\"tp-text-input\"\n          type=\"text\"\n          [value]=\"textValue()\"\n          [placeholder]=\"inputPlaceholder()\"\n          [attr.aria-label]=\"label() || 'Time value'\"\n          (input)=\"onTextInput($event)\"\n        />\n        <div class=\"tp-controls\">\n          <select class=\"tp-select\" [value]=\"displayHour()\" (change)=\"onHour($event)\">\n            @for (h of hours(); track h) {\n              <option [value]=\"h\">{{ pad(h) }}</option>\n            }\n          </select>\n          <span class=\"tp-sep\">:</span>\n          <select class=\"tp-select\" [value]=\"minute()\" (change)=\"onMin($event)\">\n            @for (m of minutes; track m) {\n              <option [value]=\"m\">{{ pad(m) }}</option>\n            }\n          </select>\n          @if (use12h()) {\n            <select class=\"tp-select tp-ampm\" [value]=\"period()\" (change)=\"onAmPm($event)\">\n              <option value=\"AM\">AM</option>\n              <option value=\"PM\">PM</option>\n            </select>\n          }\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host { display: inline-block; }\n    .ngx-time-picker { }\n    .tp-label { display: block; font-size: 12px; font-weight: 600; color: var(--ngx-input-label, #495057); margin-bottom: 4px; }\n    .tp-input-wrap { display: inline-flex; align-items: center; gap: 8px; border: 1px solid var(--ngx-input-border, #ced4da); border-radius: var(--ngx-input-radius, 6px); background: var(--ngx-input-bg, #fff); padding: 6px 10px; transition: border-color 0.15s; }\n    .tp-input-wrap.focused { border-color: var(--ngx-input-focus, #1a73e8); box-shadow: 0 0 0 2px rgba(26,115,232,0.15); }\n    .tp-text-input { width: 88px; border: none; background: transparent; font-size: 14px; color: var(--ngx-input-text, #212529); outline: none; font-family: inherit; }\n    .tp-text-input::placeholder { color: #adb5bd; }\n    .tp-controls { display: inline-flex; align-items: center; gap: 2px; padding-left: 8px; border-left: 1px solid #e9ecef; }\n    .tp-select { border: none; background: transparent; font-size: 14px; color: var(--ngx-input-text, #212529); outline: none; cursor: pointer; font-family: inherit; }\n    .tp-sep { color: #adb5bd; font-weight: 700; }\n    .tp-ampm { margin-left: 6px; }\n  `]\n})\nexport class TimePickerComponent {\n  label = input('');\n  use12h = input(false);\n  value = input('09:00');\n  hour24 = signal(9);\n  minute = signal(0);\n  focused = signal(false);\n  textValue = signal('09:00');\n  timeChange = output<string>();\n\n  hours = computed(() => this.use12h()\n    ? Array.from({ length: 12 }, (_, i) => i + 1)\n    : Array.from({ length: 24 }, (_, i) => i)\n  );\n  period = computed<'AM' | 'PM'>(() => this.hour24() >= 12 ? 'PM' : 'AM');\n  displayHour = computed(() => this.use12h() ? ((this.hour24() % 12) || 12) : this.hour24());\n  inputPlaceholder = computed(() => this.use12h() ? 'hh:mm AM' : 'HH:mm');\n  minutes = Array.from({ length: 60 }, (_, i) => i);\n\n  pad = (n: number) => n.toString().padStart(2, '0');\n\n  constructor() {\n    effect(() => {\n      const parsed = this.parseTime(this.value());\n      if (parsed) {\n        this.applyTime(parsed.hour24, parsed.minute);\n      }\n    });\n  }\n\n  onHour(e: Event): void {\n    const selectedHour = +(e.target as HTMLSelectElement).value;\n    const hour24 = this.use12h()\n      ? this.to24Hour(selectedHour, this.period())\n      : selectedHour;\n    this.applyTime(hour24, this.minute(), true);\n  }\n\n  onMin(e: Event): void {\n    this.applyTime(this.hour24(), +(e.target as HTMLSelectElement).value, true);\n  }\n\n  onAmPm(e: Event): void {\n    this.applyTime(this.to24Hour(this.displayHour(), (e.target as HTMLSelectElement).value as 'AM' | 'PM'), this.minute(), true);\n  }\n\n  onTextInput(e: Event): void {\n    const nextValue = (e.target as HTMLInputElement).value;\n    this.textValue.set(nextValue);\n    const parsed = this.parseTime(nextValue);\n    if (parsed) {\n      this.applyTime(parsed.hour24, parsed.minute, true);\n    }\n  }\n\n  onFocusOut(event: FocusEvent): void {\n    const host = event.currentTarget as HTMLElement | null;\n    const nextTarget = event.relatedTarget as Node | null;\n    if (!host?.contains(nextTarget)) {\n      this.focused.set(false);\n      this.syncTextValue();\n    }\n  }\n\n  private applyTime(hour24: number, minute: number, emit = false): void {\n    const safeHour = Math.max(0, Math.min(23, hour24));\n    const safeMinute = Math.max(0, Math.min(59, minute));\n    this.hour24.set(safeHour);\n    this.minute.set(safeMinute);\n    this.syncTextValue();\n    if (emit) {\n      this.timeChange.emit(this.formatOutput(safeHour, safeMinute));\n    }\n  }\n\n  private syncTextValue(): void {\n    const display = this.use12h()\n      ? `${this.pad(this.displayHour())}:${this.pad(this.minute())} ${this.period()}`\n      : this.formatOutput(this.hour24(), this.minute());\n    this.textValue.set(display);\n  }\n\n  private parseTime(value: string): { hour24: number; minute: number } | null {\n    const match = value.trim().match(/^(\\d{1,2}):(\\d{2})(?:\\s*([AaPp][Mm]))?$/);\n    if (!match) {\n      return null;\n    }\n\n    const hour = Number(match[1]);\n    const minute = Number(match[2]);\n    const meridiem = match[3]?.toUpperCase() as 'AM' | 'PM' | undefined;\n\n    if (!Number.isInteger(hour) || !Number.isInteger(minute) || minute < 0 || minute > 59) {\n      return null;\n    }\n\n    if (meridiem) {\n      if (hour < 1 || hour > 12) {\n        return null;\n      }\n      return { hour24: this.to24Hour(hour, meridiem), minute };\n    }\n\n    if (hour < 0 || hour > 23) {\n      return null;\n    }\n\n    return { hour24: hour, minute };\n  }\n\n  private to24Hour(displayHour: number, period: 'AM' | 'PM'): number {\n    if (period === 'AM') {\n      return displayHour === 12 ? 0 : displayHour;\n    }\n    return displayHour === 12 ? 12 : displayHour + 12;\n  }\n\n  private formatOutput(hour24: number, minute: number): string {\n    return `${this.pad(hour24)}:${this.pad(minute)}`;\n  }\n}\n","import { Component, computed, effect, input, output, signal } from '@angular/core';\n\nexport interface DateRangePreset {\n  label: string;\n  start: Date | string;\n  end: Date | string;\n}\n\ninterface CalendarDay {\n  key: string;\n  date: Date;\n  inMonth: boolean;\n  isToday: boolean;\n  isStart: boolean;\n  isEnd: boolean;\n  inRange: boolean;\n  disabled: boolean;\n}\n\n@Component({\n  selector: 'ngx-date-range-picker',\n  standalone: true,\n  template: `\n    <div class=\"ngx-date-range-picker\">\n      @if (label()) { <label class=\"drp-label\">{{ label() }}</label> }\n      <div\n        class=\"drp-inputs\"\n        [class.disabled]=\"disabled()\"\n        role=\"button\"\n        tabindex=\"0\"\n        [attr.aria-expanded]=\"open()\"\n        (click)=\"toggleOpen()\"\n        (keydown.enter)=\"toggleOpen()\"\n        (keydown.space)=\"toggleOpen(); $event.preventDefault()\"\n        (keydown.escape)=\"open.set(false)\"\n      >\n        <input class=\"drp-input\" type=\"text\" readonly [value]=\"startDate()\" placeholder=\"Start date\" [disabled]=\"disabled()\" />\n        <span class=\"drp-sep\">&#8594;</span>\n        <input class=\"drp-input\" type=\"text\" readonly [value]=\"endDate()\" placeholder=\"End date\" [disabled]=\"disabled()\" />\n        <span class=\"drp-icon\">&#128197;</span>\n      </div>\n      @if (open()) {\n        <div class=\"drp-calendar-wrap\" (click)=\"$event.stopPropagation()\">\n          @if (presets().length > 0) {\n            <div class=\"drp-presets\">\n              @for (preset of presets(); track preset.label) {\n                <button class=\"preset-btn\" type=\"button\" (click)=\"applyPreset(preset)\">\n                  {{ preset.label }}\n                </button>\n              }\n            </div>\n          }\n\n          <div class=\"drp-calendar\">\n            <div class=\"cal-header\">\n              <button class=\"cal-nav\" type=\"button\" (click)=\"prevMonth($event)\" aria-label=\"Previous month\">&#8249;</button>\n              <span class=\"cal-title\">{{ monthName(viewMonth()) }} {{ viewYear() }}</span>\n              <button class=\"cal-nav\" type=\"button\" (click)=\"nextMonth($event)\" aria-label=\"Next month\">&#8250;</button>\n            </div>\n            <div class=\"cal-grid\" role=\"grid\">\n              @for (day of weekDays(); track day) { <div class=\"cal-weekday\">{{ day }}</div> }\n              @for (cell of calendarDays(); track cell.key) {\n                <button\n                  type=\"button\"\n                  class=\"cal-day\"\n                  role=\"gridcell\"\n                  [class.other-month]=\"!cell.inMonth\"\n                  [class.in-range]=\"cell.inRange\"\n                  [class.range-start]=\"cell.isStart\"\n                  [class.range-end]=\"cell.isEnd\"\n                  [class.today]=\"cell.isToday\"\n                  [class.disabled]=\"cell.disabled\"\n                  [attr.data-date]=\"cell.key\"\n                  [attr.aria-selected]=\"cell.isStart || cell.isEnd\"\n                  [disabled]=\"cell.disabled\"\n                  (click)=\"selectDay(cell.date, $event)\"\n                  (keydown)=\"onDayKeydown($event, cell.date)\"\n                >{{ cell.date.getDate() }}</button>\n              }\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; position: relative; }\n    .drp-label { display: block; font-size: 12px; font-weight: 600; color: var(--ngx-input-label, #475569); margin-bottom: 6px; }\n    .drp-inputs { display: flex; align-items: center; gap: 8px; padding: 9px 12px; border: 1px solid var(--ngx-input-border, #cbd5e1); border-radius: var(--ngx-input-radius, 8px); cursor: pointer; background: var(--ngx-input-bg, #fff); transition: all 0.2s; }\n    .drp-inputs:hover, .drp-inputs:focus-visible { border-color: var(--primary-color, #4f46e5); outline: none; box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.12)); }\n    .drp-inputs.disabled { cursor: not-allowed; opacity: 0.6; background: var(--ngx-input-disabled-bg, #f8fafc); }\n    .drp-input { border: none; background: transparent; font-size: 13px; color: var(--ngx-input-text, #0f172a); outline: none; cursor: pointer; width: 85px; font-family: inherit; }\n    .drp-input:disabled { cursor: not-allowed; color: var(--text-secondary, #64748b); }\n    .drp-sep { color: #94a3b8; font-weight: 650; }\n    .drp-icon { font-size: 14px; color: #64748b; margin-left: auto; }\n    .drp-calendar-wrap { position: absolute; top: calc(100% + 6px); left: 0; display: flex; gap: 12px; background: var(--bg-secondary, #fff); border: 1px solid var(--border-color, #e2e8f0); border-radius: var(--ngx-input-radius, 12px); box-shadow: var(--shadow-lg, 0 10px 25px rgba(0,0,0,0.08)); z-index: 1000; padding: 14px; }\n    .drp-presets { display: flex; flex-direction: column; gap: 6px; min-width: 112px; padding-right: 12px; border-right: 1px solid var(--border-color, #e2e8f0); }\n    .preset-btn { border: 1px solid transparent; border-radius: 6px; background: transparent; color: var(--text-secondary, #64748b); cursor: pointer; font: inherit; font-size: 12px; font-weight: 650; padding: 7px 9px; text-align: left; }\n    .preset-btn:hover, .preset-btn:focus-visible { background: var(--border-light, #f1f5f9); color: var(--text-primary, #0f172a); outline: none; }\n    .cal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }\n    .cal-nav { background: none; border: 1px solid var(--border-color, #e2e8f0); border-radius: 6px; cursor: pointer; padding: 3px 8px; font-size: 14px; color: #64748b; transition: all 0.15s; }\n    .cal-nav:hover, .cal-nav:focus-visible { background: var(--border-light, #f1f5f9); color: var(--text-primary, #0f172a); outline: none; }\n    .cal-title { font-weight: 750; font-size: 13px; color: var(--text-primary, #0f172a); font-family: var(--ngx-heading-font-family, inherit); }\n    .cal-grid { display: grid; grid-template-columns: repeat(7, 34px); gap: 3px; }\n    .cal-weekday { text-align: center; font-size: 10px; font-weight: 700; color: #94a3b8; padding: 4px 0; text-transform: uppercase; letter-spacing: 0.5px; }\n    .cal-day { width: 34px; height: 34px; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 550; border-radius: 6px; cursor: pointer; transition: all 0.15s; color: var(--text-primary, #0f172a); border: 0; background: transparent; font-family: inherit; }\n    .cal-day:hover:not(.range-start):not(.range-end):not(.disabled), .cal-day:focus-visible:not(.range-start):not(.range-end):not(.disabled) { background: var(--border-light, #f1f5f9); outline: none; }\n    .cal-day.other-month { color: #cbd5e1; }\n    .cal-day.disabled { color: #cbd5e1; cursor: not-allowed; text-decoration: line-through; }\n    .cal-day.in-range { background: var(--primary-glow, rgba(79, 70, 229, 0.08)); color: var(--primary-color, #4f46e5); border-radius: 0; }\n    .cal-day.range-start, .cal-day.range-end { background: var(--primary-gradient, linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%)); color: #fff; font-weight: 700; border-radius: 50%; box-shadow: 0 2px 6px rgba(79, 70, 229, 0.35); }\n    .cal-day.today:not(.range-start):not(.range-end) { font-weight: 700; border: 1.5px solid var(--primary-color, #4f46e5); color: var(--primary-color, #4f46e5); }\n    @media (max-width: 520px) {\n      .drp-calendar-wrap { flex-direction: column; width: max-content; max-width: calc(100vw - 32px); }\n      .drp-presets { flex-direction: row; flex-wrap: wrap; min-width: 0; padding: 0 0 10px; border-right: 0; border-bottom: 1px solid var(--border-color, #e2e8f0); }\n    }\n  `]\n})\nexport class DateRangePickerComponent {\n  label = input('');\n  start = input<Date | string | null>(null);\n  end = input<Date | string | null>(null);\n  min = input<Date | string | null>(null);\n  max = input<Date | string | null>(null);\n  disabledDates = input<Array<Date | string>>([]);\n  presets = input<DateRangePreset[]>(DateRangePickerComponent.createDefaultPresets());\n  weekStartsOn = input<0 | 1 | 2 | 3 | 4 | 5 | 6>(0);\n  disabled = input(false);\n\n  startDate = signal<string>('');\n  endDate = signal<string>('');\n  open = signal(false);\n  private picking = signal<'start' | 'end'>('start');\n  viewMonth = signal(new Date().getMonth());\n  viewYear = signal(new Date().getFullYear());\n\n  rangeChange = output<{ start: string; end: string }>();\n  openChange = output<boolean>();\n\n  private monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n  private baseWeekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\n  private syncInputs = effect(() => {\n    const start = this.toDateString(this.start());\n    const end = this.toDateString(this.end());\n    this.startDate.set(start);\n    this.endDate.set(end);\n    const initialView = this.parseLocalDate(start || end);\n    if (initialView) {\n      this.viewMonth.set(initialView.getMonth());\n      this.viewYear.set(initialView.getFullYear());\n    }\n  });\n\n  weekDays = computed(() => {\n    const start = this.weekStartsOn();\n    return [...this.baseWeekDays.slice(start), ...this.baseWeekDays.slice(0, start)];\n  });\n\n  calendarDays = computed<CalendarDay[]>(() => {\n    const y = this.viewYear();\n    const m = this.viewMonth();\n    const firstDay = new Date(y, m, 1).getDay();\n    const offset = (firstDay - this.weekStartsOn() + 7) % 7;\n    const days: CalendarDay[] = [];\n    const today = this.startOfDay(new Date());\n    const s = this.parseLocalDate(this.startDate());\n    const e = this.parseLocalDate(this.endDate());\n\n    for (let i = 0; i < 42; i++) {\n      const date = this.startOfDay(new Date(y, m, i - offset + 1));\n      const key = this.formatLocalDate(date);\n      days.push({\n        key,\n        date,\n        inMonth: date.getMonth() === m,\n        isToday: date.getTime() === today.getTime(),\n        isStart: s ? date.getTime() === s.getTime() : false,\n        isEnd: e ? date.getTime() === e.getTime() : false,\n        inRange: !!(s && e && date > s && date < e),\n        disabled: this.isDateDisabled(date),\n      });\n    }\n    return days;\n  });\n\n  monthName(m: number): string {\n    return this.monthNames[m] ?? '';\n  }\n\n  toggleOpen(): void {\n    if (this.disabled()) return;\n    this.open.update(v => {\n      const next = !v;\n      this.openChange.emit(next);\n      return next;\n    });\n  }\n\n  prevMonth(e: Event): void {\n    e.stopPropagation();\n    if (this.viewMonth() === 0) {\n      this.viewMonth.set(11);\n      this.viewYear.update(y => y - 1);\n    } else {\n      this.viewMonth.update(m => m - 1);\n    }\n  }\n\n  nextMonth(e: Event): void {\n    e.stopPropagation();\n    if (this.viewMonth() === 11) {\n      this.viewMonth.set(0);\n      this.viewYear.update(y => y + 1);\n    } else {\n      this.viewMonth.update(m => m + 1);\n    }\n  }\n\n  selectDay(date: Date, e?: Event): void {\n    e?.stopPropagation();\n    if (this.disabled() || this.isDateDisabled(date)) return;\n\n    const ds = this.formatLocalDate(date);\n    if (this.picking() === 'start' || !this.startDate()) {\n      this.startDate.set(ds);\n      this.endDate.set('');\n      this.picking.set('end');\n      return;\n    }\n\n    if (ds >= this.startDate()) {\n      this.endDate.set(ds);\n      this.picking.set('start');\n      this.emitRange(ds);\n      this.open.set(false);\n      this.openChange.emit(false);\n    } else {\n      this.startDate.set(ds);\n      this.endDate.set('');\n    }\n  }\n\n  applyPreset(preset: DateRangePreset): void {\n    const start = this.toDateString(preset.start);\n    const end = this.toDateString(preset.end);\n    if (!start || !end) return;\n\n    this.startDate.set(start);\n    this.endDate.set(end);\n    this.picking.set('start');\n    const view = this.parseLocalDate(start);\n    if (view) {\n      this.viewMonth.set(view.getMonth());\n      this.viewYear.set(view.getFullYear());\n    }\n    this.rangeChange.emit({ start, end });\n    this.open.set(false);\n    this.openChange.emit(false);\n  }\n\n  onDayKeydown(event: KeyboardEvent, date: Date): void {\n    const deltas: Record<string, number> = {\n      ArrowLeft: -1,\n      ArrowRight: 1,\n      ArrowUp: -7,\n      ArrowDown: 7,\n    };\n\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.selectDay(date, event);\n      return;\n    }\n\n    const delta = deltas[event.key];\n    if (!delta) return;\n\n    event.preventDefault();\n    const next = new Date(date);\n    next.setDate(date.getDate() + delta);\n    this.viewMonth.set(next.getMonth());\n    this.viewYear.set(next.getFullYear());\n    queueMicrotask(() => {\n      const target = document.querySelector<HTMLButtonElement>(`.cal-day[data-date=\"${this.formatLocalDate(next)}\"]:not(:disabled)`);\n      target?.focus();\n    });\n  }\n\n  private emitRange(end: string): void {\n    this.rangeChange.emit({ start: this.startDate(), end });\n  }\n\n  private isDateDisabled(date: Date): boolean {\n    const min = this.parseLocalDate(this.toDateString(this.min()));\n    const max = this.parseLocalDate(this.toDateString(this.max()));\n    const key = this.formatLocalDate(date);\n    const disabledSet = new Set(this.disabledDates().map(item => this.toDateString(item)).filter(Boolean));\n\n    return !!((min && date < min) || (max && date > max) || disabledSet.has(key));\n  }\n\n  private parseLocalDate(value: string): Date | null {\n    if (!value) return null;\n    const [year, month, day] = value.split('-').map(Number);\n    if (!year || !month || !day) return null;\n    return this.startOfDay(new Date(year, month - 1, day));\n  }\n\n  private toDateString(value: Date | string | null): string {\n    if (!value) return '';\n    if (value instanceof Date) return this.formatLocalDate(value);\n    if (/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return value;\n    const parsed = new Date(value);\n    return Number.isNaN(parsed.getTime()) ? '' : this.formatLocalDate(parsed);\n  }\n\n  private formatLocalDate(date: Date): string {\n    const year = date.getFullYear();\n    const month = `${date.getMonth() + 1}`.padStart(2, '0');\n    const day = `${date.getDate()}`.padStart(2, '0');\n    return `${year}-${month}-${day}`;\n  }\n\n  private startOfDay(date: Date): Date {\n    const next = new Date(date);\n    next.setHours(0, 0, 0, 0);\n    return next;\n  }\n\n  private static createDefaultPresets(): DateRangePreset[] {\n    const today = new Date();\n    const lastSevenStart = new Date(today);\n    lastSevenStart.setDate(today.getDate() - 6);\n    const monthStart = new Date(today.getFullYear(), today.getMonth(), 1);\n    const monthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0);\n\n    return [\n      { label: 'Today', start: today, end: today },\n      { label: 'Last 7 days', start: lastSevenStart, end: today },\n      { label: 'This month', start: monthStart, end: monthEnd },\n    ];\n  }\n}\n","import { Component, input, signal, output, HostListener, ViewChild, ElementRef, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NGX_CORE_I18N } from 'ngx-core-components/i18n';\n\nexport interface UploadFileItem {\n  id: string;\n  name: string;\n  size: number;\n  type: string;\n  progress: number;\n  status: 'pending' | 'uploading' | 'success' | 'error';\n  errorMessage?: string;\n  formattedSize: string;\n  fileObject: File;\n}\n\n@Component({\n  selector: 'ngx-file-upload',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"file-upload-wrapper\"\n      [class.dark]=\"theme() === 'dark'\"\n      [class.drag-over]=\"isDragOver()\"\n      [class.disabled]=\"disabled()\"\n    >\n      <!-- Dropzone Border Frame -->\n      <div\n        class=\"dropzone-area\"\n        (dragover)=\"onDragOver($event)\"\n        (dragleave)=\"onDragLeave($event)\"\n        (drop)=\"onDrop($event)\"\n        (click)=\"fileInput.click()\"\n        (keydown)=\"onDropzoneKeyDown($event)\"\n        [attr.tabindex]=\"disabled() ? -1 : 0\"\n        role=\"button\"\n        [attr.aria-disabled]=\"disabled()\"\n        aria-label=\"Upload files\"\n      >\n        <input\n          #fileInput\n          type=\"file\"\n          [multiple]=\"multiple()\"\n          [accept]=\"accept()\"\n          [disabled]=\"disabled()\"\n          (change)=\"onFileSelected($event)\"\n          class=\"hidden-file-input\"\n        />\n\n        <div class=\"dropzone-content\">\n          <div class=\"upload-icon-circle\">\n            <svg class=\"upload-arrow-svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n              <polyline points=\"17 8 12 3 7 8\"/>\n              <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n            </svg>\n          </div>\n          <div class=\"upload-headline\">\n            <span class=\"highlight\">{{ i18n.fileUpload.browse }}</span> {{ i18n.fileUpload.dragDrop }}\n          </div>\n          <div class=\"upload-subtext\">\n            {{ getHelperText() }}\n          </div>\n        </div>\n      </div>\n\n      <!-- File Queue List -->\n      @if (fileQueue().length > 0) {\n        <div class=\"file-queue-list\">\n          <div class=\"queue-header\">\n            <h4>Files Queue ({{ fileQueue().length }})</h4>\n            <button class=\"clear-all-btn\" (click)=\"clearAll()\" [disabled]=\"disabled()\">{{ i18n.datePicker.clear }} All</button>\n          </div>\n\n          <div class=\"queue-items\">\n            @for (item of fileQueue(); track item.id) {\n              <div class=\"queue-item-card\" [class]=\"item.status\">\n                <div class=\"item-icon\">\n                  <svg class=\"file-icon-svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                    <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\n                    <polyline points=\"14 2 14 8 20 8\"/>\n                  </svg>\n                </div>\n\n                <div class=\"item-details\">\n                  <div class=\"item-meta\">\n                    <span class=\"item-name\" [title]=\"item.name\">{{ item.name }}</span>\n                    <span class=\"item-size\">{{ item.formattedSize }}</span>\n                  </div>\n\n                  <!-- Progress meter -->\n                  @if (item.status === 'uploading') {\n                    <div class=\"item-progress-wrap\">\n                      <div class=\"progress-track\">\n                        <div class=\"progress-bar-fill\" [style.width.%]=\"item.progress\"></div>\n                      </div>\n                      <span class=\"progress-text\">{{ item.progress }}%</span>\n                    </div>\n                  }\n\n                  <!-- Error message alert -->\n                  @if (item.status === 'error' && item.errorMessage) {\n                    <div class=\"item-error-msg\">\n                      ⚠️ {{ item.errorMessage }}\n                    </div>\n                  }\n\n                  <!-- Status badges -->\n                  @if (item.status === 'success') {\n                    <div class=\"item-status-badge success\">✓ Uploaded</div>\n                  }\n                </div>\n\n                <!-- Actions -->\n                <div class=\"item-actions\">\n                  @if (item.status === 'error') {\n                    <button class=\"action-btn retry-btn\" (click)=\"retryUpload(item)\" title=\"Retry upload\">\n                      🔄\n                    </button>\n                  }\n                  <button class=\"action-btn remove-btn\" (click)=\"removeFile(item)\" [title]=\"i18n.fileUpload.removeFile\" [disabled]=\"disabled()\">\n                    ✕\n                  </button>\n                </div>\n              </div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n\n    .file-upload-wrapper {\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: var(--radius-md, 10px);\n      padding: 16px;\n      box-shadow: var(--shadow-sm);\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n      transition: all 0.25s;\n    }\n\n    .file-upload-wrapper.drag-over {\n      border-color: var(--primary-color, #4f46e5);\n      background: rgba(79, 70, 229, 0.01);\n    }\n\n    .file-upload-wrapper.disabled {\n      opacity: 0.65;\n      pointer-events: none;\n    }\n\n    /* Dropzone area */\n    .dropzone-area {\n      border: 2px dashed var(--border-color, #cbd5e1);\n      border-radius: var(--radius-md, 10px);\n      padding: 32px 20px;\n      text-align: center;\n      cursor: pointer;\n      background: rgba(0, 0, 0, 0.005);\n      transition: all 0.2s ease-in-out;\n      position: relative;\n    }\n\n    .dropzone-area:hover {\n      border-color: var(--primary-color, #4f46e5);\n      background: rgba(79, 70, 229, 0.02);\n    }\n\n    .dropzone-area:focus-visible {\n      outline: 2px dashed var(--primary-color, #4f46e5);\n      outline-offset: 2px;\n      border-color: var(--primary-color, #4f46e5);\n      background: rgba(79, 70, 229, 0.02);\n    }\n\n    .drag-over .dropzone-area {\n      border-color: var(--primary-color, #4f46e5);\n      background: rgba(79, 70, 229, 0.05);\n    }\n\n    .hidden-file-input {\n      display: none;\n    }\n\n    .dropzone-content {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      user-select: none;\n    }\n\n    .upload-icon-circle {\n      width: 44px;\n      height: 44px;\n      border-radius: 50%;\n      background: var(--border-light, #f1f5f9);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      color: var(--text-secondary, #475569);\n      transition: all 0.2s;\n    }\n\n    .dropzone-area:hover .upload-icon-circle {\n      background: var(--primary-color, #4f46e5);\n      color: #ffffff;\n      transform: scale(1.05);\n    }\n\n    .upload-arrow-svg {\n      width: 20px;\n      height: 20px;\n    }\n\n    .upload-headline {\n      font-family: var(--ngx-font-family, sans-serif);\n      font-size: 14px;\n      font-weight: 550;\n      color: var(--text-primary, #0f172a);\n    }\n\n    .upload-headline .highlight {\n      color: var(--primary-color, #4f46e5);\n      font-weight: 700;\n    }\n\n    .upload-subtext {\n      font-family: var(--ngx-font-family, sans-serif);\n      font-size: 11px;\n      color: var(--text-secondary, #64748b);\n    }\n\n    /* Queue list */\n    .file-queue-list {\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n      border-top: 1px solid var(--border-color, #e2e8f0);\n      padding-top: 16px;\n    }\n\n    .queue-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      font-family: var(--ngx-font-family, sans-serif);\n    }\n\n    .queue-header h4 {\n      margin: 0;\n      font-size: 13px;\n      font-weight: 750;\n      color: var(--text-primary, #0f172a);\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n\n    .clear-all-btn {\n      background: transparent;\n      border: none;\n      color: #ef4444;\n      font-size: 11px;\n      font-weight: 700;\n      cursor: pointer;\n      padding: 2px 6px;\n      border-radius: 4px;\n      transition: background 0.2s;\n    }\n    .clear-all-btn:hover {\n      background: rgba(239, 68, 68, 0.05);\n    }\n\n    .queue-items {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n      max-height: 280px;\n      overflow-y: auto;\n      padding-right: 4px;\n    }\n\n    .queue-item-card {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      padding: 10px 14px;\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 8px;\n      background: var(--bg-secondary, #ffffff);\n      transition: all 0.2s;\n    }\n\n    .queue-item-card:hover {\n      border-color: var(--text-secondary, #94a3b8);\n      box-shadow: var(--shadow-sm);\n    }\n\n    .queue-item-card.success { border-color: rgba(16, 185, 129, 0.3); background: rgba(16, 185, 129, 0.005); }\n    .queue-item-card.error { border-color: rgba(239, 68, 68, 0.3); background: rgba(239, 68, 68, 0.005); }\n\n    .item-icon {\n      color: var(--text-secondary, #64748b);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .file-icon-svg {\n      width: 20px;\n      height: 20px;\n    }\n\n    .item-details {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n      overflow: hidden;\n      font-family: var(--ngx-font-family, sans-serif);\n    }\n\n    .item-meta {\n      display: flex;\n      justify-content: space-between;\n      gap: 8px;\n    }\n\n    .item-name {\n      font-size: 13px;\n      font-weight: 600;\n      color: var(--text-primary, #0f172a);\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    .item-size {\n      font-size: 11px;\n      color: var(--text-secondary, #64748b);\n      white-space: nowrap;\n    }\n\n    /* Progress and error layouts */\n    .item-progress-wrap {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .progress-track {\n      flex: 1;\n      height: 4px;\n      background: var(--border-light, #f1f5f9);\n      border-radius: 2px;\n      overflow: hidden;\n    }\n\n    .progress-bar-fill {\n      height: 100%;\n      background: var(--primary-color, #4f46e5);\n      border-radius: 2px;\n      transition: width 0.15s;\n    }\n\n    .progress-text {\n      font-size: 10px;\n      font-weight: 700;\n      color: var(--text-secondary, #475569);\n      min-width: 28px;\n      text-align: right;\n    }\n\n    .item-error-msg {\n      font-size: 11px;\n      color: #ef4444;\n      font-weight: 600;\n    }\n\n    .item-status-badge {\n      font-size: 10px;\n      font-weight: 700;\n      border-radius: 4px;\n      padding: 1px 6px;\n      width: fit-content;\n    }\n\n    .item-status-badge.success {\n      background: rgba(16, 185, 129, 0.1);\n      color: #10b981;\n    }\n\n    /* Actions buttons */\n    .item-actions {\n      display: flex;\n      gap: 6px;\n    }\n\n    .action-btn {\n      background: transparent;\n      border: none;\n      font-size: 12px;\n      cursor: pointer;\n      width: 24px;\n      height: 24px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      color: var(--text-secondary, #64748b);\n      transition: background 0.2s, color 0.2s;\n    }\n\n    .action-btn:hover {\n      background: var(--border-light, #f1f5f9);\n      color: var(--text-primary, #0f172a);\n    }\n\n    .action-btn.remove-btn:hover {\n      color: #ef4444;\n      background: rgba(239, 68, 68, 0.05);\n    }\n\n    /* Dark Mode */\n    .file-upload-wrapper.dark {\n      background: #0f172a;\n      border-color: #1f2937;\n    }\n    .file-upload-wrapper.dark .dropzone-area {\n      border-color: #374151;\n    }\n    .file-upload-wrapper.dark .dropzone-area:hover {\n      border-color: var(--primary-color, #6366f1);\n      background: rgba(99, 102, 241, 0.02);\n    }\n    .file-upload-wrapper.dark .upload-icon-circle {\n      background: #1e293b;\n      color: #94a3b8;\n    }\n    .file-upload-wrapper.dark .dropzone-area:hover .upload-icon-circle {\n      background: var(--primary-color, #6366f1);\n      color: #ffffff;\n    }\n    .file-upload-wrapper.dark .upload-headline {\n      color: #e2e8f0;\n    }\n    .file-upload-wrapper.dark .upload-headline .highlight {\n      color: var(--primary-color, #6366f1);\n    }\n    .file-upload-wrapper.dark .upload-subtext {\n      color: #94a3b8;\n    }\n    .file-upload-wrapper.dark .file-queue-list {\n      border-top-color: #1f2937;\n    }\n    .file-upload-wrapper.dark .queue-header h4 {\n      color: #e2e8f0;\n    }\n    .file-upload-wrapper.dark .queue-item-card {\n      border-color: #1f2937;\n      background: #111827;\n    }\n    .file-upload-wrapper.dark .queue-item-card:hover {\n      border-color: #4b5563;\n    }\n    .file-upload-wrapper.dark .queue-item-card.success {\n      border-color: rgba(16, 185, 129, 0.2);\n    }\n    .file-upload-wrapper.dark .queue-item-card.error {\n      border-color: rgba(239, 68, 68, 0.2);\n    }\n    .file-upload-wrapper.dark .item-name {\n      color: #e2e8f0;\n    }\n    .file-upload-wrapper.dark .item-size {\n      color: #94a3b8;\n    }\n    .file-upload-wrapper.dark .progress-track {\n      background: #1e293b;\n    }\n    .file-upload-wrapper.dark .progress-bar-fill {\n      background: var(--primary-color, #6366f1);\n    }\n    .file-upload-wrapper.dark .progress-text {\n      color: #94a3b8;\n    }\n    .file-upload-wrapper.dark .action-btn:hover {\n      background: #1e293b;\n      color: #f8fafc;\n    }\n    .file-upload-wrapper.dark .action-btn.remove-btn:hover {\n      background: rgba(239, 68, 68, 0.1);\n    }\n  `]\n})\nexport class FileUploadComponent {\n  i18n = inject(NGX_CORE_I18N);\n\n  // Inputs\n  multiple = input<boolean>(false);\n  accept = input<string>(''); // comma separated file rules\n  maxSize = input<number>(0);  // max bytes limit (e.g. 5242880 for 5MB). 0 means unlimited\n  disabled = input<boolean>(false);\n  theme = input<'light' | 'dark'>('light');\n  uploadUrl = input<string>('');\n\n  // Outputs\n  filesSelected = output<File[]>();\n  fileRemoved = output<File>();\n  uploadProgress = output<{ file: File, progress: number }>();\n  uploadComplete = output<{ file: File, response: any }>();\n  uploadError = output<{ file: File, error: any }>();\n\n  // State\n  isDragOver = signal<boolean>(false);\n  fileQueue = signal<UploadFileItem[]>([]);\n\n  onDropzoneKeyDown(event: KeyboardEvent) {\n    if (this.disabled()) return;\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      const inputEl = event.currentTarget as HTMLElement;\n      const fileInputEl = inputEl.querySelector('.hidden-file-input') as HTMLInputElement;\n      fileInputEl?.click();\n    }\n  }\n\n  onDragOver(event: DragEvent) {\n    if (this.disabled()) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(true);\n  }\n\n  onDragLeave(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(false);\n  }\n\n  onDrop(event: DragEvent) {\n    if (this.disabled()) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(false);\n\n    if (event.dataTransfer && event.dataTransfer.files) {\n      this.handleFiles(Array.from(event.dataTransfer.files));\n    }\n  }\n\n  onFileSelected(event: Event) {\n    const inputEl = event.target as HTMLInputElement;\n    if (inputEl.files) {\n      this.handleFiles(Array.from(inputEl.files));\n      inputEl.value = ''; // clear input selection\n    }\n  }\n\n  // Handle addition of files to the queue, runs validation, and triggers simulated upload\n  private handleFiles(incomingFiles: File[]) {\n    if (incomingFiles.length === 0) return;\n\n    // Filter by single vs multiple\n    const filesToProcess = this.multiple() ? incomingFiles : [incomingFiles[0]];\n\n    const newQueueItems: UploadFileItem[] = [];\n    const validFiles: File[] = [];\n\n    for (const file of filesToProcess) {\n      const formattedSize = this.formatBytes(file.size);\n      const id = Date.now().toString() + '-' + Math.random().toString(36).substr(2, 9);\n      \n      const item: UploadFileItem = {\n        id,\n        name: file.name,\n        size: file.size,\n        type: file.type,\n        progress: 0,\n        status: 'pending',\n        formattedSize,\n        fileObject: file\n      };\n\n      // Validation\n      const errorMsg = this.validateFile(file);\n      if (errorMsg) {\n        item.status = 'error';\n        item.errorMessage = errorMsg;\n      } else {\n        validFiles.push(file);\n      }\n\n      newQueueItems.push(item);\n    }\n\n    if (this.multiple()) {\n      this.fileQueue.update(q => [...q, ...newQueueItems]);\n    } else {\n      this.fileQueue.set(newQueueItems);\n    }\n\n    if (validFiles.length > 0) {\n      this.filesSelected.emit(validFiles);\n      \n      // Trigger simulation or actual file upload\n      for (const item of newQueueItems) {\n        if (item.status === 'pending') {\n          this.uploadFile(item);\n        }\n      }\n    }\n  }\n\n  private validateFile(file: File): string | null {\n    // 1. Max Size check\n    const maxLimit = this.maxSize();\n    if (maxLimit > 0 && file.size > maxLimit) {\n      return `${this.i18n.fileUpload.maxSizeError} (${this.formatBytes(maxLimit)})`;\n    }\n\n    // 2. Type/Accept format check\n    const acceptRule = this.accept();\n    if (acceptRule) {\n      const allowedRules = acceptRule.split(',').map(r => r.trim().toLowerCase());\n      const ext = ('.' + file.name.split('.').pop()).toLowerCase();\n      const mime = file.type.toLowerCase();\n      \n      const isAllowed = allowedRules.some(rule => {\n        if (rule.startsWith('.')) {\n          return rule === ext;\n        } else if (rule.endsWith('/*')) {\n          const prefix = rule.slice(0, -2);\n          return mime.startsWith(prefix);\n        } else {\n          return rule === mime;\n        }\n      });\n\n      if (!isAllowed) {\n        return `${this.i18n.fileUpload.invalidTypeError} (\"${acceptRule}\")`;\n      }\n    }\n\n    return null;\n  }\n\n  private uploadFile(item: UploadFileItem) {\n    this.updateItemStatus(item.id, 'uploading', 0);\n\n    // Mock Upload simulation\n    // Increment progress linearly in steps\n    let currentProgress = 0;\n    const interval = setInterval(() => {\n      currentProgress += Math.floor(Math.random() * 15) + 5;\n      if (currentProgress >= 100) {\n        currentProgress = 100;\n        clearInterval(interval);\n        \n        // Randomly simulate 5% errors to showcase error recovery states\n        const simulatedSuccess = Math.random() > 0.05;\n        if (simulatedSuccess) {\n          this.updateItemStatus(item.id, 'success', 100);\n          this.uploadComplete.emit({ file: item.fileObject, response: { success: true } });\n        } else {\n          this.updateItemStatus(item.id, 'error', 100, 'Simulated connection failure during file upload.');\n          this.uploadError.emit({ file: item.fileObject, error: 'Simulated connection failure' });\n        }\n      } else {\n        this.updateItemStatus(item.id, 'uploading', currentProgress);\n        this.uploadProgress.emit({ file: item.fileObject, progress: currentProgress });\n      }\n    }, 250);\n  }\n\n  retryUpload(item: UploadFileItem) {\n    this.uploadFile(item);\n  }\n\n  removeFile(item: UploadFileItem) {\n    this.fileQueue.update(q => q.filter(x => x.id !== item.id));\n    this.fileRemoved.emit(item.fileObject);\n  }\n\n  clearAll() {\n    this.fileQueue.set([]);\n  }\n\n  private updateItemStatus(id: string, status: UploadFileItem['status'], progress: number, errorMsg?: string) {\n    this.fileQueue.update(queue => {\n      return queue.map(x => {\n        if (x.id === id) {\n          return {\n            ...x,\n            status,\n            progress,\n            errorMessage: errorMsg\n          };\n        }\n        return x;\n      });\n    });\n  }\n\n  // Utility text mappings\n  getHelperText(): string {\n    const limits: string[] = [];\n    if (this.accept()) {\n      limits.push(`Accepted: ${this.accept()}`);\n    }\n    if (this.maxSize() > 0) {\n      limits.push(`Max: ${this.formatBytes(this.maxSize())}`);\n    }\n    return limits.length > 0 ? limits.join(' • ') : 'Supports any file';\n  }\n\n  // Byte formats convertor utility\n  private formatBytes(bytes: number, decimals = 2): string {\n    if (bytes === 0) return '0 Bytes';\n    const k = 1024;\n    const dm = decimals < 0 ? 0 : decimals;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n  }\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  output,\n  signal,\n  computed,\n  ElementRef,\n  inject,\n  effect,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n  selector: 'ngx-tag-input',\n  standalone: true,\n  imports: [CommonModule, FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-tag-input\"\n      [class.dark]=\"theme() === 'dark'\"\n      [class.disabled]=\"disabled()\"\n      [class.focused]=\"isFocused()\"\n      (click)=\"focusInput()\"\n    >\n      <!-- Existing chips -->\n      @for (tag of internalTags(); track tag + $index) {\n        <span class=\"ngx-tag-chip\">\n          <span class=\"ngx-tag-chip__label\">{{ tag }}</span>\n          @if (!disabled()) {\n            <button\n              type=\"button\"\n              class=\"ngx-tag-chip__remove\"\n              (click)=\"removeTag(tag, $event)\"\n              [attr.aria-label]=\"'Remove ' + tag\"\n            >✕</button>\n          }\n        </span>\n      }\n\n      <!-- Text input -->\n      @if (!isAtMax()) {\n        <input\n          #tagInput\n          class=\"ngx-tag-input__field\"\n          type=\"text\"\n          [placeholder]=\"internalTags().length === 0 ? placeholder() : ''\"\n          [disabled]=\"disabled()\"\n          [(ngModel)]=\"inputValue\"\n          (keydown)=\"onKeydown($event)\"\n          (focus)=\"isFocused.set(true)\"\n          (blur)=\"onBlur()\"\n        />\n      }\n\n      <!-- Max tags hint -->\n      @if (isAtMax() && !disabled()) {\n        <span class=\"ngx-tag-input__max-hint\">Max {{ maxTags() }} tags</span>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n\n    /* ── Container ── */\n    .ngx-tag-input {\n      display: flex;\n      flex-wrap: wrap;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 12px;\n      min-height: 44px;\n      border-radius: 10px;\n      border: 1.5px solid var(--ngx-tag-border, hsl(220, 15%, 82%));\n      background: var(--ngx-tag-bg, #ffffff);\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      cursor: text;\n      transition:\n        border-color 0.18s ease,\n        box-shadow 0.18s ease;\n    }\n\n    .ngx-tag-input.focused {\n      border-color: var(--ngx-tag-focus-border, hsl(250, 70%, 58%));\n      box-shadow: 0 0 0 3px var(--primary-glow, rgba(124, 95, 240, 0.15));\n      outline: none;\n    }\n\n    .ngx-tag-input.disabled {\n      background: var(--ngx-tag-disabled-bg, hsl(220, 15%, 97%));\n      border-color: var(--ngx-tag-disabled-border, hsl(220, 10%, 88%));\n      cursor: not-allowed;\n      opacity: 0.72;\n    }\n\n    /* ── Dark mode ── */\n    .ngx-tag-input.dark {\n      background: var(--ngx-tag-dark-bg, hsl(225, 20%, 14%));\n      border-color: var(--ngx-tag-dark-border, hsl(225, 15%, 28%));\n    }\n    .ngx-tag-input.dark.focused {\n      border-color: var(--ngx-tag-focus-border, hsl(250, 65%, 65%));\n      box-shadow: 0 0 0 3px rgba(124, 95, 240, 0.22);\n    }\n    .ngx-tag-input.dark.disabled {\n      background: hsl(225, 18%, 10%);\n      border-color: hsl(225, 12%, 22%);\n    }\n\n    /* ── Chips ── */\n    .ngx-tag-chip {\n      display: inline-flex;\n      align-items: center;\n      gap: 4px;\n      padding: 3px 8px 3px 10px;\n      background: var(--ngx-tag-chip-bg, hsl(250, 65%, 94%));\n      color: var(--ngx-tag-chip-color, hsl(250, 55%, 38%));\n      border-radius: 999px;\n      font-size: 12px;\n      font-weight: 600;\n      white-space: nowrap;\n      border: 1px solid var(--ngx-tag-chip-border, hsl(250, 55%, 85%));\n      transition: background 0.15s ease, border-color 0.15s ease;\n      animation: chip-pop 0.18s cubic-bezier(0.34, 1.56, 0.64, 1);\n    }\n    .dark .ngx-tag-chip {\n      background: var(--ngx-tag-chip-dark-bg, hsl(250, 45%, 20%));\n      color: var(--ngx-tag-chip-dark-color, hsl(250, 75%, 80%));\n      border-color: hsl(250, 45%, 30%);\n    }\n\n    @keyframes chip-pop {\n      from { transform: scale(0.7); opacity: 0; }\n      to   { transform: scale(1);   opacity: 1; }\n    }\n\n    .ngx-tag-chip__label {\n      max-width: 160px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    .ngx-tag-chip__remove {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 16px;\n      height: 16px;\n      padding: 0;\n      background: transparent;\n      border: none;\n      border-radius: 50%;\n      color: inherit;\n      font-size: 9px;\n      line-height: 1;\n      cursor: pointer;\n      opacity: 0.5;\n      transition: opacity 0.12s ease, background 0.12s ease;\n      flex-shrink: 0;\n    }\n    .ngx-tag-chip__remove:hover {\n      opacity: 1;\n      background: rgba(0, 0, 0, 0.1);\n    }\n    .dark .ngx-tag-chip__remove:hover {\n      background: rgba(255, 255, 255, 0.12);\n    }\n\n    /* ── Text input field ── */\n    .ngx-tag-input__field {\n      flex: 1;\n      min-width: 100px;\n      border: none;\n      outline: none;\n      background: transparent;\n      font-size: 13px;\n      font-family: inherit;\n      color: var(--ngx-tag-input-color, hsl(220, 20%, 18%));\n      padding: 2px 0;\n    }\n    .ngx-tag-input__field::placeholder {\n      color: var(--ngx-tag-placeholder-color, hsl(220, 12%, 65%));\n    }\n    .ngx-tag-input__field:disabled {\n      cursor: not-allowed;\n    }\n    .dark .ngx-tag-input__field {\n      color: var(--ngx-tag-input-dark-color, hsl(220, 15%, 88%));\n    }\n    .dark .ngx-tag-input__field::placeholder {\n      color: hsl(220, 12%, 48%);\n    }\n\n    /* ── Max tags hint ── */\n    .ngx-tag-input__max-hint {\n      font-size: 11px;\n      font-style: italic;\n      color: hsl(220, 10%, 58%);\n      padding: 2px 4px;\n      align-self: center;\n    }\n    .dark .ngx-tag-input__max-hint {\n      color: hsl(220, 10%, 48%);\n    }\n  `],\n})\nexport class TagInputComponent {\n  private elementRef = inject(ElementRef);\n\n  // ── Inputs ──\n  tags            = input<string[]>([]);\n  placeholder     = input<string>('Add tag...');\n  maxTags         = input<number>(20);\n  allowDuplicates = input<boolean>(false);\n  disabled        = input<boolean>(false);\n  theme           = input<'light' | 'dark'>('light');\n\n  // ── Outputs ──\n  tagsChange  = output<string[]>();\n  tagAdded    = output<string>();\n  tagRemoved  = output<string>();\n\n  // ── Internal state ──\n  internalTags = signal<string[]>([]);\n  isFocused    = signal<boolean>(false);\n  inputValue   = '';\n\n  isAtMax = computed(() => this.internalTags().length >= this.maxTags());\n\n  private syncTags = effect(() => {\n    const initial = this.tags();\n    this.internalTags.set(initial ? [...initial] : []);\n  });\n\n  /** Native input element reference (grabbed via ViewChild-less approach via the template variable). */\n  private _inputEl: HTMLInputElement | null = null;\n\n  focusInput(): void {\n    if (this.disabled() || this.isAtMax()) return;\n    // Query the rendered input inside this host element\n    const input = this.elementRef.nativeElement.querySelector('.ngx-tag-input__field') as HTMLInputElement;\n    input?.focus();\n  }\n\n  onKeydown(event: KeyboardEvent): void {\n    if (this.disabled()) return;\n\n    if (event.key === 'Enter' || event.key === ',') {\n      event.preventDefault();\n      this.commitTag();\n    } else if (event.key === 'Backspace' && !this.inputValue) {\n      // Remove last tag on backspace when input is empty\n      const tags = this.internalTags();\n      if (tags.length > 0) {\n        this.removeTag(tags[tags.length - 1]);\n      }\n    }\n  }\n\n  onBlur(): void {\n    this.isFocused.set(false);\n    // Commit any pending text on blur\n    if (this.inputValue.trim()) {\n      this.commitTag();\n    }\n  }\n\n  private commitTag(): void {\n    const raw = this.inputValue.replace(/,/g, '').trim();\n    if (!raw) return;\n    if (this.isAtMax()) return;\n    if (!this.allowDuplicates() && this.internalTags().includes(raw)) {\n      this.inputValue = '';\n      return;\n    }\n\n    const newTags = [...this.internalTags(), raw];\n    this.internalTags.set(newTags);\n    this.inputValue = '';\n    this.tagsChange.emit(newTags);\n    this.tagAdded.emit(raw);\n  }\n\n  removeTag(tag: string, event?: MouseEvent): void {\n    event?.stopPropagation();\n    const newTags = this.internalTags().filter(t => t !== tag);\n    this.internalTags.set(newTags);\n    this.tagsChange.emit(newTags);\n    this.tagRemoved.emit(tag);\n  }\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  output,\n  signal,\n  computed,\n  OnDestroy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UploadFileItem } from '../file-upload/file-upload.component';\n\nexport interface PreviewFileItem {\n  id: string;\n  name: string;\n  size: number;\n  type: string;\n  status: 'pending' | 'uploading' | 'success' | 'error';\n  progress: number;\n  errorMessage?: string;\n  formattedSize: string;\n  thumbnailUrl?: string;\n  fileObject?: File;\n}\n\n@Component({\n  selector: 'ngx-file-preview',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-file-preview\"\n      [class.dark]=\"theme() === 'dark'\"\n      [class]=\"layout()\"\n    >\n      @if (previewFiles().length === 0) {\n        <div class=\"ngx-file-preview__empty\">\n          <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n            <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n            <polyline points=\"17 8 12 3 7 8\"/>\n            <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n          </svg>\n          <span class=\"ngx-file-preview__empty-text\">No files selected</span>\n        </div>\n      } @else {\n        <div class=\"ngx-file-preview__grid-container\">\n          @for (item of previewFiles(); track item.id) {\n            <div\n              class=\"ngx-file-preview__card\"\n              [class]=\"item.status\"\n            >\n              <!-- Image Thumbnail or Icon -->\n              <div class=\"ngx-file-preview__media-wrapper\">\n                @if (item.thumbnailUrl) {\n                  <div\n                    class=\"ngx-file-preview__thumbnail\"\n                    [style.backgroundImage]=\"'url(' + item.thumbnailUrl + ')'\"\n                  ></div>\n                } @else {\n                  <div\n                    class=\"ngx-file-preview__icon-fallback\"\n                    [style.background-color]=\"getFileDetails(item).color + '15'\"\n                    [style.color]=\"getFileDetails(item).color\"\n                  >\n                    <span class=\"file-icon-symbol\">{{ getFileDetails(item).icon }}</span>\n                    <span class=\"file-icon-badge\">{{ getFileDetails(item).label }}</span>\n                  </div>\n                }\n\n                <!-- Delete & Download Hover Actions Overlay -->\n                <div class=\"ngx-file-preview__overlay-actions\">\n                  @if (allowDownload() && item.status === 'success') {\n                    <button\n                      class=\"ngx-file-preview__action-btn btn-download\"\n                      (click)=\"onDownload(item)\"\n                      aria-label=\"Download file\"\n                    >\n                      <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                        <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n                        <polyline points=\"7 10 12 15 17 10\"/>\n                        <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/>\n                      </svg>\n                    </button>\n                  }\n                  @if (allowDelete()) {\n                    <button\n                      class=\"ngx-file-preview__action-btn btn-delete\"\n                      (click)=\"onDelete(item)\"\n                      aria-label=\"Delete file\"\n                    >\n                      <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                        <polyline points=\"3 6 5 6 21 6\" />\n                        <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n                      </svg>\n                    </button>\n                  }\n                </div>\n              </div>\n\n              <!-- Content details -->\n              <div class=\"ngx-file-preview__details\">\n                <div class=\"ngx-file-preview__meta\">\n                  <span class=\"ngx-file-preview__name\" [title]=\"item.name\">{{ item.name }}</span>\n                  <span class=\"ngx-file-preview__size\">{{ item.formattedSize }}</span>\n                </div>\n\n                <!-- Status details / upload meter -->\n                @if (item.status === 'uploading') {\n                  <div class=\"ngx-file-preview__progress-wrap\">\n                    <div class=\"ngx-file-preview__progress-bar\">\n                      <div class=\"ngx-file-preview__progress-fill\" [style.width.%]=\"item.progress\"></div>\n                    </div>\n                    <span class=\"ngx-file-preview__progress-text\">{{ item.progress }}%</span>\n                  </div>\n                } @else if (item.status === 'error') {\n                  <span class=\"ngx-file-preview__error-msg\">\n                    ⚠️ {{ item.errorMessage || 'Upload failed' }}\n                  </span>\n                } @else {\n                  <div class=\"ngx-file-preview__status-row\">\n                    <span class=\"status-indicator\" [class]=\"item.status\"></span>\n                    <span class=\"status-label\">{{ item.status }}</span>\n                  </div>\n                }\n              </div>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n\n    .ngx-file-preview {\n      width: 100%;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n\n    /* ── Empty State ── */\n    .ngx-file-preview__empty {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 40px;\n      border: 2px dashed rgba(0, 0, 0, 0.1);\n      border-radius: 12px;\n      color: #64748b;\n      background: rgba(255, 255, 255, 0.2);\n    }\n\n    .dark .ngx-file-preview__empty {\n      border-color: rgba(255, 255, 255, 0.08);\n      color: #94a3b8;\n      background: rgba(15, 23, 42, 0.15);\n    }\n\n    .ngx-file-preview__empty svg {\n      margin-bottom: 8px;\n      stroke: #94a3b8;\n    }\n\n    .ngx-file-preview__empty-text {\n      font-size: 13px;\n      font-weight: 500;\n    }\n\n    /* ── Grid Container ── */\n    .ngx-file-preview__grid-container {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n      gap: 16px;\n    }\n\n    /* ── Card Styling ── */\n    .ngx-file-preview__card {\n      display: flex;\n      flex-direction: column;\n      border-radius: 12px;\n      overflow: hidden;\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      border: 1px solid rgba(0, 0, 0, 0.06);\n      box-shadow: \n        0 4px 6px -1px rgba(0, 0, 0, 0.03),\n        0 2px 4px -1px rgba(0, 0, 0, 0.02);\n      transition: all 0.2s ease;\n    }\n\n    .ngx-file-preview__card:hover {\n      transform: translateY(-2px);\n      box-shadow: \n        0 10px 15px -3px rgba(0, 0, 0, 0.05),\n        0 4px 6px -4px rgba(0, 0, 0, 0.05);\n      border-color: rgba(0, 0, 0, 0.12);\n    }\n\n    .dark .ngx-file-preview__card {\n      background: rgba(30, 32, 48, 0.85);\n      border-color: rgba(255, 255, 255, 0.06);\n    }\n\n    .dark .ngx-file-preview__card:hover {\n      border-color: rgba(255, 255, 255, 0.12);\n    }\n\n    /* ── Media wrapper & Thumbnail ── */\n    .ngx-file-preview__media-wrapper {\n      position: relative;\n      width: 100%;\n      height: 120px;\n      background: #f8fafc;\n      overflow: hidden;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .dark .ngx-file-preview__media-wrapper {\n      background: #1e293b;\n    }\n\n    .ngx-file-preview__thumbnail {\n      width: 100%;\n      height: 100%;\n      background-size: cover;\n      background-position: center;\n      background-repeat: no-repeat;\n    }\n\n    .ngx-file-preview__icon-fallback {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      width: 100%;\n      height: 100%;\n      font-weight: 700;\n    }\n\n    .file-icon-symbol {\n      font-size: 36px;\n      line-height: 1;\n      margin-bottom: 4px;\n    }\n\n    .file-icon-badge {\n      font-size: 10px;\n      padding: 2px 6px;\n      border-radius: 4px;\n      background: rgba(0, 0, 0, 0.05);\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n\n    .dark .file-icon-badge {\n      background: rgba(255, 255, 255, 0.1);\n    }\n\n    /* ── Overlays actions ── */\n    .ngx-file-preview__overlay-actions {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background: rgba(15, 23, 42, 0.4);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 12px;\n      opacity: 0;\n      transition: opacity 0.2s ease;\n      z-index: 5;\n    }\n\n    .ngx-file-preview__media-wrapper:hover .ngx-file-preview__overlay-actions {\n      opacity: 1;\n    }\n\n    .ngx-file-preview__action-btn {\n      width: 34px;\n      height: 34px;\n      border-radius: 50%;\n      border: none;\n      background: rgba(255, 255, 255, 0.9);\n      color: #0f172a;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n    }\n\n    .ngx-file-preview__action-btn:hover {\n      transform: scale(1.1);\n      background: #ffffff;\n    }\n\n    .ngx-file-preview__action-btn.btn-delete:hover {\n      background: #ef4444;\n      color: #ffffff;\n    }\n\n    .ngx-file-preview__action-btn.btn-download:hover {\n      background: var(--primary-color, #3b82f6);\n      color: #ffffff;\n    }\n\n    /* ── Details content ── */\n    .ngx-file-preview__details {\n      padding: 12px;\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      flex-grow: 1;\n    }\n\n    .ngx-file-preview__meta {\n      display: flex;\n      justify-content: space-between;\n      align-items: baseline;\n      gap: 8px;\n    }\n\n    .ngx-file-preview__name {\n      font-size: 13px;\n      font-weight: 600;\n      color: #0f172a;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      flex-grow: 1;\n    }\n\n    .dark .ngx-file-preview__name {\n      color: #f8fafc;\n    }\n\n    .ngx-file-preview__size {\n      font-size: 11px;\n      font-weight: 500;\n      color: #64748b;\n      white-space: nowrap;\n    }\n\n    .dark .ngx-file-preview__size {\n      color: #94a3b8;\n    }\n\n    /* ── Progress display ── */\n    .ngx-file-preview__progress-wrap {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      width: 100%;\n    }\n\n    .ngx-file-preview__progress-bar {\n      flex-grow: 1;\n      height: 4px;\n      border-radius: 2px;\n      background: rgba(0, 0, 0, 0.05);\n      overflow: hidden;\n    }\n\n    .dark .ngx-file-preview__progress-bar {\n      background: rgba(255, 255, 255, 0.08);\n    }\n\n    .ngx-file-preview__progress-fill {\n      height: 100%;\n      background: var(--primary-color, #3b82f6);\n      transition: width 0.2s ease;\n    }\n\n    .ngx-file-preview__progress-text {\n      font-size: 10px;\n      font-weight: 600;\n      color: #64748b;\n      width: 28px;\n      text-align: right;\n    }\n\n    .ngx-file-preview__error-msg {\n      font-size: 11px;\n      color: #ef4444;\n      font-weight: 500;\n    }\n\n    .ngx-file-preview__status-row {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      font-size: 11px;\n      font-weight: 600;\n      text-transform: capitalize;\n      color: #64748b;\n    }\n\n    .dark .ngx-file-preview__status-row {\n      color: #94a3b8;\n    }\n\n    .status-indicator {\n      width: 6px;\n      height: 6px;\n      border-radius: 50%;\n      background: #64748b;\n    }\n\n    .status-indicator.success {\n      background: #10b981;\n    }\n\n    .status-indicator.pending {\n      background: #f59e0b;\n    }\n\n    /* ── List Layout ── */\n    .ngx-file-preview.list .ngx-file-preview__grid-container {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n\n    .ngx-file-preview.list .ngx-file-preview__card {\n      flex-direction: row;\n      align-items: center;\n      padding: 8px 12px;\n      gap: 12px;\n    }\n\n    .ngx-file-preview.list .ngx-file-preview__card:hover {\n      transform: translateX(2px) translateY(0);\n    }\n\n    .ngx-file-preview.list .ngx-file-preview__media-wrapper {\n      width: 42px;\n      height: 42px;\n      border-radius: 6px;\n      flex-shrink: 0;\n    }\n\n    .ngx-file-preview.list .file-icon-symbol {\n      font-size: 20px;\n      margin: 0;\n    }\n\n    .ngx-file-preview.list .file-icon-badge {\n      display: none;\n    }\n\n    .ngx-file-preview.list .ngx-file-preview__details {\n      padding: 0;\n      flex-direction: row;\n      align-items: center;\n      justify-content: space-between;\n      width: 100%;\n      gap: 16px;\n    }\n\n    .ngx-file-preview.list .ngx-file-preview__meta {\n      flex-grow: 1;\n      width: 30%;\n      flex-direction: column;\n      gap: 2px;\n    }\n\n    .ngx-file-preview.list .ngx-file-preview__progress-wrap {\n      width: 120px;\n      flex-shrink: 0;\n    }\n\n    /* List Hover action menu */\n    .ngx-file-preview.list .ngx-file-preview__overlay-actions {\n      position: static;\n      opacity: 1;\n      background: transparent;\n      box-shadow: none;\n      width: auto;\n      height: auto;\n      gap: 6px;\n      margin-left: auto;\n    }\n\n    .ngx-file-preview.list .ngx-file-preview__action-btn {\n      width: 30px;\n      height: 30px;\n      box-shadow: none;\n      border: 1px solid rgba(0, 0, 0, 0.05);\n      background: rgba(0, 0, 0, 0.02);\n    }\n\n    .dark .ngx-file-preview.list .ngx-file-preview__action-btn {\n      border-color: rgba(255, 255, 255, 0.06);\n      background: rgba(255, 255, 255, 0.02);\n      color: #cbd5e1;\n    }\n\n    .ngx-file-preview.list .ngx-file-preview__action-btn:hover {\n      transform: scale(1.05);\n    }\n  `]\n})\nexport class FilePreviewComponent implements OnDestroy {\n  // Inputs\n  files = input<UploadFileItem[] | File[] | null>(null);\n  layout = input<'grid' | 'list'>('grid');\n  allowDelete = input<boolean>(true);\n  allowDownload = input<boolean>(true);\n  theme = input<'light' | 'dark'>('light');\n\n  // Outputs\n  delete = output<any>();\n  download = output<any>();\n\n  // Object URL cache to prevent leaks and repeat generations\n  private objectUrlCache = new Map<File, string>();\n\n  // Map inputs to local standardized objects\n  previewFiles = computed(() => {\n    const rawFiles = this.files() || [];\n    return rawFiles.map((file, idx) => {\n      if (file instanceof File) {\n        return {\n          id: `${file.name}-${idx}-${file.size}`,\n          name: file.name,\n          size: file.size,\n          type: file.type,\n          progress: 100,\n          status: 'success' as const,\n          formattedSize: this.formatBytes(file.size),\n          fileObject: file,\n          thumbnailUrl: file.type.startsWith('image/') ? this.getObjectUrl(file) : undefined,\n        };\n      } else {\n        // UploadFileItem\n        let thumbUrl: string | undefined = undefined;\n        if (file.fileObject && file.type.startsWith('image/')) {\n          thumbUrl = this.getObjectUrl(file.fileObject);\n        }\n        return {\n          id: file.id || `${file.name}-${idx}`,\n          name: file.name,\n          size: file.size,\n          type: file.type,\n          progress: file.progress !== undefined ? file.progress : 100,\n          status: file.status || 'success',\n          errorMessage: file.errorMessage,\n          formattedSize: file.formattedSize || this.formatBytes(file.size),\n          fileObject: file.fileObject,\n          thumbnailUrl: thumbUrl,\n        };\n      }\n    });\n  });\n\n  ngOnDestroy() {\n    this.objectUrlCache.forEach((url) => URL.revokeObjectURL(url));\n    this.objectUrlCache.clear();\n  }\n\n  onDelete(item: PreviewFileItem) {\n    // Emit original item if possible or the constructed item\n    const orig = this.findOriginal(item);\n    this.delete.emit(orig);\n  }\n\n  onDownload(item: PreviewFileItem) {\n    const orig = this.findOriginal(item);\n    this.download.emit(orig);\n  }\n\n  getFileDetails(item: PreviewFileItem) {\n    const type = item.type || '';\n    const name = item.name || '';\n    const ext = name.split('.').pop()?.toLowerCase() || '';\n\n    if (type.startsWith('image/')) {\n      return { label: 'IMG', color: '#3b82f6', icon: '🖼️' };\n    }\n    if (type === 'application/pdf' || ext === 'pdf') {\n      return { label: 'PDF', color: '#ef4444', icon: '📄' };\n    }\n    if (type.includes('word') || type.includes('document') || ['doc', 'docx', 'txt', 'rtf'].includes(ext)) {\n      return { label: 'DOC', color: '#2563eb', icon: '📝' };\n    }\n    if (type.includes('sheet') || type.includes('excel') || ['xls', 'xlsx', 'csv'].includes(ext)) {\n      return { label: 'XLS', color: '#16a34a', icon: '📊' };\n    }\n    if (type.includes('presentation') || type.includes('powerpoint') || ['ppt', 'pptx'].includes(ext)) {\n      return { label: 'PPT', color: '#ea580c', icon: '🎭' };\n    }\n    if (type.includes('zip') || type.includes('compressed') || type.includes('tar') || ['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) {\n      return { label: 'ZIP', color: '#7c3aed', icon: '📦' };\n    }\n    if (\n      type.includes('javascript') ||\n      type.includes('typescript') ||\n      type.includes('json') ||\n      ['js', 'ts', 'html', 'css', 'json', 'py', 'go', 'rs', 'cpp'].includes(ext)\n    ) {\n      return { label: 'CODE', color: '#0f172a', icon: '💻' };\n    }\n    if (type.startsWith('audio/') || ['mp3', 'wav', 'ogg', 'm4a'].includes(ext)) {\n      return { label: 'AUDIO', color: '#06b6d4', icon: '🎵' };\n    }\n    if (type.startsWith('video/') || ['mp4', 'mkv', 'avi', 'mov'].includes(ext)) {\n      return { label: 'VIDEO', color: '#6366f1', icon: '🎥' };\n    }\n    return { label: 'FILE', color: '#64748b', icon: '📁' };\n  }\n\n  private getObjectUrl(file: File): string {\n    if (this.objectUrlCache.has(file)) {\n      return this.objectUrlCache.get(file)!;\n    }\n    const url = URL.createObjectURL(file);\n    this.objectUrlCache.set(file, url);\n    return url;\n  }\n\n  private findOriginal(item: PreviewFileItem): any {\n    const list = this.files() || [];\n    // Search original items in the list\n    for (const f of list) {\n      if (f instanceof File) {\n        if (f === item.fileObject) return f;\n      } else {\n        if (f.id === item.id || (f.name === item.name && f.size === item.size)) {\n          return f;\n        }\n      }\n    }\n    return item;\n  }\n\n  private formatBytes(bytes: number, decimals: number = 2): string {\n    if (bytes === 0) return '0 Bytes';\n    const k = 1024;\n    const dm = decimals < 0 ? 0 : decimals;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n  }\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  output,\n  model,\n  computed,\n  viewChildren,\n  ElementRef,\n  effect,\n  signal,\n  HostListener,\n  OnInit\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface SegmentedOption {\n  label: string;\n  value: any;\n  badge?: string;\n}\n\n@Component({\n  selector: 'ngx-segmented-control',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-segmented-control\"\n      [class.dark]=\"theme() === 'dark'\"\n      [class.disabled]=\"disabled()\"\n      [class.auto-width]=\"!equalWidth()\"\n      [class]=\"variantClass()\"\n      [attr.id]=\"id()\"\n    >\n      <!-- Sliding Highlight Backdrop indicator -->\n      @if (selectedIndex() >= 0) {\n        <div\n          class=\"ngx-segmented-control__indicator\"\n          [style.width.px]=\"indicatorWidth()\"\n          [style.transform]=\"'translateX(' + indicatorLeft() + 'px)'\"\n          [class]=\"variant()\"\n        ></div>\n      }\n\n      <!-- Option buttons -->\n      @for (opt of options(); track opt.value; let idx = $index) {\n        <button\n          #optionBtn\n          class=\"ngx-segmented-control__option\"\n          [class.selected]=\"idx === selectedIndex()\"\n          (click)=\"selectOption(opt.value)\"\n          [disabled]=\"disabled()\"\n          [style.flex]=\"equalWidth() ? '1 1 0%' : '0 0 auto'\"\n          type=\"button\"\n        >\n          <span class=\"ngx-segmented-control__label-text\">{{ opt.label }}</span>\n          @if (opt.badge) {\n            <span class=\"ngx-segmented-control__badge\">{{ opt.badge }}</span>\n          }\n        </button>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: inline-block;\n      min-width: 200px;\n    }\n\n    .ngx-segmented-control {\n      position: relative;\n      display: inline-flex;\n      width: 100%;\n      background: rgba(15, 23, 42, 0.05);\n      padding: 3px;\n      border-radius: 12px;\n      box-sizing: border-box;\n      user-select: none;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      border: 1px solid rgba(15, 23, 42, 0.04);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n    }\n\n    .ngx-segmented-control.dark {\n      background: rgba(30, 41, 59, 0.6);\n      border-color: rgba(255, 255, 255, 0.05);\n    }\n\n    .ngx-segmented-control.disabled {\n      opacity: 0.5;\n      pointer-events: none;\n    }\n\n    /* Active sliding indicator marker */\n    .ngx-segmented-control__indicator {\n      position: absolute;\n      top: 3px;\n      left: 0;\n      bottom: 3px;\n      background: #ffffff;\n      border-radius: 9px;\n      box-shadow: \n        0 2px 4px rgba(15, 23, 42, 0.04),\n        0 4px 10px rgba(15, 23, 42, 0.08);\n      transition: transform 0.28s cubic-bezier(0.25, 0.8, 0.25, 1), width 0.28s cubic-bezier(0.25, 0.8, 0.25, 1);\n      z-index: 1;\n    }\n\n    .ngx-segmented-control.dark .ngx-segmented-control__indicator.default {\n      background: rgba(255, 255, 255, 0.08);\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      box-shadow: none;\n    }\n\n    /* Option tabs buttons */\n    .ngx-segmented-control__option {\n      position: relative;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n      padding: 6px 16px;\n      font-size: 13px;\n      font-weight: 600;\n      color: #64748b;\n      background: transparent;\n      border: none;\n      cursor: pointer;\n      z-index: 2;\n      transition: color 0.2s ease, transform 0.1s ease;\n      outline: none;\n      height: 32px;\n      box-sizing: border-box;\n    }\n\n    .ngx-segmented-control__option:hover:not([disabled]) {\n      color: #0f172a;\n    }\n\n    .ngx-segmented-control__option:active:not([disabled]) {\n      transform: scale(0.97);\n    }\n\n    .ngx-segmented-control__option.selected {\n      color: #0f172a;\n    }\n\n    .ngx-segmented-control.dark .ngx-segmented-control__option {\n      color: #94a3b8;\n    }\n\n    .ngx-segmented-control.dark .ngx-segmented-control__option:hover:not([disabled]) {\n      color: #cbd5e1;\n    }\n\n    .ngx-segmented-control.dark .ngx-segmented-control__option.selected {\n      color: #ffffff;\n    }\n\n    /* Badge indicators */\n    .ngx-segmented-control__badge {\n      font-size: 9px;\n      padding: 1px 6px;\n      border-radius: 99px;\n      background: rgba(15, 23, 42, 0.08);\n      color: #475569;\n      font-weight: 750;\n      transition: all 0.2s ease;\n    }\n\n    .ngx-segmented-control__option.selected .ngx-segmented-control__badge {\n      background: rgba(15, 23, 42, 0.12);\n      color: #0f172a;\n    }\n\n    .ngx-segmented-control.dark .ngx-segmented-control__badge {\n      background: rgba(255, 255, 255, 0.08);\n      color: #cbd5e1;\n    }\n\n    .ngx-segmented-control.dark .ngx-segmented-control__option.selected .ngx-segmented-control__badge {\n      background: rgba(255, 255, 255, 0.16);\n      color: #ffffff;\n    }\n\n    /* ── Variants accent colors ── */\n    .ngx-segmented-control__indicator.primary {\n      background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n    }\n    .ngx-segmented-control__indicator.success {\n      background: linear-gradient(135deg, #34d399 0%, #10b981 100%);\n    }\n    .ngx-segmented-control__indicator.danger {\n      background: linear-gradient(135deg, #f87171 0%, #ef4444 100%);\n    }\n    .ngx-segmented-control__indicator.warning {\n      background: linear-gradient(135deg, #fbbf24 0%, #d97706 100%);\n    }\n    .ngx-segmented-control__indicator.info {\n      background: linear-gradient(135deg, #38bdf8 0%, #0284c7 100%);\n    }\n\n    .ngx-segmented-control__indicator.primary,\n    .ngx-segmented-control__indicator.success,\n    .ngx-segmented-control__indicator.danger,\n    .ngx-segmented-control__indicator.warning,\n    .ngx-segmented-control__indicator.info {\n      box-shadow: 0 4px 12px rgba(79, 70, 229, 0.15);\n      border: none;\n    }\n\n    /* Text colors matching colored indicators */\n    .ngx-segmented-control-variant-active .ngx-segmented-control__option.selected {\n      color: #ffffff !important;\n    }\n\n    .ngx-segmented-control-variant-active .ngx-segmented-control__option.selected .ngx-segmented-control__badge {\n      background: rgba(255, 255, 255, 0.2) !important;\n      color: #ffffff !important;\n    }\n  `]\n})\nexport class SegmentedControlComponent implements OnInit {\n  // Inputs\n  options = input<SegmentedOption[]>([]);\n  value = model<any>(null); // Signal-based model for two-way binding\n  disabled = input<boolean>(false);\n  theme = input<'light' | 'dark'>('light');\n  variant = input<'default' | 'primary' | 'success' | 'danger' | 'warning' | 'info'>('default');\n  equalWidth = input<boolean>(true);\n  id = input<string>('ngx-segmented-' + Math.random().toString(36).substring(2, 9));\n\n  // Outputs\n  valueChange = output<any>();\n\n  // Sliding Indicator State Signals\n  indicatorWidth = signal<number>(0);\n  indicatorLeft = signal<number>(0);\n\n  // View Children query to access button native elements\n  optionElements = viewChildren<ElementRef<HTMLButtonElement>>('optionBtn');\n\n  // Computeds\n  selectedIndex = computed(() => {\n    const val = this.value();\n    return this.options().findIndex(opt => opt.value === val);\n  });\n\n  variantClass = computed(() => {\n    let classes = '';\n    if (this.variant() !== 'default') {\n      classes += ' ngx-segmented-control-variant-active';\n    }\n    return classes;\n  });\n\n  constructor() {\n    // Reactively update indicator coordinates when option query or selection shifts\n    effect(() => {\n      this.updateIndicator();\n    });\n  }\n\n  ngOnInit(): void {\n    // Initial update trigger\n    setTimeout(() => this.updateIndicator(), 50);\n  }\n\n  @HostListener('window:resize')\n  onResize() {\n    this.updateIndicator();\n  }\n\n  updateIndicator() {\n    const idx = this.selectedIndex();\n    const buttons = this.optionElements();\n    if (idx >= 0 && buttons && buttons[idx]) {\n      const btnEl = buttons[idx].nativeElement;\n      this.indicatorWidth.set(btnEl.offsetWidth);\n      this.indicatorLeft.set(btnEl.offsetLeft);\n    }\n  }\n\n  selectOption(val: any) {\n    if (this.disabled()) return;\n    this.value.set(val);\n    this.valueChange.emit(val);\n    setTimeout(() => this.updateIndicator(), 0);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, input, output, signal } from '@angular/core';\n\nexport interface FormBuilderOption {\n  label: string;\n  value: string | number | boolean;\n}\n\nexport interface FormBuilderCondition {\n  field: string;\n  operator: 'eq' | 'neq' | 'contains' | 'gt' | 'lt' | 'isTrue' | 'isFalse';\n  value?: unknown;\n  action: 'show' | 'hide' | 'enable' | 'disable';\n}\n\nexport interface FormBuilderField {\n  key: string;\n  label: string;\n  type?:\n    | 'text' | 'email' | 'password' | 'number' | 'textarea' | 'select' | 'checkbox'\n    | 'date' | 'date-range' | 'time' | 'file-upload' | 'multi-select' | 'rating'\n    | 'color-picker' | 'switch' | 'segmented-control' | 'signature-pad' | 'slider' | 'range'\n    | 'autocomplete' | 'tag-input';\n  placeholder?: string;\n  required?: boolean;\n  disabled?: boolean;\n  options?: FormBuilderOption[];\n  value?: unknown;\n  min?: number | string;\n  max?: number | string;\n  step?: number;\n  colSpan?: number; // 1 to 12 column span\n  conditions?: FormBuilderCondition[];\n  hint?: string;\n}\n\n@Component({\n  selector: 'ngx-form-builder',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <form class=\"ngx-form-builder\" (submit)=\"submit($event)\">\n      <div class=\"form-grid\">\n        @for (field of visibleFields(); track field.key) {\n          <div\n            class=\"form-field-wrap\"\n            [style.grid-column]=\"'span ' + (field.colSpan || 12)\"\n            [class.checkbox-field]=\"field.type === 'checkbox'\"\n          >\n            @if (field.type !== 'checkbox') {\n              <label class=\"field-label\" [attr.for]=\"field.key\">\n                {{ field.label }}@if (field.required) { <strong class=\"req-star\">*</strong> }\n              </label>\n            }\n\n            @switch (field.type || 'text') {\n              @case ('textarea') {\n                <textarea\n                  [id]=\"field.key\"\n                  [placeholder]=\"field.placeholder || ''\"\n                  [required]=\"field.required || false\"\n                  [disabled]=\"isFieldDisabled(field)\"\n                  [value]=\"valueFor(field.key)\"\n                  (input)=\"updateValue(field.key, $any($event.target).value)\"\n                ></textarea>\n              }\n              @case ('select') {\n                <select\n                  [id]=\"field.key\"\n                  [required]=\"field.required || false\"\n                  [disabled]=\"isFieldDisabled(field)\"\n                  [value]=\"valueFor(field.key)\"\n                  (change)=\"updateValue(field.key, readOptionValue(field, $any($event.target).value))\"\n                >\n                  <option value=\"\">Select...</option>\n                  @for (option of field.options || []; track option.value) {\n                    <option [value]=\"option.value\">{{ option.label }}</option>\n                  }\n                </select>\n              }\n              @case ('checkbox') {\n                <label class=\"checkbox-label\">\n                  <input\n                    type=\"checkbox\"\n                    [id]=\"field.key\"\n                    [checked]=\"!!valueFor(field.key)\"\n                    [required]=\"field.required || false\"\n                    [disabled]=\"isFieldDisabled(field)\"\n                    (change)=\"updateValue(field.key, $any($event.target).checked)\"\n                  />\n                  <span class=\"field-label\">{{ field.label }}@if (field.required) { <strong class=\"req-star\">*</strong> }</span>\n                </label>\n              }\n              @case ('switch') {\n                <label class=\"switch-wrap\">\n                  <input\n                    type=\"checkbox\"\n                    [id]=\"field.key\"\n                    [checked]=\"!!valueFor(field.key)\"\n                    [disabled]=\"isFieldDisabled(field)\"\n                    (change)=\"updateValue(field.key, $any($event.target).checked)\"\n                  />\n                  <span class=\"switch-slider\"></span>\n                  <span class=\"field-label\">{{ field.label }}</span>\n                </label>\n              }\n              @case ('range') {\n              }\n              @case ('color-picker') {\n                <input\n                  type=\"color\"\n                  [id]=\"field.key\"\n                  [value]=\"valueFor(field.key) || '#4f46e5'\"\n                  [disabled]=\"isFieldDisabled(field)\"\n                  (change)=\"updateValue(field.key, $any($event.target).value)\"\n                />\n              }\n              @default {\n                <input\n                  [id]=\"field.key\"\n                  [type]=\"field.type || 'text'\"\n                  [placeholder]=\"field.placeholder || ''\"\n                  [required]=\"field.required || false\"\n                  [disabled]=\"isFieldDisabled(field)\"\n                  [min]=\"field.min ?? null\"\n                  [max]=\"field.max ?? null\"\n                  [step]=\"field.step ?? null\"\n                  [value]=\"valueFor(field.key)\"\n                  (input)=\"updateValue(field.key, coerceInputValue(field, $any($event.target).value))\"\n                />\n              }\n            }\n\n            @if (field.hint) {\n              <div class=\"field-hint\">{{ field.hint }}</div>\n            }\n          </div>\n        }\n      </div>\n\n      @if (showSubmit()) {\n        <div class=\"form-actions\">\n          <button type=\"submit\" class=\"submit-btn\">{{ submitLabel() }}</button>\n        </div>\n      }\n    </form>\n  `,\n  styles: [`\n    :host { display: block; }\n    .ngx-form-builder { font-family: var(--ngx-font-family, inherit); color: var(--text-primary, #0f172a); }\n    .form-grid { display: grid; grid-template-columns: repeat(12, 1fr); gap: 14px; }\n    .form-field-wrap { display: flex; flex-direction: column; gap: 6px; }\n    .field-label { font-size: 12px; font-weight: 700; color: var(--ngx-input-label, #475569); }\n    .req-star { color: var(--ngx-input-error, #dc2626); margin-left: 2px; }\n    .checkbox-label { display: flex; align-items: center; gap: 8px; cursor: pointer; }\n    .field-hint { font-size: 11px; color: #64748b; }\n    input:not([type=\"checkbox\"]):not([type=\"color\"]), textarea, select {\n      width: 100%; border: 1px solid var(--ngx-input-border, #cbd5e1);\n      border-radius: var(--ngx-input-radius, 8px); background: var(--ngx-input-bg, #ffffff);\n      color: var(--ngx-input-text, #0f172a); font: inherit; font-size: 13px; padding: 9px 11px;\n      outline: none; transition: all 0.15s;\n    }\n    input:focus, textarea:focus, select:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.12);\n    }\n    textarea { min-height: 80px; resize: vertical; }\n    .form-actions { margin-top: 18px; display: flex; justify-content: flex-end; }\n    .submit-btn {\n      padding: 9px 20px; font-size: 13px; font-weight: 700; border-radius: 8px;\n      border: none; background: var(--ngx-btn-primary-bg, #4f46e5); color: #ffffff;\n      cursor: pointer; transition: all 0.2s;\n    }\n    .submit-btn:hover { background: var(--ngx-btn-primary-hover, #4338ca); }\n\n    /* Switch styling */\n    .switch-wrap { display: flex; align-items: center; gap: 10px; cursor: pointer; }\n    .switch-wrap input { display: none; }\n    .switch-slider {\n      width: 36px; height: 20px; background: #cbd5e1; border-radius: 20px;\n      position: relative; transition: background 0.2s;\n    }\n    .switch-slider::before {\n      content: ''; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px;\n      background: #ffffff; border-radius: 50%; transition: transform 0.2s;\n    }\n    .switch-wrap input:checked + .switch-slider { background: #4f46e5; }\n    .switch-wrap input:checked + .switch-slider::before { transform: translateX(16px); }\n  `]\n})\nexport class FormBuilderComponent {\n  fields = input<FormBuilderField[]>([]);\n  value = input<Record<string, unknown>>({});\n  submitLabel = input<string>('Submit');\n  showSubmit = input<boolean>(true);\n\n  formSubmit = output<Record<string, unknown>>();\n  formChange = output<Record<string, unknown>>();\n\n  private formState = signal<Record<string, unknown>>({});\n\n  visibleFields = computed(() => {\n    const allFields = this.fields();\n    const state = this.formState();\n\n    return allFields.filter(f => {\n      if (!f.conditions || f.conditions.length === 0) return true;\n      for (const cond of f.conditions) {\n        const val = state[cond.field];\n        const match = this.evaluateCondition(val, cond);\n        if (cond.action === 'hide' && match) return false;\n        if (cond.action === 'show' && !match) return false;\n      }\n      return true;\n    });\n  });\n\n  constructor() {\n    effect(() => {\n      const initial = this.value() || {};\n      const fields = this.fields();\n      const next: Record<string, unknown> = { ...initial };\n\n      fields.forEach(f => {\n        if (next[f.key] === undefined && f.value !== undefined) {\n          next[f.key] = f.value;\n        }\n      });\n\n      this.formState.set(next);\n    }, { allowSignalWrites: true });\n  }\n\n  valueFor(key: string): unknown {\n    const val = this.formState()[key];\n    return val ?? '';\n  }\n\n  isFieldDisabled(field: FormBuilderField): boolean {\n    if (field.disabled) return true;\n    if (!field.conditions) return false;\n\n    const state = this.formState();\n    for (const cond of field.conditions) {\n      const val = state[cond.field];\n      const match = this.evaluateCondition(val, cond);\n      if (cond.action === 'disable' && match) return true;\n      if (cond.action === 'enable' && !match) return true;\n    }\n    return false;\n  }\n\n  updateValue(key: string, val: unknown): void {\n    const updated = { ...this.formState(), [key]: val };\n    this.formState.set(updated);\n    this.formChange.emit(updated);\n  }\n\n  submit(event: Event): void {\n    event.preventDefault();\n    this.formSubmit.emit(this.formState());\n  }\n\n  coerceInputValue(field: FormBuilderField, val: string): unknown {\n    if (field.type === 'number') {\n      if (val === '') return null;\n      const num = Number(val);\n      return isNaN(num) ? null : num;\n    }\n    return val;\n  }\n\n  readOptionValue(field: FormBuilderField, valStr: string): unknown {\n    const opt = field.options?.find(o => String(o.value) === valStr);\n    return opt ? opt.value : valStr;\n  }\n\n  private evaluateCondition(actualVal: unknown, cond: FormBuilderCondition): boolean {\n    switch (cond.operator) {\n      case 'eq':\n        return String(actualVal) === String(cond.value);\n      case 'neq':\n        return String(actualVal) !== String(cond.value);\n      case 'contains':\n        return String(actualVal || '').toLowerCase().includes(String(cond.value || '').toLowerCase());\n      case 'gt':\n        return Number(actualVal) > Number(cond.value);\n      case 'lt':\n        return Number(actualVal) < Number(cond.value);\n      case 'isTrue':\n        return actualVal === true || String(actualVal) === 'true';\n      case 'isFalse':\n        return actualVal === false || String(actualVal) === 'false';\n      default:\n        return false;\n    }\n  }\n}\n","import { Component, computed, signal, input, output, effect, viewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FormBuilderField, FormBuilderOption, FormBuilderComponent } from './form-builder.component';\n\n@Component({\n  selector: 'ngx-form-designer',\n  standalone: true,\n  imports: [CommonModule, FormsModule, FormBuilderComponent],\n  template: `\n    <div class=\"ngx-form-designer-container\" [class.dark-mode]=\"theme() === 'dark'\">\n      \n      <!-- Top Actions Bar -->\n      <div class=\"designer-header\">\n        <h3 class=\"designer-title\">Visual Form Designer</h3>\n        <div class=\"designer-header-actions\">\n          <button class=\"header-action-btn primary\" (click)=\"importSchemaPopupOpen.set(true)\">📥 Import Schema</button>\n          <button class=\"header-action-btn\" (click)=\"clearAll()\">🗑️ Clear All</button>\n        </div>\n      </div>\n\n      <div class=\"designer-workspace\">\n        <!-- 1. Toolbox Panel -->\n        <div class=\"designer-panel toolbox-panel\">\n          <h4 class=\"panel-title\">Toolbox</h4>\n          <p class=\"panel-subtitle\">Drag fields to the canvas</p>\n          \n          <div class=\"toolbox-items\">\n            @for (item of toolboxFields; track item.type) {\n              <div \n                class=\"toolbox-card\" \n                draggable=\"true\" \n                (dragstart)=\"onToolboxDragStart($event, item)\"\n                (dragend)=\"onDragEnd()\"\n              >\n                <span class=\"toolbox-icon\">{{ getIconForType(item.type) }}</span>\n                <span class=\"toolbox-label\">{{ item.label }}</span>\n              </div>\n            }\n          </div>\n        </div>\n\n        <!-- 2. Interactive Canvas -->\n        <div class=\"designer-panel canvas-panel\">\n          <div class=\"panel-header\">\n            <h4 class=\"panel-title\">Canvas</h4>\n            <span class=\"field-count-badge\">{{ designerFields().length }} Fields</span>\n          </div>\n\n          <div \n            class=\"canvas-dropzone\" \n            [class.drag-over]=\"isDraggingOverCanvas && isDraggingFromToolbox\"\n            (dragover)=\"onCanvasDragOver($event)\"\n            (dragleave)=\"onCanvasDragLeave()\"\n            (drop)=\"onCanvasDrop($event)\"\n          >\n            @if (designerFields().length === 0) {\n              <div class=\"canvas-placeholder\">\n                <span class=\"placeholder-icon\">🎯</span>\n                <p class=\"placeholder-text\">Drag and drop fields here to start designing your form</p>\n              </div>\n            } @else {\n              <div class=\"canvas-fields-list\">\n                @for (field of designerFields(); track field.key; let idx = $index) {\n                  <div \n                    class=\"canvas-field-row\"\n                    [class.selected]=\"selectedField()?.key === field.key\"\n                    [class.drag-over]=\"dragOverIndex() === idx\"\n                    [class.dragging]=\"draggingIndex() === idx\"\n                    draggable=\"true\"\n                    (dragstart)=\"onCanvasFieldDragStart($event, idx)\"\n                    (dragover)=\"onCanvasFieldDragOver($event, idx)\"\n                    (dragleave)=\"onCanvasFieldDragLeave()\"\n                    (drop)=\"onCanvasFieldDrop($event, idx)\"\n                    (dragend)=\"onDragEnd()\"\n                    (click)=\"selectField(field)\"\n                  >\n                    <!-- Drag handle -->\n                    <div class=\"field-drag-handle\">&#8942;&#8942;</div>\n                    \n                    <!-- Content -->\n                    <div class=\"field-details\">\n                      <div class=\"field-header\">\n                        <span class=\"field-type-badge\">{{ field.type || 'text' }}</span>\n                        <span class=\"field-key-badge\">{{ field.key }}</span>\n                      </div>\n                      <span class=\"field-label-text\">{{ field.label }} @if (field.required) { <strong class=\"req-star\">*</strong> }</span>\n                      @if (field.placeholder) {\n                        <span class=\"field-placeholder-text\">Placeholder: \"{{ field.placeholder }}\"</span>\n                      }\n                    </div>\n\n                    <!-- Delete button -->\n                    <button class=\"delete-field-btn\" (click)=\"deleteField(field, $event)\" title=\"Delete Field\">✕</button>\n                  </div>\n                }\n              </div>\n            }\n          </div>\n        </div>\n\n        <!-- 3. Inspector Settings / Schema Panel -->\n        <div class=\"designer-panel inspector-panel\">\n          <div class=\"inspector-tabs\">\n            <button class=\"tab-btn\" [class.active]=\"activeTab() === 'properties'\" (click)=\"activeTab.set('properties')\">Properties</button>\n            <button class=\"tab-btn\" [class.active]=\"activeTab() === 'schema'\" (click)=\"activeTab.set('schema')\">JSON Schema</button>\n            <button class=\"tab-btn\" [class.active]=\"activeTab() === 'preview'\" (click)=\"activeTab.set('preview')\">Live Preview</button>\n          </div>\n\n          <!-- Properties Inspector Tab -->\n          @if (activeTab() === 'properties') {\n            <div class=\"tab-content properties-content\">\n              @if (!selectedField()) {\n                <div class=\"inspector-placeholder\">\n                  <span>⚙️</span>\n                  <p>Select a field on the canvas to configure its properties.</p>\n                </div>\n              } @else {\n                <div class=\"properties-form\">\n                  <label class=\"inspector-field\">\n                    <span class=\"inspector-label\">Unique Key</span>\n                    <input type=\"text\" [(ngModel)]=\"selectedField()!.key\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                  </label>\n\n                  <label class=\"inspector-field\">\n                    <span class=\"inspector-label\">Field Label</span>\n                    <input type=\"text\" [(ngModel)]=\"selectedField()!.label\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                  </label>\n\n                  @if (selectedField()!.type !== 'checkbox') {\n                    <label class=\"inspector-field\">\n                      <span class=\"inspector-label\">Placeholder Text</span>\n                      <input type=\"text\" [(ngModel)]=\"selectedField()!.placeholder\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                    </label>\n                  }\n\n                  @if (selectedField()!.type === 'number') {\n                    <div class=\"properties-row\">\n                      <label class=\"inspector-field\">\n                        <span class=\"inspector-label\">Min Value</span>\n                        <input type=\"number\" [(ngModel)]=\"selectedField()!.min\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                      </label>\n                      <label class=\"inspector-field\">\n                        <span class=\"inspector-label\">Max Value</span>\n                        <input type=\"number\" [(ngModel)]=\"selectedField()!.max\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                      </label>\n                    </div>\n                    <label class=\"inspector-field\">\n                      <span class=\"inspector-label\">Step</span>\n                      <input type=\"number\" [(ngModel)]=\"selectedField()!.step\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                    </label>\n                  }\n\n                  <div class=\"checkbox-row\">\n                    <label class=\"inspector-checkbox\">\n                      <input type=\"checkbox\" [(ngModel)]=\"selectedField()!.required\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                      <span>Required Field</span>\n                    </label>\n\n                    <label class=\"inspector-checkbox\">\n                      <input type=\"checkbox\" [(ngModel)]=\"selectedField()!.disabled\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                      <span>Disabled Field</span>\n                    </label>\n                  </div>\n\n                  <!-- Options list editor (for Select fields) -->\n                  @if (selectedField()!.type === 'select') {\n                    <div class=\"options-editor-section\">\n                      <div class=\"options-header\">\n                        <span class=\"inspector-label\">Dropdown Options</span>\n                        <button class=\"add-opt-btn\" (click)=\"addOption()\">➕ Add</button>\n                      </div>\n                      \n                      <div class=\"options-list\">\n                        @for (opt of selectedField()!.options || []; track $index; let oidx = $index) {\n                          <div class=\"option-edit-row\">\n                            <input type=\"text\" placeholder=\"Label\" [(ngModel)]=\"opt.label\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                            <input type=\"text\" placeholder=\"Value\" [(ngModel)]=\"opt.value\" (ngModelChange)=\"onFieldPropertyChange()\" />\n                            <button class=\"delete-opt-btn\" (click)=\"deleteOption(oidx)\" title=\"Delete Option\">✕</button>\n                          </div>\n                        }\n                      </div>\n                    </div>\n                  }\n                </div>\n              }\n            </div>\n          }\n\n          <!-- JSON Schema Tab -->\n          @if (activeTab() === 'schema') {\n            <div class=\"tab-content schema-content\">\n              <div class=\"schema-actions\">\n                <button class=\"schema-action-btn\" (click)=\"copySchema()\">📋 Copy Schema</button>\n              </div>\n              <pre class=\"schema-code-block\"><code>{{ schemaJsonString() }}</code></pre>\n            </div>\n          }\n\n          <!-- Live Preview Tab -->\n          @if (activeTab() === 'preview') {\n            <div class=\"tab-content preview-content\">\n              <div class=\"preview-card\">\n                <ngx-form-builder \n                  #previewForm\n                  [fields]=\"designerFields()\"\n                  [showSubmit]=\"true\"\n                  submitLabel=\"Test Submit\"\n                  (formSubmit)=\"onPreviewSubmit($event)\"\n                ></ngx-form-builder>\n              </div>\n              <div class=\"copilot-container\" style=\"margin-top: 16px;\">\n                <ng-content select=\"[copilot]\"></ng-content>\n              </div>\n              @if (previewSubmitData()) {\n                <div class=\"preview-submit-banner\">\n                  <span class=\"banner-title\">Form Submitted Data:</span>\n                  <pre><code>{{ previewSubmitData() | json }}</code></pre>\n                </div>\n              }\n            </div>\n          }\n        </div>\n      </div>\n\n      <!-- Popups / Modals -->\n      @if (importSchemaPopupOpen()) {\n        <div class=\"designer-modal-overlay\">\n          <div class=\"designer-modal-card\">\n            <h4 class=\"modal-title\">Import JSON Schema</h4>\n            <p class=\"modal-subtitle\">Paste a valid FormBuilderField[] JSON array below:</p>\n            <textarea \n              class=\"modal-textarea\" \n              placeholder=\"[ { &quot;key&quot;: &quot;firstname&quot;, &quot;label&quot;: &quot;First Name&quot;, &quot;type&quot;: &quot;text&quot; } ]\"\n              [(ngModel)]=\"importSchemaText\"\n            ></textarea>\n            @if (importError()) {\n              <div class=\"modal-error-banner\">{{ importError() }}</div>\n            }\n            <div class=\"modal-actions\">\n              <button class=\"modal-action-btn cancel\" (click)=\"importSchemaPopupOpen.set(false)\">Cancel</button>\n              <button class=\"modal-action-btn primary\" (click)=\"importSchema()\">Import</button>\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-form-designer-container {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      min-height: 580px;\n      background: var(--ngx-designer-bg, #f8fafc);\n      color: var(--ngx-designer-text, #0f172a);\n      font-family: var(--ngx-font-family, sans-serif);\n      border-radius: 12px;\n      overflow: hidden;\n      border: 1px solid var(--ngx-designer-border, #e2e8f0);\n    }\n    \n    /* Dark mode overrides */\n    .ngx-form-designer-container.dark-mode {\n      --ngx-designer-bg: #0f172a;\n      --ngx-designer-text: #f8fafc;\n      --ngx-designer-border: #334155;\n    }\n    \n    .designer-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 14px 20px;\n      border-bottom: 1px solid var(--ngx-designer-border, #e2e8f0);\n      background: var(--ngx-designer-bg, #ffffff);\n    }\n    .designer-title {\n      margin: 0;\n      font-size: 16px;\n      font-weight: 700;\n    }\n    .designer-header-actions {\n      display: flex;\n      gap: 10px;\n    }\n    .header-action-btn {\n      border: 1px solid var(--ngx-designer-border, #e2e8f0);\n      background: transparent;\n      padding: 7px 14px;\n      border-radius: 6px;\n      font-size: 12px;\n      font-weight: 600;\n      color: inherit;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .header-action-btn:hover {\n      background: rgba(0,0,0,0.03);\n    }\n    .header-action-btn.primary {\n      background: var(--primary-color, #4f46e5);\n      color: #fff;\n      border: none;\n    }\n    .header-action-btn.primary:hover {\n      background: var(--primary-hover, #4338ca);\n    }\n\n    .designer-workspace {\n      display: grid;\n      grid-template-columns: 240px 1fr 340px;\n      flex: 1;\n      height: calc(100% - 60px);\n      overflow: hidden;\n    }\n    \n    @media (max-width: 950px) {\n      .designer-workspace {\n        grid-template-columns: 200px 1fr;\n      }\n      .inspector-panel {\n        grid-column: 1 / span 2;\n        border-top: 1px solid var(--ngx-designer-border, #e2e8f0);\n        height: auto;\n      }\n    }\n\n    .designer-panel {\n      display: flex;\n      flex-direction: column;\n      overflow: hidden;\n      background: var(--ngx-designer-panel-bg, #ffffff);\n    }\n    .dark-mode .designer-panel {\n      --ngx-designer-panel-bg: #1e293b;\n    }\n    \n    .toolbox-panel {\n      border-right: 1px solid var(--ngx-designer-border, #e2e8f0);\n      padding: 16px;\n    }\n    .panel-title {\n      margin: 0;\n      font-size: 14px;\n      font-weight: 700;\n    }\n    .panel-subtitle {\n      margin: 4px 0 16px;\n      font-size: 11px;\n      opacity: 0.6;\n    }\n    .toolbox-items {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      overflow-y: auto;\n    }\n    .toolbox-card {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      padding: 10px 12px;\n      border: 1px dashed var(--ngx-designer-border, #cbd5e1);\n      border-radius: 8px;\n      cursor: grab;\n      font-size: 12px;\n      font-weight: 600;\n      transition: all 0.2s;\n    }\n    .toolbox-card:hover {\n      border-color: var(--primary-color, #4f46e5);\n      background: rgba(79,70,229,0.03);\n    }\n    .toolbox-icon {\n      font-size: 16px;\n    }\n\n    .canvas-panel {\n      border-right: 1px solid var(--ngx-designer-border, #e2e8f0);\n      background: var(--ngx-designer-canvas-bg, #f1f5f9);\n      padding: 16px;\n    }\n    .dark-mode .canvas-panel {\n      --ngx-designer-canvas-bg: #0f172a;\n    }\n    .panel-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n    }\n    .field-count-badge {\n      font-size: 10px;\n      font-weight: 700;\n      background: rgba(0,0,0,0.06);\n      padding: 3px 8px;\n      border-radius: 12px;\n    }\n    .dark-mode .field-count-badge {\n      background: rgba(255,255,255,0.08);\n    }\n\n    .canvas-dropzone {\n      flex: 1;\n      border: 2px dashed var(--ngx-designer-border, #cbd5e1);\n      border-radius: 10px;\n      background: var(--ngx-designer-panel-bg, #ffffff);\n      padding: 16px;\n      overflow-y: auto;\n      transition: all 0.2s;\n      min-height: 250px;\n    }\n    .canvas-dropzone.drag-over {\n      border-color: var(--primary-color, #4f46e5);\n      background: rgba(79,70,229,0.02);\n    }\n    .canvas-placeholder {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      height: 100%;\n      text-align: center;\n      opacity: 0.5;\n      padding: 40px 10px;\n    }\n    .placeholder-icon {\n      font-size: 32px;\n      margin-bottom: 10px;\n    }\n    .placeholder-text {\n      font-size: 12px;\n      max-width: 200px;\n      margin: 0;\n    }\n\n    .canvas-fields-list {\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n    }\n    .canvas-field-row {\n      display: flex;\n      align-items: center;\n      padding: 12px 14px;\n      border: 1px solid var(--ngx-designer-border, #e2e8f0);\n      border-radius: 8px;\n      background: var(--ngx-designer-panel-bg, #ffffff);\n      cursor: pointer;\n      position: relative;\n      transition: all 0.2s;\n    }\n    .canvas-field-row:hover {\n      box-shadow: 0 4px 12px rgba(0,0,0,0.04);\n      border-color: var(--ngx-designer-border-hover, #cbd5e1);\n    }\n    .canvas-field-row.selected {\n      border-color: var(--primary-color, #4f46e5);\n      box-shadow: 0 0 0 2px rgba(79,70,229,0.08);\n      background: rgba(79,70,229,0.01);\n    }\n    .canvas-field-row.dragging {\n      opacity: 0.4;\n      border-style: dashed;\n    }\n    .canvas-field-row.drag-over {\n      border-top: 2px solid var(--primary-color, #4f46e5);\n    }\n\n    .field-drag-handle {\n      cursor: grab;\n      margin-right: 12px;\n      opacity: 0.3;\n      font-size: 16px;\n      user-select: none;\n    }\n    .field-details {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n    }\n    .field-header {\n      display: flex;\n      gap: 8px;\n      align-items: center;\n      margin-bottom: 2px;\n    }\n    .field-type-badge {\n      font-size: 9px;\n      font-weight: 700;\n      text-transform: uppercase;\n      background: rgba(79,70,229,0.08);\n      color: var(--primary-color, #4f46e5);\n      padding: 1px 6px;\n      border-radius: 4px;\n    }\n    .field-key-badge {\n      font-size: 9px;\n      font-family: monospace;\n      opacity: 0.5;\n    }\n    .field-label-text {\n      font-size: 13px;\n      font-weight: 600;\n    }\n    .req-star {\n      color: #dc2626;\n    }\n    .field-placeholder-text {\n      font-size: 10px;\n      opacity: 0.5;\n    }\n    .delete-field-btn {\n      background: transparent;\n      border: 0;\n      color: #ef4444;\n      cursor: pointer;\n      font-size: 12px;\n      font-weight: bold;\n      opacity: 0.3;\n      padding: 6px;\n      border-radius: 4px;\n      transition: all 0.15s;\n    }\n    .canvas-field-row:hover .delete-field-btn {\n      opacity: 1;\n    }\n    .delete-field-btn:hover {\n      background: rgba(239,68,68,0.06);\n    }\n\n    .inspector-panel {\n      padding: 0;\n    }\n    .inspector-tabs {\n      display: flex;\n      border-bottom: 1px solid var(--ngx-designer-border, #e2e8f0);\n    }\n    .tab-btn {\n      flex: 1;\n      border: 0;\n      background: transparent;\n      padding: 12px 6px;\n      font-size: 11px;\n      font-weight: 700;\n      color: inherit;\n      opacity: 0.6;\n      cursor: pointer;\n      border-bottom: 2px solid transparent;\n      transition: all 0.2s;\n    }\n    .tab-btn:hover {\n      opacity: 0.9;\n    }\n    .tab-btn.active {\n      opacity: 1;\n      border-bottom-color: var(--primary-color, #4f46e5);\n      color: var(--primary-color, #4f46e5);\n    }\n\n    .tab-content {\n      flex: 1;\n      overflow-y: auto;\n      padding: 16px;\n    }\n    .inspector-placeholder {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      height: 100%;\n      text-align: center;\n      opacity: 0.5;\n      padding: 40px 10px;\n    }\n    .inspector-placeholder span {\n      font-size: 32px;\n      margin-bottom: 10px;\n    }\n    .inspector-placeholder p {\n      font-size: 11px;\n      margin: 0;\n      max-width: 180px;\n    }\n\n    .properties-form {\n      display: flex;\n      flex-direction: column;\n      gap: 14px;\n    }\n    .inspector-field {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n    .inspector-label {\n      font-size: 11px;\n      font-weight: 700;\n      opacity: 0.7;\n    }\n    .properties-form input[type=\"text\"],\n    .properties-form input[type=\"number\"] {\n      width: 100%;\n      border: 1px solid var(--ngx-designer-border, #cbd5e1);\n      border-radius: 6px;\n      background: transparent;\n      color: inherit;\n      padding: 8px 10px;\n      font-size: 12px;\n      outline: none;\n      transition: border-color 0.2s;\n    }\n    .properties-form input[type=\"text\"]:focus,\n    .properties-form input[type=\"number\"]:focus {\n      border-color: var(--primary-color, #4f46e5);\n    }\n    .properties-row {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 10px;\n    }\n    .checkbox-row {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n      margin: 6px 0;\n    }\n    .inspector-checkbox {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 11px;\n      font-weight: 600;\n      cursor: pointer;\n    }\n    .inspector-checkbox input {\n      accent-color: var(--primary-color, #4f46e5);\n    }\n\n    .options-editor-section {\n      border-top: 1px solid var(--ngx-designer-border, #e2e8f0);\n      padding-top: 14px;\n      margin-top: 6px;\n    }\n    .options-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 8px;\n    }\n    .add-opt-btn {\n      background: transparent;\n      border: 0;\n      color: var(--primary-color, #4f46e5);\n      font-size: 11px;\n      font-weight: 700;\n      cursor: pointer;\n    }\n    .options-list {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n    .option-edit-row {\n      display: grid;\n      grid-template-columns: 1fr 1fr 24px;\n      gap: 6px;\n      align-items: center;\n    }\n    .option-edit-row input {\n      border: 1px solid var(--ngx-designer-border, #cbd5e1);\n      border-radius: 4px;\n      padding: 5px 8px;\n      font-size: 11px;\n      background: transparent;\n      color: inherit;\n    }\n    .delete-opt-btn {\n      background: transparent;\n      border: 0;\n      color: #ef4444;\n      cursor: pointer;\n      font-size: 11px;\n      font-weight: bold;\n    }\n\n    .schema-actions {\n      display: flex;\n      justify-content: flex-end;\n      margin-bottom: 10px;\n    }\n    .schema-action-btn {\n      border: 0;\n      background: var(--primary-color, #4f46e5);\n      color: #fff;\n      border-radius: 5px;\n      padding: 6px 12px;\n      font-size: 11px;\n      font-weight: 600;\n      cursor: pointer;\n    }\n    .schema-code-block {\n      background: rgba(0,0,0,0.03);\n      padding: 12px;\n      border-radius: 8px;\n      font-family: monospace;\n      font-size: 11px;\n      overflow-x: auto;\n      white-space: pre-wrap;\n      margin: 0;\n    }\n    .dark-mode .schema-code-block {\n      background: rgba(255,255,255,0.03);\n    }\n\n    .preview-card {\n      border: 1px solid var(--ngx-designer-border, #e2e8f0);\n      border-radius: 8px;\n      padding: 16px;\n      background: var(--ngx-designer-panel-bg, #ffffff);\n    }\n    .preview-submit-banner {\n      margin-top: 14px;\n      padding: 10px 12px;\n      background: rgba(16,185,129,0.08);\n      border: 1px solid rgba(16,185,129,0.15);\n      border-radius: 6px;\n    }\n    .banner-title {\n      font-size: 11px;\n      font-weight: 700;\n      color: #059669;\n    }\n    .preview-submit-banner pre {\n      margin: 6px 0 0;\n      font-family: monospace;\n      font-size: 10px;\n      overflow-x: auto;\n    }\n\n    /* Modal / Popups styles */\n    .designer-modal-overlay {\n      position: fixed;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      background: rgba(0, 0, 0, 0.45);\n      backdrop-filter: blur(4px);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      z-index: 1000;\n    }\n    .designer-modal-card {\n      background: var(--ngx-designer-panel-bg, #ffffff);\n      border: 1px solid var(--ngx-designer-border, #e2e8f0);\n      border-radius: 12px;\n      padding: 20px;\n      width: 420px;\n      box-shadow: 0 10px 25px rgba(0,0,0,0.1);\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n    }\n    .modal-title {\n      margin: 0;\n      font-size: 14px;\n      font-weight: 700;\n    }\n    .modal-subtitle {\n      margin: 0;\n      font-size: 11px;\n      opacity: 0.6;\n    }\n    .modal-textarea {\n      width: 100%;\n      height: 140px;\n      border: 1px solid var(--ngx-designer-border, #cbd5e1);\n      border-radius: 6px;\n      background: transparent;\n      color: inherit;\n      padding: 8px 10px;\n      font-family: monospace;\n      font-size: 11px;\n      outline: none;\n      resize: none;\n    }\n    .modal-error-banner {\n      color: #dc2626;\n      font-size: 10px;\n      font-weight: 600;\n    }\n    .modal-actions {\n      display: flex;\n      justify-content: flex-end;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .modal-action-btn {\n      border: 0;\n      border-radius: 5px;\n      padding: 7px 14px;\n      font-size: 12px;\n      font-weight: 600;\n      cursor: pointer;\n    }\n    .modal-action-btn.cancel {\n      background: transparent;\n      border: 1px solid var(--ngx-designer-border, #cbd5e1);\n      color: inherit;\n    }\n    .modal-action-btn.primary {\n      background: var(--primary-color, #4f46e5);\n      color: #fff;\n    }\n  `]\n})\nexport class FormDesignerComponent {\n  theme = input<'light' | 'dark'>('light');\n  \n  schemaChange = output<FormBuilderField[]>();\n\n  designerFields = signal<FormBuilderField[]>([]);\n  selectedField = signal<FormBuilderField | null>(null);\n  activeTab = signal<'properties' | 'schema' | 'preview'>('properties');\n  \n  previewForm = viewChild<FormBuilderComponent>('previewForm');\n  \n  // Drag states\n  isDraggingFromToolbox = false;\n  draggingToolboxField: FormBuilderField | null = null;\n  isDraggingOverCanvas = false;\n  \n  draggingIndex = signal<number | null>(null);\n  dragOverIndex = signal<number | null>(null);\n\n  // Modal import states\n  importSchemaPopupOpen = signal<boolean>(false);\n  importSchemaText = '';\n  importError = signal<string | null>(null);\n\n  // Live preview submit state\n  previewSubmitData = signal<Record<string, unknown> | null>(null);\n\n  toolboxFields: FormBuilderField[] = [\n    { type: 'text', label: 'Short Text', key: 'text_field', placeholder: 'Enter text...' },\n    { type: 'email', label: 'Email', key: 'email_field', placeholder: 'Enter email address...' },\n    { type: 'password', label: 'Password', key: 'password_field', placeholder: 'Enter password...' },\n    { type: 'number', label: 'Number', key: 'number_field', placeholder: 'Enter number...' },\n    { type: 'textarea', label: 'Long Text', key: 'textarea_field', placeholder: 'Enter long text...' },\n    { type: 'select', label: 'Dropdown', key: 'select_field', placeholder: 'Select...', options: [{ label: 'Option 1', value: 'opt1' }, { label: 'Option 2', value: 'opt2' }] },\n    { type: 'checkbox', label: 'Checkbox', key: 'checkbox_field' },\n    { type: 'date', label: 'Date Picker', key: 'date_field' }\n  ];\n\n  schemaJsonString = computed(() => {\n    return JSON.stringify(this.designerFields(), null, 2);\n  });\n\n  constructor() {\n    // Sync notifications on change\n    effect(() => {\n      this.schemaChange.emit(this.designerFields());\n    });\n  }\n\n  getIconForType(type?: string): string {\n    switch (type) {\n      case 'text': return '🔤';\n      case 'email': return '📧';\n      case 'password': return '🔑';\n      case 'number': return '🔢';\n      case 'textarea': return '📝';\n      case 'select': return '▼';\n      case 'checkbox': return '☑️';\n      case 'date': return '📅';\n      default: return '📄';\n    }\n  }\n\n  // Toolbox drag handlers\n  onToolboxDragStart(event: DragEvent, field: FormBuilderField): void {\n    this.isDraggingFromToolbox = true;\n    this.draggingToolboxField = field;\n    if (event.dataTransfer) {\n      event.dataTransfer.setData('text/plain', 'toolbox');\n      event.dataTransfer.effectAllowed = 'copy';\n    }\n  }\n\n  // Canvas Drag/Drop handlers\n  onCanvasDragOver(event: DragEvent): void {\n    event.preventDefault();\n    if (this.isDraggingFromToolbox) {\n      this.isDraggingOverCanvas = true;\n      if (event.dataTransfer) {\n        event.dataTransfer.dropEffect = 'copy';\n      }\n    }\n  }\n\n  onCanvasDragLeave(): void {\n    this.isDraggingOverCanvas = false;\n  }\n\n  onCanvasDrop(event: DragEvent): void {\n    event.preventDefault();\n    this.isDraggingOverCanvas = false;\n\n    if (this.isDraggingFromToolbox && this.draggingToolboxField) {\n      const type = this.draggingToolboxField.type;\n      const count = this.designerFields().filter(f => f.type === type).length + 1;\n      const key = `${type}_${Math.random().toString(36).substr(2, 4)}`;\n      \n      const newField: FormBuilderField = {\n        ...this.draggingToolboxField,\n        key,\n        label: `${this.draggingToolboxField.label} ${count}`,\n        options: this.draggingToolboxField.options ? JSON.parse(JSON.stringify(this.draggingToolboxField.options)) : undefined\n      };\n\n      this.designerFields.update(arr => [...arr, newField]);\n      this.selectField(newField);\n    }\n    \n    this.onDragEnd();\n  }\n\n  // Canvas sorting / reordering drag handlers\n  onCanvasFieldDragStart(event: DragEvent, idx: number): void {\n    this.isDraggingFromToolbox = false;\n    this.draggingIndex.set(idx);\n    if (event.dataTransfer) {\n      event.dataTransfer.setData('text/plain', String(idx));\n      event.dataTransfer.effectAllowed = 'move';\n    }\n  }\n\n  onCanvasFieldDragOver(event: DragEvent, idx: number): void {\n    event.preventDefault();\n    if (this.draggingIndex() !== null && this.draggingIndex() !== idx) {\n      this.dragOverIndex.set(idx);\n    }\n  }\n\n  onCanvasFieldDragLeave(): void {\n    this.dragOverIndex.set(null);\n  }\n\n  onCanvasFieldDrop(event: DragEvent, targetIdx: number): void {\n    event.preventDefault();\n    const sourceIdx = this.draggingIndex();\n    this.dragOverIndex.set(null);\n\n    if (sourceIdx !== null && sourceIdx !== targetIdx) {\n      this.designerFields.update(arr => {\n        const next = [...arr];\n        const [moved] = next.splice(sourceIdx, 1);\n        next.splice(targetIdx, 0, moved);\n        return next;\n      });\n    }\n    \n    this.onDragEnd();\n  }\n\n  onDragEnd(): void {\n    this.isDraggingFromToolbox = false;\n    this.draggingToolboxField = null;\n    this.isDraggingOverCanvas = false;\n    this.draggingIndex.set(null);\n    this.dragOverIndex.set(null);\n  }\n\n  // Selection & mutations\n  selectField(field: FormBuilderField): void {\n    // Make a shallow copy of properties to support reactive form updates\n    this.selectedField.set(field);\n  }\n\n  onFieldPropertyChange(): void {\n    const selected = this.selectedField();\n    if (!selected) return;\n\n    this.designerFields.update(arr => {\n      return arr.map(f => (f.key === selected.key ? { ...selected } : f));\n    });\n  }\n\n  deleteField(field: FormBuilderField, event: MouseEvent): void {\n    event.stopPropagation();\n    this.designerFields.update(arr => arr.filter(f => f.key !== field.key));\n    if (this.selectedField()?.key === field.key) {\n      this.selectedField.set(null);\n    }\n  }\n\n  clearAll(): void {\n    if (confirm('Are you sure you want to delete all fields?')) {\n      this.designerFields.set([]);\n      this.selectedField.set(null);\n      this.previewSubmitData.set(null);\n    }\n  }\n\n  // Options list mutations\n  addOption(): void {\n    const selected = this.selectedField();\n    if (!selected) return;\n\n    const opts = selected.options || [];\n    const count = opts.length + 1;\n    const nextOpts: FormBuilderOption[] = [\n      ...opts,\n      { label: `Option ${count}`, value: `opt${count}` }\n    ];\n\n    selected.options = nextOpts;\n    this.onFieldPropertyChange();\n  }\n\n  deleteOption(idx: number): void {\n    const selected = this.selectedField();\n    if (!selected || !selected.options) return;\n\n    selected.options = selected.options.filter((_, i) => i !== idx);\n    this.onFieldPropertyChange();\n  }\n\n  // Schema copying\n  async copySchema(): Promise<void> {\n    try {\n      await navigator.clipboard.writeText(this.schemaJsonString());\n      alert('Schema copied to clipboard!');\n    } catch (err) {\n      console.error('Failed to copy schema:', err);\n    }\n  }\n\n  // Import Schema Dialog\n  importSchema(): void {\n    this.importError.set(null);\n    try {\n      const parsed = JSON.parse(this.importSchemaText);\n      if (!Array.isArray(parsed)) {\n        throw new Error('Schema must be a JSON array of FormBuilderField elements.');\n      }\n      \n      // Verify minimal elements\n      for (const item of parsed) {\n        if (!item.key || !item.label) {\n          throw new Error('Each field in the schema array must have at least \"key\" and \"label\" properties.');\n        }\n      }\n\n      this.designerFields.set(parsed);\n      this.selectedField.set(null);\n      this.importSchemaPopupOpen.set(false);\n      this.importSchemaText = '';\n    } catch (err: any) {\n      this.importError.set(err?.message || 'Invalid JSON syntax.');\n    }\n  }\n\n  // Live preview actions\n  onPreviewSubmit(data: Record<string, unknown>): void {\n    this.previewSubmitData.set(data);\n  }\n}\n","import { AfterViewInit, Component, ElementRef, ViewChild, input, output, signal } from '@angular/core';\n\n@Component({\n  selector: 'ngx-signature-pad',\n  standalone: true,\n  template: `\n    <div class=\"ngx-signature-pad\">\n      <canvas\n        #canvas\n        [style.width.px]=\"width()\"\n        [style.height.px]=\"height()\"\n        (pointerdown)=\"startDrawing($event)\"\n        (pointermove)=\"draw($event)\"\n        (pointerup)=\"stopDrawing()\"\n        (pointerleave)=\"stopDrawing()\"\n      ></canvas>\n      <div class=\"signature-actions\">\n        <button type=\"button\" (click)=\"clear()\">Clear</button>\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host { display: block; }\n    .ngx-signature-pad { display: grid; gap: 8px; font-family: var(--ngx-font-family, inherit); }\n    canvas { display: block; max-width: 100%; border: 1px solid var(--ngx-input-border, #cbd5e1); border-radius: var(--ngx-input-radius, 8px); background: var(--ngx-signature-bg, #ffffff); touch-action: none; cursor: crosshair; }\n    .signature-actions { display: flex; justify-content: flex-end; }\n    .signature-actions button { border: 1px solid var(--border-color, #cbd5e1); border-radius: 6px; background: var(--bg-secondary, #ffffff); color: var(--text-primary, #0f172a); cursor: pointer; font: inherit; font-size: 12px; font-weight: 700; padding: 6px 11px; }\n    .signature-actions button:hover, .signature-actions button:focus-visible { border-color: var(--primary-color, #4f46e5); outline: none; }\n  `]\n})\nexport class SignaturePadComponent implements AfterViewInit {\n  @ViewChild('canvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;\n\n  width = input(520);\n  height = input(180);\n  strokeColor = input('#111827');\n  strokeWidth = input(2);\n  backgroundColor = input('#ffffff');\n\n  signatureChange = output<string>();\n  cleared = output<void>();\n\n  private drawing = signal(false);\n  private context: CanvasRenderingContext2D | null = null;\n\n  ngAfterViewInit(): void {\n    this.setupCanvas();\n    this.clear(false);\n  }\n\n  startDrawing(event: PointerEvent): void {\n    const context = this.context;\n    if (!context) return;\n\n    const point = this.pointerPoint(event);\n    context.beginPath();\n    context.moveTo(point.x, point.y);\n    this.drawing.set(true);\n    this.canvasRef.nativeElement.setPointerCapture(event.pointerId);\n  }\n\n  draw(event: PointerEvent): void {\n    const context = this.context;\n    if (!context || !this.drawing()) return;\n\n    const point = this.pointerPoint(event);\n    context.lineTo(point.x, point.y);\n    context.strokeStyle = this.strokeColor();\n    context.lineWidth = this.strokeWidth();\n    context.lineCap = 'round';\n    context.lineJoin = 'round';\n    context.stroke();\n  }\n\n  stopDrawing(): void {\n    if (!this.drawing()) return;\n    this.drawing.set(false);\n    this.signatureChange.emit(this.toDataUrl());\n  }\n\n  clear(emit = true): void {\n    const canvas = this.canvasRef.nativeElement;\n    const context = this.context;\n    if (!context) return;\n\n    context.save();\n    context.fillStyle = this.backgroundColor();\n    context.fillRect(0, 0, canvas.width, canvas.height);\n    context.restore();\n\n    if (emit) {\n      this.cleared.emit();\n      this.signatureChange.emit(this.toDataUrl());\n    }\n  }\n\n  toDataUrl(): string {\n    return this.canvasRef.nativeElement.toDataURL('image/png');\n  }\n\n  private setupCanvas(): void {\n    const canvas = this.canvasRef.nativeElement;\n    const ratio = window.devicePixelRatio || 1;\n    canvas.width = this.width() * ratio;\n    canvas.height = this.height() * ratio;\n    this.context = canvas.getContext('2d');\n    this.context?.scale(ratio, ratio);\n  }\n\n  private pointerPoint(event: PointerEvent): { x: number; y: number } {\n    const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n    return {\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n    };\n  }\n}\n","import { Injectable, InjectionToken } from '@angular/core';\n\nexport interface FormErrorMessages {\n  required?: string;\n  email?: string;\n  minlength?: (err: { requiredLength: number; actualLength: number }) => string;\n  maxlength?: (err: { requiredLength: number; actualLength: number }) => string;\n  min?: (err: { min: number; actual: number }) => string;\n  max?: (err: { max: number; actual: number }) => string;\n  pattern?: string;\n  [key: string]: unknown;\n}\n\nexport const DEFAULT_FORM_ERROR_MESSAGES: FormErrorMessages = {\n  required: 'This field is required',\n  email: 'Please enter a valid email address',\n  minlength: (err) => `Minimum ${err.requiredLength} characters required`,\n  maxlength: (err) => `Maximum ${err.requiredLength} characters allowed`,\n  min: (err) => `Value must be at least ${err.min}`,\n  max: (err) => `Value must not exceed ${err.max}`,\n  pattern: 'Invalid format',\n};\n\nexport const NGX_FORM_ERROR_MESSAGES = new InjectionToken<FormErrorMessages>('NGX_FORM_ERROR_MESSAGES', {\n  providedIn: 'root',\n  factory: () => DEFAULT_FORM_ERROR_MESSAGES,\n});\n\n@Injectable({ providedIn: 'root' })\nexport class NgxFormErrorService {\n  private messages = DEFAULT_FORM_ERROR_MESSAGES;\n\n  setMessageTemplates(customMessages: Partial<FormErrorMessages>): void {\n    this.messages = { ...this.messages, ...customMessages };\n  }\n\n  resolveError(errorKey: string, errorValue: unknown): string {\n    const template = this.messages[errorKey];\n    if (typeof template === 'function') {\n      return template(errorValue as any);\n    }\n    if (typeof template === 'string') {\n      return template;\n    }\n    if (typeof errorValue === 'string') {\n      return errorValue;\n    }\n    return `Invalid value (${errorKey})`;\n  }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { ValidationErrors } from '@angular/forms';\nimport { NgxFormErrorService } from '../services/form-error.service';\n\n@Pipe({\n  name: 'ngxFormError',\n  standalone: true,\n})\nexport class NgxFormErrorPipe implements PipeTransform {\n  private errorService = inject(NgxFormErrorService);\n\n  transform(errors: ValidationErrors | null | undefined): string | null {\n    if (!errors) return null;\n    const keys = Object.keys(errors);\n    if (keys.length === 0) return null;\n\n    // Resolve the first validation error message\n    const firstKey = keys[0];\n    return this.errorService.resolveError(firstKey, errors[firstKey]);\n  }\n}\n","import { Directive, ElementRef, HostListener, inject, input, output } from '@angular/core';\nimport { applyMask } from '../utils/mask.util';\n\n@Directive({\n  selector: 'input[ngxMask]',\n  standalone: true,\n})\nexport class NgxMaskDirective {\n  ngxMask = input.required<string>();\n  unmaskedValueChange = output<string>();\n\n  private el = inject(ElementRef<HTMLInputElement>);\n\n  @HostListener('input', ['$event'])\n  onInput(event: InputEvent): void {\n    const inputEl = this.el.nativeElement;\n    const rawVal = inputEl.value;\n    const pattern = this.ngxMask();\n\n    if (!pattern) return;\n\n    const { masked, unmasked } = applyMask(rawVal, pattern);\n    inputEl.value = masked;\n    this.unmaskedValueChange.emit(unmasked);\n  }\n}\n","/*\n * Public API Surface — secondary entry point: ngx-core-components/inputs\n */\n\n// Text input\nexport { TextBoxComponent } from './textbox/textbox.component';\n\n// Checkbox — with ControlValueAccessor\nexport { CheckboxComponent } from './checkbox/checkbox.component';\n\n// Radio Group — with ControlValueAccessor\nexport { RadioGroupComponent } from './radio/radio-group.component';\nexport type { RadioOption } from './radio/radio-group.component';\n\n// Dropdown / Select\nexport { DropdownComponent } from './dropdown/dropdown.component';\nexport type { DropdownOption } from './dropdown/dropdown.component';\n\n// Multi-select with chips/tags\nexport { MultiSelectComponent } from './multi-select/multi-select.component';\n\n// Autocomplete — with ControlValueAccessor\nexport { AutocompleteComponent } from './autocomplete/autocomplete.component';\n\n// Date Picker\nexport { DatePickerComponent } from './date-picker/date-picker.component';\n\n// Slider\nexport { SliderComponent } from './slider/slider.component';\n\n// Switch / Toggle\nexport { SwitchComponent } from './switch/switch.component';\n\n// Star Rating\nexport { RatingComponent } from './rating/rating.component';\n\n// Numeric TextBox\nexport { NumericTextBoxComponent } from './numeric-textbox/numeric-textbox.component';\n\n// Textarea\nexport { TextareaComponent } from './textarea/textarea.component';\n\n// Color Picker\nexport { ColorPickerComponent } from './color-picker/color-picker.component';\n\n// Time Picker\nexport { TimePickerComponent } from './time-picker/time-picker.component';\n\n// Date Range Picker\nexport { DateRangePickerComponent } from './date-range-picker/date-range-picker.component';\n\n// File Upload\nexport { FileUploadComponent } from './file-upload/file-upload.component';\nexport type { UploadFileItem } from './file-upload/file-upload.component';\n\n// Tag Input\nexport { TagInputComponent } from './tag-input/tag-input.component';\n\n// File Preview\nexport { FilePreviewComponent } from './file-preview/file-preview.component';\nexport type { PreviewFileItem } from './file-preview/file-preview.component';\n\n// Segmented Control Selector\nexport { SegmentedControlComponent } from './segmented-control/segmented-control.component';\nexport type { SegmentedOption } from './segmented-control/segmented-control.component';\n\n// Dynamic Form Builder & Designer\nexport { FormBuilderComponent } from './form-builder/form-builder.component';\nexport type { FormBuilderField, FormBuilderOption, FormBuilderCondition } from './form-builder/form-builder.component';\nexport { FormDesignerComponent } from './form-builder/form-designer.component';\n\n// Signature Pad\nexport { SignaturePadComponent } from './signature-pad/signature-pad.component';\n\n// Reactive Validation & Form Error Services\nexport { NgxFormErrorService, DEFAULT_FORM_ERROR_MESSAGES, NGX_FORM_ERROR_MESSAGES } from './services/form-error.service';\nexport type { FormErrorMessages } from './services/form-error.service';\nexport { NgxFormErrorPipe } from './pipes/form-error.pipe';\n\n// Pattern Masking Directive & Utilities\nexport { NgxMaskDirective } from './directives/mask.directive';\nexport { applyMask, getPresetMask, unmaskValue } from './utils/mask.util';\nexport type { MaskResult } from './utils/mask.util';\nexport type { DatePreset } from './date-picker/date-picker.component';\n\n\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}