@apexara/ng-components 1.0.6-test.7 → 1.0.7

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.
Files changed (43) hide show
  1. package/README.md +35 -0
  2. package/fesm2022/apexara-ng-components-button.mjs +15 -3
  3. package/fesm2022/apexara-ng-components-button.mjs.map +1 -1
  4. package/fesm2022/apexara-ng-components-chip.mjs +1 -1
  5. package/fesm2022/apexara-ng-components-chip.mjs.map +1 -1
  6. package/fesm2022/apexara-ng-components-datepicker.mjs +1 -1
  7. package/fesm2022/apexara-ng-components-datepicker.mjs.map +1 -1
  8. package/fesm2022/apexara-ng-components-dialog.mjs +26 -3
  9. package/fesm2022/apexara-ng-components-dialog.mjs.map +1 -1
  10. package/fesm2022/apexara-ng-components-drawer.mjs +26 -7
  11. package/fesm2022/apexara-ng-components-drawer.mjs.map +1 -1
  12. package/fesm2022/apexara-ng-components-expander.mjs +5 -2
  13. package/fesm2022/apexara-ng-components-expander.mjs.map +1 -1
  14. package/fesm2022/apexara-ng-components-filter-pill.mjs +58 -0
  15. package/fesm2022/apexara-ng-components-filter-pill.mjs.map +1 -0
  16. package/fesm2022/apexara-ng-components-image.mjs +15 -5
  17. package/fesm2022/apexara-ng-components-image.mjs.map +1 -1
  18. package/fesm2022/apexara-ng-components-input.mjs +30 -7
  19. package/fesm2022/apexara-ng-components-input.mjs.map +1 -1
  20. package/fesm2022/apexara-ng-components-more-options.mjs +1 -1
  21. package/fesm2022/apexara-ng-components-more-options.mjs.map +1 -1
  22. package/fesm2022/apexara-ng-components-select.mjs +258 -9
  23. package/fesm2022/apexara-ng-components-select.mjs.map +1 -1
  24. package/fesm2022/apexara-ng-components-services.mjs +6 -0
  25. package/fesm2022/apexara-ng-components-services.mjs.map +1 -1
  26. package/fesm2022/apexara-ng-components-snackbar.mjs +2 -2
  27. package/fesm2022/apexara-ng-components-snackbar.mjs.map +1 -1
  28. package/fesm2022/apexara-ng-components-table.mjs +157 -3
  29. package/fesm2022/apexara-ng-components-table.mjs.map +1 -1
  30. package/fesm2022/apexara-ng-components-textarea.mjs +10 -2
  31. package/fesm2022/apexara-ng-components-textarea.mjs.map +1 -1
  32. package/package.json +5 -1
  33. package/types/apexara-ng-components-button.d.ts +3 -2
  34. package/types/apexara-ng-components-dialog.d.ts +6 -1
  35. package/types/apexara-ng-components-drawer.d.ts +10 -2
  36. package/types/apexara-ng-components-expander.d.ts +2 -0
  37. package/types/apexara-ng-components-filter-pill.d.ts +30 -0
  38. package/types/apexara-ng-components-image.d.ts +2 -1
  39. package/types/apexara-ng-components-input.d.ts +14 -2
  40. package/types/apexara-ng-components-select.d.ts +31 -1
  41. package/types/apexara-ng-components-services.d.ts +1 -0
  42. package/types/apexara-ng-components-table.d.ts +36 -3
  43. package/types/apexara-ng-components-textarea.d.ts +5 -0
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, signal, inject, PLATFORM_ID, HostListener, Output, Input, ViewChild, Component } from '@angular/core';
3
- import { isPlatformServer, NgClass } from '@angular/common';
2
+ import { EventEmitter, signal, inject, PLATFORM_ID, computed, HostListener, Output, Input, ViewChild, Component } from '@angular/core';
3
+ import { isPlatformServer, NgClass, NgTemplateOutlet } from '@angular/common';
4
4
  import * as i2 from '@angular/forms';
5
5
  import { TouchedChangeEvent, FormsModule, ReactiveFormsModule } from '@angular/forms';
6
6
  import { RouterLink } from '@angular/router';
@@ -14,7 +14,38 @@ import * as i1 from '@apexara/ng-components/services';
14
14
  import { MobileOS } from '@apexara/ng-components/services';
15
15
  import { TooltipPosition, ApexTooltipDirective } from '@apexara/ng-components/tooltip';
16
16
 
17
+ // Trigger appearance. Default is the standard single-line trigger; Inset moves the
18
+ // field label inside the trigger, stacks it above the value, and swaps the caret for
19
+ // an inline clear (×). Add a new appearance by extending this enum, then giving it its
20
+ // own predicate + overlay block + CSS namespace — existing variants stay closed.
21
+ var ApexSelectVariant;
22
+ (function (ApexSelectVariant) {
23
+ ApexSelectVariant["Default"] = "default";
24
+ ApexSelectVariant["Inset"] = "inset";
25
+ })(ApexSelectVariant || (ApexSelectVariant = {}));
17
26
  class ApexSelectComponent {
27
+ static { this.nextA11yId = 0; }
28
+ // Accessible-name fallback chain: explicit ariaLabel → visible label → placeholder.
29
+ get ariaLabelValue() {
30
+ return this.options?.ariaLabel ?? (this.options?.label || this.options?.placeholder || null);
31
+ }
32
+ optionId(index) {
33
+ return `${this.listboxId}-opt-${index}`;
34
+ }
35
+ // Flat index of an option across groups, so grouped options share the same
36
+ // id scheme as the virtual-scrolled flat list.
37
+ flatIndexOf(data) {
38
+ return this.getNavigableOptions().indexOf(data);
39
+ }
40
+ // The keyboard-highlighted option's id, exposed on the trigger as
41
+ // aria-activedescendant so AT tracks arrow-key navigation.
42
+ activeOptionId() {
43
+ if (!this.isDropdown()) {
44
+ return null;
45
+ }
46
+ const index = this.getNavigableOptions().findIndex(option => option.isHover);
47
+ return index >= 0 ? this.optionId(index) : null;
48
+ }
18
49
  constructor(osService, elementRef, iterableDiffers) {
19
50
  this.osService = osService;
20
51
  this.elementRef = elementRef;
@@ -25,6 +56,12 @@ class ApexSelectComponent {
25
56
  this.inputWrapper = null;
26
57
  this.dropdownSearch = null;
27
58
  this.dropdownContainer = null;
59
+ // Exposes the variant enum to the template (mirrors TableColumnType on apex-table).
60
+ this.Variant = ApexSelectVariant;
61
+ // Ids wiring the APG combobox pattern: trigger (combobox) ↔ dropdown
62
+ // (listbox) ↔ options, all referenced via aria-controls/activedescendant.
63
+ this.selectA11yId = `apex-select-${ApexSelectComponent.nextA11yId++}`;
64
+ this.listboxId = `${this.selectA11yId}-listbox`;
28
65
  this.selectChange = new EventEmitter();
29
66
  this.helperTextChange = new EventEmitter();
30
67
  this.firstDropdown = signal(0, ...(ngDevMode ? [{ debugName: "firstDropdown" }] : []));
@@ -39,6 +76,25 @@ class ApexSelectComponent {
39
76
  this.controlSubscription = null;
40
77
  this.filteredData = signal([], ...(ngDevMode ? [{ debugName: "filteredData" }] : []));
41
78
  this.filteredGroups = signal([], ...(ngDevMode ? [{ debugName: "filteredGroups" }] : []));
79
+ // The groups split into `dropdownColumns` side-by-side lists (one list when the option is unset or
80
+ // 1). Each group stays whole in one column; groups are handed to the currently-shortest column so
81
+ // the columns end up roughly equal height. The template lays these out as flex columns that scroll
82
+ // together, so a capped, columned menu never clips.
83
+ this.groupColumns = computed(() => {
84
+ const columnCount = this.options?.dropdownColumns ?? 1;
85
+ const groups = this.filteredGroups();
86
+ if (columnCount <= 1) {
87
+ return [groups];
88
+ }
89
+ const columns = Array.from({ length: columnCount }, () => []);
90
+ const heights = new Array(columnCount).fill(0);
91
+ for (const group of groups) {
92
+ const shortest = heights.indexOf(Math.min(...heights));
93
+ columns[shortest].push(group);
94
+ heights[shortest] += group.data.length + 1; // + 1 for the group header row
95
+ }
96
+ return columns;
97
+ }, ...(ngDevMode ? [{ debugName: "groupColumns" }] : []));
42
98
  this.lastSearch = '';
43
99
  this.keyListener = (event) => this.blockArrowScroll(event);
44
100
  this.wheelListener = (event) => this.blockScroll(event);
@@ -130,12 +186,74 @@ class ApexSelectComponent {
130
186
  isSearchInDropdown() {
131
187
  return !!this.options?.searchInDropdown;
132
188
  }
189
+ // The active trigger appearance; defaults to Default when unset. Single source
190
+ // for every variant check + the wrapper's variant class.
191
+ variant() {
192
+ return this.options?.variant ?? ApexSelectVariant.Default;
193
+ }
194
+ isInsetLabel() {
195
+ return this.variant() === ApexSelectVariant.Inset;
196
+ }
197
+ // The selected option's label for the inset-variant overlay. Reads the reactive
198
+ // controlValue (an { label, value } object, or a raw value) and resolves it to a
199
+ // label via the option list. Empty when nothing is selected.
200
+ insetValueLabel() {
201
+ const controlVal = this.controlValue();
202
+ if (controlVal == null || controlVal === '') {
203
+ return '';
204
+ }
205
+ // Multiple selects show a count, matching the counterAsValue trigger.
206
+ if (this.options.multiple) {
207
+ const count = Array.isArray(controlVal) ? controlVal.length : 0;
208
+ return count ? `${count} selected` : '';
209
+ }
210
+ if (typeof controlVal === 'object' && controlVal.label) {
211
+ return controlVal.label;
212
+ }
213
+ return this.getAllOptions().find(option => option.value === controlVal)?.label ?? '';
214
+ }
215
+ // The inset variant only shows its stacked caption + value + clear once a value
216
+ // is set; empty, it renders the normal placeholder + caret.
217
+ hasInsetValue() {
218
+ return this.isInsetLabel() && !!this.insetValueLabel();
219
+ }
220
+ // Inline clear (×) on the inset trigger. Stops the click from toggling the
221
+ // dropdown, then resets the bound control to null so the placeholder returns.
222
+ clearInsetValue(event) {
223
+ event.stopPropagation();
224
+ // A multiple control holds an array — clearing it to null would break the next toggle, which
225
+ // reads `.length`. Reset to an empty array there, and to null for a single select.
226
+ const cleared = this.options.multiple ? [] : null;
227
+ this.control.setValue(cleared);
228
+ this.controlValue.set(cleared);
229
+ if (this.input) {
230
+ this.input.nativeElement.value = '';
231
+ }
232
+ this.selectChange.emit(cleared);
233
+ }
133
234
  getAllOptions() {
134
235
  if (this.hasGroups()) {
135
236
  return (this.options.groups || []).flatMap(group => group.data);
136
237
  }
137
238
  return this.options.data || [];
138
239
  }
240
+ // Whether every option is currently selected — drives the Select All master's ticked state.
241
+ isAllSelected() {
242
+ const all = this.getAllOptions();
243
+ return all.length > 0 && all.every(option => this.isMultipleSelected(option));
244
+ }
245
+ // Select All toggles the whole set: clear it when everything is already picked, otherwise
246
+ // select every option. Mirrors setMultipleValue's stored shape ({ label, value } only).
247
+ toggleSelectAll(event) {
248
+ if (event) {
249
+ event.preventDefault();
250
+ }
251
+ const next = this.isAllSelected()
252
+ ? []
253
+ : this.getAllOptions().map(option => ({ label: option.label, value: option.value }));
254
+ this.control.setValue(next);
255
+ this.selectChange.emit(next);
256
+ }
139
257
  getDropdownEl() {
140
258
  if (this.dropdownContainer) {
141
259
  return this.dropdownContainer.nativeElement;
@@ -400,14 +518,42 @@ class ApexSelectComponent {
400
518
  elementRefRect.y += window.visualViewport.offsetTop;
401
519
  elementRefRect.x += window.visualViewport.offsetLeft;
402
520
  }
403
- dropdownEl.style.left = elementRefRect.x + 'px';
404
- dropdownEl.style.width = elementRefRect.width + 'px';
521
+ // ── Width ──
522
+ // 'trigger' (default) → match the trigger; otherwise use the explicit px
523
+ // value, clamped so the dropdown can never exceed viewport minus 2× the
524
+ // safe-area padding on very narrow screens.
525
+ const VIEWPORT_PADDING = 8;
526
+ const widthOption = this.options.dropdownWidth ?? 'trigger';
527
+ const maxWidth = Math.max(elementRefRect.width, window.innerWidth - VIEWPORT_PADDING * 2);
528
+ const desiredWidth = typeof widthOption === 'number'
529
+ ? Math.min(widthOption, maxWidth)
530
+ : elementRefRect.width;
531
+ dropdownEl.style.width = desiredWidth + 'px';
532
+ // ── Horizontal alignment ──
533
+ // Default is 'start' for trigger-width dropdowns (preserves the
534
+ // pre-existing behavior) and 'auto' for explicit-width dropdowns so a
535
+ // wider menu near the right edge of the viewport flips to end-align
536
+ // instead of clipping.
537
+ const defaultAlign = typeof widthOption === 'number' ? 'auto' : 'start';
538
+ const alignOption = this.options.dropdownAlign ?? defaultAlign;
539
+ let resolvedLeft = this.resolveDropdownLeft(alignOption, elementRefRect, desiredWidth, VIEWPORT_PADDING);
540
+ // Final clamp keeps the dropdown inside the viewport at any width.
541
+ const minLeft = VIEWPORT_PADDING;
542
+ const maxLeft = Math.max(VIEWPORT_PADDING, window.innerWidth - desiredWidth - VIEWPORT_PADDING);
543
+ resolvedLeft = Math.max(minLeft, Math.min(resolvedLeft, maxLeft));
544
+ dropdownEl.style.left = resolvedLeft + 'px';
405
545
  dropdownEl.style.top = elementRefRect.y + elementRefRect.height + 'px';
546
+ // Size the grouped-dropdown body to the space available below the trigger
547
+ // (with `maxDropdownHeightPx` as an optional cap). Non-grouped selects
548
+ // are handled by `updateDropdownHeight()` via virtual scroll height.
549
+ this.adjustGroupedDropdownMaxHeight(false, elementRefRect);
406
550
  if (checkRevserse) {
407
551
  if (window.innerHeight < dropdownEl.getBoundingClientRect().bottom) {
408
552
  dropdownEl.style.top = 'unset';
409
553
  dropdownEl.style.bottom = window.innerHeight - elementRefRect.y + 10 + 'px';
410
554
  this.isDropdownReversed = true;
555
+ // Reflow grouped body for the above-trigger space after flipping up.
556
+ this.adjustGroupedDropdownMaxHeight(true, elementRefRect);
411
557
  }
412
558
  }
413
559
  if (this.isDropdownReversed) {
@@ -418,6 +564,65 @@ class ApexSelectComponent {
418
564
  this.updateDropdownHeight();
419
565
  }, 100);
420
566
  }
567
+ // Resolves the dropdown's left coordinate against the trigger and viewport.
568
+ // 'start' → trigger left edge
569
+ // 'end' → trigger right edge minus dropdown width
570
+ // 'auto' → start if it fits, else end if it fits, else pinned padding
571
+ // The 'auto' branch is the only place where viewport-overflow detection
572
+ // matters; keeping it isolated avoids the nested-else chain in the caller.
573
+ resolveDropdownLeft(align, triggerRect, desiredWidth, padding) {
574
+ const startLeft = triggerRect.x;
575
+ const endLeft = triggerRect.right - desiredWidth;
576
+ if (align === 'start') {
577
+ return startLeft;
578
+ }
579
+ if (align === 'end') {
580
+ return endLeft;
581
+ }
582
+ const fitsAtStart = startLeft + desiredWidth <= window.innerWidth - padding;
583
+ if (fitsAtStart) {
584
+ return startLeft;
585
+ }
586
+ const fitsAtEnd = endLeft >= padding;
587
+ if (fitsAtEnd) {
588
+ return endLeft;
589
+ }
590
+ // Both edges would still overflow — pin to viewport with padding.
591
+ return padding;
592
+ }
593
+ // Sets `--apex-select-dropdown-body-max-height` on the dropdown root so the
594
+ // grouped + searchInDropdown body grows to fill the viewport instead of the
595
+ // hardcoded 320 px CSS fallback. Called twice: once for the default
596
+ // below-trigger anchor, again after the reverse-flip handler so the value
597
+ // matches the chosen side. `maxDropdownHeightPx` (when provided) caps the
598
+ // dynamic value — useful when callers want a smaller-than-viewport dropdown.
599
+ adjustGroupedDropdownMaxHeight(reversed, triggerRect) {
600
+ if (!this.hasGroups()) {
601
+ return;
602
+ }
603
+ const dropdownEl = this.getDropdownEl();
604
+ if (!dropdownEl) {
605
+ return;
606
+ }
607
+ const VIEWPORT_PADDING = 16;
608
+ const SEARCH_HEADER_PX = this.isSearchInDropdown() ? 52 : 0;
609
+ // The `.dropdown` root sits `margin-top` below its anchor and carries a 1px border top and
610
+ // bottom — chrome that lives OUTSIDE the body the max-height caps. Left unaccounted, the body
611
+ // fills the whole gap and the assembled dropdown lands a hair past the viewport edge, tripping
612
+ // the flip-up check even when there is room below. Reserving it keeps a below-anchored grouped
613
+ // dropdown open downward. A search dropdown never noticed because its header offset absorbed it.
614
+ const DROPDOWN_CHROME_PX = 17;
615
+ const MIN_BODY_PX = 160;
616
+ const availableSpace = reversed
617
+ ? triggerRect.y - VIEWPORT_PADDING - DROPDOWN_CHROME_PX
618
+ : window.innerHeight - (triggerRect.y + triggerRect.height) - VIEWPORT_PADDING - DROPDOWN_CHROME_PX;
619
+ let bodyMax = Math.max(MIN_BODY_PX, availableSpace - SEARCH_HEADER_PX);
620
+ const cap = this.options.maxDropdownHeightPx;
621
+ if (cap !== undefined && cap > 0) {
622
+ bodyMax = Math.min(bodyMax, cap);
623
+ }
624
+ dropdownEl.style.setProperty('--apex-select-dropdown-body-max-height', bodyMax + 'px');
625
+ }
421
626
  removeDropdown() {
422
627
  this.isDropdown.set(false);
423
628
  this.isDropdownReversed = false;
@@ -587,9 +792,35 @@ class ApexSelectComponent {
587
792
  case 'ArrowUp':
588
793
  this.documentArrowsKeyup(false);
589
794
  return;
795
+ case 'Home':
796
+ this.documentHomeEndKeyup(true);
797
+ return;
798
+ case 'End':
799
+ this.documentHomeEndKeyup(false);
800
+ return;
590
801
  }
591
802
  this.documentKeyup(event);
592
803
  }
804
+ // Home/End jump the keyboard highlight to the first/last option (APG combobox).
805
+ documentHomeEndKeyup(toFirst) {
806
+ const data = this.getNavigableOptions();
807
+ if (!data.length || !this.isDropdown()) {
808
+ return;
809
+ }
810
+ for (let i = 0; i < data.length; i++) {
811
+ data[i].isHover = false;
812
+ }
813
+ const newIndex = toFirst ? 0 : data.length - 1;
814
+ data[newIndex].isHover = true;
815
+ if (this.hasGroups()) {
816
+ this.filteredGroups.set([...this.filteredGroups()]);
817
+ this.scrollGroupedOptionIntoView(newIndex);
818
+ }
819
+ else {
820
+ this.filteredData.set([...this.filteredData()]);
821
+ this.dropdown?.scrollToIndex(newIndex, 'auto');
822
+ }
823
+ }
593
824
  documentEnterKeyup(event) {
594
825
  const data = this.getNavigableOptions();
595
826
  for (let i = 0; i < data.length; i++) {
@@ -702,9 +933,10 @@ class ApexSelectComponent {
702
933
  if (!dropdownEl) {
703
934
  return;
704
935
  }
705
- const isInsideDropdown = this.isDescendant(dropdownEl, event.target);
936
+ const target = event.target;
937
+ const isInsideDropdown = !!target && this.isDescendant(dropdownEl, target);
706
938
  if (isInsideDropdown) {
707
- const canScroll = dropdownEl.scrollHeight > dropdownEl.clientHeight;
939
+ const canScroll = this.canScrollAt(target, dropdownEl);
708
940
  if (!canScroll) {
709
941
  event.preventDefault();
710
942
  }
@@ -712,6 +944,22 @@ class ApexSelectComponent {
712
944
  }
713
945
  event.preventDefault();
714
946
  }
947
+ canScrollAt(start, boundary) {
948
+ let el = start;
949
+ while (el !== null) {
950
+ if (el.scrollHeight > el.clientHeight) {
951
+ const overflowY = getComputedStyle(el).overflowY;
952
+ if (overflowY === 'auto' || overflowY === 'scroll') {
953
+ return true;
954
+ }
955
+ }
956
+ if (el === boundary || el === document.body) {
957
+ break;
958
+ }
959
+ el = el.parentElement;
960
+ }
961
+ return false;
962
+ }
715
963
  isDescendant(parent, child) {
716
964
  while (child !== null) {
717
965
  if (child === parent) {
@@ -738,12 +986,13 @@ class ApexSelectComponent {
738
986
  this.scrollBlockersAttached = false;
739
987
  }
740
988
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ApexSelectComponent, deps: [{ token: i1.OSService }, { token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component }); }
741
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: ApexSelectComponent, isStandalone: true, selector: "apex-select", inputs: { options: "options" }, outputs: { selectChange: "selectChange", helperTextChange: "helperTextChange" }, host: { listeners: { "document:click": "deactivateControl($event)" } }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "label", first: true, predicate: ["label"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "inputWrapper", first: true, predicate: ["inputWrapper"], descendants: true }, { propertyName: "dropdownSearch", first: true, predicate: ["dropdownSearch"], descendants: true }, { propertyName: "dropdownContainer", first: true, predicate: ["dropdownContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (options) {\n @if (options.formGroup && options.formControlName) {\n <div class=\"container\" (mousedown)=\"preventFocusChange($event)\">\n @if (options.label !== '') {\n <div class=\"header\">\n <div class=\"label-wrapper\">\n <label>{{ options.label }}</label>\n\n @if (options.tooltip) {\n <svg class=\"tooltip-icon\" [apexTooltip]=\"options.tooltip\" [tooltipPosition]=\"tooltipPosition.Above\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 7.5H8V11h.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.25 5.25a.25.25 0 1 1-.5 0 .25.25 0 0 1 .5 0z\" fill=\"#fff\"/>\n </g>\n </svg>\n }\n </div>\n\n @if (options.helperText) {\n <div class=\"header-helper\" (click)=\"onHelperText()\" [routerLink]=\"options.helperRoute\">{{ options.helperText }}</div>\n }\n </div>\n }\n\n <div #inputWrapper class=\"input-field-wrapper\" (click)=\"toggleDropdown()\" [formGroup]=\"options.formGroup\" [ngClass]=\"{ 'invalid': checkIfControlInvalid(), 'disabled': checkIfControlDisabled() }\">\n @if (options.prefixImg) {\n <apex-img class=\"prefix\" [src]=\"'assets/img/' + this.options.prefixImg\" [alt]=\"'Select prefix icon'\"></apex-img>\n }\n\n @if (isSearchInDropdown() && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of getAllOptions(); track $index) {\n @if (isMultipleSelected(data)) {\n <apex-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</apex-chip>\n }\n }\n </div>\n }\n }\n\n @if (!isSearchInDropdown() && options.searchable && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of getAllOptions(); track $index) {\n @if (isMultipleSelected(data)) {\n <apex-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</apex-chip>\n }\n }\n </div>\n }\n }\n\n @if (isSearchInDropdown()) {\n <!-- Hidden input owns the form binding; the visible one is a placeholder slot. -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <input #input\n readonly\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"/>\n } @else if (options.searchable) {\n <!-- used for formControl data binding and reactivness -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <!-- used for searching and data displaying -->\n <input #input\n [placeholder]=\"getPlaceholder()\"\n [readOnly]=\"!options.searchable\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n [disabled]=\"checkIfControlDisabled()\"\n (keydown)=\"handleKeydown($event)\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n (input)=\"onSearch(input.value, true)\"\n autocorrect=\"off\"\n spellcheck=\"false\">\n } @else {\n <input #input\n readonly\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n [formControlName]=\"options.formControlName\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n (ngModelChange)=\"setVisibleValue($event)\"/>\n }\n\n <div class=\"arrow-wrapper\">\n <div class=\"arrow\" [class]=\"{ checked: this.isDropdown() }\"></div>\n </div>\n </div>\n\n @if (isDropdown()) {\n @if (isSearchInDropdown()) {\n <div #dropdownContainer class=\"dropdown dropdown-wrapper\">\n <div class=\"dropdown-search\">\n <svg class=\"dropdown-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M11 11L14 14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input #dropdownSearch\n type=\"text\"\n placeholder=\"Search\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n (input)=\"onSearch(dropdownSearch.value, true)\"\n (keydown)=\"handleKeydown($event)\"/>\n </div>\n\n @if (options.groups && options.groups.length > 0) {\n <div class=\"dropdown-body\">\n @for (group of filteredGroups(); track group.label) {\n <div class=\"group-header\">{{ group.label }}</div>\n @for (data of group.data; track data.value) {\n <div class=\"option\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n }\n }\n\n @if (filteredGroups().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </div>\n } @else {\n <cdk-virtual-scroll-viewport [itemSize]=\"optionItemSizePx\" [style.height.px]=\"dropdownHeightPx()\" class=\"dropdown-body dropdown-body-virtual\" #dropdown>\n <div class=\"option\"\n *cdkVirtualFor=\"let data of filteredData();\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n @if (filteredData().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </cdk-virtual-scroll-viewport>\n }\n </div>\n } @else {\n <cdk-virtual-scroll-viewport [itemSize]=\"optionItemSizePx\" [style.height.px]=\"dropdownHeightPx()\" class=\"dropdown\" #dropdown>\n <div class=\"option\"\n *cdkVirtualFor=\"let data of filteredData();\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n @if (filteredData().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </cdk-virtual-scroll-viewport>\n }\n }\n </div>\n }\n}\n", styles: [":host{display:block;touch-action:manipulation}:host-context(.table) .input-field-wrapper{width:80px;justify-content:center}:host-context(.table) .input-field-wrapper input{width:40px;color:var(--apex-select-input-table-color, #5D6068);font-weight:600;margin:0}.header{display:flex;align-items:center;justify-content:space-between;column-gap:4px;color:var(--apex-select-header-color, #0B1222);text-wrap:nowrap;margin-bottom:2px}.header label{font-size:14px;font-weight:600}.header-helper{font-size:12px;text-align:right;color:var(--apex-select-helper-text-color, #5D6068);cursor:pointer}.header-helper:after{width:0;height:1px;display:block;content:\"\";background:var(--apex-select-helper-text-color, #5D6068);transition:width .3s}.header-helper:hover:after{width:100%}.header .label-wrapper{display:flex;justify-content:center;align-items:center;text-wrap:wrap}.tooltip-icon{overflow:visible}.tooltip-icon path{fill:var(--apex-select-tooltip-icon-fill, transparent);stroke:var(--apex-input-tooltip-icon-stroke, #C6C6C6)}.input-field-wrapper{width:100%;height:44px;display:flex;justify-content:space-around;align-items:center;cursor:pointer;box-sizing:border-box;overflow:scroll;background-color:var(--apex-select-input-background-color, #ffffff00);border:solid var(--apex-select-input-border-color, #E9E9E9);border-width:var(--apex-select-input-border-width, 1px);transition:border 1s;border-radius:4px;padding:0 16px}.input-field-wrapper .multiple-count{font-size:14px;padding:0 8px;font-weight:600}.input-field-wrapper::-webkit-scrollbar{display:none}.input-field-wrapper:not(.input-field-wrapper.disabled):hover{border-color:var(--apex-select-input-border-hover-color, #4B5368)}.input-field-wrapper.disabled{opacity:.8;cursor:not-allowed;border:1px dashed var(--apex-select-input-border-disabled-color, #F2F2F2)}.input-field-wrapper .input-field{height:100%;display:flex;justify-content:space-between;align-items:center;padding:0 16px}apex-img{width:16px;height:16px}apex-img.prefix path{fill:var(--apex-select-icon-prefix-fill, #C6C6C6);stroke:var(--apex-select-icon-prefix-stroke, transparent)}.input-field-wrapper.disabled label{cursor:not-allowed}.chips{--apex-chip-font-size: var(--apex-select-chip-font-size, 10px);--apex-chip-color: var(--apex-select-chip-color, #FFFFFF);--apex-chip-background-color: var(--apex-select-chip-background-color, #0B1222);--apex-chip-icon-color: var(--apex-select-chip-icon-color, #FFFFFF);display:flex;padding-left:8px}.input-field-wrapper input{width:inherit;flex:1;text-overflow:ellipsis;border:none;outline:none;cursor:pointer;background:transparent;color:var(--apex-select-input-text-color, #0B1222);font-size:16px;transform:scale(.875);transform-origin:left center;padding:0;margin:0 12px}.input-field-wrapper input.hidden{display:none}input::placeholder{color:var(--apex-select-input-placeholder-color, #0B1222)}.input-field-wrapper input.no-icon{left:0}.input-field-wrapper.disabled input{cursor:not-allowed}.arrow-wrapper{width:8px;height:8px}.arrow{width:8px;height:8px;position:relative;bottom:3px;border-top:2px solid var(--apex-select-arrow-color, #5D6068);border-left:2px solid var(--apex-select-arrow-color, #5D6068);border-top-left-radius:3px;border-top-right-radius:1px;border-bottom-left-radius:1px;transition:all .25s ease-in-out;transform-origin:center;transform:rotate(-135deg)}.arrow.checked{bottom:-2px;transform:rotate(45deg);border-top:2px solid var(--apex-select-arrow-checked-color, #F96138);border-left:2px solid var(--apex-select-arrow-checked-color, #F96138)}.arrow svg{width:16px;height:16px;transform:rotate(0);transition:transform .25s ease-in-out}.arrow.checked svg{transform:rotate(180deg)}.input-field-wrapper.invalid{border:solid var(--apex-select-invalid-color, #F96138);border-width:var(--apex-select-invalid-border-width, 1px)}.input-field-wrapper.invalid label{color:var(--apex-select-invalid-color, #F96138)}.input-field-wrapper apex-chip{margin-right:4px}.dropdown{width:264px;position:fixed;z-index:900;overscroll-behavior:contain;border-radius:8px;border:1px solid var(--apex-select-dropdown-border-color, #E9E9E9);background-color:var(--apex-select-dropdown-background-color, #FFFFFF);box-shadow:var(--apex-select-dropdown-box-shadow);animation:fadeIn .3s forwards;opacity:0;margin-top:15px}.dropdown:focus{outline:none}.dropdown::-webkit-scrollbar{width:16px;padding:8px}.dropdown::-webkit-scrollbar-thumb{background-color:#e0dfde;border-radius:25px}.dropdown::-webkit-scrollbar-track{background-color:#f8f8f8;border-top-right-radius:8px;border-bottom-right-radius:8px}.dropdown::-webkit-scrollbar-button{display:none}.dropdown.no-scroll{overflow:hidden}.values::-webkit-scrollbar{width:8px;padding:4px}.values::-webkit-scrollbar-thumb{background-color:#e0dfde;border-radius:25px}.values::-webkit-scrollbar-track{background-color:#f8f8f8;border-top-right-radius:8px;border-bottom-right-radius:8px}.values::-webkit-scrollbar-button{display:none}.dropdown .option{min-height:48px;display:flex;align-items:center;cursor:pointer;font-weight:600;color:#0009;padding:0 16px}.dropdown .option.disabled{pointer-events:none}.dropdown .option:hover,.dropdown .option.preselected{background:#00000005}.dropdown .option.checkbox.selected{--apex-checkbox-text-color: var(--apex-select-input-text-selected-color, #F96138);background:#0000000a}.dropdown .option.selected{color:var(--apex-select-input-text-selected-color, #F96138);background:#0000000a}.option-icon{width:var(--apex-select-option-icon-size, 16px);height:var(--apex-select-option-icon-size, 16px);min-width:var(--apex-select-option-icon-size, 16px);display:flex;justify-content:center;align-items:center;margin-right:var(--apex-select-option-icon-spacing, 10px)}.option-icon apex-img{max-width:var(--apex-select-option-icon-size, 20px);max-height:var(--apex-select-option-icon-size, 20px);display:flex;justify-content:center;align-items:center}.option-icon apex-img path{fill:var(--apex-select-option-icon-fill, #5D6068);stroke:var(--apex-select-option-icon-stroke, #ffffff00)}.dropdown .option.selected .option-icon apex-img path{fill:var(--apex-select-option-icon-selected-fill, #F96138);stroke:var(--apex-select-option-icon-selected-stroke, #ffffff00)}.values{width:fit-content;display:flex;flex-wrap:wrap;align-items:center;padding:6px;overflow-x:auto}.values apex-chip{margin:6px 0 0}.single-value{padding:6px}.options-divider{width:calc(100% - 36px);height:var(--apex-select-options-divider-height, 1px);background-color:var(--apex-select-options-divider-color, #E9E9E9);margin:0 auto}.multiple-checkbox-container{display:flex;flex-direction:column;row-gap:3px;padding:12px 0 12px 6px}.multiple-checkbox-container span{word-break:normal;overflow-wrap:break-word;white-space:normal}.multiple-checkbox-container span:nth-of-type(2){font-size:13px;font-weight:500;line-height:1.3;color:#5d6068}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.dropdown.dropdown-wrapper{display:flex;flex-direction:column;overflow:hidden;padding:0}.dropdown-search{display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--apex-select-dropdown-search-border-color, #E9E9E9);color:var(--apex-select-dropdown-search-icon-color, #5D6068);padding:10px 16px}.dropdown-search-icon{flex:0 0 auto}.dropdown-search input{flex:1;border:none;outline:none;background:transparent;font-size:14px;color:var(--apex-select-input-text-color, #0B1222);padding:0}.dropdown-search input::placeholder{color:var(--apex-select-input-placeholder-color, #9A9A9A)}.dropdown-body{flex:1 1 auto;min-height:0;overflow-y:auto;max-height:var(--apex-select-dropdown-body-max-height, 320px)}.dropdown-body.dropdown-body-virtual{overflow:hidden;max-height:none}.dropdown-body::-webkit-scrollbar{width:8px}.dropdown-body::-webkit-scrollbar-thumb{background-color:#e0dfde;border-radius:25px}.dropdown-body::-webkit-scrollbar-track{background-color:#f8f8f8}.group-header{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:none;color:var(--apex-select-group-header-color, #9A9A9A);pointer-events:none;-webkit-user-select:none;user-select:none;padding:10px 16px 4px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: ApexChipComponent, selector: "apex-chip", inputs: ["closeIcon", "options"], outputs: ["closeChange"] }, { kind: "component", type: ApexImageComponent, selector: "apex-img", inputs: ["src", "alt"] }, { kind: "directive", type: ApexTooltipDirective, selector: "[apexTooltip]", inputs: ["apexTooltip", "tooltipPosition"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ApexCheckboxComponent, selector: "apex-checkbox", inputs: ["checked", "disabled", "tooltip", "options"], outputs: ["clickChange"] }] }); }
989
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: ApexSelectComponent, isStandalone: true, selector: "apex-select", inputs: { options: "options" }, outputs: { selectChange: "selectChange", helperTextChange: "helperTextChange" }, host: { listeners: { "document:click": "deactivateControl($event)" } }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "label", first: true, predicate: ["label"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "inputWrapper", first: true, predicate: ["inputWrapper"], descendants: true }, { propertyName: "dropdownSearch", first: true, predicate: ["dropdownSearch"], descendants: true }, { propertyName: "dropdownContainer", first: true, predicate: ["dropdownContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (options) {\n @if (options.formGroup && options.formControlName) {\n <div class=\"container\" (mousedown)=\"preventFocusChange($event)\">\n @if (options.label !== '' && variant() === Variant.Default) {\n <div class=\"header\">\n <div class=\"label-wrapper\">\n <label>{{ options.label }}</label>\n\n @if (options.tooltip) {\n <svg class=\"tooltip-icon\" [apexTooltip]=\"options.tooltip\" [tooltipPosition]=\"tooltipPosition.Above\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 7.5H8V11h.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.25 5.25a.25.25 0 1 1-.5 0 .25.25 0 0 1 .5 0z\" fill=\"#fff\"/>\n </g>\n </svg>\n }\n </div>\n\n @if (options.helperText) {\n <div class=\"header-helper\" (click)=\"onHelperText()\" [routerLink]=\"options.helperRoute\">{{ options.helperText }}</div>\n }\n </div>\n }\n\n <div #inputWrapper class=\"input-field-wrapper\" (click)=\"toggleDropdown()\" [formGroup]=\"options.formGroup\" [ngClass]=\"{ 'invalid': checkIfControlInvalid(), 'disabled': checkIfControlDisabled(), 'inset': isInsetLabel(), 'inset-has-value': hasInsetValue() }\">\n @if (options.prefixImg) {\n <apex-img class=\"prefix\" [src]=\"'assets/img/' + this.options.prefixImg\" [alt]=\"''\"></apex-img>\n }\n\n @if (isSearchInDropdown() && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of getAllOptions(); track $index) {\n @if (isMultipleSelected(data)) {\n <apex-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</apex-chip>\n }\n }\n </div>\n }\n }\n\n @if (!isSearchInDropdown() && options.searchable && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of getAllOptions(); track $index) {\n @if (isMultipleSelected(data)) {\n <apex-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</apex-chip>\n }\n }\n </div>\n }\n }\n\n @if (isSearchInDropdown()) {\n <!-- Hidden input owns the form binding; the visible one is a placeholder slot. -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <input #input\n readonly\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isDropdown()\"\n [attr.aria-controls]=\"isDropdown() ? listboxId : null\"\n [attr.aria-label]=\"ariaLabelValue\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [attr.aria-invalid]=\"checkIfControlInvalid() ? 'true' : null\"\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"/>\n } @else if (options.searchable) {\n <!-- used for formControl data binding and reactivness -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <!-- used for searching and data displaying -->\n <input #input\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n [attr.aria-expanded]=\"isDropdown()\"\n [attr.aria-controls]=\"isDropdown() ? listboxId : null\"\n [attr.aria-label]=\"ariaLabelValue\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [attr.aria-invalid]=\"checkIfControlInvalid() ? 'true' : null\"\n [placeholder]=\"getPlaceholder()\"\n [readOnly]=\"!options.searchable\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n [disabled]=\"checkIfControlDisabled()\"\n (keydown)=\"handleKeydown($event)\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n (input)=\"onSearch(input.value, true)\"\n autocorrect=\"off\"\n spellcheck=\"false\">\n } @else {\n <input #input\n readonly\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isDropdown()\"\n [attr.aria-controls]=\"isDropdown() ? listboxId : null\"\n [attr.aria-label]=\"ariaLabelValue\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [attr.aria-invalid]=\"checkIfControlInvalid() ? 'true' : null\"\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n [formControlName]=\"options.formControlName\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n (ngModelChange)=\"setVisibleValue($event)\"/>\n }\n\n @if (isInsetLabel() && hasInsetValue()) {\n <div class=\"inset-stack\" aria-hidden=\"true\">\n <span class=\"inset-label\">{{ options.label }}</span>\n <span class=\"inset-value\">{{ insetValueLabel() }}</span>\n </div>\n\n <button type=\"button\" class=\"inset-clear\" [attr.aria-label]=\"'Clear ' + (options.label || options.placeholder || 'filter')\" (click)=\"clearInsetValue($event)\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 3 9 9M9 3 3 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n }\n\n <div class=\"arrow-wrapper\" aria-hidden=\"true\">\n <div class=\"arrow\" [class]=\"{ checked: this.isDropdown() }\"></div>\n </div>\n </div>\n\n @if (isDropdown()) {\n @if (isSearchInDropdown()) {\n <div #dropdownContainer class=\"dropdown dropdown-wrapper\">\n <div class=\"dropdown-search\">\n <svg class=\"dropdown-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M11 11L14 14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input #dropdownSearch\n type=\"text\"\n placeholder=\"Search\"\n aria-label=\"Search options\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n (input)=\"onSearch(dropdownSearch.value, true)\"\n (keydown)=\"handleKeydown($event)\"/>\n </div>\n\n @if (options.groups && options.groups.length > 0) {\n <div class=\"dropdown-body\" role=\"listbox\" [class.dropdown-body-columns]=\"(options.dropdownColumns ?? 1) > 1\" [id]=\"listboxId\" [attr.aria-multiselectable]=\"options.multiple ? 'true' : null\" [attr.aria-label]=\"ariaLabelValue\">\n <ng-container [ngTemplateOutlet]=\"groupBody\"></ng-container>\n </div>\n } @else {\n <cdk-virtual-scroll-viewport [itemSize]=\"optionItemSizePx\" [style.height.px]=\"dropdownHeightPx()\" class=\"dropdown-body dropdown-body-virtual\" role=\"listbox\" [id]=\"listboxId\" [attr.aria-multiselectable]=\"options.multiple ? 'true' : null\" [attr.aria-label]=\"ariaLabelValue\" #dropdown>\n <div class=\"option\"\n *cdkVirtualFor=\"let data of filteredData(); let i = index\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"options.multiple ? isMultipleSelected(data) : isValueSelected(data)\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n @if (filteredData().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </cdk-virtual-scroll-viewport>\n }\n </div>\n } @else if (options.groups && options.groups.length > 0) {\n <div #dropdownContainer class=\"dropdown dropdown-wrapper\">\n <div class=\"dropdown-body\" role=\"listbox\" [class.dropdown-body-columns]=\"(options.dropdownColumns ?? 1) > 1\" [id]=\"listboxId\" [attr.aria-multiselectable]=\"options.multiple ? 'true' : null\" [attr.aria-label]=\"ariaLabelValue\">\n <ng-container [ngTemplateOutlet]=\"groupBody\"></ng-container>\n </div>\n </div>\n } @else {\n <cdk-virtual-scroll-viewport [itemSize]=\"optionItemSizePx\" [style.height.px]=\"dropdownHeightPx()\" class=\"dropdown\" role=\"listbox\" [id]=\"listboxId\" [attr.aria-multiselectable]=\"options.multiple ? 'true' : null\" [attr.aria-label]=\"ariaLabelValue\" #dropdown>\n <div class=\"option\"\n *cdkVirtualFor=\"let data of filteredData(); let i = index\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"options.multiple ? isMultipleSelected(data) : isValueSelected(data)\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n @if (filteredData().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </cdk-virtual-scroll-viewport>\n }\n }\n </div>\n }\n}\n\n<!-- The grouped option list, shared by the search and no-search dropdowns so the group + option\n markup lives in one place. The Select All master (multiple mode + selectAll) sits above the\n groups and toggles every option. -->\n<ng-template #groupBody>\n @if (options.selectAll && options.multiple) {\n <div class=\"option checkbox select-all-option\"\n role=\"option\"\n [attr.aria-selected]=\"isAllSelected()\"\n (click)=\"toggleSelectAll($event)\">\n <apex-checkbox [checked]=\"isAllSelected()\">\n <div class=\"multiple-checkbox-container\"><span>Select all</span></div>\n </apex-checkbox>\n </div>\n }\n\n @if ((options.dropdownColumns ?? 1) > 1) {\n <div class=\"group-columns\">\n @for (column of groupColumns(); track $index) {\n <div class=\"select-col\">\n @for (group of column; track group.label) {\n <ng-container [ngTemplateOutlet]=\"groupBlock\" [ngTemplateOutletContext]=\"{ $implicit: group }\"></ng-container>\n }\n </div>\n }\n </div>\n } @else {\n @for (group of filteredGroups(); track group.label) {\n <ng-container [ngTemplateOutlet]=\"groupBlock\" [ngTemplateOutletContext]=\"{ $implicit: group }\"></ng-container>\n }\n }\n\n @if (filteredGroups().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n</ng-template>\n\n<!-- One group: its header followed by its options. Shared by the single-column list and by each\n flex column, so the option markup lives in exactly one place. -->\n<ng-template #groupBlock let-group>\n <div class=\"group-header\" role=\"presentation\">{{ group.label }}</div>\n @for (data of group.data; track data.value) {\n <div class=\"option\"\n role=\"option\"\n [id]=\"optionId(flatIndexOf(data))\"\n [attr.aria-selected]=\"options.multiple ? isMultipleSelected(data) : isValueSelected(data)\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n }\n</ng-template>\n", styles: [":host{display:block;touch-action:manipulation}:host-context(.table) .input-field-wrapper{width:80px;justify-content:center}:host-context(.table) .input-field-wrapper input{width:40px;color:var(--apex-select-input-table-color, #5D6068);font-weight:600;margin:0}.header{display:flex;align-items:center;justify-content:space-between;column-gap:4px;color:var(--apex-select-header-color, #0B1222);text-wrap:nowrap;margin-bottom:2px}.header label{font-size:14px;font-weight:600}.header-helper{font-size:12px;text-align:right;color:var(--apex-select-helper-text-color, #5D6068);cursor:pointer}.header-helper:after{width:0;height:1px;display:block;content:\"\";background:var(--apex-select-helper-text-color, #5D6068);transition:width .3s}.header-helper:hover:after{width:100%}.header .label-wrapper{display:flex;justify-content:center;align-items:center;text-wrap:wrap}.tooltip-icon{overflow:visible}.tooltip-icon path{fill:var(--apex-select-tooltip-icon-fill, transparent);stroke:var(--apex-input-tooltip-icon-stroke, #C6C6C6)}.input-field-wrapper{width:100%;height:44px;display:flex;justify-content:space-around;align-items:center;cursor:pointer;box-sizing:border-box;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;background-color:var(--apex-select-input-background-color, #ffffff00);border:solid var(--apex-select-input-border-color, #E9E9E9);border-width:var(--apex-select-input-border-width, 1px);transition:border 1s;border-radius:4px;padding:0 16px}.input-field-wrapper .multiple-count{font-size:14px;padding:0 8px;font-weight:600}.input-field-wrapper::-webkit-scrollbar{display:none}.input-field-wrapper:not(.input-field-wrapper.disabled):hover{border-color:var(--apex-select-input-border-hover-color, #4B5368)}.input-field-wrapper.disabled{opacity:.8;cursor:not-allowed;border:1px dashed var(--apex-select-input-border-disabled-color, #F2F2F2)}.input-field-wrapper .input-field{height:100%;display:flex;justify-content:space-between;align-items:center;padding:0 16px}apex-img{width:16px;height:16px}apex-img.prefix path{fill:var(--apex-select-icon-prefix-fill, #C6C6C6);stroke:var(--apex-select-icon-prefix-stroke, transparent)}.input-field-wrapper.disabled label{cursor:not-allowed}.chips{--apex-chip-font-size: var(--apex-select-chip-font-size, 10px);--apex-chip-color: var(--apex-select-chip-color, #FFFFFF);--apex-chip-background-color: var(--apex-select-chip-background-color, #0B1222);--apex-chip-icon-color: var(--apex-select-chip-icon-color, #FFFFFF);display:flex;padding-left:8px}.input-field-wrapper.inset{position:relative;border-color:var(--apex-select-inset-border-color, #D3D3D3)}.input-field-wrapper.inset.disabled{opacity:1;cursor:not-allowed;background-color:var(--apex-select-inset-disabled-background-color, #F3F3F3);border:1px solid var(--apex-select-inset-disabled-border-color, #E4E4E4)}.input-field-wrapper.inset-has-value input{color:transparent}.input-field-wrapper.inset-has-value .arrow-wrapper{display:none}.inset-stack{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;gap:4px;padding:0 38px 0 16px;pointer-events:none}.inset-label{font-size:var(--apex-select-inset-label-font-size, 10px);font-weight:600;letter-spacing:.04em;text-transform:uppercase;line-height:1;color:var(--apex-select-inset-label-color, #7C8182)}.inset-value{font-size:var(--apex-select-inset-value-font-size, 13px);font-weight:600;line-height:1;color:var(--apex-select-inset-value-color, #141414);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.inset-clear{position:absolute;top:50%;right:12px;transform:translateY(-50%);display:inline-grid;place-items:center;width:18px;height:18px;padding:0;border:none;border-radius:999px;background:var(--apex-select-inset-clear-background, transparent);color:var(--apex-select-inset-clear-color, #7C8182);cursor:pointer}.inset-clear:hover{background:var(--apex-select-inset-clear-hover-background, #141414);color:var(--apex-select-inset-clear-hover-color, #FFFFFF)}.inset-clear svg{width:11px;height:11px;display:block}.input-field-wrapper input{width:inherit;flex:1;text-overflow:ellipsis;border:none;outline:none;cursor:pointer;background:transparent;color:var(--apex-select-input-text-color, #0B1222);font-size:16px;transform:scale(.875);transform-origin:left center;padding:0;margin:0 12px}.input-field-wrapper input.hidden{display:none}input::placeholder{color:var(--apex-select-input-placeholder-color, #0B1222)}.input-field-wrapper input.no-icon{left:0}.input-field-wrapper.disabled input{cursor:not-allowed}.arrow-wrapper{width:8px;height:8px}.arrow{width:8px;height:8px;position:relative;bottom:3px;border-top:2px solid var(--apex-select-arrow-color, #5D6068);border-left:2px solid var(--apex-select-arrow-color, #5D6068);border-top-left-radius:3px;border-top-right-radius:1px;border-bottom-left-radius:1px;transition:all .25s ease-in-out;transform-origin:center;transform:rotate(-135deg)}.arrow.checked{bottom:-2px;transform:rotate(45deg);border-top:2px solid var(--apex-select-arrow-checked-color, #F96138);border-left:2px solid var(--apex-select-arrow-checked-color, #F96138)}.arrow svg{width:16px;height:16px;transform:rotate(0);transition:transform .25s ease-in-out}.arrow.checked svg{transform:rotate(180deg)}.input-field-wrapper.invalid{border:solid var(--apex-select-invalid-color, #F96138);border-width:var(--apex-select-invalid-border-width, 1px)}.input-field-wrapper.invalid label{color:var(--apex-select-invalid-color, #F96138)}.input-field-wrapper apex-chip{margin-right:4px}.dropdown{width:264px;position:fixed;z-index:900;overscroll-behavior:contain;border-radius:8px;border:1px solid var(--apex-select-dropdown-border-color, #E9E9E9);background-color:var(--apex-select-dropdown-background-color, #FFFFFF);box-shadow:var(--apex-select-dropdown-box-shadow);animation:fadeIn .3s forwards;opacity:0;margin-top:15px}.dropdown:focus{outline:none}.dropdown{scrollbar-width:thin;scrollbar-color:#F2F2F2 #FAFAFA}.dropdown::-webkit-scrollbar{width:4px}.dropdown::-webkit-scrollbar-thumb{background-color:#f2f2f2;border-radius:99px}.dropdown::-webkit-scrollbar-track{background-color:#fafafa;border-radius:99px}.dropdown::-webkit-scrollbar-button{display:none}.dropdown.no-scroll{overflow:hidden}.values{scrollbar-width:thin;scrollbar-color:#F2F2F2 #FAFAFA}.values::-webkit-scrollbar{width:4px}.values::-webkit-scrollbar-thumb{background-color:#f2f2f2;border-radius:99px}.values::-webkit-scrollbar-track{background-color:#fafafa;border-radius:99px}.values::-webkit-scrollbar-button{display:none}.dropdown .option{min-height:48px;display:flex;align-items:center;cursor:pointer;font-weight:600;color:#0009;padding:0 16px}.dropdown .option.disabled{pointer-events:none}.dropdown .option:hover,.dropdown .option.preselected{background:#00000005}.dropdown .option.checkbox.selected{--apex-checkbox-text-color: var(--apex-select-input-text-selected-color, #F96138);background:#0000000a}.dropdown .option.selected{color:var(--apex-select-input-text-selected-color, #F96138);background:#0000000a}.option-icon{width:var(--apex-select-option-icon-size, 16px);height:var(--apex-select-option-icon-size, 16px);min-width:var(--apex-select-option-icon-size, 16px);display:flex;justify-content:center;align-items:center;margin-right:var(--apex-select-option-icon-spacing, 10px)}.option-icon apex-img{max-width:var(--apex-select-option-icon-size, 20px);max-height:var(--apex-select-option-icon-size, 20px);display:flex;justify-content:center;align-items:center}.option-icon apex-img path{fill:var(--apex-select-option-icon-fill, #5D6068);stroke:var(--apex-select-option-icon-stroke, #ffffff00)}.dropdown .option.selected .option-icon apex-img path{fill:var(--apex-select-option-icon-selected-fill, #F96138);stroke:var(--apex-select-option-icon-selected-stroke, #ffffff00)}.values{width:fit-content;display:flex;flex-wrap:wrap;align-items:center;padding:6px;overflow-x:auto}.values apex-chip{margin:6px 0 0}.single-value{padding:6px}.options-divider{width:calc(100% - 36px);height:var(--apex-select-options-divider-height, 1px);background-color:var(--apex-select-options-divider-color, #E9E9E9);margin:0 auto}.multiple-checkbox-container{display:flex;flex-direction:column;row-gap:3px;padding:12px 0 12px 6px}.multiple-checkbox-container span{word-break:normal;overflow-wrap:break-word;white-space:normal}.multiple-checkbox-container span:nth-of-type(2){font-size:13px;font-weight:500;line-height:1.3;color:#5d6068}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.dropdown.dropdown-wrapper{display:flex;flex-direction:column;overflow:hidden;padding:0}.dropdown-search{display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--apex-select-dropdown-search-border-color, #E9E9E9);color:var(--apex-select-dropdown-search-icon-color, #5D6068);padding:10px 16px}.dropdown-search-icon{flex:0 0 auto}.dropdown-search input{flex:1;border:none;outline:none;background:transparent;font-size:14px;color:var(--apex-select-input-text-color, #0B1222);padding:0}.dropdown-search input::placeholder{color:var(--apex-select-input-placeholder-color, #9A9A9A)}.dropdown-body{flex:1 1 auto;min-height:0;overflow-y:auto;max-height:var(--apex-select-dropdown-body-max-height, 320px)}.dropdown-body.dropdown-body-virtual{overflow:hidden;max-height:none}.dropdown-body{scrollbar-width:thin;scrollbar-color:#F2F2F2 #FAFAFA}.dropdown-body::-webkit-scrollbar{width:4px}.dropdown-body::-webkit-scrollbar-thumb{background-color:#f2f2f2;border-radius:99px}.dropdown-body::-webkit-scrollbar-track{background-color:#fafafa;border-radius:99px}.group-header{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:none;color:var(--apex-select-group-header-color, #9A9A9A);pointer-events:none;-webkit-user-select:none;user-select:none;padding:10px 16px 4px}.dropdown .option.select-all-option{border-bottom:1px solid var(--apex-select-dropdown-border-color, #E9E9E9)}.dropdown-body.dropdown-body-columns{padding:4px 14px 10px}.dropdown-body-columns .group-columns{display:flex;align-items:flex-start;gap:24px}.dropdown-body-columns .select-col{flex:1;min-width:0}.dropdown-body-columns .option,.dropdown-body-columns .group-header{padding-left:8px;padding-right:8px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: ApexChipComponent, selector: "apex-chip", inputs: ["closeIcon", "options"], outputs: ["closeChange"] }, { kind: "component", type: ApexImageComponent, selector: "apex-img", inputs: ["src", "alt", "loading"] }, { kind: "directive", type: ApexTooltipDirective, selector: "[apexTooltip]", inputs: ["apexTooltip", "tooltipPosition"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ApexCheckboxComponent, selector: "apex-checkbox", inputs: ["checked", "disabled", "tooltip", "options"], outputs: ["clickChange"] }] }); }
742
990
  }
743
991
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ApexSelectComponent, decorators: [{
744
992
  type: Component,
745
993
  args: [{ selector: 'apex-select', imports: [
746
994
  NgClass,
995
+ NgTemplateOutlet,
747
996
  RouterLink,
748
997
  FormsModule,
749
998
  ScrollingModule,
@@ -752,7 +1001,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
752
1001
  ApexTooltipDirective,
753
1002
  ReactiveFormsModule,
754
1003
  ApexCheckboxComponent,
755
- ], template: "@if (options) {\n @if (options.formGroup && options.formControlName) {\n <div class=\"container\" (mousedown)=\"preventFocusChange($event)\">\n @if (options.label !== '') {\n <div class=\"header\">\n <div class=\"label-wrapper\">\n <label>{{ options.label }}</label>\n\n @if (options.tooltip) {\n <svg class=\"tooltip-icon\" [apexTooltip]=\"options.tooltip\" [tooltipPosition]=\"tooltipPosition.Above\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 7.5H8V11h.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.25 5.25a.25.25 0 1 1-.5 0 .25.25 0 0 1 .5 0z\" fill=\"#fff\"/>\n </g>\n </svg>\n }\n </div>\n\n @if (options.helperText) {\n <div class=\"header-helper\" (click)=\"onHelperText()\" [routerLink]=\"options.helperRoute\">{{ options.helperText }}</div>\n }\n </div>\n }\n\n <div #inputWrapper class=\"input-field-wrapper\" (click)=\"toggleDropdown()\" [formGroup]=\"options.formGroup\" [ngClass]=\"{ 'invalid': checkIfControlInvalid(), 'disabled': checkIfControlDisabled() }\">\n @if (options.prefixImg) {\n <apex-img class=\"prefix\" [src]=\"'assets/img/' + this.options.prefixImg\" [alt]=\"'Select prefix icon'\"></apex-img>\n }\n\n @if (isSearchInDropdown() && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of getAllOptions(); track $index) {\n @if (isMultipleSelected(data)) {\n <apex-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</apex-chip>\n }\n }\n </div>\n }\n }\n\n @if (!isSearchInDropdown() && options.searchable && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of getAllOptions(); track $index) {\n @if (isMultipleSelected(data)) {\n <apex-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</apex-chip>\n }\n }\n </div>\n }\n }\n\n @if (isSearchInDropdown()) {\n <!-- Hidden input owns the form binding; the visible one is a placeholder slot. -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <input #input\n readonly\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"/>\n } @else if (options.searchable) {\n <!-- used for formControl data binding and reactivness -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <!-- used for searching and data displaying -->\n <input #input\n [placeholder]=\"getPlaceholder()\"\n [readOnly]=\"!options.searchable\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n [disabled]=\"checkIfControlDisabled()\"\n (keydown)=\"handleKeydown($event)\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n (input)=\"onSearch(input.value, true)\"\n autocorrect=\"off\"\n spellcheck=\"false\">\n } @else {\n <input #input\n readonly\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n [formControlName]=\"options.formControlName\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n (ngModelChange)=\"setVisibleValue($event)\"/>\n }\n\n <div class=\"arrow-wrapper\">\n <div class=\"arrow\" [class]=\"{ checked: this.isDropdown() }\"></div>\n </div>\n </div>\n\n @if (isDropdown()) {\n @if (isSearchInDropdown()) {\n <div #dropdownContainer class=\"dropdown dropdown-wrapper\">\n <div class=\"dropdown-search\">\n <svg class=\"dropdown-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M11 11L14 14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input #dropdownSearch\n type=\"text\"\n placeholder=\"Search\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n (input)=\"onSearch(dropdownSearch.value, true)\"\n (keydown)=\"handleKeydown($event)\"/>\n </div>\n\n @if (options.groups && options.groups.length > 0) {\n <div class=\"dropdown-body\">\n @for (group of filteredGroups(); track group.label) {\n <div class=\"group-header\">{{ group.label }}</div>\n @for (data of group.data; track data.value) {\n <div class=\"option\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n }\n }\n\n @if (filteredGroups().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </div>\n } @else {\n <cdk-virtual-scroll-viewport [itemSize]=\"optionItemSizePx\" [style.height.px]=\"dropdownHeightPx()\" class=\"dropdown-body dropdown-body-virtual\" #dropdown>\n <div class=\"option\"\n *cdkVirtualFor=\"let data of filteredData();\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n @if (filteredData().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </cdk-virtual-scroll-viewport>\n }\n </div>\n } @else {\n <cdk-virtual-scroll-viewport [itemSize]=\"optionItemSizePx\" [style.height.px]=\"dropdownHeightPx()\" class=\"dropdown\" #dropdown>\n <div class=\"option\"\n *cdkVirtualFor=\"let data of filteredData();\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"'Option icon.'\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n @if (filteredData().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </cdk-virtual-scroll-viewport>\n }\n }\n </div>\n }\n}\n", styles: [":host{display:block;touch-action:manipulation}:host-context(.table) .input-field-wrapper{width:80px;justify-content:center}:host-context(.table) .input-field-wrapper input{width:40px;color:var(--apex-select-input-table-color, #5D6068);font-weight:600;margin:0}.header{display:flex;align-items:center;justify-content:space-between;column-gap:4px;color:var(--apex-select-header-color, #0B1222);text-wrap:nowrap;margin-bottom:2px}.header label{font-size:14px;font-weight:600}.header-helper{font-size:12px;text-align:right;color:var(--apex-select-helper-text-color, #5D6068);cursor:pointer}.header-helper:after{width:0;height:1px;display:block;content:\"\";background:var(--apex-select-helper-text-color, #5D6068);transition:width .3s}.header-helper:hover:after{width:100%}.header .label-wrapper{display:flex;justify-content:center;align-items:center;text-wrap:wrap}.tooltip-icon{overflow:visible}.tooltip-icon path{fill:var(--apex-select-tooltip-icon-fill, transparent);stroke:var(--apex-input-tooltip-icon-stroke, #C6C6C6)}.input-field-wrapper{width:100%;height:44px;display:flex;justify-content:space-around;align-items:center;cursor:pointer;box-sizing:border-box;overflow:scroll;background-color:var(--apex-select-input-background-color, #ffffff00);border:solid var(--apex-select-input-border-color, #E9E9E9);border-width:var(--apex-select-input-border-width, 1px);transition:border 1s;border-radius:4px;padding:0 16px}.input-field-wrapper .multiple-count{font-size:14px;padding:0 8px;font-weight:600}.input-field-wrapper::-webkit-scrollbar{display:none}.input-field-wrapper:not(.input-field-wrapper.disabled):hover{border-color:var(--apex-select-input-border-hover-color, #4B5368)}.input-field-wrapper.disabled{opacity:.8;cursor:not-allowed;border:1px dashed var(--apex-select-input-border-disabled-color, #F2F2F2)}.input-field-wrapper .input-field{height:100%;display:flex;justify-content:space-between;align-items:center;padding:0 16px}apex-img{width:16px;height:16px}apex-img.prefix path{fill:var(--apex-select-icon-prefix-fill, #C6C6C6);stroke:var(--apex-select-icon-prefix-stroke, transparent)}.input-field-wrapper.disabled label{cursor:not-allowed}.chips{--apex-chip-font-size: var(--apex-select-chip-font-size, 10px);--apex-chip-color: var(--apex-select-chip-color, #FFFFFF);--apex-chip-background-color: var(--apex-select-chip-background-color, #0B1222);--apex-chip-icon-color: var(--apex-select-chip-icon-color, #FFFFFF);display:flex;padding-left:8px}.input-field-wrapper input{width:inherit;flex:1;text-overflow:ellipsis;border:none;outline:none;cursor:pointer;background:transparent;color:var(--apex-select-input-text-color, #0B1222);font-size:16px;transform:scale(.875);transform-origin:left center;padding:0;margin:0 12px}.input-field-wrapper input.hidden{display:none}input::placeholder{color:var(--apex-select-input-placeholder-color, #0B1222)}.input-field-wrapper input.no-icon{left:0}.input-field-wrapper.disabled input{cursor:not-allowed}.arrow-wrapper{width:8px;height:8px}.arrow{width:8px;height:8px;position:relative;bottom:3px;border-top:2px solid var(--apex-select-arrow-color, #5D6068);border-left:2px solid var(--apex-select-arrow-color, #5D6068);border-top-left-radius:3px;border-top-right-radius:1px;border-bottom-left-radius:1px;transition:all .25s ease-in-out;transform-origin:center;transform:rotate(-135deg)}.arrow.checked{bottom:-2px;transform:rotate(45deg);border-top:2px solid var(--apex-select-arrow-checked-color, #F96138);border-left:2px solid var(--apex-select-arrow-checked-color, #F96138)}.arrow svg{width:16px;height:16px;transform:rotate(0);transition:transform .25s ease-in-out}.arrow.checked svg{transform:rotate(180deg)}.input-field-wrapper.invalid{border:solid var(--apex-select-invalid-color, #F96138);border-width:var(--apex-select-invalid-border-width, 1px)}.input-field-wrapper.invalid label{color:var(--apex-select-invalid-color, #F96138)}.input-field-wrapper apex-chip{margin-right:4px}.dropdown{width:264px;position:fixed;z-index:900;overscroll-behavior:contain;border-radius:8px;border:1px solid var(--apex-select-dropdown-border-color, #E9E9E9);background-color:var(--apex-select-dropdown-background-color, #FFFFFF);box-shadow:var(--apex-select-dropdown-box-shadow);animation:fadeIn .3s forwards;opacity:0;margin-top:15px}.dropdown:focus{outline:none}.dropdown::-webkit-scrollbar{width:16px;padding:8px}.dropdown::-webkit-scrollbar-thumb{background-color:#e0dfde;border-radius:25px}.dropdown::-webkit-scrollbar-track{background-color:#f8f8f8;border-top-right-radius:8px;border-bottom-right-radius:8px}.dropdown::-webkit-scrollbar-button{display:none}.dropdown.no-scroll{overflow:hidden}.values::-webkit-scrollbar{width:8px;padding:4px}.values::-webkit-scrollbar-thumb{background-color:#e0dfde;border-radius:25px}.values::-webkit-scrollbar-track{background-color:#f8f8f8;border-top-right-radius:8px;border-bottom-right-radius:8px}.values::-webkit-scrollbar-button{display:none}.dropdown .option{min-height:48px;display:flex;align-items:center;cursor:pointer;font-weight:600;color:#0009;padding:0 16px}.dropdown .option.disabled{pointer-events:none}.dropdown .option:hover,.dropdown .option.preselected{background:#00000005}.dropdown .option.checkbox.selected{--apex-checkbox-text-color: var(--apex-select-input-text-selected-color, #F96138);background:#0000000a}.dropdown .option.selected{color:var(--apex-select-input-text-selected-color, #F96138);background:#0000000a}.option-icon{width:var(--apex-select-option-icon-size, 16px);height:var(--apex-select-option-icon-size, 16px);min-width:var(--apex-select-option-icon-size, 16px);display:flex;justify-content:center;align-items:center;margin-right:var(--apex-select-option-icon-spacing, 10px)}.option-icon apex-img{max-width:var(--apex-select-option-icon-size, 20px);max-height:var(--apex-select-option-icon-size, 20px);display:flex;justify-content:center;align-items:center}.option-icon apex-img path{fill:var(--apex-select-option-icon-fill, #5D6068);stroke:var(--apex-select-option-icon-stroke, #ffffff00)}.dropdown .option.selected .option-icon apex-img path{fill:var(--apex-select-option-icon-selected-fill, #F96138);stroke:var(--apex-select-option-icon-selected-stroke, #ffffff00)}.values{width:fit-content;display:flex;flex-wrap:wrap;align-items:center;padding:6px;overflow-x:auto}.values apex-chip{margin:6px 0 0}.single-value{padding:6px}.options-divider{width:calc(100% - 36px);height:var(--apex-select-options-divider-height, 1px);background-color:var(--apex-select-options-divider-color, #E9E9E9);margin:0 auto}.multiple-checkbox-container{display:flex;flex-direction:column;row-gap:3px;padding:12px 0 12px 6px}.multiple-checkbox-container span{word-break:normal;overflow-wrap:break-word;white-space:normal}.multiple-checkbox-container span:nth-of-type(2){font-size:13px;font-weight:500;line-height:1.3;color:#5d6068}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.dropdown.dropdown-wrapper{display:flex;flex-direction:column;overflow:hidden;padding:0}.dropdown-search{display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--apex-select-dropdown-search-border-color, #E9E9E9);color:var(--apex-select-dropdown-search-icon-color, #5D6068);padding:10px 16px}.dropdown-search-icon{flex:0 0 auto}.dropdown-search input{flex:1;border:none;outline:none;background:transparent;font-size:14px;color:var(--apex-select-input-text-color, #0B1222);padding:0}.dropdown-search input::placeholder{color:var(--apex-select-input-placeholder-color, #9A9A9A)}.dropdown-body{flex:1 1 auto;min-height:0;overflow-y:auto;max-height:var(--apex-select-dropdown-body-max-height, 320px)}.dropdown-body.dropdown-body-virtual{overflow:hidden;max-height:none}.dropdown-body::-webkit-scrollbar{width:8px}.dropdown-body::-webkit-scrollbar-thumb{background-color:#e0dfde;border-radius:25px}.dropdown-body::-webkit-scrollbar-track{background-color:#f8f8f8}.group-header{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:none;color:var(--apex-select-group-header-color, #9A9A9A);pointer-events:none;-webkit-user-select:none;user-select:none;padding:10px 16px 4px}\n"] }]
1004
+ ], template: "@if (options) {\n @if (options.formGroup && options.formControlName) {\n <div class=\"container\" (mousedown)=\"preventFocusChange($event)\">\n @if (options.label !== '' && variant() === Variant.Default) {\n <div class=\"header\">\n <div class=\"label-wrapper\">\n <label>{{ options.label }}</label>\n\n @if (options.tooltip) {\n <svg class=\"tooltip-icon\" [apexTooltip]=\"options.tooltip\" [tooltipPosition]=\"tooltipPosition.Above\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 7.5H8V11h.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.25 5.25a.25.25 0 1 1-.5 0 .25.25 0 0 1 .5 0z\" fill=\"#fff\"/>\n </g>\n </svg>\n }\n </div>\n\n @if (options.helperText) {\n <div class=\"header-helper\" (click)=\"onHelperText()\" [routerLink]=\"options.helperRoute\">{{ options.helperText }}</div>\n }\n </div>\n }\n\n <div #inputWrapper class=\"input-field-wrapper\" (click)=\"toggleDropdown()\" [formGroup]=\"options.formGroup\" [ngClass]=\"{ 'invalid': checkIfControlInvalid(), 'disabled': checkIfControlDisabled(), 'inset': isInsetLabel(), 'inset-has-value': hasInsetValue() }\">\n @if (options.prefixImg) {\n <apex-img class=\"prefix\" [src]=\"'assets/img/' + this.options.prefixImg\" [alt]=\"''\"></apex-img>\n }\n\n @if (isSearchInDropdown() && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of getAllOptions(); track $index) {\n @if (isMultipleSelected(data)) {\n <apex-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</apex-chip>\n }\n }\n </div>\n }\n }\n\n @if (!isSearchInDropdown() && options.searchable && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of getAllOptions(); track $index) {\n @if (isMultipleSelected(data)) {\n <apex-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</apex-chip>\n }\n }\n </div>\n }\n }\n\n @if (isSearchInDropdown()) {\n <!-- Hidden input owns the form binding; the visible one is a placeholder slot. -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <input #input\n readonly\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isDropdown()\"\n [attr.aria-controls]=\"isDropdown() ? listboxId : null\"\n [attr.aria-label]=\"ariaLabelValue\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [attr.aria-invalid]=\"checkIfControlInvalid() ? 'true' : null\"\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"/>\n } @else if (options.searchable) {\n <!-- used for formControl data binding and reactivness -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <!-- used for searching and data displaying -->\n <input #input\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n [attr.aria-expanded]=\"isDropdown()\"\n [attr.aria-controls]=\"isDropdown() ? listboxId : null\"\n [attr.aria-label]=\"ariaLabelValue\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [attr.aria-invalid]=\"checkIfControlInvalid() ? 'true' : null\"\n [placeholder]=\"getPlaceholder()\"\n [readOnly]=\"!options.searchable\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n [disabled]=\"checkIfControlDisabled()\"\n (keydown)=\"handleKeydown($event)\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n (input)=\"onSearch(input.value, true)\"\n autocorrect=\"off\"\n spellcheck=\"false\">\n } @else {\n <input #input\n readonly\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isDropdown()\"\n [attr.aria-controls]=\"isDropdown() ? listboxId : null\"\n [attr.aria-label]=\"ariaLabelValue\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [attr.aria-invalid]=\"checkIfControlInvalid() ? 'true' : null\"\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n [formControlName]=\"options.formControlName\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n (ngModelChange)=\"setVisibleValue($event)\"/>\n }\n\n @if (isInsetLabel() && hasInsetValue()) {\n <div class=\"inset-stack\" aria-hidden=\"true\">\n <span class=\"inset-label\">{{ options.label }}</span>\n <span class=\"inset-value\">{{ insetValueLabel() }}</span>\n </div>\n\n <button type=\"button\" class=\"inset-clear\" [attr.aria-label]=\"'Clear ' + (options.label || options.placeholder || 'filter')\" (click)=\"clearInsetValue($event)\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 3 9 9M9 3 3 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n }\n\n <div class=\"arrow-wrapper\" aria-hidden=\"true\">\n <div class=\"arrow\" [class]=\"{ checked: this.isDropdown() }\"></div>\n </div>\n </div>\n\n @if (isDropdown()) {\n @if (isSearchInDropdown()) {\n <div #dropdownContainer class=\"dropdown dropdown-wrapper\">\n <div class=\"dropdown-search\">\n <svg class=\"dropdown-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M11 11L14 14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input #dropdownSearch\n type=\"text\"\n placeholder=\"Search\"\n aria-label=\"Search options\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n (input)=\"onSearch(dropdownSearch.value, true)\"\n (keydown)=\"handleKeydown($event)\"/>\n </div>\n\n @if (options.groups && options.groups.length > 0) {\n <div class=\"dropdown-body\" role=\"listbox\" [class.dropdown-body-columns]=\"(options.dropdownColumns ?? 1) > 1\" [id]=\"listboxId\" [attr.aria-multiselectable]=\"options.multiple ? 'true' : null\" [attr.aria-label]=\"ariaLabelValue\">\n <ng-container [ngTemplateOutlet]=\"groupBody\"></ng-container>\n </div>\n } @else {\n <cdk-virtual-scroll-viewport [itemSize]=\"optionItemSizePx\" [style.height.px]=\"dropdownHeightPx()\" class=\"dropdown-body dropdown-body-virtual\" role=\"listbox\" [id]=\"listboxId\" [attr.aria-multiselectable]=\"options.multiple ? 'true' : null\" [attr.aria-label]=\"ariaLabelValue\" #dropdown>\n <div class=\"option\"\n *cdkVirtualFor=\"let data of filteredData(); let i = index\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"options.multiple ? isMultipleSelected(data) : isValueSelected(data)\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n @if (filteredData().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </cdk-virtual-scroll-viewport>\n }\n </div>\n } @else if (options.groups && options.groups.length > 0) {\n <div #dropdownContainer class=\"dropdown dropdown-wrapper\">\n <div class=\"dropdown-body\" role=\"listbox\" [class.dropdown-body-columns]=\"(options.dropdownColumns ?? 1) > 1\" [id]=\"listboxId\" [attr.aria-multiselectable]=\"options.multiple ? 'true' : null\" [attr.aria-label]=\"ariaLabelValue\">\n <ng-container [ngTemplateOutlet]=\"groupBody\"></ng-container>\n </div>\n </div>\n } @else {\n <cdk-virtual-scroll-viewport [itemSize]=\"optionItemSizePx\" [style.height.px]=\"dropdownHeightPx()\" class=\"dropdown\" role=\"listbox\" [id]=\"listboxId\" [attr.aria-multiselectable]=\"options.multiple ? 'true' : null\" [attr.aria-label]=\"ariaLabelValue\" #dropdown>\n <div class=\"option\"\n *cdkVirtualFor=\"let data of filteredData(); let i = index\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"options.multiple ? isMultipleSelected(data) : isValueSelected(data)\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n @if (filteredData().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n </cdk-virtual-scroll-viewport>\n }\n }\n </div>\n }\n}\n\n<!-- The grouped option list, shared by the search and no-search dropdowns so the group + option\n markup lives in one place. The Select All master (multiple mode + selectAll) sits above the\n groups and toggles every option. -->\n<ng-template #groupBody>\n @if (options.selectAll && options.multiple) {\n <div class=\"option checkbox select-all-option\"\n role=\"option\"\n [attr.aria-selected]=\"isAllSelected()\"\n (click)=\"toggleSelectAll($event)\">\n <apex-checkbox [checked]=\"isAllSelected()\">\n <div class=\"multiple-checkbox-container\"><span>Select all</span></div>\n </apex-checkbox>\n </div>\n }\n\n @if ((options.dropdownColumns ?? 1) > 1) {\n <div class=\"group-columns\">\n @for (column of groupColumns(); track $index) {\n <div class=\"select-col\">\n @for (group of column; track group.label) {\n <ng-container [ngTemplateOutlet]=\"groupBlock\" [ngTemplateOutletContext]=\"{ $implicit: group }\"></ng-container>\n }\n </div>\n }\n </div>\n } @else {\n @for (group of filteredGroups(); track group.label) {\n <ng-container [ngTemplateOutlet]=\"groupBlock\" [ngTemplateOutletContext]=\"{ $implicit: group }\"></ng-container>\n }\n }\n\n @if (filteredGroups().length === 0) {\n <div class=\"option disabled\">No options to select from.</div>\n }\n</ng-template>\n\n<!-- One group: its header followed by its options. Shared by the single-column list and by each\n flex column, so the option markup lives in exactly one place. -->\n<ng-template #groupBlock let-group>\n <div class=\"group-header\" role=\"presentation\">{{ group.label }}</div>\n @for (data of group.data; track data.value) {\n <div class=\"option\"\n role=\"option\"\n [id]=\"optionId(flatIndexOf(data))\"\n [attr.aria-selected]=\"options.multiple ? isMultipleSelected(data) : isValueSelected(data)\"\n [ngClass]=\"{ selected: !options.multiple ? isValueSelected(data) : false, preselected: data.isHover, checkbox: options.multiple }\"\n (click)=\"options.multiple ? setMultipleValue(data, $event) : setValue(data)\">\n @if (options.multiple) {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n <apex-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n @if (data.description) { <span>{{ data.description }}</span> }\n </div>\n </apex-checkbox>\n } @else {\n @if (data.icon) {\n <div class=\"option-icon\">\n <apex-img [src]=\"'assets/img/' + data.icon\" [alt]=\"''\"></apex-img>\n </div>\n }\n {{ data.label }}\n }\n </div>\n }\n</ng-template>\n", styles: [":host{display:block;touch-action:manipulation}:host-context(.table) .input-field-wrapper{width:80px;justify-content:center}:host-context(.table) .input-field-wrapper input{width:40px;color:var(--apex-select-input-table-color, #5D6068);font-weight:600;margin:0}.header{display:flex;align-items:center;justify-content:space-between;column-gap:4px;color:var(--apex-select-header-color, #0B1222);text-wrap:nowrap;margin-bottom:2px}.header label{font-size:14px;font-weight:600}.header-helper{font-size:12px;text-align:right;color:var(--apex-select-helper-text-color, #5D6068);cursor:pointer}.header-helper:after{width:0;height:1px;display:block;content:\"\";background:var(--apex-select-helper-text-color, #5D6068);transition:width .3s}.header-helper:hover:after{width:100%}.header .label-wrapper{display:flex;justify-content:center;align-items:center;text-wrap:wrap}.tooltip-icon{overflow:visible}.tooltip-icon path{fill:var(--apex-select-tooltip-icon-fill, transparent);stroke:var(--apex-input-tooltip-icon-stroke, #C6C6C6)}.input-field-wrapper{width:100%;height:44px;display:flex;justify-content:space-around;align-items:center;cursor:pointer;box-sizing:border-box;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;background-color:var(--apex-select-input-background-color, #ffffff00);border:solid var(--apex-select-input-border-color, #E9E9E9);border-width:var(--apex-select-input-border-width, 1px);transition:border 1s;border-radius:4px;padding:0 16px}.input-field-wrapper .multiple-count{font-size:14px;padding:0 8px;font-weight:600}.input-field-wrapper::-webkit-scrollbar{display:none}.input-field-wrapper:not(.input-field-wrapper.disabled):hover{border-color:var(--apex-select-input-border-hover-color, #4B5368)}.input-field-wrapper.disabled{opacity:.8;cursor:not-allowed;border:1px dashed var(--apex-select-input-border-disabled-color, #F2F2F2)}.input-field-wrapper .input-field{height:100%;display:flex;justify-content:space-between;align-items:center;padding:0 16px}apex-img{width:16px;height:16px}apex-img.prefix path{fill:var(--apex-select-icon-prefix-fill, #C6C6C6);stroke:var(--apex-select-icon-prefix-stroke, transparent)}.input-field-wrapper.disabled label{cursor:not-allowed}.chips{--apex-chip-font-size: var(--apex-select-chip-font-size, 10px);--apex-chip-color: var(--apex-select-chip-color, #FFFFFF);--apex-chip-background-color: var(--apex-select-chip-background-color, #0B1222);--apex-chip-icon-color: var(--apex-select-chip-icon-color, #FFFFFF);display:flex;padding-left:8px}.input-field-wrapper.inset{position:relative;border-color:var(--apex-select-inset-border-color, #D3D3D3)}.input-field-wrapper.inset.disabled{opacity:1;cursor:not-allowed;background-color:var(--apex-select-inset-disabled-background-color, #F3F3F3);border:1px solid var(--apex-select-inset-disabled-border-color, #E4E4E4)}.input-field-wrapper.inset-has-value input{color:transparent}.input-field-wrapper.inset-has-value .arrow-wrapper{display:none}.inset-stack{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;gap:4px;padding:0 38px 0 16px;pointer-events:none}.inset-label{font-size:var(--apex-select-inset-label-font-size, 10px);font-weight:600;letter-spacing:.04em;text-transform:uppercase;line-height:1;color:var(--apex-select-inset-label-color, #7C8182)}.inset-value{font-size:var(--apex-select-inset-value-font-size, 13px);font-weight:600;line-height:1;color:var(--apex-select-inset-value-color, #141414);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.inset-clear{position:absolute;top:50%;right:12px;transform:translateY(-50%);display:inline-grid;place-items:center;width:18px;height:18px;padding:0;border:none;border-radius:999px;background:var(--apex-select-inset-clear-background, transparent);color:var(--apex-select-inset-clear-color, #7C8182);cursor:pointer}.inset-clear:hover{background:var(--apex-select-inset-clear-hover-background, #141414);color:var(--apex-select-inset-clear-hover-color, #FFFFFF)}.inset-clear svg{width:11px;height:11px;display:block}.input-field-wrapper input{width:inherit;flex:1;text-overflow:ellipsis;border:none;outline:none;cursor:pointer;background:transparent;color:var(--apex-select-input-text-color, #0B1222);font-size:16px;transform:scale(.875);transform-origin:left center;padding:0;margin:0 12px}.input-field-wrapper input.hidden{display:none}input::placeholder{color:var(--apex-select-input-placeholder-color, #0B1222)}.input-field-wrapper input.no-icon{left:0}.input-field-wrapper.disabled input{cursor:not-allowed}.arrow-wrapper{width:8px;height:8px}.arrow{width:8px;height:8px;position:relative;bottom:3px;border-top:2px solid var(--apex-select-arrow-color, #5D6068);border-left:2px solid var(--apex-select-arrow-color, #5D6068);border-top-left-radius:3px;border-top-right-radius:1px;border-bottom-left-radius:1px;transition:all .25s ease-in-out;transform-origin:center;transform:rotate(-135deg)}.arrow.checked{bottom:-2px;transform:rotate(45deg);border-top:2px solid var(--apex-select-arrow-checked-color, #F96138);border-left:2px solid var(--apex-select-arrow-checked-color, #F96138)}.arrow svg{width:16px;height:16px;transform:rotate(0);transition:transform .25s ease-in-out}.arrow.checked svg{transform:rotate(180deg)}.input-field-wrapper.invalid{border:solid var(--apex-select-invalid-color, #F96138);border-width:var(--apex-select-invalid-border-width, 1px)}.input-field-wrapper.invalid label{color:var(--apex-select-invalid-color, #F96138)}.input-field-wrapper apex-chip{margin-right:4px}.dropdown{width:264px;position:fixed;z-index:900;overscroll-behavior:contain;border-radius:8px;border:1px solid var(--apex-select-dropdown-border-color, #E9E9E9);background-color:var(--apex-select-dropdown-background-color, #FFFFFF);box-shadow:var(--apex-select-dropdown-box-shadow);animation:fadeIn .3s forwards;opacity:0;margin-top:15px}.dropdown:focus{outline:none}.dropdown{scrollbar-width:thin;scrollbar-color:#F2F2F2 #FAFAFA}.dropdown::-webkit-scrollbar{width:4px}.dropdown::-webkit-scrollbar-thumb{background-color:#f2f2f2;border-radius:99px}.dropdown::-webkit-scrollbar-track{background-color:#fafafa;border-radius:99px}.dropdown::-webkit-scrollbar-button{display:none}.dropdown.no-scroll{overflow:hidden}.values{scrollbar-width:thin;scrollbar-color:#F2F2F2 #FAFAFA}.values::-webkit-scrollbar{width:4px}.values::-webkit-scrollbar-thumb{background-color:#f2f2f2;border-radius:99px}.values::-webkit-scrollbar-track{background-color:#fafafa;border-radius:99px}.values::-webkit-scrollbar-button{display:none}.dropdown .option{min-height:48px;display:flex;align-items:center;cursor:pointer;font-weight:600;color:#0009;padding:0 16px}.dropdown .option.disabled{pointer-events:none}.dropdown .option:hover,.dropdown .option.preselected{background:#00000005}.dropdown .option.checkbox.selected{--apex-checkbox-text-color: var(--apex-select-input-text-selected-color, #F96138);background:#0000000a}.dropdown .option.selected{color:var(--apex-select-input-text-selected-color, #F96138);background:#0000000a}.option-icon{width:var(--apex-select-option-icon-size, 16px);height:var(--apex-select-option-icon-size, 16px);min-width:var(--apex-select-option-icon-size, 16px);display:flex;justify-content:center;align-items:center;margin-right:var(--apex-select-option-icon-spacing, 10px)}.option-icon apex-img{max-width:var(--apex-select-option-icon-size, 20px);max-height:var(--apex-select-option-icon-size, 20px);display:flex;justify-content:center;align-items:center}.option-icon apex-img path{fill:var(--apex-select-option-icon-fill, #5D6068);stroke:var(--apex-select-option-icon-stroke, #ffffff00)}.dropdown .option.selected .option-icon apex-img path{fill:var(--apex-select-option-icon-selected-fill, #F96138);stroke:var(--apex-select-option-icon-selected-stroke, #ffffff00)}.values{width:fit-content;display:flex;flex-wrap:wrap;align-items:center;padding:6px;overflow-x:auto}.values apex-chip{margin:6px 0 0}.single-value{padding:6px}.options-divider{width:calc(100% - 36px);height:var(--apex-select-options-divider-height, 1px);background-color:var(--apex-select-options-divider-color, #E9E9E9);margin:0 auto}.multiple-checkbox-container{display:flex;flex-direction:column;row-gap:3px;padding:12px 0 12px 6px}.multiple-checkbox-container span{word-break:normal;overflow-wrap:break-word;white-space:normal}.multiple-checkbox-container span:nth-of-type(2){font-size:13px;font-weight:500;line-height:1.3;color:#5d6068}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.dropdown.dropdown-wrapper{display:flex;flex-direction:column;overflow:hidden;padding:0}.dropdown-search{display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--apex-select-dropdown-search-border-color, #E9E9E9);color:var(--apex-select-dropdown-search-icon-color, #5D6068);padding:10px 16px}.dropdown-search-icon{flex:0 0 auto}.dropdown-search input{flex:1;border:none;outline:none;background:transparent;font-size:14px;color:var(--apex-select-input-text-color, #0B1222);padding:0}.dropdown-search input::placeholder{color:var(--apex-select-input-placeholder-color, #9A9A9A)}.dropdown-body{flex:1 1 auto;min-height:0;overflow-y:auto;max-height:var(--apex-select-dropdown-body-max-height, 320px)}.dropdown-body.dropdown-body-virtual{overflow:hidden;max-height:none}.dropdown-body{scrollbar-width:thin;scrollbar-color:#F2F2F2 #FAFAFA}.dropdown-body::-webkit-scrollbar{width:4px}.dropdown-body::-webkit-scrollbar-thumb{background-color:#f2f2f2;border-radius:99px}.dropdown-body::-webkit-scrollbar-track{background-color:#fafafa;border-radius:99px}.group-header{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:none;color:var(--apex-select-group-header-color, #9A9A9A);pointer-events:none;-webkit-user-select:none;user-select:none;padding:10px 16px 4px}.dropdown .option.select-all-option{border-bottom:1px solid var(--apex-select-dropdown-border-color, #E9E9E9)}.dropdown-body.dropdown-body-columns{padding:4px 14px 10px}.dropdown-body-columns .group-columns{display:flex;align-items:flex-start;gap:24px}.dropdown-body-columns .select-col{flex:1;min-width:0}.dropdown-body-columns .option,.dropdown-body-columns .group-header{padding-left:8px;padding-right:8px}\n"] }]
756
1005
  }], ctorParameters: () => [{ type: i1.OSService }, { type: i0.ElementRef }, { type: i0.IterableDiffers }], propDecorators: { input: [{
757
1006
  type: ViewChild,
758
1007
  args: ['input']
@@ -786,5 +1035,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
786
1035
  * Generated bundle index. Do not edit.
787
1036
  */
788
1037
 
789
- export { ApexSelectComponent };
1038
+ export { ApexSelectComponent, ApexSelectVariant };
790
1039
  //# sourceMappingURL=apexara-ng-components-select.mjs.map