shirkasoft-ui-components 1.3.3 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,6 +19,32 @@ import { getIcon } from 'shirkasoft-ui-components/utils';
19
19
  * reactive-form integration.
20
20
  */
21
21
  class SelectComponent {
22
+ /** Computes the fixed position of the dropdown so it's not clipped by overflow. */
23
+ computeDropdownPosition() {
24
+ const trigger = this.selectTrigger()?.nativeElement;
25
+ if (!trigger)
26
+ return;
27
+ const rect = trigger.getBoundingClientRect();
28
+ const dropdownMaxHeight = 240;
29
+ const spaceBelow = window.innerHeight - rect.bottom;
30
+ const spaceAbove = rect.top;
31
+ const opensUpward = this.dropdownUpward();
32
+ let top;
33
+ if (opensUpward) {
34
+ top = rect.top - dropdownMaxHeight - 4;
35
+ if (top < 8)
36
+ top = 8;
37
+ }
38
+ else {
39
+ top = rect.bottom + 4;
40
+ if (top + dropdownMaxHeight > window.innerHeight - 8) {
41
+ top = rect.top - dropdownMaxHeight - 4;
42
+ if (top < 8)
43
+ top = 8;
44
+ }
45
+ }
46
+ this.dropdownPosition.set({ top, left: rect.left, width: rect.width });
47
+ }
22
48
  constructor(elementRef) {
23
49
  this.elementRef = elementRef;
24
50
  /** Resolves icon names to lucide components, falling back to a chevron. */
@@ -256,6 +282,8 @@ class SelectComponent {
256
282
  term !== '' &&
257
283
  !opts.some((o) => o.value === term));
258
284
  }, ...(ngDevMode ? [{ debugName: "showCustomOption" }] : /* istanbul ignore next */ []));
285
+ /** Fixed position of the dropdown relative to the viewport. */
286
+ this.dropdownPosition = signal({ top: 0, left: 0, width: 0 }, ...(ngDevMode ? [{ debugName: "dropdownPosition" }] : /* istanbul ignore next */ []));
259
287
  this.transloco = inject(TranslocoService);
260
288
  /** ControlValueAccessor onChange callback. */
261
289
  this.onChange = (_) => { };
@@ -674,6 +702,9 @@ class SelectComponent {
674
702
  this.filterInput()?.nativeElement?.focus();
675
703
  });
676
704
  }
705
+ if (this.isOpen()) {
706
+ this.computeDropdownPosition();
707
+ }
677
708
  this.onTouched();
678
709
  }
679
710
  /** trackBy for rendered options so Angular reuses DOM nodes by value. */
@@ -707,7 +738,7 @@ class SelectComponent {
707
738
  useExisting: forwardRef(() => SelectComponent),
708
739
  multi: true,
709
740
  },
710
- ], viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true, isSignal: true }, { propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true, isSignal: true }, { propertyName: "selectTrigger", first: true, predicate: ["selectTrigger"], descendants: true, isSignal: true }, { propertyName: "dropdownContainer", first: true, predicate: ["dropdownContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #selectContainer\n class=\"relative w-full font-sans outline-none\"\n>\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div\n #selectTrigger\n class=\"flex justify-between items-center w-full px-3 py-2 border _shk-border rounded-lg _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] transition-colors duration-150 cursor-pointer min-h-[2.5rem] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus-within:outline-none focus-within:[background-color:var(--shk-surface-50)] dark:focus-within:[background-color:var(--shk-surface-100)] focus-within:ring-1 focus-within:[--tw-ring-color:var(--shk-primary-500)] focus-within:[border-color:var(--shk-primary-500)] focus:outline-none focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] focus:[border-color:var(--shk-primary-500)] sm:text-sm\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeydown($event)\"\n (click)=\"toggleDropdown()\"\n [class.open]=\"isOpen()\"\n [class.disabled-select]=\"isDisabled()\"\n [class._shk-border-red]=\"shouldShowError()\"\n >\n <div class=\"selected-value truncate\">\n @if (isSearchable() && isOpen()) {\n <input\n #filterInput\n type=\"text\"\n class=\"w-full bg-transparent border-0 outline-none p-0 _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n placeholder=\"Buscar...\"\n [value]=\"searchTerm()\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span\n [class._shk-text-surface-400]=\"!hasSelectedValues()\"\n [class._shk-text-surface-800]=\"hasSelectedValues()\"\n >\n {{ displayValue() }}\n </span>\n }\n </div>\n <div\n class=\"text-xs transition-transform duration-200 shrink-0 ml-2\"\n [class.rotate-180]=\"isOpen()\"\n >\n <svg\n [lucideIcon]=\"getIcon('chevron-down')\"\n class=\"w-4 h-4 _shk-text-surface-400 dark:[color:var(--shk-surface-400)]\"\n ></svg>\n </div>\n </div>\n\n @if (isOpen()) {\n <div\n #dropdownContainer\n (keydown)=\"onKeydown($event)\"\n class=\"absolute left-0 right-0 _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border _shk-border rounded-lg max-h-[240px] overflow-y-auto z-50 shadow-lg _shk-scrollbar\"\n [class.top-full]=\"!dropdownUpward()\"\n [class.bottom-full]=\"dropdownUpward()\"\n [class.mt-1]=\"!dropdownUpward()\"\n [class.mb-1]=\"dropdownUpward()\"\n >\n @if (showCustomOption()) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm\"\n (click)=\"onCustomOptionClick()\"\n >\n <span class=\"font-semibold _shk-text-primary\">Crear nuevo:</span>\n <span class=\"_shk-text-surface-700 dark:[color:var(--shk-surface-700)] ml-1\">{{ searchTerm() }}</span>\n </div>\n }\n\n @for (option of regularOptions(); track trackByFn($index, option); let i = $index) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n [class.opacity-50]=\"isOptionDisabled(option)\"\n [class.select-option-active]=\"focusedIndex() === i\"\n [class._shk-text-surface-400]=\"option.value === null\"\n (click)=\"!isOptionDisabled(option) && onOptionClick(option)\"\n >\n @if (multiple()) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n [disabled]=\"isOptionDisabled(option)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"!isOptionDisabled(option) && toggleOption(option)\"\n class=\"flex-shrink-0 [accent-color:var(--shk-primary-600)]\"\n />\n {{ option.label }}\n } @else {\n {{ option.label }}\n }\n </div>\n }\n\n <div class=\"px-3 py-2 text-center\">\n @if (isLoading() && regularOptions().length === 0) {\n <div class=\"flex items-center justify-center gap-2 text-sm _shk-text-surface-500\">\n <svg class=\"spinner\" viewBox=\"0 0 50 50\">\n <circle\n class=\"path\"\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"5\"\n ></circle>\n </svg>\n Cargando m\u00E1s resultados...\n </div>\n }\n\n @if (!isLoading() && isAllDataLoaded() && regularOptions().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n No se encontraron coincidencias\n </div>\n }\n\n @if (options().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n {{ emptyMessageKey() | transloco }}\n </div>\n }\n </div>\n\n @if (usePagination() && totalPages() > 1) {\n <div class=\"flex justify-between items-center px-3 py-2 border-t _shk-border\">\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"$event.stopPropagation(); previousPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <span class=\"text-sm _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\">\n {{ currentPage() }} de {{ totalPages() }}\n </span>\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"$event.stopPropagation(); nextPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-right')\" class=\"w-4 h-4\"></svg>\n </button>\n </div>\n }\n </div>\n }\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>", styles: [".select-option-active{background-color:var(--shk-primary-50);outline:2px solid var(--shk-primary-500);outline-offset:-2px;color:var(--shk-primary-700)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }, { kind: "pipe", type: i1.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
741
+ ], viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true, isSignal: true }, { propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true, isSignal: true }, { propertyName: "selectTrigger", first: true, predicate: ["selectTrigger"], descendants: true, isSignal: true }, { propertyName: "dropdownContainer", first: true, predicate: ["dropdownContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #selectContainer\n class=\"relative w-full font-sans outline-none\"\n>\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div\n #selectTrigger\n class=\"flex justify-between items-center w-full px-3 py-2 border _shk-border rounded-lg _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] transition-colors duration-150 cursor-pointer min-h-[2.5rem] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus-within:outline-none focus-within:[background-color:var(--shk-surface-50)] dark:focus-within:[background-color:var(--shk-surface-100)] focus-within:ring-1 focus-within:[--tw-ring-color:var(--shk-primary-500)] focus-within:[border-color:var(--shk-primary-500)] focus:outline-none focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] focus:[border-color:var(--shk-primary-500)] sm:text-sm\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeydown($event)\"\n (click)=\"toggleDropdown()\"\n [class.open]=\"isOpen()\"\n [class.disabled-select]=\"isDisabled()\"\n [class._shk-border-red]=\"shouldShowError()\"\n >\n <div class=\"selected-value truncate\">\n @if (isSearchable() && isOpen()) {\n <input\n #filterInput\n type=\"text\"\n class=\"w-full bg-transparent border-0 outline-none p-0 _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n placeholder=\"Buscar...\"\n [value]=\"searchTerm()\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span\n [class._shk-text-surface-400]=\"!hasSelectedValues()\"\n [class._shk-text-surface-800]=\"hasSelectedValues()\"\n >\n {{ displayValue() }}\n </span>\n }\n </div>\n <div\n class=\"text-xs transition-transform duration-200 shrink-0 ml-2\"\n [class.rotate-180]=\"isOpen()\"\n >\n <svg\n [lucideIcon]=\"getIcon('chevron-down')\"\n class=\"w-4 h-4 _shk-text-surface-400 dark:[color:var(--shk-surface-400)]\"\n ></svg>\n </div>\n </div>\n\n @if (isOpen()) {\n <div\n #dropdownContainer\n (keydown)=\"onKeydown($event)\"\n class=\"fixed _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border _shk-border rounded-lg max-h-[240px] overflow-y-auto z-[9999] shadow-lg _shk-scrollbar\"\n [style.top]=\"dropdownPosition().top + 'px'\"\n [style.left]=\"dropdownPosition().left + 'px'\"\n [style.width]=\"dropdownPosition().width + 'px'\"\n >\n @if (showCustomOption()) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm\"\n (click)=\"onCustomOptionClick()\"\n >\n <span class=\"font-semibold _shk-text-primary\">Crear nuevo:</span>\n <span class=\"_shk-text-surface-700 dark:[color:var(--shk-surface-700)] ml-1\">{{ searchTerm() }}</span>\n </div>\n }\n\n @for (option of regularOptions(); track trackByFn($index, option); let i = $index) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n [class.opacity-50]=\"isOptionDisabled(option)\"\n [class.select-option-active]=\"focusedIndex() === i\"\n [class._shk-text-surface-400]=\"option.value === null\"\n (click)=\"!isOptionDisabled(option) && onOptionClick(option)\"\n >\n @if (multiple()) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n [disabled]=\"isOptionDisabled(option)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"!isOptionDisabled(option) && toggleOption(option)\"\n class=\"flex-shrink-0 [accent-color:var(--shk-primary-600)]\"\n />\n {{ option.label }}\n } @else {\n {{ option.label }}\n }\n </div>\n }\n\n <div class=\"px-3 py-2 text-center\">\n @if (isLoading() && regularOptions().length === 0) {\n <div class=\"flex items-center justify-center gap-2 text-sm _shk-text-surface-500\">\n <svg class=\"spinner\" viewBox=\"0 0 50 50\">\n <circle\n class=\"path\"\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"5\"\n ></circle>\n </svg>\n Cargando m\u00E1s resultados...\n </div>\n }\n\n @if (!isLoading() && isAllDataLoaded() && regularOptions().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n No se encontraron coincidencias\n </div>\n }\n\n @if (options().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n {{ emptyMessageKey() | transloco }}\n </div>\n }\n </div>\n\n @if (usePagination() && totalPages() > 1) {\n <div class=\"flex justify-between items-center px-3 py-2 border-t _shk-border\">\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"$event.stopPropagation(); previousPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <span class=\"text-sm _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\">\n {{ currentPage() }} de {{ totalPages() }}\n </span>\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"$event.stopPropagation(); nextPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-right')\" class=\"w-4 h-4\"></svg>\n </button>\n </div>\n }\n </div>\n }\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>", styles: [".select-option-active{background-color:var(--shk-primary-50);outline:2px solid var(--shk-primary-500);outline-offset:-2px;color:var(--shk-primary-700)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }, { kind: "pipe", type: i1.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
711
742
  }
712
743
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SelectComponent, decorators: [{
713
744
  type: Component,
@@ -723,7 +754,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
723
754
  useExisting: forwardRef(() => SelectComponent),
724
755
  multi: true,
725
756
  },
726
- ], template: "<div\n #selectContainer\n class=\"relative w-full font-sans outline-none\"\n>\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div\n #selectTrigger\n class=\"flex justify-between items-center w-full px-3 py-2 border _shk-border rounded-lg _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] transition-colors duration-150 cursor-pointer min-h-[2.5rem] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus-within:outline-none focus-within:[background-color:var(--shk-surface-50)] dark:focus-within:[background-color:var(--shk-surface-100)] focus-within:ring-1 focus-within:[--tw-ring-color:var(--shk-primary-500)] focus-within:[border-color:var(--shk-primary-500)] focus:outline-none focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] focus:[border-color:var(--shk-primary-500)] sm:text-sm\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeydown($event)\"\n (click)=\"toggleDropdown()\"\n [class.open]=\"isOpen()\"\n [class.disabled-select]=\"isDisabled()\"\n [class._shk-border-red]=\"shouldShowError()\"\n >\n <div class=\"selected-value truncate\">\n @if (isSearchable() && isOpen()) {\n <input\n #filterInput\n type=\"text\"\n class=\"w-full bg-transparent border-0 outline-none p-0 _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n placeholder=\"Buscar...\"\n [value]=\"searchTerm()\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span\n [class._shk-text-surface-400]=\"!hasSelectedValues()\"\n [class._shk-text-surface-800]=\"hasSelectedValues()\"\n >\n {{ displayValue() }}\n </span>\n }\n </div>\n <div\n class=\"text-xs transition-transform duration-200 shrink-0 ml-2\"\n [class.rotate-180]=\"isOpen()\"\n >\n <svg\n [lucideIcon]=\"getIcon('chevron-down')\"\n class=\"w-4 h-4 _shk-text-surface-400 dark:[color:var(--shk-surface-400)]\"\n ></svg>\n </div>\n </div>\n\n @if (isOpen()) {\n <div\n #dropdownContainer\n (keydown)=\"onKeydown($event)\"\n class=\"absolute left-0 right-0 _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border _shk-border rounded-lg max-h-[240px] overflow-y-auto z-50 shadow-lg _shk-scrollbar\"\n [class.top-full]=\"!dropdownUpward()\"\n [class.bottom-full]=\"dropdownUpward()\"\n [class.mt-1]=\"!dropdownUpward()\"\n [class.mb-1]=\"dropdownUpward()\"\n >\n @if (showCustomOption()) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm\"\n (click)=\"onCustomOptionClick()\"\n >\n <span class=\"font-semibold _shk-text-primary\">Crear nuevo:</span>\n <span class=\"_shk-text-surface-700 dark:[color:var(--shk-surface-700)] ml-1\">{{ searchTerm() }}</span>\n </div>\n }\n\n @for (option of regularOptions(); track trackByFn($index, option); let i = $index) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n [class.opacity-50]=\"isOptionDisabled(option)\"\n [class.select-option-active]=\"focusedIndex() === i\"\n [class._shk-text-surface-400]=\"option.value === null\"\n (click)=\"!isOptionDisabled(option) && onOptionClick(option)\"\n >\n @if (multiple()) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n [disabled]=\"isOptionDisabled(option)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"!isOptionDisabled(option) && toggleOption(option)\"\n class=\"flex-shrink-0 [accent-color:var(--shk-primary-600)]\"\n />\n {{ option.label }}\n } @else {\n {{ option.label }}\n }\n </div>\n }\n\n <div class=\"px-3 py-2 text-center\">\n @if (isLoading() && regularOptions().length === 0) {\n <div class=\"flex items-center justify-center gap-2 text-sm _shk-text-surface-500\">\n <svg class=\"spinner\" viewBox=\"0 0 50 50\">\n <circle\n class=\"path\"\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"5\"\n ></circle>\n </svg>\n Cargando m\u00E1s resultados...\n </div>\n }\n\n @if (!isLoading() && isAllDataLoaded() && regularOptions().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n No se encontraron coincidencias\n </div>\n }\n\n @if (options().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n {{ emptyMessageKey() | transloco }}\n </div>\n }\n </div>\n\n @if (usePagination() && totalPages() > 1) {\n <div class=\"flex justify-between items-center px-3 py-2 border-t _shk-border\">\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"$event.stopPropagation(); previousPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <span class=\"text-sm _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\">\n {{ currentPage() }} de {{ totalPages() }}\n </span>\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"$event.stopPropagation(); nextPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-right')\" class=\"w-4 h-4\"></svg>\n </button>\n </div>\n }\n </div>\n }\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>", styles: [".select-option-active{background-color:var(--shk-primary-50);outline:2px solid var(--shk-primary-500);outline-offset:-2px;color:var(--shk-primary-700)}\n"] }]
757
+ ], template: "<div\n #selectContainer\n class=\"relative w-full font-sans outline-none\"\n>\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div\n #selectTrigger\n class=\"flex justify-between items-center w-full px-3 py-2 border _shk-border rounded-lg _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] transition-colors duration-150 cursor-pointer min-h-[2.5rem] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus-within:outline-none focus-within:[background-color:var(--shk-surface-50)] dark:focus-within:[background-color:var(--shk-surface-100)] focus-within:ring-1 focus-within:[--tw-ring-color:var(--shk-primary-500)] focus-within:[border-color:var(--shk-primary-500)] focus:outline-none focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] focus:[border-color:var(--shk-primary-500)] sm:text-sm\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeydown($event)\"\n (click)=\"toggleDropdown()\"\n [class.open]=\"isOpen()\"\n [class.disabled-select]=\"isDisabled()\"\n [class._shk-border-red]=\"shouldShowError()\"\n >\n <div class=\"selected-value truncate\">\n @if (isSearchable() && isOpen()) {\n <input\n #filterInput\n type=\"text\"\n class=\"w-full bg-transparent border-0 outline-none p-0 _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n placeholder=\"Buscar...\"\n [value]=\"searchTerm()\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span\n [class._shk-text-surface-400]=\"!hasSelectedValues()\"\n [class._shk-text-surface-800]=\"hasSelectedValues()\"\n >\n {{ displayValue() }}\n </span>\n }\n </div>\n <div\n class=\"text-xs transition-transform duration-200 shrink-0 ml-2\"\n [class.rotate-180]=\"isOpen()\"\n >\n <svg\n [lucideIcon]=\"getIcon('chevron-down')\"\n class=\"w-4 h-4 _shk-text-surface-400 dark:[color:var(--shk-surface-400)]\"\n ></svg>\n </div>\n </div>\n\n @if (isOpen()) {\n <div\n #dropdownContainer\n (keydown)=\"onKeydown($event)\"\n class=\"fixed _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border _shk-border rounded-lg max-h-[240px] overflow-y-auto z-[9999] shadow-lg _shk-scrollbar\"\n [style.top]=\"dropdownPosition().top + 'px'\"\n [style.left]=\"dropdownPosition().left + 'px'\"\n [style.width]=\"dropdownPosition().width + 'px'\"\n >\n @if (showCustomOption()) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm\"\n (click)=\"onCustomOptionClick()\"\n >\n <span class=\"font-semibold _shk-text-primary\">Crear nuevo:</span>\n <span class=\"_shk-text-surface-700 dark:[color:var(--shk-surface-700)] ml-1\">{{ searchTerm() }}</span>\n </div>\n }\n\n @for (option of regularOptions(); track trackByFn($index, option); let i = $index) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n [class.opacity-50]=\"isOptionDisabled(option)\"\n [class.select-option-active]=\"focusedIndex() === i\"\n [class._shk-text-surface-400]=\"option.value === null\"\n (click)=\"!isOptionDisabled(option) && onOptionClick(option)\"\n >\n @if (multiple()) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n [disabled]=\"isOptionDisabled(option)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"!isOptionDisabled(option) && toggleOption(option)\"\n class=\"flex-shrink-0 [accent-color:var(--shk-primary-600)]\"\n />\n {{ option.label }}\n } @else {\n {{ option.label }}\n }\n </div>\n }\n\n <div class=\"px-3 py-2 text-center\">\n @if (isLoading() && regularOptions().length === 0) {\n <div class=\"flex items-center justify-center gap-2 text-sm _shk-text-surface-500\">\n <svg class=\"spinner\" viewBox=\"0 0 50 50\">\n <circle\n class=\"path\"\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"5\"\n ></circle>\n </svg>\n Cargando m\u00E1s resultados...\n </div>\n }\n\n @if (!isLoading() && isAllDataLoaded() && regularOptions().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n No se encontraron coincidencias\n </div>\n }\n\n @if (options().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n {{ emptyMessageKey() | transloco }}\n </div>\n }\n </div>\n\n @if (usePagination() && totalPages() > 1) {\n <div class=\"flex justify-between items-center px-3 py-2 border-t _shk-border\">\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"$event.stopPropagation(); previousPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <span class=\"text-sm _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\">\n {{ currentPage() }} de {{ totalPages() }}\n </span>\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"$event.stopPropagation(); nextPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-right')\" class=\"w-4 h-4\"></svg>\n </button>\n </div>\n }\n </div>\n }\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>", styles: [".select-option-active{background-color:var(--shk-primary-50);outline:2px solid var(--shk-primary-500);outline-offset:-2px;color:var(--shk-primary-700)}\n"] }]
727
758
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], validCombinations: [{ type: i0.Input, args: [{ isSignal: true, alias: "validCombinations", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], isAllDataLoaded: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAllDataLoaded", required: false }] }], allowCustomEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowCustomEntries", required: false }] }], formGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "formGroup", required: false }] }], isSearchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isSearchable", required: false }] }], itemsPerPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemsPerPage", required: false }] }], control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: false }] }], usePagination: [{ type: i0.Input, args: [{ isSignal: true, alias: "usePagination", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], errorMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessages", required: false }] }], preserveSearchOnLoad: [{ type: i0.Input, args: [{ isSignal: true, alias: "preserveSearchOnLoad", required: false }] }], emptyMessageKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessageKey", required: false }] }], dropdownUpward: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownUpward", required: false }] }], showEmptyOption: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEmptyOption", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], search: [{ type: i0.Output, args: ["search"] }], filterInput: [{ type: i0.ViewChild, args: ['filterInput', { isSignal: true }] }], selectContainer: [{ type: i0.ViewChild, args: ['selectContainer', { isSignal: true }] }], selectTrigger: [{ type: i0.ViewChild, args: ['selectTrigger', { isSignal: true }] }], dropdownContainer: [{ type: i0.ViewChild, args: ['dropdownContainer', { isSignal: true }] }], onClickOutside: [{
728
759
  type: HostListener,
729
760
  args: ['document:mousedown', ['$event']]
@@ -1 +1 @@
1
- {"version":3,"file":"shirkasoft-ui-components-select.mjs","sources":["../../../projects/ui-components/select/select.component.ts","../../../projects/ui-components/select/select.component.html","../../../projects/ui-components/select/shirkasoft-ui-components-select.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n input,\n output,\n viewChild,\n forwardRef,\n signal,\n computed,\n effect,\n HostListener,\n ElementRef,\n ChangeDetectionStrategy,\n inject,\n DestroyRef,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormControl,\n FormGroup,\n FormsModule,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { LucideDynamicIcon, LucideChevronDown } from '@lucide/angular';\nimport { getIcon as getIconFromCentral } from 'shirkasoft-ui-components/utils';\n\n/** Option rendered by the select, optionally prefixed with a \"new entry\" badge. */\nexport interface SelectOption {\n label: string;\n value: any;\n custom?: boolean;\n}\n\n/**\n * Shirkasoft UI Components.\n * Authors: Roberto Valladares Martin (Ansem13), Julio César García García (Sanjuli14).\n * Belongs to Shirkasoft.\n */\n\n/**\n * Custom select that works as a ControlValueAccessor: single/multiple\n * selection, searchable, keyboard navigation, pagination, custom entries and\n * reactive-form integration.\n */\n@Component({\n selector: 'shk-select',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n TranslocoModule,\n LucideDynamicIcon,\n ],\n templateUrl: './select.component.html',\n styles: [`\n .select-option-active {\n background-color: var(--shk-primary-50);\n outline: 2px solid var(--shk-primary-500);\n outline-offset: -2px;\n color: var(--shk-primary-700);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectComponent),\n multi: true,\n },\n ],\n})\nexport class SelectComponent implements ControlValueAccessor {\n /** Resolves icon names to lucide components, falling back to a chevron. */\n protected getIcon = (name: any) => getIconFromCentral(name, LucideChevronDown);\n\n /** Available options. */\n options = input<SelectOption[]>([]);\n /** Enables multi-select mode. */\n multiple = input<boolean>(false);\n /** Restricts multi-selection to the given value combinations. */\n validCombinations = input<string[][] | undefined>(undefined);\n /** Placeholder shown when there is no selection. */\n placeholder = input<string>('Seleccionar...');\n /** Label used to bind the control inside a `formGroup`. */\n label = input<string | undefined>(undefined);\n /** Shows a loading state while options are being fetched. */\n isLoading = input<boolean>(false);\n /** Marks that all options have been loaded (used with pagination + search). */\n isAllDataLoaded = input<boolean>(false);\n /** Allows creating new entries from the typed search term. */\n allowCustomEntries = input<boolean>(false);\n /** Parent form group to resolve the control from `label`. */\n formGroup = input<FormGroup | undefined>(undefined);\n /** Enables the search input inside the dropdown. */\n isSearchable = input<boolean>(false);\n /** Number of options loaded per page when pagination is enabled. */\n itemsPerPage = input<number>(10);\n /** FormControl bound externally (used instead of `formGroup`/`label`). */\n control = input<FormControl | undefined>(undefined);\n /** Paginates the option list instead of rendering it all at once. */\n usePagination = input<boolean>(false);\n /** Disables the whole select. */\n disabled = input<boolean>(false);\n /** Custom per-validation-error messages shown under the select. */\n errorMessages = input<{ [key: string]: string }>({\n required: 'Este campo es requerido',\n });\n /** Keeps the search term when options reload. */\n preserveSearchOnLoad = input<boolean>(false);\n /** Translation key of the \"no records\" empty message. */\n emptyMessageKey = input<string>('common.no_records');\n /** Opens the dropdown above the trigger instead of below. */\n dropdownUpward = input<boolean>(false);\n /** Shows the \"no selection\" option in single-select mode. */\n showEmptyOption = input<boolean>(true);\n\n /** Emits when the selection changes (new value or array in multiple mode). */\n selectionChange = output<any>();\n /** Emits the debounced search term while typing. */\n search = output<string>();\n\n /** Reference to the filter input inside the dropdown (when searchable). */\n filterInput = viewChild<ElementRef>('filterInput');\n /** Reference to the select container element. */\n private selectContainer = viewChild<ElementRef>('selectContainer');\n /** Reference to the trigger button. */\n private selectTrigger = viewChild<ElementRef>('selectTrigger');\n /** Reference to the dropdown list container. */\n private dropdownContainer = viewChild<ElementRef>('dropdownContainer');\n\n /** Underlying selection value (mirrors the reactive control). */\n private _value = signal<any>(null);\n /** Whether the dropdown is open. */\n isOpen = signal<boolean>(false);\n /** Index of the currently focused option for keyboard navigation. */\n focusedIndex = signal<number>(-1);\n /** Current search term (searchable mode). */\n searchTerm = signal<string>('');\n /** Current page of the paginated dropdown. */\n currentPage = signal<number>(1);\n /** Tracks whether the user typed in the search input. */\n private searchTermChanged = signal<boolean>(false);\n /** Internal disabled state from the reactive form (setDisabledState). */\n private _isDisabled = signal<boolean>(false);\n\n /** Debounce timer handle for the search output. */\n private debounceTimer: any = null;\n\n /** Error-state counter used to recompute error helpers reactively. */\n private errorTracker = signal<number>(0);\n /** Whether an error has been shown at some point (for \"fixed\" messaging). */\n hadError = signal<boolean>(false);\n /** Whether control status/value subscriptions have been attached. */\n private subscribed = signal<boolean>(false);\n private valueSubscribed = signal<boolean>(false);\n\n /** Current selection value. */\n value = computed(() => this._value());\n\n /** True when the select is disabled via input or by the reactive form. */\n isDisabled = computed(() => this.disabled() || this._isDisabled());\n\n /** Resolves the form control from `control` or from `formGroup`+`label`. */\n actualControl = computed(() => {\n const ctrl = this.control();\n if (ctrl) return ctrl;\n\n const fg = this.formGroup();\n const lbl = this.label();\n if (fg && lbl) {\n return fg.get(lbl) as FormControl;\n }\n return undefined;\n });\n\n /** Whether the bound control should display its error (invalid + touched/dirty). */\n shouldShowError = computed(() => {\n this.errorTracker();\n\n const ctrl = this.actualControl();\n return ctrl?.invalid && (ctrl?.dirty || ctrl?.touched);\n });\n\n /** Whether an error was shown before and the control is now valid + touched. */\n wasFixedError = computed(() => {\n this.errorTracker();\n\n const ctrl = this.actualControl();\n return this.hadError() && ctrl?.valid && ctrl?.touched;\n });\n\n /** Text shown in the trigger: the selected label(s) or the placeholder. */\n displayValue = computed(() => {\n const val = this._value();\n const opts = this.options();\n const isMultiple = this.multiple();\n const ph = this.placeholder();\n\n if (!val || (Array.isArray(val) && val.length === 0)) {\n return ph;\n }\n\n if (isMultiple) {\n const values = Array.isArray(val) ? val : [];\n const selectedLabels = opts\n .filter((option) => values.includes(option.value))\n .map((option) => option.label);\n\n if (selectedLabels.length === 0) {\n return values.toString();\n }\n return selectedLabels.join(', ');\n }\n\n const selectedOption = opts.find((opt) => opt.value === val);\n return selectedOption ? selectedOption.label : val;\n });\n\n /** List of validation error messages for the bound control. */\n getErrorMessages = computed(() => {\n this.errorTracker();\n\n const ctrl = this.actualControl();\n if (!ctrl?.errors) return [];\n\n const customErrors = this.errorMessages();\n const t = this.transloco;\n\n return Object.keys(ctrl.errors).map((errorKey) => {\n if (customErrors[errorKey]) return customErrors[errorKey];\n\n switch (errorKey) {\n case 'required':\n return t.translate('validation.required');\n case 'email':\n return t.translate('validation.email');\n case 'minlength':\n return t.translate('validation.minlength', {\n min: ctrl.errors!['minlength'].requiredLength,\n });\n case 'maxlength':\n return t.translate('validation.maxlength', {\n max: ctrl.errors!['maxlength'].requiredLength,\n });\n case 'pattern':\n return t.translate('validation.pattern');\n default:\n return t.translate('validation.invalid');\n }\n });\n });\n\n /** Options filtered by the search term (matches first, then contains). */\n filteredOptions = computed(() => {\n const opts = this.options();\n const term = this.searchTerm();\n\n if (!term) return opts;\n\n const normalizedSearchTerm = this.normalizeText(term);\n\n const matched = opts.filter((option) =>\n this.normalizeText(option.label).includes(normalizedSearchTerm),\n );\n\n return matched.sort((a, b) => {\n const aLbl = this.normalizeText(a.label);\n const bLbl = this.normalizeText(b.label);\n\n const aStarts = aLbl.startsWith(normalizedSearchTerm);\n const bStarts = bLbl.startsWith(normalizedSearchTerm);\n\n if (aStarts && !bStarts) return -1;\n if (!aStarts && bStarts) return 1;\n return 0;\n });\n });\n\n /** Options for the current page, with a synthetic custom entry when allowed. */\n paginatedOptions = computed(() => {\n let filtered = this.filteredOptions();\n const term = this.searchTerm();\n const allowCustom = this.allowCustomEntries();\n\n if (allowCustom && term && !filtered.some((o) => o.value === term)) {\n filtered = [\n {\n label: `${term} (nuevo)`,\n value: term,\n custom: true,\n },\n ...filtered,\n ];\n }\n\n if (!this.usePagination()) {\n return filtered;\n }\n\n const page = this.currentPage();\n const perPage = this.itemsPerPage();\n const startIndex = (page - 1) * perPage;\n const endIndex = startIndex + perPage;\n return filtered.slice(startIndex, endIndex);\n });\n\n /** Non-custom options, including the empty option in single-select mode. */\n regularOptions = computed(() => {\n const opts = this.paginatedOptions().filter((option) => !option.custom);\n\n if (!this.multiple() && this.showEmptyOption()) {\n return [{ label: '- Sin selección -', value: null } as SelectOption, ...opts];\n }\n\n return opts;\n });\n\n /** Total pages of the filtered option list (1 when pagination is off). */\n totalPages = computed(() => {\n if (!this.usePagination()) {\n return 1;\n }\n\n const filtered = this.filteredOptions();\n const perPage = this.itemsPerPage();\n return Math.ceil(filtered.length / perPage);\n });\n\n /** Whether there is at least one selected value. */\n hasSelectedValues = computed(() => {\n const val = this._value();\n if (this.multiple()) {\n return val && val.length > 0;\n }\n return !!val;\n });\n\n /** Whether the custom optional entry should be offered for the current term. */\n showCustomOption = computed(() => {\n const term = this.searchTerm();\n const opts = this.options();\n return (\n this.allowCustomEntries() &&\n term !== '' &&\n !opts.some((o) => o.value === term)\n );\n });\n\n private transloco = inject(TranslocoService);\n /** ControlValueAccessor onChange callback. */\n private onChange = (_: any) => {};\n /** ControlValueAccessor onTouched callback. */\n private onTouched = () => {};\n private destroyRef = inject(DestroyRef);\n\n constructor(private elementRef: ElementRef) {\n // Debounced search emission whenever the term changes (searchable mode).\n effect(() => {\n const term = this.searchTerm();\n\n if (term !== '' && this.isSearchable()) {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.search.emit(term);\n }, 300);\n }\n });\n\n // Normalizes the value to arrays in multiple mode when empty.\n effect(() => {\n const isMultiple = this.multiple();\n if (this._value() === null || this._value() === undefined) {\n this._value.set(isMultiple ? [] : null);\n }\n });\n\n // Resets to the first page when options reload, clearing the search\n // term unless it must be preserved.\n effect(() => {\n this.options();\n this.currentPage.set(1);\n\n if (!this.preserveSearchOnLoad() || !this.searchTermChanged()) {\n this.searchTerm.set('');\n }\n });\n\n // Subscribes to the bound control status/value changes to track errors.\n effect(() => {\n const ctrl = this.actualControl();\n\n if (!ctrl) {\n this.subscribed.set(false);\n return;\n }\n\n if (this.subscribed()) return;\n\n if (ctrl.invalid && ctrl.touched) {\n this.hadError.set(true);\n }\n\n ctrl.statusChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n\n if (ctrl.invalid && ctrl.touched) {\n this.hadError.set(true);\n }\n });\n\n ctrl.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n });\n\n this.subscribed.set(true);\n });\n\n // Forces error recomputation when the active translation changes.\n this.transloco.langChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n });\n\n // One-way sync from the reactive control to the internal value signal.\n effect(() => {\n const ctrl = this.actualControl();\n if (!ctrl) return;\n\n if (!this.valueSubscribed()) {\n this.writeValue(ctrl.value);\n\n ctrl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {\n this.writeValue(value);\n });\n\n this.valueSubscribed.set(true);\n }\n });\n }\n\n /** Sets the disabled state coming from the reactive form infrastructure. */\n setDisabledState(isDisabled: boolean): void {\n this._isDisabled.set(isDisabled);\n }\n\n /** Marks the control as touched and updates validity and error state. */\n private markAsTouchedAndUpdate(): void {\n const ctrl = this.actualControl();\n if (ctrl) {\n ctrl.markAsTouched();\n ctrl.updateValueAndValidity({ emitEvent: false });\n }\n\n this.onTouched();\n this.errorTracker.update((v) => v + 1);\n\n if (ctrl?.invalid) {\n this.hadError.set(true);\n }\n }\n\n /** Strips accents and lowercases text for accent-insensitive matching. */\n normalizeText(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n }\n\n /** Keyboard handler for the trigger element (open/close/navigate/select). */\n onKeydown(event: KeyboardEvent) {\n if (this.isDisabled()) return;\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (this.isOpen()) {\n if (this.focusedIndex() >= 0) {\n const options = this.regularOptions();\n const selectedOption = options[this.focusedIndex()];\n if (selectedOption && !this.isOptionDisabled(selectedOption)) {\n this.selectOption(selectedOption);\n }\n }\n } else {\n this.toggleDropdown();\n }\n break;\n case 'Escape':\n if (this.isOpen()) {\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n this.selectTrigger()?.nativeElement.focus();\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen()) {\n this.toggleDropdown();\n } else {\n this.moveFocus(1);\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (this.isOpen()) {\n this.moveFocus(-1);\n }\n break;\n case 'Tab':\n if (this.isOpen()) {\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n }\n break;\n }\n }\n\n /** Keyboard handler for the search input inside a searchable dropdown. */\n handleKeyDown(event: KeyboardEvent) {\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n event.stopPropagation();\n if (this.focusedIndex() >= 0) {\n const options = this.regularOptions();\n const option = options[this.focusedIndex()];\n if (option && !this.isOptionDisabled(option)) {\n this.selectOption(option);\n }\n } else {\n const filtered = this.filteredOptions();\n if (filtered.length > 0) {\n this.selectOption(filtered[0]);\n }\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n event.stopPropagation();\n this.moveFocus(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n event.stopPropagation();\n this.moveFocus(-1);\n break;\n case 'Escape':\n event.stopPropagation();\n event.preventDefault();\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n this.selectTrigger()?.nativeElement.focus();\n break;\n }\n }\n\n /** Moves the focused option index by `direction`, skipping disabled ones. */\n private moveFocus(direction: number) {\n const options = this.regularOptions();\n if (!options.length) return;\n\n let newIndex = this.focusedIndex();\n do {\n newIndex = newIndex + direction;\n if (newIndex < 0) newIndex = options.length - 1;\n if (newIndex >= options.length) newIndex = 0;\n } while (this.isOptionDisabled(options[newIndex]) && options.length > 1);\n\n this.focusedIndex.set(newIndex);\n\n setTimeout(() => {\n const container = this.dropdownContainer()?.nativeElement;\n const activeItem = container?.querySelector('.select-option-active');\n if (activeItem && container) {\n const itemTop = activeItem.offsetTop;\n const itemBottom = itemTop + activeItem.offsetHeight;\n const containerScrollTop = container.scrollTop;\n const containerHeight = container.clientHeight;\n\n if (itemTop < containerScrollTop) {\n container.scrollTop = itemTop;\n } else if (itemBottom > containerScrollTop + containerHeight) {\n container.scrollTop = itemBottom - containerHeight;\n }\n }\n });\n }\n\n /** Index of the currently selected option, or -1. */\n private getSelectedIndex(): number {\n const currentVal = this._value();\n const options = this.regularOptions();\n if (currentVal === null || currentVal === undefined) return -1;\n const index = options.findIndex((opt) => opt.value === currentVal);\n return index >= 0 ? index : -1;\n }\n\n /** Whether an option is disabled based on the valid combinations rule. */\n isOptionDisabled(option: SelectOption): boolean {\n if (option.value === null) return false;\n\n const validCombos = this.validCombinations();\n if (!validCombos || !this.multiple()) {\n return false;\n }\n\n const currentSelection = Array.isArray(this._value()) ? this._value() : [];\n\n if (currentSelection.length === 0) {\n return false;\n }\n\n if (currentSelection.includes(option.value)) {\n return false;\n }\n\n const hypotheticalSelection = [...currentSelection, option.value];\n\n return !validCombos.some((combination) => {\n const allSelected = hypotheticalSelection.every((selected) =>\n combination.includes(selected),\n );\n const withinLimit = hypotheticalSelection.length <= combination.length;\n return allSelected && withinLimit;\n });\n }\n\n /** Whether an option is currently selected. */\n isSelected(option: SelectOption): boolean {\n const val = this._value();\n if (this.multiple()) {\n return Array.isArray(val) && val.includes(option.value);\n }\n return val === option.value;\n }\n\n /** Goes to the next options page when possible. */\n nextPage() {\n const total = this.totalPages();\n const current = this.currentPage();\n if (current < total) {\n this.currentPage.set(current + 1);\n }\n }\n\n /** Goes to the previous options page when possible. */\n previousPage() {\n const current = this.currentPage();\n if (current > 1) {\n this.currentPage.set(current - 1);\n }\n }\n\n /** Closes the dropdown when a click happens outside the component. */\n @HostListener('document:mousedown', ['$event'])\n onClickOutside(event: MouseEvent): void {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside && this.isOpen()) {\n this.markAsTouchedAndUpdate();\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n }\n }\n\n /** Selects a typed free-text value as a new custom entry. */\n onCustomOptionClick() {\n const term = this.searchTerm();\n const customOption: SelectOption = {\n label: term,\n value: term,\n };\n\n this._value.set(customOption.value);\n this.onChange(customOption.value);\n this.selectionChange.emit(customOption.value);\n this.isOpen.set(false);\n this.searchTerm.set('');\n\n const ctrl = this.actualControl();\n if (ctrl) {\n ctrl.setValue(customOption.value);\n }\n\n this.markAsTouchedAndUpdate();\n }\n\n /** Handles typing in the search input (updates term and emits search). */\n onInputChange(event: Event) {\n const previousSearch = this.searchTerm();\n const target = event.target as HTMLInputElement;\n this.searchTerm.set(target.value);\n this.searchTermChanged.set(true);\n\n if (previousSearch !== this.searchTerm()) {\n this.search.emit(this.searchTerm());\n\n if (this.allowCustomEntries() && this.searchTerm()) {\n this._value.set(this.searchTerm());\n this.onChange(this.searchTerm());\n this.selectionChange.emit(this.searchTerm());\n }\n }\n\n this.currentPage.set(1);\n }\n\n /** Selects or toggles the clicked option (custom entries included). */\n onOptionClick(option: SelectOption) {\n if (this.isDisabled()) return;\n\n if (this.allowCustomEntries() && option.value === this.searchTerm()) {\n const customOption: SelectOption = {\n label: this.searchTerm(),\n value: this.searchTerm(),\n };\n\n this._value.set(customOption.value);\n this.onChange(customOption.value);\n this.selectionChange.emit(customOption.value);\n this.isOpen.set(false);\n this.searchTerm.set('');\n\n const ctrl = this.actualControl();\n if (ctrl) {\n ctrl.setValue(customOption.value);\n }\n\n this.markAsTouchedAndUpdate();\n return;\n }\n\n if (this.multiple()) {\n this.toggleOption(option);\n } else {\n this.selectOption(option);\n }\n }\n\n /** Selects a single option and updates the control/outputs. */\n selectOption(option: SelectOption) {\n if (this.multiple()) {\n this.toggleOption(option);\n return;\n }\n this._value.set(option.value);\n this.onChange(option.value);\n this.onTouched();\n this.selectionChange.emit(option.value);\n this.isOpen.set(false);\n\n const ctrl = this.actualControl();\n if (ctrl) {\n ctrl.setValue(option.value);\n }\n\n this.markAsTouchedAndUpdate();\n this.focusedIndex.set(-1);\n this.selectTrigger()?.nativeElement.focus();\n }\n\n /** Toggles an option in multiple mode, honoring the valid combinations. */\n toggleOption(option: SelectOption) {\n if (this.isOptionDisabled(option)) return;\n if (!this.multiple()) return;\n\n let currentValue = this._value();\n if (!Array.isArray(currentValue)) {\n currentValue = [];\n }\n\n const index = currentValue.indexOf(option.value);\n let newValue: any[];\n\n if (index === -1) {\n newValue = [...currentValue, option.value];\n } else {\n newValue = currentValue.filter((v: any) => v !== option.value);\n }\n\n this._value.set(newValue);\n this.onChange(newValue);\n this.onTouched();\n this.selectionChange.emit(newValue);\n\n this.markAsTouchedAndUpdate();\n }\n\n /** Opens/closes the dropdown and manages focus/selection state. */\n toggleDropdown() {\n if (this.isDisabled()) return;\n\n const wasOpen = this.isOpen();\n this.isOpen.update((v) => !v);\n\n if (!wasOpen && this.isOpen()) {\n const selectedIdx = this.getSelectedIndex();\n this.focusedIndex.set(selectedIdx);\n } else if (wasOpen && !this.isOpen()) {\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n this.selectTrigger()?.nativeElement.focus();\n }\n\n if (this.isOpen() && this.isSearchable()) {\n setTimeout(() => {\n this.filterInput()?.nativeElement?.focus();\n });\n }\n this.onTouched();\n }\n\n /** trackBy for rendered options so Angular reuses DOM nodes by value. */\n trackByFn(index: number, option: SelectOption): any {\n return option.value;\n }\n\n /** Writes an external value into the internal signal (ControlValueAccessor). */\n writeValue(value: any): void {\n if (\n value === null ||\n value === undefined ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n ) {\n this._value.set(this.multiple() ? [] : null);\n } else {\n this._value.set(value);\n }\n }\n\n /** Stores the onChange callback (ControlValueAccessor). */\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n /** Stores the onTouched callback (ControlValueAccessor). */\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n}","<div\n #selectContainer\n class=\"relative w-full font-sans outline-none\"\n>\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div\n #selectTrigger\n class=\"flex justify-between items-center w-full px-3 py-2 border _shk-border rounded-lg _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] transition-colors duration-150 cursor-pointer min-h-[2.5rem] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus-within:outline-none focus-within:[background-color:var(--shk-surface-50)] dark:focus-within:[background-color:var(--shk-surface-100)] focus-within:ring-1 focus-within:[--tw-ring-color:var(--shk-primary-500)] focus-within:[border-color:var(--shk-primary-500)] focus:outline-none focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] focus:[border-color:var(--shk-primary-500)] sm:text-sm\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeydown($event)\"\n (click)=\"toggleDropdown()\"\n [class.open]=\"isOpen()\"\n [class.disabled-select]=\"isDisabled()\"\n [class._shk-border-red]=\"shouldShowError()\"\n >\n <div class=\"selected-value truncate\">\n @if (isSearchable() && isOpen()) {\n <input\n #filterInput\n type=\"text\"\n class=\"w-full bg-transparent border-0 outline-none p-0 _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n placeholder=\"Buscar...\"\n [value]=\"searchTerm()\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span\n [class._shk-text-surface-400]=\"!hasSelectedValues()\"\n [class._shk-text-surface-800]=\"hasSelectedValues()\"\n >\n {{ displayValue() }}\n </span>\n }\n </div>\n <div\n class=\"text-xs transition-transform duration-200 shrink-0 ml-2\"\n [class.rotate-180]=\"isOpen()\"\n >\n <svg\n [lucideIcon]=\"getIcon('chevron-down')\"\n class=\"w-4 h-4 _shk-text-surface-400 dark:[color:var(--shk-surface-400)]\"\n ></svg>\n </div>\n </div>\n\n @if (isOpen()) {\n <div\n #dropdownContainer\n (keydown)=\"onKeydown($event)\"\n class=\"absolute left-0 right-0 _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border _shk-border rounded-lg max-h-[240px] overflow-y-auto z-50 shadow-lg _shk-scrollbar\"\n [class.top-full]=\"!dropdownUpward()\"\n [class.bottom-full]=\"dropdownUpward()\"\n [class.mt-1]=\"!dropdownUpward()\"\n [class.mb-1]=\"dropdownUpward()\"\n >\n @if (showCustomOption()) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm\"\n (click)=\"onCustomOptionClick()\"\n >\n <span class=\"font-semibold _shk-text-primary\">Crear nuevo:</span>\n <span class=\"_shk-text-surface-700 dark:[color:var(--shk-surface-700)] ml-1\">{{ searchTerm() }}</span>\n </div>\n }\n\n @for (option of regularOptions(); track trackByFn($index, option); let i = $index) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n [class.opacity-50]=\"isOptionDisabled(option)\"\n [class.select-option-active]=\"focusedIndex() === i\"\n [class._shk-text-surface-400]=\"option.value === null\"\n (click)=\"!isOptionDisabled(option) && onOptionClick(option)\"\n >\n @if (multiple()) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n [disabled]=\"isOptionDisabled(option)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"!isOptionDisabled(option) && toggleOption(option)\"\n class=\"flex-shrink-0 [accent-color:var(--shk-primary-600)]\"\n />\n {{ option.label }}\n } @else {\n {{ option.label }}\n }\n </div>\n }\n\n <div class=\"px-3 py-2 text-center\">\n @if (isLoading() && regularOptions().length === 0) {\n <div class=\"flex items-center justify-center gap-2 text-sm _shk-text-surface-500\">\n <svg class=\"spinner\" viewBox=\"0 0 50 50\">\n <circle\n class=\"path\"\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"5\"\n ></circle>\n </svg>\n Cargando más resultados...\n </div>\n }\n\n @if (!isLoading() && isAllDataLoaded() && regularOptions().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n No se encontraron coincidencias\n </div>\n }\n\n @if (options().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n {{ emptyMessageKey() | transloco }}\n </div>\n }\n </div>\n\n @if (usePagination() && totalPages() > 1) {\n <div class=\"flex justify-between items-center px-3 py-2 border-t _shk-border\">\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"$event.stopPropagation(); previousPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <span class=\"text-sm _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\">\n {{ currentPage() }} de {{ totalPages() }}\n </span>\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"$event.stopPropagation(); nextPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-right')\" class=\"w-4 h-4\"></svg>\n </button>\n </div>\n }\n </div>\n }\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["getIconFromCentral"],"mappings":"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"}
1
+ {"version":3,"file":"shirkasoft-ui-components-select.mjs","sources":["../../../projects/ui-components/select/select.component.ts","../../../projects/ui-components/select/select.component.html","../../../projects/ui-components/select/shirkasoft-ui-components-select.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n input,\n output,\n viewChild,\n forwardRef,\n signal,\n computed,\n effect,\n HostListener,\n ElementRef,\n ChangeDetectionStrategy,\n inject,\n DestroyRef,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormControl,\n FormGroup,\n FormsModule,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { LucideDynamicIcon, LucideChevronDown } from '@lucide/angular';\nimport { getIcon as getIconFromCentral } from 'shirkasoft-ui-components/utils';\n\n/** Option rendered by the select, optionally prefixed with a \"new entry\" badge. */\nexport interface SelectOption {\n label: string;\n value: any;\n custom?: boolean;\n}\n\n/**\n * Shirkasoft UI Components.\n * Authors: Roberto Valladares Martin (Ansem13), Julio César García García (Sanjuli14).\n * Belongs to Shirkasoft.\n */\n\n/**\n * Custom select that works as a ControlValueAccessor: single/multiple\n * selection, searchable, keyboard navigation, pagination, custom entries and\n * reactive-form integration.\n */\n@Component({\n selector: 'shk-select',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n TranslocoModule,\n LucideDynamicIcon,\n ],\n templateUrl: './select.component.html',\n styles: [`\n .select-option-active {\n background-color: var(--shk-primary-50);\n outline: 2px solid var(--shk-primary-500);\n outline-offset: -2px;\n color: var(--shk-primary-700);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectComponent),\n multi: true,\n },\n ],\n})\nexport class SelectComponent implements ControlValueAccessor {\n /** Resolves icon names to lucide components, falling back to a chevron. */\n protected getIcon = (name: any) => getIconFromCentral(name, LucideChevronDown);\n\n /** Available options. */\n options = input<SelectOption[]>([]);\n /** Enables multi-select mode. */\n multiple = input<boolean>(false);\n /** Restricts multi-selection to the given value combinations. */\n validCombinations = input<string[][] | undefined>(undefined);\n /** Placeholder shown when there is no selection. */\n placeholder = input<string>('Seleccionar...');\n /** Label used to bind the control inside a `formGroup`. */\n label = input<string | undefined>(undefined);\n /** Shows a loading state while options are being fetched. */\n isLoading = input<boolean>(false);\n /** Marks that all options have been loaded (used with pagination + search). */\n isAllDataLoaded = input<boolean>(false);\n /** Allows creating new entries from the typed search term. */\n allowCustomEntries = input<boolean>(false);\n /** Parent form group to resolve the control from `label`. */\n formGroup = input<FormGroup | undefined>(undefined);\n /** Enables the search input inside the dropdown. */\n isSearchable = input<boolean>(false);\n /** Number of options loaded per page when pagination is enabled. */\n itemsPerPage = input<number>(10);\n /** FormControl bound externally (used instead of `formGroup`/`label`). */\n control = input<FormControl | undefined>(undefined);\n /** Paginates the option list instead of rendering it all at once. */\n usePagination = input<boolean>(false);\n /** Disables the whole select. */\n disabled = input<boolean>(false);\n /** Custom per-validation-error messages shown under the select. */\n errorMessages = input<{ [key: string]: string }>({\n required: 'Este campo es requerido',\n });\n /** Keeps the search term when options reload. */\n preserveSearchOnLoad = input<boolean>(false);\n /** Translation key of the \"no records\" empty message. */\n emptyMessageKey = input<string>('common.no_records');\n /** Opens the dropdown above the trigger instead of below. */\n dropdownUpward = input<boolean>(false);\n /** Shows the \"no selection\" option in single-select mode. */\n showEmptyOption = input<boolean>(true);\n\n /** Emits when the selection changes (new value or array in multiple mode). */\n selectionChange = output<any>();\n /** Emits the debounced search term while typing. */\n search = output<string>();\n\n /** Reference to the filter input inside the dropdown (when searchable). */\n filterInput = viewChild<ElementRef>('filterInput');\n /** Reference to the select container element. */\n private selectContainer = viewChild<ElementRef>('selectContainer');\n /** Reference to the trigger button. */\n private selectTrigger = viewChild<ElementRef>('selectTrigger');\n /** Reference to the dropdown list container. */\n private dropdownContainer = viewChild<ElementRef>('dropdownContainer');\n\n /** Underlying selection value (mirrors the reactive control). */\n private _value = signal<any>(null);\n /** Whether the dropdown is open. */\n isOpen = signal<boolean>(false);\n /** Index of the currently focused option for keyboard navigation. */\n focusedIndex = signal<number>(-1);\n /** Current search term (searchable mode). */\n searchTerm = signal<string>('');\n /** Current page of the paginated dropdown. */\n currentPage = signal<number>(1);\n /** Tracks whether the user typed in the search input. */\n private searchTermChanged = signal<boolean>(false);\n /** Internal disabled state from the reactive form (setDisabledState). */\n private _isDisabled = signal<boolean>(false);\n\n /** Debounce timer handle for the search output. */\n private debounceTimer: any = null;\n\n /** Error-state counter used to recompute error helpers reactively. */\n private errorTracker = signal<number>(0);\n /** Whether an error has been shown at some point (for \"fixed\" messaging). */\n hadError = signal<boolean>(false);\n /** Whether control status/value subscriptions have been attached. */\n private subscribed = signal<boolean>(false);\n private valueSubscribed = signal<boolean>(false);\n\n /** Current selection value. */\n value = computed(() => this._value());\n\n /** True when the select is disabled via input or by the reactive form. */\n isDisabled = computed(() => this.disabled() || this._isDisabled());\n\n /** Resolves the form control from `control` or from `formGroup`+`label`. */\n actualControl = computed(() => {\n const ctrl = this.control();\n if (ctrl) return ctrl;\n\n const fg = this.formGroup();\n const lbl = this.label();\n if (fg && lbl) {\n return fg.get(lbl) as FormControl;\n }\n return undefined;\n });\n\n /** Whether the bound control should display its error (invalid + touched/dirty). */\n shouldShowError = computed(() => {\n this.errorTracker();\n\n const ctrl = this.actualControl();\n return ctrl?.invalid && (ctrl?.dirty || ctrl?.touched);\n });\n\n /** Whether an error was shown before and the control is now valid + touched. */\n wasFixedError = computed(() => {\n this.errorTracker();\n\n const ctrl = this.actualControl();\n return this.hadError() && ctrl?.valid && ctrl?.touched;\n });\n\n /** Text shown in the trigger: the selected label(s) or the placeholder. */\n displayValue = computed(() => {\n const val = this._value();\n const opts = this.options();\n const isMultiple = this.multiple();\n const ph = this.placeholder();\n\n if (!val || (Array.isArray(val) && val.length === 0)) {\n return ph;\n }\n\n if (isMultiple) {\n const values = Array.isArray(val) ? val : [];\n const selectedLabels = opts\n .filter((option) => values.includes(option.value))\n .map((option) => option.label);\n\n if (selectedLabels.length === 0) {\n return values.toString();\n }\n return selectedLabels.join(', ');\n }\n\n const selectedOption = opts.find((opt) => opt.value === val);\n return selectedOption ? selectedOption.label : val;\n });\n\n /** List of validation error messages for the bound control. */\n getErrorMessages = computed(() => {\n this.errorTracker();\n\n const ctrl = this.actualControl();\n if (!ctrl?.errors) return [];\n\n const customErrors = this.errorMessages();\n const t = this.transloco;\n\n return Object.keys(ctrl.errors).map((errorKey) => {\n if (customErrors[errorKey]) return customErrors[errorKey];\n\n switch (errorKey) {\n case 'required':\n return t.translate('validation.required');\n case 'email':\n return t.translate('validation.email');\n case 'minlength':\n return t.translate('validation.minlength', {\n min: ctrl.errors!['minlength'].requiredLength,\n });\n case 'maxlength':\n return t.translate('validation.maxlength', {\n max: ctrl.errors!['maxlength'].requiredLength,\n });\n case 'pattern':\n return t.translate('validation.pattern');\n default:\n return t.translate('validation.invalid');\n }\n });\n });\n\n /** Options filtered by the search term (matches first, then contains). */\n filteredOptions = computed(() => {\n const opts = this.options();\n const term = this.searchTerm();\n\n if (!term) return opts;\n\n const normalizedSearchTerm = this.normalizeText(term);\n\n const matched = opts.filter((option) =>\n this.normalizeText(option.label).includes(normalizedSearchTerm),\n );\n\n return matched.sort((a, b) => {\n const aLbl = this.normalizeText(a.label);\n const bLbl = this.normalizeText(b.label);\n\n const aStarts = aLbl.startsWith(normalizedSearchTerm);\n const bStarts = bLbl.startsWith(normalizedSearchTerm);\n\n if (aStarts && !bStarts) return -1;\n if (!aStarts && bStarts) return 1;\n return 0;\n });\n });\n\n /** Options for the current page, with a synthetic custom entry when allowed. */\n paginatedOptions = computed(() => {\n let filtered = this.filteredOptions();\n const term = this.searchTerm();\n const allowCustom = this.allowCustomEntries();\n\n if (allowCustom && term && !filtered.some((o) => o.value === term)) {\n filtered = [\n {\n label: `${term} (nuevo)`,\n value: term,\n custom: true,\n },\n ...filtered,\n ];\n }\n\n if (!this.usePagination()) {\n return filtered;\n }\n\n const page = this.currentPage();\n const perPage = this.itemsPerPage();\n const startIndex = (page - 1) * perPage;\n const endIndex = startIndex + perPage;\n return filtered.slice(startIndex, endIndex);\n });\n\n /** Non-custom options, including the empty option in single-select mode. */\n regularOptions = computed(() => {\n const opts = this.paginatedOptions().filter((option) => !option.custom);\n\n if (!this.multiple() && this.showEmptyOption()) {\n return [{ label: '- Sin selección -', value: null } as SelectOption, ...opts];\n }\n\n return opts;\n });\n\n /** Total pages of the filtered option list (1 when pagination is off). */\n totalPages = computed(() => {\n if (!this.usePagination()) {\n return 1;\n }\n\n const filtered = this.filteredOptions();\n const perPage = this.itemsPerPage();\n return Math.ceil(filtered.length / perPage);\n });\n\n /** Whether there is at least one selected value. */\n hasSelectedValues = computed(() => {\n const val = this._value();\n if (this.multiple()) {\n return val && val.length > 0;\n }\n return !!val;\n });\n\n /** Whether the custom optional entry should be offered for the current term. */\n showCustomOption = computed(() => {\n const term = this.searchTerm();\n const opts = this.options();\n return (\n this.allowCustomEntries() &&\n term !== '' &&\n !opts.some((o) => o.value === term)\n );\n });\n\n /** Fixed position of the dropdown relative to the viewport. */\n dropdownPosition = signal<{ top: number; left: number; width: number }>({ top: 0, left: 0, width: 0 });\n\n /** Computes the fixed position of the dropdown so it's not clipped by overflow. */\n computeDropdownPosition() {\n const trigger = this.selectTrigger()?.nativeElement as HTMLElement | undefined;\n if (!trigger) return;\n const rect = trigger.getBoundingClientRect();\n const dropdownMaxHeight = 240;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n const opensUpward = this.dropdownUpward();\n\n let top: number;\n if (opensUpward) {\n top = rect.top - dropdownMaxHeight - 4;\n if (top < 8) top = 8;\n } else {\n top = rect.bottom + 4;\n if (top + dropdownMaxHeight > window.innerHeight - 8) {\n top = rect.top - dropdownMaxHeight - 4;\n if (top < 8) top = 8;\n }\n }\n\n this.dropdownPosition.set({ top, left: rect.left, width: rect.width });\n }\n\n private transloco = inject(TranslocoService);\n /** ControlValueAccessor onChange callback. */\n private onChange = (_: any) => {};\n /** ControlValueAccessor onTouched callback. */\n private onTouched = () => {};\n private destroyRef = inject(DestroyRef);\n\n constructor(private elementRef: ElementRef) {\n // Debounced search emission whenever the term changes (searchable mode).\n effect(() => {\n const term = this.searchTerm();\n\n if (term !== '' && this.isSearchable()) {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.search.emit(term);\n }, 300);\n }\n });\n\n // Normalizes the value to arrays in multiple mode when empty.\n effect(() => {\n const isMultiple = this.multiple();\n if (this._value() === null || this._value() === undefined) {\n this._value.set(isMultiple ? [] : null);\n }\n });\n\n // Resets to the first page when options reload, clearing the search\n // term unless it must be preserved.\n effect(() => {\n this.options();\n this.currentPage.set(1);\n\n if (!this.preserveSearchOnLoad() || !this.searchTermChanged()) {\n this.searchTerm.set('');\n }\n });\n\n // Subscribes to the bound control status/value changes to track errors.\n effect(() => {\n const ctrl = this.actualControl();\n\n if (!ctrl) {\n this.subscribed.set(false);\n return;\n }\n\n if (this.subscribed()) return;\n\n if (ctrl.invalid && ctrl.touched) {\n this.hadError.set(true);\n }\n\n ctrl.statusChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n\n if (ctrl.invalid && ctrl.touched) {\n this.hadError.set(true);\n }\n });\n\n ctrl.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n });\n\n this.subscribed.set(true);\n });\n\n // Forces error recomputation when the active translation changes.\n this.transloco.langChanges$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.errorTracker.update((v) => v + 1);\n });\n\n // One-way sync from the reactive control to the internal value signal.\n effect(() => {\n const ctrl = this.actualControl();\n if (!ctrl) return;\n\n if (!this.valueSubscribed()) {\n this.writeValue(ctrl.value);\n\n ctrl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {\n this.writeValue(value);\n });\n\n this.valueSubscribed.set(true);\n }\n });\n }\n\n /** Sets the disabled state coming from the reactive form infrastructure. */\n setDisabledState(isDisabled: boolean): void {\n this._isDisabled.set(isDisabled);\n }\n\n /** Marks the control as touched and updates validity and error state. */\n private markAsTouchedAndUpdate(): void {\n const ctrl = this.actualControl();\n if (ctrl) {\n ctrl.markAsTouched();\n ctrl.updateValueAndValidity({ emitEvent: false });\n }\n\n this.onTouched();\n this.errorTracker.update((v) => v + 1);\n\n if (ctrl?.invalid) {\n this.hadError.set(true);\n }\n }\n\n /** Strips accents and lowercases text for accent-insensitive matching. */\n normalizeText(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n }\n\n /** Keyboard handler for the trigger element (open/close/navigate/select). */\n onKeydown(event: KeyboardEvent) {\n if (this.isDisabled()) return;\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (this.isOpen()) {\n if (this.focusedIndex() >= 0) {\n const options = this.regularOptions();\n const selectedOption = options[this.focusedIndex()];\n if (selectedOption && !this.isOptionDisabled(selectedOption)) {\n this.selectOption(selectedOption);\n }\n }\n } else {\n this.toggleDropdown();\n }\n break;\n case 'Escape':\n if (this.isOpen()) {\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n this.selectTrigger()?.nativeElement.focus();\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen()) {\n this.toggleDropdown();\n } else {\n this.moveFocus(1);\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (this.isOpen()) {\n this.moveFocus(-1);\n }\n break;\n case 'Tab':\n if (this.isOpen()) {\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n }\n break;\n }\n }\n\n /** Keyboard handler for the search input inside a searchable dropdown. */\n handleKeyDown(event: KeyboardEvent) {\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n event.stopPropagation();\n if (this.focusedIndex() >= 0) {\n const options = this.regularOptions();\n const option = options[this.focusedIndex()];\n if (option && !this.isOptionDisabled(option)) {\n this.selectOption(option);\n }\n } else {\n const filtered = this.filteredOptions();\n if (filtered.length > 0) {\n this.selectOption(filtered[0]);\n }\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n event.stopPropagation();\n this.moveFocus(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n event.stopPropagation();\n this.moveFocus(-1);\n break;\n case 'Escape':\n event.stopPropagation();\n event.preventDefault();\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n this.selectTrigger()?.nativeElement.focus();\n break;\n }\n }\n\n /** Moves the focused option index by `direction`, skipping disabled ones. */\n private moveFocus(direction: number) {\n const options = this.regularOptions();\n if (!options.length) return;\n\n let newIndex = this.focusedIndex();\n do {\n newIndex = newIndex + direction;\n if (newIndex < 0) newIndex = options.length - 1;\n if (newIndex >= options.length) newIndex = 0;\n } while (this.isOptionDisabled(options[newIndex]) && options.length > 1);\n\n this.focusedIndex.set(newIndex);\n\n setTimeout(() => {\n const container = this.dropdownContainer()?.nativeElement;\n const activeItem = container?.querySelector('.select-option-active');\n if (activeItem && container) {\n const itemTop = activeItem.offsetTop;\n const itemBottom = itemTop + activeItem.offsetHeight;\n const containerScrollTop = container.scrollTop;\n const containerHeight = container.clientHeight;\n\n if (itemTop < containerScrollTop) {\n container.scrollTop = itemTop;\n } else if (itemBottom > containerScrollTop + containerHeight) {\n container.scrollTop = itemBottom - containerHeight;\n }\n }\n });\n }\n\n /** Index of the currently selected option, or -1. */\n private getSelectedIndex(): number {\n const currentVal = this._value();\n const options = this.regularOptions();\n if (currentVal === null || currentVal === undefined) return -1;\n const index = options.findIndex((opt) => opt.value === currentVal);\n return index >= 0 ? index : -1;\n }\n\n /** Whether an option is disabled based on the valid combinations rule. */\n isOptionDisabled(option: SelectOption): boolean {\n if (option.value === null) return false;\n\n const validCombos = this.validCombinations();\n if (!validCombos || !this.multiple()) {\n return false;\n }\n\n const currentSelection = Array.isArray(this._value()) ? this._value() : [];\n\n if (currentSelection.length === 0) {\n return false;\n }\n\n if (currentSelection.includes(option.value)) {\n return false;\n }\n\n const hypotheticalSelection = [...currentSelection, option.value];\n\n return !validCombos.some((combination) => {\n const allSelected = hypotheticalSelection.every((selected) =>\n combination.includes(selected),\n );\n const withinLimit = hypotheticalSelection.length <= combination.length;\n return allSelected && withinLimit;\n });\n }\n\n /** Whether an option is currently selected. */\n isSelected(option: SelectOption): boolean {\n const val = this._value();\n if (this.multiple()) {\n return Array.isArray(val) && val.includes(option.value);\n }\n return val === option.value;\n }\n\n /** Goes to the next options page when possible. */\n nextPage() {\n const total = this.totalPages();\n const current = this.currentPage();\n if (current < total) {\n this.currentPage.set(current + 1);\n }\n }\n\n /** Goes to the previous options page when possible. */\n previousPage() {\n const current = this.currentPage();\n if (current > 1) {\n this.currentPage.set(current - 1);\n }\n }\n\n /** Closes the dropdown when a click happens outside the component. */\n @HostListener('document:mousedown', ['$event'])\n onClickOutside(event: MouseEvent): void {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside && this.isOpen()) {\n this.markAsTouchedAndUpdate();\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n }\n }\n\n /** Selects a typed free-text value as a new custom entry. */\n onCustomOptionClick() {\n const term = this.searchTerm();\n const customOption: SelectOption = {\n label: term,\n value: term,\n };\n\n this._value.set(customOption.value);\n this.onChange(customOption.value);\n this.selectionChange.emit(customOption.value);\n this.isOpen.set(false);\n this.searchTerm.set('');\n\n const ctrl = this.actualControl();\n if (ctrl) {\n ctrl.setValue(customOption.value);\n }\n\n this.markAsTouchedAndUpdate();\n }\n\n /** Handles typing in the search input (updates term and emits search). */\n onInputChange(event: Event) {\n const previousSearch = this.searchTerm();\n const target = event.target as HTMLInputElement;\n this.searchTerm.set(target.value);\n this.searchTermChanged.set(true);\n\n if (previousSearch !== this.searchTerm()) {\n this.search.emit(this.searchTerm());\n\n if (this.allowCustomEntries() && this.searchTerm()) {\n this._value.set(this.searchTerm());\n this.onChange(this.searchTerm());\n this.selectionChange.emit(this.searchTerm());\n }\n }\n\n this.currentPage.set(1);\n }\n\n /** Selects or toggles the clicked option (custom entries included). */\n onOptionClick(option: SelectOption) {\n if (this.isDisabled()) return;\n\n if (this.allowCustomEntries() && option.value === this.searchTerm()) {\n const customOption: SelectOption = {\n label: this.searchTerm(),\n value: this.searchTerm(),\n };\n\n this._value.set(customOption.value);\n this.onChange(customOption.value);\n this.selectionChange.emit(customOption.value);\n this.isOpen.set(false);\n this.searchTerm.set('');\n\n const ctrl = this.actualControl();\n if (ctrl) {\n ctrl.setValue(customOption.value);\n }\n\n this.markAsTouchedAndUpdate();\n return;\n }\n\n if (this.multiple()) {\n this.toggleOption(option);\n } else {\n this.selectOption(option);\n }\n }\n\n /** Selects a single option and updates the control/outputs. */\n selectOption(option: SelectOption) {\n if (this.multiple()) {\n this.toggleOption(option);\n return;\n }\n this._value.set(option.value);\n this.onChange(option.value);\n this.onTouched();\n this.selectionChange.emit(option.value);\n this.isOpen.set(false);\n\n const ctrl = this.actualControl();\n if (ctrl) {\n ctrl.setValue(option.value);\n }\n\n this.markAsTouchedAndUpdate();\n this.focusedIndex.set(-1);\n this.selectTrigger()?.nativeElement.focus();\n }\n\n /** Toggles an option in multiple mode, honoring the valid combinations. */\n toggleOption(option: SelectOption) {\n if (this.isOptionDisabled(option)) return;\n if (!this.multiple()) return;\n\n let currentValue = this._value();\n if (!Array.isArray(currentValue)) {\n currentValue = [];\n }\n\n const index = currentValue.indexOf(option.value);\n let newValue: any[];\n\n if (index === -1) {\n newValue = [...currentValue, option.value];\n } else {\n newValue = currentValue.filter((v: any) => v !== option.value);\n }\n\n this._value.set(newValue);\n this.onChange(newValue);\n this.onTouched();\n this.selectionChange.emit(newValue);\n\n this.markAsTouchedAndUpdate();\n }\n\n /** Opens/closes the dropdown and manages focus/selection state. */\n toggleDropdown() {\n if (this.isDisabled()) return;\n\n const wasOpen = this.isOpen();\n this.isOpen.update((v) => !v);\n\n if (!wasOpen && this.isOpen()) {\n const selectedIdx = this.getSelectedIndex();\n this.focusedIndex.set(selectedIdx);\n } else if (wasOpen && !this.isOpen()) {\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n this.selectTrigger()?.nativeElement.focus();\n }\n\n if (this.isOpen() && this.isSearchable()) {\n setTimeout(() => {\n this.filterInput()?.nativeElement?.focus();\n });\n }\n if (this.isOpen()) {\n this.computeDropdownPosition();\n }\n this.onTouched();\n }\n\n /** trackBy for rendered options so Angular reuses DOM nodes by value. */\n trackByFn(index: number, option: SelectOption): any {\n return option.value;\n }\n\n /** Writes an external value into the internal signal (ControlValueAccessor). */\n writeValue(value: any): void {\n if (\n value === null ||\n value === undefined ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n ) {\n this._value.set(this.multiple() ? [] : null);\n } else {\n this._value.set(value);\n }\n }\n\n /** Stores the onChange callback (ControlValueAccessor). */\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n /** Stores the onTouched callback (ControlValueAccessor). */\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n}","<div\n #selectContainer\n class=\"relative w-full font-sans outline-none\"\n>\n @if (label()) {\n <div class=\"text-sm font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-600)] mb-1\">\n {{ label() }}\n </div>\n }\n\n <div\n #selectTrigger\n class=\"flex justify-between items-center w-full px-3 py-2 border _shk-border rounded-lg _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] transition-colors duration-150 cursor-pointer min-h-[2.5rem] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus-within:outline-none focus-within:[background-color:var(--shk-surface-50)] dark:focus-within:[background-color:var(--shk-surface-100)] focus-within:ring-1 focus-within:[--tw-ring-color:var(--shk-primary-500)] focus-within:[border-color:var(--shk-primary-500)] focus:outline-none focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] focus:[border-color:var(--shk-primary-500)] sm:text-sm\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeydown($event)\"\n (click)=\"toggleDropdown()\"\n [class.open]=\"isOpen()\"\n [class.disabled-select]=\"isDisabled()\"\n [class._shk-border-red]=\"shouldShowError()\"\n >\n <div class=\"selected-value truncate\">\n @if (isSearchable() && isOpen()) {\n <input\n #filterInput\n type=\"text\"\n class=\"w-full bg-transparent border-0 outline-none p-0 _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n placeholder=\"Buscar...\"\n [value]=\"searchTerm()\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span\n [class._shk-text-surface-400]=\"!hasSelectedValues()\"\n [class._shk-text-surface-800]=\"hasSelectedValues()\"\n >\n {{ displayValue() }}\n </span>\n }\n </div>\n <div\n class=\"text-xs transition-transform duration-200 shrink-0 ml-2\"\n [class.rotate-180]=\"isOpen()\"\n >\n <svg\n [lucideIcon]=\"getIcon('chevron-down')\"\n class=\"w-4 h-4 _shk-text-surface-400 dark:[color:var(--shk-surface-400)]\"\n ></svg>\n </div>\n </div>\n\n @if (isOpen()) {\n <div\n #dropdownContainer\n (keydown)=\"onKeydown($event)\"\n class=\"fixed _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border _shk-border rounded-lg max-h-[240px] overflow-y-auto z-[9999] shadow-lg _shk-scrollbar\"\n [style.top]=\"dropdownPosition().top + 'px'\"\n [style.left]=\"dropdownPosition().left + 'px'\"\n [style.width]=\"dropdownPosition().width + 'px'\"\n >\n @if (showCustomOption()) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm\"\n (click)=\"onCustomOptionClick()\"\n >\n <span class=\"font-semibold _shk-text-primary\">Crear nuevo:</span>\n <span class=\"_shk-text-surface-700 dark:[color:var(--shk-surface-700)] ml-1\">{{ searchTerm() }}</span>\n </div>\n }\n\n @for (option of regularOptions(); track trackByFn($index, option); let i = $index) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:[background-color:var(--shk-surface-50)] dark:hover:[background-color:var(--shk-surface-200)] text-sm _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n [class.opacity-50]=\"isOptionDisabled(option)\"\n [class.select-option-active]=\"focusedIndex() === i\"\n [class._shk-text-surface-400]=\"option.value === null\"\n (click)=\"!isOptionDisabled(option) && onOptionClick(option)\"\n >\n @if (multiple()) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n [disabled]=\"isOptionDisabled(option)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"!isOptionDisabled(option) && toggleOption(option)\"\n class=\"flex-shrink-0 [accent-color:var(--shk-primary-600)]\"\n />\n {{ option.label }}\n } @else {\n {{ option.label }}\n }\n </div>\n }\n\n <div class=\"px-3 py-2 text-center\">\n @if (isLoading() && regularOptions().length === 0) {\n <div class=\"flex items-center justify-center gap-2 text-sm _shk-text-surface-500\">\n <svg class=\"spinner\" viewBox=\"0 0 50 50\">\n <circle\n class=\"path\"\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"5\"\n ></circle>\n </svg>\n Cargando más resultados...\n </div>\n }\n\n @if (!isLoading() && isAllDataLoaded() && regularOptions().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n No se encontraron coincidencias\n </div>\n }\n\n @if (options().length === 0) {\n <div class=\"text-sm _shk-text-surface-400 italic\">\n {{ emptyMessageKey() | transloco }}\n </div>\n }\n </div>\n\n @if (usePagination() && totalPages() > 1) {\n <div class=\"flex justify-between items-center px-3 py-2 border-t _shk-border\">\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"$event.stopPropagation(); previousPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <span class=\"text-sm _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\">\n {{ currentPage() }} de {{ totalPages() }}\n </span>\n <button\n class=\"bg-transparent border-0 cursor-pointer px-2 py-1 rounded hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-50 disabled:cursor-not-allowed _shk-text-surface-600 dark:[color:var(--shk-surface-600)]\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"$event.stopPropagation(); nextPage()\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-right')\" class=\"w-4 h-4\"></svg>\n </button>\n </div>\n }\n </div>\n }\n\n @if (shouldShowError()) {\n <div class=\"mt-1 text-xs text-red-500 max-h-20 overflow-y-auto _shk-scrollbar\" tabindex=\"-1\">\n <ul class=\"list-disc pl-4 space-y-1\">\n @for (error of getErrorMessages(); track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n }\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["getIconFromCentral"],"mappings":"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"}