@eagami/ui 5.56.0 → 5.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -481,7 +481,13 @@ const ar = {
481
481
  },
482
482
  dialog: { close: "إغلاق مربع الحوار" },
483
483
  drawer: { close: "إغلاق اللوحة" },
484
- dropdown: { placeholder: "اختر…" },
484
+ dropdown: {
485
+ placeholder: "اختر…",
486
+ clear: "مسح التحديد",
487
+ dialogLabel: "اختيار خيار",
488
+ searchPlaceholder: "بحث…",
489
+ searchEmpty: "لا توجد مطابقات"
490
+ },
485
491
  fieldLabel: { help: (label) => `مزيد من المعلومات حول ${label}` },
486
492
  fileUploader: {
487
493
  prompt: "انقر أو اسحب الملفات هنا للتحميل",
@@ -691,7 +697,13 @@ const de = {
691
697
  },
692
698
  dialog: { close: "Dialog schließen" },
693
699
  drawer: { close: "Panel schließen" },
694
- dropdown: { placeholder: "Auswählen…" },
700
+ dropdown: {
701
+ placeholder: "Auswählen…",
702
+ clear: "Auswahl aufheben",
703
+ dialogLabel: "Option wählen",
704
+ searchPlaceholder: "Suchen…",
705
+ searchEmpty: "Keine Treffer"
706
+ },
695
707
  fieldLabel: { help: (label) => `Weitere Informationen zu ${label}` },
696
708
  fileUploader: {
697
709
  prompt: "Dateien hierher klicken oder ziehen zum Hochladen",
@@ -901,7 +913,13 @@ const el = {
901
913
  },
902
914
  dialog: { close: "Κλείσιμο παραθύρου διαλόγου" },
903
915
  drawer: { close: "Κλείσιμο πίνακα" },
904
- dropdown: { placeholder: "Επιλέξτε…" },
916
+ dropdown: {
917
+ placeholder: "Επιλέξτε…",
918
+ clear: "Εκκαθάριση επιλογής",
919
+ dialogLabel: "Επιλέξτε μια επιλογή",
920
+ searchPlaceholder: "Αναζήτηση…",
921
+ searchEmpty: "Δεν βρέθηκαν αποτελέσματα"
922
+ },
905
923
  fieldLabel: { help: (label) => `Περισσότερες πληροφορίες: ${label}` },
906
924
  fileUploader: {
907
925
  prompt: "Κάντε κλικ ή σύρετε αρχεία εδώ για μεταφόρτωση",
@@ -1111,7 +1129,13 @@ const en = {
1111
1129
  },
1112
1130
  dialog: { close: "Close dialog" },
1113
1131
  drawer: { close: "Close panel" },
1114
- dropdown: { placeholder: "Select…" },
1132
+ dropdown: {
1133
+ placeholder: "Select…",
1134
+ clear: "Clear selection",
1135
+ dialogLabel: "Choose an option",
1136
+ searchPlaceholder: "Search…",
1137
+ searchEmpty: "No matches"
1138
+ },
1115
1139
  fieldLabel: { help: (label) => `More information about ${label}` },
1116
1140
  fileUploader: {
1117
1141
  prompt: "Click or drag files here to upload",
@@ -1321,7 +1345,13 @@ const esES = {
1321
1345
  },
1322
1346
  dialog: { close: "Cerrar diálogo" },
1323
1347
  drawer: { close: "Cerrar panel" },
1324
- dropdown: { placeholder: "Seleccionar…" },
1348
+ dropdown: {
1349
+ placeholder: "Seleccionar…",
1350
+ clear: "Borrar selección",
1351
+ dialogLabel: "Elegir una opción",
1352
+ searchPlaceholder: "Buscar…",
1353
+ searchEmpty: "Sin coincidencias"
1354
+ },
1325
1355
  fieldLabel: { help: (label) => `Más información sobre ${label}` },
1326
1356
  fileUploader: {
1327
1357
  prompt: "Haz clic o arrastra archivos aquí para subirlos",
@@ -1531,7 +1561,13 @@ const frFR = {
1531
1561
  },
1532
1562
  dialog: { close: "Fermer la boîte de dialogue" },
1533
1563
  drawer: { close: "Fermer le panneau" },
1534
- dropdown: { placeholder: "Sélectionner…" },
1564
+ dropdown: {
1565
+ placeholder: "Sélectionner…",
1566
+ clear: "Effacer la sélection",
1567
+ dialogLabel: "Choisir une option",
1568
+ searchPlaceholder: "Rechercher…",
1569
+ searchEmpty: "Aucun résultat"
1570
+ },
1535
1571
  fieldLabel: { help: (label) => `Plus d’informations sur ${label}` },
1536
1572
  fileUploader: {
1537
1573
  prompt: "Cliquez ou glissez des fichiers ici pour les téléverser",
@@ -1741,7 +1777,13 @@ const he = {
1741
1777
  },
1742
1778
  dialog: { close: "סגירת חלון" },
1743
1779
  drawer: { close: "סגירת לוח" },
1744
- dropdown: { placeholder: "בחר…" },
1780
+ dropdown: {
1781
+ placeholder: "בחר…",
1782
+ clear: "ניקוי הבחירה",
1783
+ dialogLabel: "בחירת אפשרות",
1784
+ searchPlaceholder: "חיפוש…",
1785
+ searchEmpty: "אין התאמות"
1786
+ },
1745
1787
  fieldLabel: { help: (label) => `מידע נוסף על ${label}` },
1746
1788
  fileUploader: {
1747
1789
  prompt: "לחץ או גרור קבצים לכאן להעלאה",
@@ -1951,7 +1993,13 @@ const hi = {
1951
1993
  },
1952
1994
  dialog: { close: "संवाद बंद करें" },
1953
1995
  drawer: { close: "पैनल बंद करें" },
1954
- dropdown: { placeholder: "चुनें…" },
1996
+ dropdown: {
1997
+ placeholder: "चुनें…",
1998
+ clear: "चयन साफ़ करें",
1999
+ dialogLabel: "एक विकल्प चुनें",
2000
+ searchPlaceholder: "खोजें…",
2001
+ searchEmpty: "कोई मिलान नहीं"
2002
+ },
1955
2003
  fieldLabel: { help: (label) => `अधिक जानकारी: ${label}` },
1956
2004
  fileUploader: {
1957
2005
  prompt: "अपलोड करने के लिए फ़ाइलें यहाँ क्लिक करें या खींचें",
@@ -2161,7 +2209,13 @@ const is = {
2161
2209
  },
2162
2210
  dialog: { close: "Loka glugga" },
2163
2211
  drawer: { close: "Loka spjaldi" },
2164
- dropdown: { placeholder: "Veldu…" },
2212
+ dropdown: {
2213
+ placeholder: "Veldu…",
2214
+ clear: "Hreinsa val",
2215
+ dialogLabel: "Velja valkost",
2216
+ searchPlaceholder: "Leita…",
2217
+ searchEmpty: "Engin samsvörun"
2218
+ },
2165
2219
  fieldLabel: { help: (label) => `Nánari upplýsingar: ${label}` },
2166
2220
  fileUploader: {
2167
2221
  prompt: "Smelltu eða dragðu skrár hingað til að hlaða upp",
@@ -2371,7 +2425,13 @@ const nl = {
2371
2425
  },
2372
2426
  dialog: { close: "Dialoogvenster sluiten" },
2373
2427
  drawer: { close: "Paneel sluiten" },
2374
- dropdown: { placeholder: "Selecteer…" },
2428
+ dropdown: {
2429
+ placeholder: "Selecteer…",
2430
+ clear: "Selectie wissen",
2431
+ dialogLabel: "Optie kiezen",
2432
+ searchPlaceholder: "Zoeken…",
2433
+ searchEmpty: "Geen overeenkomsten"
2434
+ },
2375
2435
  fieldLabel: { help: (label) => `Meer informatie over ${label}` },
2376
2436
  fileUploader: {
2377
2437
  prompt: "Klik of sleep bestanden hierheen om te uploaden",
@@ -2581,7 +2641,13 @@ const pl = {
2581
2641
  },
2582
2642
  dialog: { close: "Zamknij okno dialogowe" },
2583
2643
  drawer: { close: "Zamknij panel" },
2584
- dropdown: { placeholder: "Wybierz…" },
2644
+ dropdown: {
2645
+ placeholder: "Wybierz…",
2646
+ clear: "Wyczyść wybór",
2647
+ dialogLabel: "Wybierz opcję",
2648
+ searchPlaceholder: "Szukaj…",
2649
+ searchEmpty: "Brak wyników"
2650
+ },
2585
2651
  fieldLabel: { help: (label) => `Więcej informacji: ${label}` },
2586
2652
  fileUploader: {
2587
2653
  prompt: "Kliknij lub przeciągnij pliki tutaj, aby je przesłać",
@@ -2791,7 +2857,13 @@ const ptBR = {
2791
2857
  },
2792
2858
  dialog: { close: "Fechar diálogo" },
2793
2859
  drawer: { close: "Fechar painel" },
2794
- dropdown: { placeholder: "Selecione…" },
2860
+ dropdown: {
2861
+ placeholder: "Selecione…",
2862
+ clear: "Limpar seleção",
2863
+ dialogLabel: "Escolher uma opção",
2864
+ searchPlaceholder: "Pesquisar…",
2865
+ searchEmpty: "Nenhuma correspondência"
2866
+ },
2795
2867
  fieldLabel: { help: (label) => `Mais informações sobre ${label}` },
2796
2868
  fileUploader: {
2797
2869
  prompt: "Clique ou arraste arquivos aqui para enviar",
@@ -3001,7 +3073,13 @@ const ru = {
3001
3073
  },
3002
3074
  dialog: { close: "Закрыть диалог" },
3003
3075
  drawer: { close: "Закрыть панель" },
3004
- dropdown: { placeholder: "Выберите…" },
3076
+ dropdown: {
3077
+ placeholder: "Выберите…",
3078
+ clear: "Очистить выбор",
3079
+ dialogLabel: "Выбор варианта",
3080
+ searchPlaceholder: "Поиск…",
3081
+ searchEmpty: "Нет совпадений"
3082
+ },
3005
3083
  fieldLabel: { help: (label) => `Подробнее: ${label}` },
3006
3084
  fileUploader: {
3007
3085
  prompt: "Нажмите или перетащите файлы сюда для загрузки",
@@ -3211,7 +3289,13 @@ const uk = {
3211
3289
  },
3212
3290
  dialog: { close: "Закрити діалог" },
3213
3291
  drawer: { close: "Закрити панель" },
3214
- dropdown: { placeholder: "Виберіть…" },
3292
+ dropdown: {
3293
+ placeholder: "Виберіть…",
3294
+ clear: "Очистити вибір",
3295
+ dialogLabel: "Виберіть варіант",
3296
+ searchPlaceholder: "Пошук…",
3297
+ searchEmpty: "Немає збігів"
3298
+ },
3215
3299
  fieldLabel: { help: (label) => `Докладніше: ${label}` },
3216
3300
  fileUploader: {
3217
3301
  prompt: "Натисніть або перетягніть файли сюди для завантаження",
@@ -3421,7 +3505,13 @@ const zhCN = {
3421
3505
  },
3422
3506
  dialog: { close: "关闭对话框" },
3423
3507
  drawer: { close: "关闭面板" },
3424
- dropdown: { placeholder: "请选择…" },
3508
+ dropdown: {
3509
+ placeholder: "请选择…",
3510
+ clear: "清除选择",
3511
+ dialogLabel: "选择一个选项",
3512
+ searchPlaceholder: "搜索…",
3513
+ searchEmpty: "无匹配项"
3514
+ },
3425
3515
  fieldLabel: { help: (label) => `关于 ${label} 的更多信息` },
3426
3516
  fileUploader: {
3427
3517
  prompt: "点击或拖动文件到此处上传",
@@ -7221,12 +7311,14 @@ var TooltipDirective = class TooltipDirective {
7221
7311
  flip = input(true, ...ngDevMode ? [{ debugName: "flip" }] : /* istanbul ignore next */ []);
7222
7312
  whenClipped = input(false, ...ngDevMode ? [{ debugName: "whenClipped" }] : /* istanbul ignore next */ []);
7223
7313
  maxWidth = input(200, ...ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []);
7314
+ showDelay = input(0, ...ngDevMode ? [{ debugName: "showDelay" }] : /* istanbul ignore next */ []);
7224
7315
  dismissDelay = input(150, ...ngDevMode ? [{ debugName: "dismissDelay" }] : /* istanbul ignore next */ []);
7225
7316
  tooltipOpen = input(null, ...ngDevMode ? [{ debugName: "tooltipOpen" }] : /* istanbul ignore next */ []);
7226
7317
  tooltipEl = null;
7227
7318
  placedPosition = "top";
7228
7319
  templateView = null;
7229
7320
  scrollable = false;
7321
+ showTimer = null;
7230
7322
  hideTimer = null;
7231
7323
  pointerInside = false;
7232
7324
  tooltipId = `ea-tooltip-${Math.random().toString(36).slice(2, 9)}`;
@@ -7234,7 +7326,7 @@ var TooltipDirective = class TooltipDirective {
7234
7326
  showHandler = () => {
7235
7327
  if (this.controlled()) return;
7236
7328
  this.pointerInside = true;
7237
- this.show();
7329
+ this.requestShow();
7238
7330
  };
7239
7331
  pointerLeaveHandler = () => {
7240
7332
  if (this.controlled()) return;
@@ -7250,7 +7342,7 @@ var TooltipDirective = class TooltipDirective {
7250
7342
  focusHandler = (event) => {
7251
7343
  if (this.controlled()) return;
7252
7344
  const target = event.target;
7253
- if (!this.supportsFocusVisible || target.matches(":focus-visible")) this.show();
7345
+ if (!this.supportsFocusVisible || target.matches(":focus-visible")) this.requestShow();
7254
7346
  };
7255
7347
  keydownHandler = (event) => {
7256
7348
  if (event.key === "Escape" && this.tooltipEl) this.hide();
@@ -7310,7 +7402,26 @@ var TooltipDirective = class TooltipDirective {
7310
7402
  this.hide();
7311
7403
  }
7312
7404
  }
7405
+ requestShow() {
7406
+ const delay = this.showDelay();
7407
+ if (delay <= 0 || this.tooltipEl) {
7408
+ this.show();
7409
+ return;
7410
+ }
7411
+ if (this.showTimer !== null) return;
7412
+ this.showTimer = setTimeout(() => {
7413
+ this.showTimer = null;
7414
+ this.show();
7415
+ }, delay);
7416
+ }
7417
+ cancelPendingShow() {
7418
+ if (this.showTimer !== null) {
7419
+ clearTimeout(this.showTimer);
7420
+ this.showTimer = null;
7421
+ }
7422
+ }
7313
7423
  show() {
7424
+ this.cancelPendingShow();
7314
7425
  if (this.tooltipEl) {
7315
7426
  this.cancelPendingHide();
7316
7427
  return;
@@ -7378,6 +7489,7 @@ var TooltipDirective = class TooltipDirective {
7378
7489
  }
7379
7490
  }
7380
7491
  hide() {
7492
+ this.cancelPendingShow();
7381
7493
  this.cancelPendingHide();
7382
7494
  this.detachRepositionListeners();
7383
7495
  if (this.rafId !== null) {
@@ -7547,6 +7659,13 @@ var TooltipDirective = class TooltipDirective {
7547
7659
  isRequired: false,
7548
7660
  transformFunction: null
7549
7661
  },
7662
+ showDelay: {
7663
+ classPropertyName: "showDelay",
7664
+ publicName: "showDelay",
7665
+ isSignal: true,
7666
+ isRequired: false,
7667
+ transformFunction: null
7668
+ },
7550
7669
  dismissDelay: {
7551
7670
  classPropertyName: "dismissDelay",
7552
7671
  publicName: "dismissDelay",
@@ -7616,6 +7735,14 @@ i0.ɵɵngDeclareClassMetadata({
7616
7735
  required: false
7617
7736
  }]
7618
7737
  }],
7738
+ showDelay: [{
7739
+ type: i0.Input,
7740
+ args: [{
7741
+ isSignal: true,
7742
+ alias: "showDelay",
7743
+ required: false
7744
+ }]
7745
+ }],
7619
7746
  dismissDelay: [{
7620
7747
  type: i0.Input,
7621
7748
  args: [{
@@ -8326,6 +8453,7 @@ var AvatarEditorComponent = class AvatarEditorComponent {
8326
8453
  "flip",
8327
8454
  "whenClipped",
8328
8455
  "maxWidth",
8456
+ "showDelay",
8329
8457
  "dismissDelay",
8330
8458
  "tooltipOpen"
8331
8459
  ]
@@ -9580,6 +9708,7 @@ var BarChartComponent = class BarChartComponent {
9580
9708
  "flip",
9581
9709
  "whenClipped",
9582
9710
  "maxWidth",
9711
+ "showDelay",
9583
9712
  "dismissDelay",
9584
9713
  "tooltipOpen"
9585
9714
  ]
@@ -10945,6 +11074,7 @@ var CheckboxComponent = class CheckboxComponent {
10945
11074
  "flip",
10946
11075
  "whenClipped",
10947
11076
  "maxWidth",
11077
+ "showDelay",
10948
11078
  "dismissDelay",
10949
11079
  "tooltipOpen"
10950
11080
  ]
@@ -17745,9 +17875,23 @@ i0.ɵɵngDeclareClassMetadata({
17745
17875
  }]
17746
17876
  }
17747
17877
  });
17878
+ const LIST_KEYS = /* @__PURE__ */ new Set([
17879
+ "ArrowDown",
17880
+ "ArrowUp",
17881
+ "Home",
17882
+ "End",
17883
+ "Enter",
17884
+ "Escape"
17885
+ ]);
17886
+ function isTypedCharacter(event) {
17887
+ return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;
17888
+ }
17748
17889
  var DropdownComponent = class DropdownComponent {
17749
17890
  elRef = viewChild("triggerEl", ...ngDevMode ? [{ debugName: "elRef" }] : /* istanbul ignore next */ []);
17891
+ popover = viewChild(PopoverComponent, ...ngDevMode ? [{ debugName: "popover" }] : /* istanbul ignore next */ []);
17892
+ searchEl = viewChild("searchEl", ...ngDevMode ? [{ debugName: "searchEl" }] : /* istanbul ignore next */ []);
17750
17893
  i18n = inject(EagamiI18nService);
17894
+ injector = inject(Injector);
17751
17895
  label = input(void 0, ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
17752
17896
  labelIcon = input(void 0, ...ngDevMode ? [{ debugName: "labelIcon" }] : /* istanbul ignore next */ []);
17753
17897
  labelHelp = input(void 0, ...ngDevMode ? [{ debugName: "labelHelp" }] : /* istanbul ignore next */ []);
@@ -17757,6 +17901,8 @@ var DropdownComponent = class DropdownComponent {
17757
17901
  disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
17758
17902
  readonly = input(false, ...ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []);
17759
17903
  required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
17904
+ clearable = input(false, ...ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []);
17905
+ searchable = input(false, ...ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []);
17760
17906
  hint = input(void 0, ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
17761
17907
  errorMsg = input(void 0, ...ngDevMode ? [{ debugName: "errorMsg" }] : /* istanbul ignore next */ []);
17762
17908
  errorMessages = input(void 0, ...ngDevMode ? [{ debugName: "errorMessages" }] : /* istanbul ignore next */ []);
@@ -17765,6 +17911,7 @@ var DropdownComponent = class DropdownComponent {
17765
17911
  changed = output();
17766
17912
  isOpen = signal(false, ...ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []);
17767
17913
  focusedIndex = signal(-1, ...ngDevMode ? [{ debugName: "focusedIndex" }] : /* istanbul ignore next */ []);
17914
+ searchTerm = signal("", ...ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []);
17768
17915
  _formDisabled = signal(false, ...ngDevMode ? [{ debugName: "_formDisabled" }] : /* istanbul ignore next */ []);
17769
17916
  typeaheadQuery = "";
17770
17917
  typeaheadTimer;
@@ -17772,6 +17919,9 @@ var DropdownComponent = class DropdownComponent {
17772
17919
  onTouched = () => {};
17773
17920
  constructor() {
17774
17921
  inject(DestroyRef).onDestroy(() => clearTimeout(this.typeaheadTimer));
17922
+ afterRenderEffect(() => {
17923
+ if (this.searchable() && this.popover()?.isPositioned()) untracked(() => this.searchEl()?.nativeElement.focus());
17924
+ });
17775
17925
  }
17776
17926
  isDisabled = computed(() => this.disabled() || this._formDisabled(), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
17777
17927
  errorState = injectControlErrorState({
@@ -17785,19 +17935,29 @@ var DropdownComponent = class DropdownComponent {
17785
17935
  optionGroups = computed(() => toGroups(this.options()), ...ngDevMode ? [{ debugName: "optionGroups" }] : /* istanbul ignore next */ []);
17786
17936
  grouped = computed(() => isGrouped(this.options()), ...ngDevMode ? [{ debugName: "grouped" }] : /* istanbul ignore next */ []);
17787
17937
  flatOptions = computed(() => flattenGroups(this.optionGroups()), ...ngDevMode ? [{ debugName: "flatOptions" }] : /* istanbul ignore next */ []);
17788
- renderedGroups = computed(() => toRenderedGroups(this.optionGroups()), ...ngDevMode ? [{ debugName: "renderedGroups" }] : /* istanbul ignore next */ []);
17789
- selectedIndex = computed(() => this.flatOptions().findIndex((o) => o.value === this.value()), ...ngDevMode ? [{ debugName: "selectedIndex" }] : /* istanbul ignore next */ []);
17938
+ filteredGroups = computed(() => {
17939
+ const term = foldForSearch(this.searchTerm().trim());
17940
+ const groups = this.optionGroups();
17941
+ return term ? filterGroups(groups, (o) => foldForSearch(o.label).includes(term)) : groups;
17942
+ }, ...ngDevMode ? [{ debugName: "filteredGroups" }] : /* istanbul ignore next */ []);
17943
+ filteredOptions = computed(() => flattenGroups(this.filteredGroups()), ...ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []);
17944
+ renderedGroups = computed(() => toRenderedGroups(this.filteredGroups()), ...ngDevMode ? [{ debugName: "renderedGroups" }] : /* istanbul ignore next */ []);
17945
+ selectedIndex = computed(() => this.filteredOptions().findIndex((o) => o.value === this.value()), ...ngDevMode ? [{ debugName: "selectedIndex" }] : /* istanbul ignore next */ []);
17790
17946
  selectedLabel = computed(() => {
17791
17947
  return this.flatOptions().find((o) => o.value === this.value())?.label ?? "";
17792
17948
  }, ...ngDevMode ? [{ debugName: "selectedLabel" }] : /* istanbul ignore next */ []);
17793
17949
  resolvedPlaceholder = computed(() => this.placeholder() ?? this.i18n.messages().dropdown.placeholder, ...ngDevMode ? [{ debugName: "resolvedPlaceholder" }] : /* istanbul ignore next */ []);
17794
17950
  triggerLabelledBy = computed(() => this.label() ? `${this.id()}-label ${this.id()}` : null, ...ngDevMode ? [{ debugName: "triggerLabelledBy" }] : /* istanbul ignore next */ []);
17951
+ showClear = computed(() => this.clearable() && this.value() !== "" && !this.isDisabled() && !this.readonly(), ...ngDevMode ? [{ debugName: "showClear" }] : /* istanbul ignore next */ []);
17952
+ listboxId = computed(() => `${this.id()}-listbox`, ...ngDevMode ? [{ debugName: "listboxId" }] : /* istanbul ignore next */ []);
17953
+ activeOptionId = computed(() => this.isOpen() && this.focusedIndex() >= 0 ? `${this.id()}-option-${this.focusedIndex()}` : null, ...ngDevMode ? [{ debugName: "activeOptionId" }] : /* istanbul ignore next */ []);
17795
17954
  triggerClasses = computed(() => ({
17796
17955
  [`ea-dropdown__trigger--${this.size()}`]: true,
17797
17956
  "ea-dropdown__trigger--error": this.hasError(),
17798
17957
  "ea-dropdown__trigger--open": this.isOpen(),
17799
17958
  "ea-dropdown__trigger--disabled": this.isDisabled(),
17800
- "ea-dropdown__trigger--readonly": this.readonly() && !this.isDisabled()
17959
+ "ea-dropdown__trigger--readonly": this.readonly() && !this.isDisabled(),
17960
+ "ea-dropdown__trigger--clearable": this.showClear()
17801
17961
  }), ...ngDevMode ? [{ debugName: "triggerClasses" }] : /* istanbul ignore next */ []);
17802
17962
  menuClasses = computed(() => ({ [`ea-dropdown__menu--${this.size()}`]: true }), ...ngDevMode ? [{ debugName: "menuClasses" }] : /* istanbul ignore next */ []);
17803
17963
  writeValue(val) {
@@ -17814,26 +17974,34 @@ var DropdownComponent = class DropdownComponent {
17814
17974
  }
17815
17975
  toggle() {
17816
17976
  if (this.isDisabled() || this.readonly()) return;
17817
- this.isOpen.set(!this.isOpen());
17818
17977
  if (this.isOpen()) {
17819
- const selected = this.flatOptions().findIndex((o) => o.value === this.value());
17820
- if (selected >= 0) this.focusedIndex.set(selected);
17821
- else this.focusEdge(1);
17978
+ this.close();
17979
+ return;
17822
17980
  }
17981
+ this.isOpen.set(true);
17982
+ const selected = this.selectedIndex();
17983
+ if (selected >= 0) this.focusedIndex.set(selected);
17984
+ else this.focusEdge(1);
17823
17985
  }
17824
17986
  select(option) {
17825
17987
  if (option.disabled || this.isDisabled() || this.readonly()) return;
17826
- this.value.set(option.value);
17827
- this.onChange(option.value);
17828
- this.onTouched();
17829
- this.changed.emit(option.value);
17988
+ this.commit(option.value);
17830
17989
  this.close();
17831
17990
  }
17832
17991
  close() {
17992
+ const searchEl = this.searchEl()?.nativeElement;
17993
+ const searching = !!searchEl && document.activeElement === searchEl;
17833
17994
  this.isOpen.set(false);
17834
17995
  this.focusedIndex.set(-1);
17996
+ this.searchTerm.set("");
17835
17997
  this.typeaheadQuery = "";
17836
17998
  clearTimeout(this.typeaheadTimer);
17999
+ if (searching) this.focus();
18000
+ }
18001
+ clear() {
18002
+ this.close();
18003
+ this.commit("");
18004
+ this.focus();
17837
18005
  }
17838
18006
  focus() {
17839
18007
  this.elRef()?.nativeElement.focus();
@@ -17878,36 +18046,69 @@ var DropdownComponent = class DropdownComponent {
17878
18046
  if (!this.isOpen()) this.toggle();
17879
18047
  this.focusEdge(-1);
17880
18048
  break;
17881
- default: this.handleTypeahead(event);
18049
+ default: if (this.searchable()) this.startSearch(event);
18050
+ else this.handleTypeahead(event);
17882
18051
  }
17883
18052
  }
18053
+ onSearchInput(term) {
18054
+ this.searchTerm.set(term);
18055
+ this.focusFirstMatch();
18056
+ }
18057
+ handleSearchKeydown(event) {
18058
+ if (event.key === "Tab") this.close();
18059
+ else if (LIST_KEYS.has(event.key)) this.handleKeydown(event);
18060
+ }
18061
+ onMenuMousedown(event) {
18062
+ if (this.searchable() && event.target !== this.searchEl()?.nativeElement) event.preventDefault();
18063
+ }
18064
+ commit(value) {
18065
+ this.value.set(value);
18066
+ this.onChange(value);
18067
+ this.onTouched();
18068
+ this.changed.emit(value);
18069
+ }
18070
+ startSearch(event) {
18071
+ if (!isTypedCharacter(event)) return;
18072
+ event.preventDefault();
18073
+ this.isOpen.set(true);
18074
+ this.searchTerm.update((term) => term + event.key);
18075
+ this.focusFirstMatch();
18076
+ }
18077
+ focusFirstMatch() {
18078
+ const first = this.filteredOptions().findIndex((o) => !o.disabled);
18079
+ this.focusedIndex.set(first);
18080
+ afterNextRender(() => this.scrollOptionIntoView(first), { injector: this.injector });
18081
+ }
17884
18082
  selectFocusedOrOpen(event) {
17885
18083
  event.preventDefault();
17886
18084
  if (this.isOpen()) {
17887
- const opts = this.flatOptions();
18085
+ const opts = this.filteredOptions();
17888
18086
  const idx = this.focusedIndex();
17889
18087
  if (idx >= 0 && idx < opts.length && !opts[idx].disabled) this.select(opts[idx]);
17890
18088
  } else this.toggle();
17891
18089
  }
17892
18090
  focusEdge(direction) {
17893
- const opts = this.flatOptions();
18091
+ const opts = this.filteredOptions();
17894
18092
  let idx = direction === 1 ? 0 : opts.length - 1;
17895
18093
  while (idx >= 0 && idx < opts.length && opts[idx].disabled) idx += direction;
17896
18094
  if (idx >= 0 && idx < opts.length) this.setFocusedIndex(idx);
17897
18095
  }
17898
18096
  setFocusedIndex(idx) {
17899
18097
  this.focusedIndex.set(idx);
18098
+ this.scrollOptionIntoView(idx);
18099
+ }
18100
+ scrollOptionIntoView(idx) {
17900
18101
  document.getElementById(`${this.id()}-option-${idx}`)?.scrollIntoView({ block: "nearest" });
17901
18102
  }
17902
18103
  handleTypeahead(event) {
17903
- if (event.key.length !== 1 || event.ctrlKey || event.metaKey || event.altKey) return;
18104
+ if (!isTypedCharacter(event)) return;
17904
18105
  event.preventDefault();
17905
18106
  if (this.typeaheadTimer !== void 0) clearTimeout(this.typeaheadTimer);
17906
18107
  this.typeaheadTimer = setTimeout(() => this.typeaheadQuery = "", 500);
17907
18108
  this.typeaheadQuery += foldForSearch(event.key);
17908
18109
  const wasOpen = this.isOpen();
17909
18110
  if (!wasOpen) this.toggle();
17910
- const opts = this.flatOptions();
18111
+ const opts = this.filteredOptions();
17911
18112
  if (opts.length === 0) return;
17912
18113
  const start = Math.max(this.focusedIndex(), 0);
17913
18114
  const firstOffset = this.typeaheadQuery.length > 1 || !wasOpen ? 0 : 1;
@@ -17921,7 +18122,7 @@ var DropdownComponent = class DropdownComponent {
17921
18122
  }
17922
18123
  }
17923
18124
  moveFocus(delta) {
17924
- const opts = this.flatOptions();
18125
+ const opts = this.filteredOptions();
17925
18126
  let idx = this.focusedIndex() + delta;
17926
18127
  while (idx >= 0 && idx < opts.length && opts[idx].disabled) idx += delta;
17927
18128
  if (idx >= 0 && idx < opts.length) this.setFocusedIndex(idx);
@@ -18004,6 +18205,20 @@ var DropdownComponent = class DropdownComponent {
18004
18205
  isRequired: false,
18005
18206
  transformFunction: null
18006
18207
  },
18208
+ clearable: {
18209
+ classPropertyName: "clearable",
18210
+ publicName: "clearable",
18211
+ isSignal: true,
18212
+ isRequired: false,
18213
+ transformFunction: null
18214
+ },
18215
+ searchable: {
18216
+ classPropertyName: "searchable",
18217
+ publicName: "searchable",
18218
+ isSignal: true,
18219
+ isRequired: false,
18220
+ transformFunction: null
18221
+ },
18007
18222
  hint: {
18008
18223
  classPropertyName: "hint",
18009
18224
  publicName: "hint",
@@ -18049,16 +18264,32 @@ var DropdownComponent = class DropdownComponent {
18049
18264
  useExisting: forwardRef(() => DropdownComponent),
18050
18265
  multi: true
18051
18266
  }],
18052
- viewQueries: [{
18053
- propertyName: "elRef",
18054
- first: true,
18055
- predicate: ["triggerEl"],
18056
- descendants: true,
18057
- isSignal: true
18058
- }],
18267
+ viewQueries: [
18268
+ {
18269
+ propertyName: "elRef",
18270
+ first: true,
18271
+ predicate: ["triggerEl"],
18272
+ descendants: true,
18273
+ isSignal: true
18274
+ },
18275
+ {
18276
+ propertyName: "popover",
18277
+ first: true,
18278
+ predicate: PopoverComponent,
18279
+ descendants: true,
18280
+ isSignal: true
18281
+ },
18282
+ {
18283
+ propertyName: "searchEl",
18284
+ first: true,
18285
+ predicate: ["searchEl"],
18286
+ descendants: true,
18287
+ isSignal: true
18288
+ }
18289
+ ],
18059
18290
  ngImport: i0,
18060
- template: "<div class=\"ea-dropdown-field ea-dropdown-field--{{ size() }}\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [icon]=\"labelIcon()\"\n [help]=\"labelHelp()\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-dropdown\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-dropdown__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n role=\"combobox\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? id() + '-listbox' : null\"\n [attr.aria-activedescendant]=\"\n isOpen() && focusedIndex() >= 0 ? id() + '-option-' + focusedIndex() : null\n \"\n [attr.aria-labelledby]=\"triggerLabelledBy()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"hasError() || null\"\n [attr.aria-describedby]=\"\n showError() ? id() + '-error' : showHint() ? id() + '-hint' : null\n \"\n (click)=\"toggle()\"\n (keydown)=\"handleKeydown($event)\">\n <span\n class=\"ea-dropdown__value\"\n [class.ea-dropdown__value--placeholder]=\"!selectedLabel()\">\n <bdi>{{ selectedLabel() || resolvedPlaceholder() }}</bdi>\n </span>\n <ea-icon-chevron-down\n class=\"ea-dropdown__chevron\"\n [class.ea-dropdown__chevron--open]=\"isOpen()\" />\n </button>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n role=\"listbox\"\n [surfaceId]=\"id() + '-listbox'\"\n [aria-label]=\"label()\"\n [matchAnchorWidth]=\"true\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"close\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-dropdown__menu\"\n [ngClass]=\"menuClasses()\"\n role=\"none\">\n @for (group of renderedGroups(); track $index) {\n <div\n class=\"ea-dropdown__group\"\n [class.ea-dropdown__group--ruled]=\"group.rule\"\n [attr.role]=\"grouped() ? 'group' : 'presentation'\"\n [attr.aria-label]=\"group.label ?? null\">\n @if (group.label; as groupLabel) {\n <div\n class=\"ea-dropdown__group-label\"\n aria-hidden=\"true\">\n {{ groupLabel }}\n </div>\n }\n @for (entry of group.options; track entry.option.value) {\n <div\n class=\"ea-dropdown__option\"\n [class.ea-dropdown__option--selected]=\"entry.option.value === value()\"\n [class.ea-dropdown__option--focused]=\"entry.index === focusedIndex()\"\n [class.ea-dropdown__option--disabled]=\"entry.option.disabled\"\n [id]=\"id() + '-option-' + entry.index\"\n role=\"option\"\n [attr.aria-selected]=\"entry.index === selectedIndex()\"\n [attr.aria-disabled]=\"entry.option.disabled || null\"\n (click)=\"select(entry.option)\"\n (mouseenter)=\"focusedIndex.set(entry.index)\">\n {{ entry.option.label }}\n </div>\n }\n </div>\n }\n </div>\n </ea-popover>\n </div>\n\n <ea-field-messages\n [id]=\"id()\"\n [error]=\"errorText()\"\n [hint]=\"showHint() ? hint() : null\" />\n</div>\n",
18061
- styles: [".ea-dropdown-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-dropdown-field--2xs{font-size:var(--font-size-2xs)}.ea-dropdown-field--xs{font-size:var(--font-size-xs)}.ea-dropdown-field--sm{font-size:var(--font-size-sm)}.ea-dropdown-field--md{font-size:var(--font-size-md)}.ea-dropdown-field--lg{font-size:var(--font-size-lg)}.ea-dropdown-field--xl{font-size:var(--font-size-xl)}.ea-dropdown{position:relative}.ea-dropdown__trigger{display:flex;align-items:center;justify-content:space-between;gap:.5em;width:100%;min-height:2.5em;padding:.5em .75em;text-align:start;font-family:var(--font-family-sans);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);background-color:var(--color-bg-base);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors),var(--transition-shadow)}.ea-dropdown__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--error{border-color:var(--color-error-default)}.ea-dropdown__trigger--error.ea-dropdown__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-dropdown__trigger--error.ea-dropdown__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-dropdown__trigger--readonly{cursor:default}.ea-dropdown__trigger--readonly:focus-visible{border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-dropdown__trigger--readonly:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-dropdown__value--placeholder{color:var(--color-text-tertiary)}.ea-dropdown__chevron{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:var(--transition-transform)}.ea-dropdown__chevron--open{transform:rotate(180deg)}.ea-dropdown__menu{max-height:15rem;padding:.25em 0;overflow-y:auto;overscroll-behavior:none;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-dropdown-menu-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-dropdown__menu{border:1px solid CanvasText}}.ea-dropdown__menu--2xs{font-size:var(--font-size-2xs)}.ea-dropdown__menu--xs{font-size:var(--font-size-xs)}.ea-dropdown__menu--sm{font-size:var(--font-size-sm)}.ea-dropdown__menu--md{font-size:var(--font-size-md)}.ea-dropdown__menu--lg{font-size:var(--font-size-lg)}.ea-dropdown__menu--xl{font-size:var(--font-size-xl)}.ea-dropdown__group{position:relative}.ea-dropdown__group--ruled{padding-top:.25em;margin-top:.25em}.ea-dropdown__group--ruled:before{position:absolute;top:0;inset-inline-end:0;inset-inline-start:0;height:var(--border-width-thin);background-color:var(--color-divider);content:\"\"}.ea-dropdown__group-label{display:block;padding:.5em .75em .125em;font-size:.8125em;font-weight:var(--font-weight-semibold);text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-tertiary);-webkit-user-select:none;user-select:none}.ea-dropdown__option{padding:.5em .75em;font-size:inherit;white-space:nowrap;font-family:var(--font-family-sans);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-dropdown__option--focused{background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-dropdown__option--focused{background-color:Highlight;color:HighlightText}}.ea-dropdown__option--selected{color:var(--color-brand-text);font-weight:var(--font-weight-medium)}@media(forced-colors:active){.ea-dropdown__option--selected{background-color:Highlight;color:HighlightText}}.ea-dropdown__option--disabled{color:var(--color-text-disabled);cursor:default}@media(forced-colors:active){.ea-dropdown__option--disabled{color:GrayText}}\n"],
18291
+ template: "<div class=\"ea-dropdown-field ea-dropdown-field--{{ size() }}\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [icon]=\"labelIcon()\"\n [help]=\"labelHelp()\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-dropdown\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-dropdown__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n role=\"combobox\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? listboxId() : null\"\n [attr.aria-activedescendant]=\"searchable() ? null : activeOptionId()\"\n [attr.aria-labelledby]=\"triggerLabelledBy()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"hasError() || null\"\n [attr.aria-describedby]=\"\n showError() ? id() + '-error' : showHint() ? id() + '-hint' : null\n \"\n (click)=\"toggle()\"\n (keydown)=\"handleKeydown($event)\">\n <span\n class=\"ea-dropdown__value\"\n [class.ea-dropdown__value--placeholder]=\"!selectedLabel()\">\n <bdi>{{ selectedLabel() || resolvedPlaceholder() }}</bdi>\n </span>\n <ea-icon-chevron-down\n class=\"ea-dropdown__chevron\"\n [class.ea-dropdown__chevron--open]=\"isOpen()\" />\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"ea-dropdown__clear\"\n [attr.aria-label]=\"i18n.messages().dropdown.clear\"\n (click)=\"clear()\">\n <ea-icon-x aria-hidden=\"true\" />\n </button>\n }\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n [role]=\"searchable() ? 'dialog' : 'listbox'\"\n [surfaceId]=\"searchable() ? id() + '-popover' : listboxId()\"\n [aria-label]=\"searchable() ? i18n.messages().dropdown.dialogLabel : label()\"\n [matchAnchorWidth]=\"true\"\n [closeOnEscape]=\"false\"\n [scrollBehavior]=\"searchable() ? 'reposition' : 'close'\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-dropdown__menu\"\n [ngClass]=\"menuClasses()\"\n role=\"none\"\n (mousedown)=\"onMenuMousedown($event)\">\n @if (searchable()) {\n <div class=\"ea-dropdown__search\">\n <ea-icon-search\n class=\"ea-dropdown__search-icon\"\n aria-hidden=\"true\" />\n <input\n #searchEl\n type=\"text\"\n dir=\"auto\"\n class=\"ea-dropdown__search-input\"\n autocomplete=\"off\"\n [placeholder]=\"i18n.messages().dropdown.searchPlaceholder\"\n [value]=\"searchTerm()\"\n [attr.aria-controls]=\"listboxId()\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n (input)=\"onSearchInput(searchEl.value)\"\n (keydown)=\"handleSearchKeydown($event)\" />\n </div>\n }\n <div\n class=\"ea-dropdown__list\"\n [attr.id]=\"searchable() ? listboxId() : null\"\n [attr.role]=\"searchable() ? 'listbox' : 'none'\"\n [attr.aria-label]=\"searchable() ? (label() ?? null) : null\">\n @for (group of renderedGroups(); track $index) {\n <div\n class=\"ea-dropdown__group\"\n [class.ea-dropdown__group--ruled]=\"group.rule\"\n [attr.role]=\"grouped() ? 'group' : 'presentation'\"\n [attr.aria-label]=\"group.label ?? null\">\n @if (group.label; as groupLabel) {\n <div\n class=\"ea-dropdown__group-label\"\n aria-hidden=\"true\">\n {{ groupLabel }}\n </div>\n }\n @for (entry of group.options; track entry.option.value) {\n <div\n class=\"ea-dropdown__option\"\n [class.ea-dropdown__option--selected]=\"entry.option.value === value()\"\n [class.ea-dropdown__option--focused]=\"entry.index === focusedIndex()\"\n [class.ea-dropdown__option--disabled]=\"entry.option.disabled\"\n [id]=\"id() + '-option-' + entry.index\"\n role=\"option\"\n [attr.aria-selected]=\"entry.index === selectedIndex()\"\n [attr.aria-disabled]=\"entry.option.disabled || null\"\n (click)=\"select(entry.option)\"\n (mouseenter)=\"focusedIndex.set(entry.index)\">\n {{ entry.option.label }}\n </div>\n }\n </div>\n }\n </div>\n @if (searchable() && filteredOptions().length === 0) {\n <div\n class=\"ea-dropdown__empty\"\n role=\"status\">\n {{ i18n.messages().dropdown.searchEmpty }}\n </div>\n }\n </div>\n </ea-popover>\n </div>\n\n <ea-field-messages\n [id]=\"id()\"\n [error]=\"errorText()\"\n [hint]=\"showHint() ? hint() : null\" />\n</div>\n",
18292
+ styles: [".ea-dropdown-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-dropdown-field--2xs{font-size:var(--font-size-2xs)}.ea-dropdown-field--xs{font-size:var(--font-size-xs)}.ea-dropdown-field--sm{font-size:var(--font-size-sm)}.ea-dropdown-field--md{font-size:var(--font-size-md)}.ea-dropdown-field--lg{font-size:var(--font-size-lg)}.ea-dropdown-field--xl{font-size:var(--font-size-xl)}.ea-dropdown{position:relative}.ea-dropdown__trigger{display:flex;align-items:center;justify-content:space-between;gap:.5em;width:100%;min-height:2.5em;padding:.5em .75em;text-align:start;font-family:var(--font-family-sans);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);background-color:var(--color-bg-base);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors),var(--transition-shadow)}.ea-dropdown__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--error{border-color:var(--color-error-default)}.ea-dropdown__trigger--error.ea-dropdown__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-dropdown__trigger--error.ea-dropdown__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-dropdown__trigger--readonly{cursor:default}.ea-dropdown__trigger--readonly:focus-visible{border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-dropdown__trigger--readonly:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--clearable .ea-dropdown__value{margin-inline-end:2em}.ea-dropdown__clear{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--ea-icon-button-size, 1.75em);height:var(--ea-icon-button-size, 1.75em);padding:0;border:none;border-radius:var(--radius-sm);background:none;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-dropdown__clear>*{font-size:1.25em}.ea-dropdown__clear:after{content:\"\";position:absolute;top:50%;left:50%;width:max(100%,var(--ea-icon-button-target, 24px));height:max(100%,var(--ea-icon-button-target, 24px));transform:translate(-50%,-50%)}.ea-dropdown__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-dropdown__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__clear:disabled{cursor:default;opacity:.5}.ea-dropdown__clear{position:absolute;top:50%;inset-inline-end:2em;transform:translateY(-50%)}.ea-dropdown__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-dropdown__value--placeholder{color:var(--color-text-tertiary)}.ea-dropdown__chevron{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:var(--transition-transform)}.ea-dropdown__chevron--open{transform:rotate(180deg)}.ea-dropdown__menu{overflow:hidden;display:flex;flex-direction:column;max-height:15rem;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-dropdown-menu-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-dropdown__menu{border:1px solid CanvasText}}.ea-dropdown__menu--2xs{font-size:var(--font-size-2xs)}.ea-dropdown__menu--xs{font-size:var(--font-size-xs)}.ea-dropdown__menu--sm{font-size:var(--font-size-sm)}.ea-dropdown__menu--md{font-size:var(--font-size-md)}.ea-dropdown__menu--lg{font-size:var(--font-size-lg)}.ea-dropdown__menu--xl{font-size:var(--font-size-xl)}.ea-dropdown__search{position:relative;display:flex;flex-shrink:0;align-items:center;gap:.5em;padding:.5em .75em}.ea-dropdown__search:after{position:absolute;bottom:0;inset-inline-end:0;inset-inline-start:0;height:var(--border-width-thin);background-color:var(--color-divider);content:\"\"}.ea-dropdown__search-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-tertiary)}.ea-dropdown__search-input{flex:1;min-width:0;padding:0;font-size:inherit;font-family:var(--font-family-sans);border:none;background:none;color:var(--color-text-primary)}.ea-dropdown__search-input::placeholder{opacity:1;color:var(--color-text-tertiary)}.ea-dropdown__search-input:focus{outline:none}.ea-dropdown__list{overflow-y:auto;overscroll-behavior:none;flex:1;padding:.25em 0}.ea-dropdown__empty{padding:.75em;text-align:center;color:var(--color-text-tertiary)}.ea-dropdown__group{position:relative}.ea-dropdown__group--ruled{padding-top:.25em;margin-top:.25em}.ea-dropdown__group--ruled:before{position:absolute;top:0;inset-inline-end:0;inset-inline-start:0;height:var(--border-width-thin);background-color:var(--color-divider);content:\"\"}.ea-dropdown__group-label{display:block;padding:.5em .75em .125em;font-size:.8125em;font-weight:var(--font-weight-semibold);text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-tertiary);-webkit-user-select:none;user-select:none}.ea-dropdown__option{padding:.5em .75em;font-size:inherit;white-space:nowrap;font-family:var(--font-family-sans);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-dropdown__option--focused{background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-dropdown__option--focused{background-color:Highlight;color:HighlightText}}.ea-dropdown__option--selected{color:var(--color-brand-text);font-weight:var(--font-weight-medium)}@media(forced-colors:active){.ea-dropdown__option--selected{background-color:Highlight;color:HighlightText}}.ea-dropdown__option--disabled{color:var(--color-text-disabled);cursor:default}@media(forced-colors:active){.ea-dropdown__option--disabled{color:GrayText}}\n"],
18062
18293
  dependencies: [
18063
18294
  {
18064
18295
  kind: "component",
@@ -18119,6 +18350,16 @@ var DropdownComponent = class DropdownComponent {
18119
18350
  "contextMenu"
18120
18351
  ],
18121
18352
  outputs: ["closeRequested", "openRequested"]
18353
+ },
18354
+ {
18355
+ kind: "component",
18356
+ type: SearchIconComponent,
18357
+ selector: "ea-icon-search"
18358
+ },
18359
+ {
18360
+ kind: "component",
18361
+ type: XIconComponent,
18362
+ selector: "ea-icon-x"
18122
18363
  }
18123
18364
  ],
18124
18365
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -18138,7 +18379,9 @@ i0.ɵɵngDeclareClassMetadata({
18138
18379
  FieldLabelComponent,
18139
18380
  FieldMessagesComponent,
18140
18381
  NgClass,
18141
- PopoverComponent
18382
+ PopoverComponent,
18383
+ SearchIconComponent,
18384
+ XIconComponent
18142
18385
  ],
18143
18386
  changeDetection: ChangeDetectionStrategy.OnPush,
18144
18387
  providers: [{
@@ -18146,8 +18389,8 @@ i0.ɵɵngDeclareClassMetadata({
18146
18389
  useExisting: forwardRef(() => DropdownComponent),
18147
18390
  multi: true
18148
18391
  }],
18149
- template: "<div class=\"ea-dropdown-field ea-dropdown-field--{{ size() }}\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [icon]=\"labelIcon()\"\n [help]=\"labelHelp()\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-dropdown\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-dropdown__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n role=\"combobox\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? id() + '-listbox' : null\"\n [attr.aria-activedescendant]=\"\n isOpen() && focusedIndex() >= 0 ? id() + '-option-' + focusedIndex() : null\n \"\n [attr.aria-labelledby]=\"triggerLabelledBy()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"hasError() || null\"\n [attr.aria-describedby]=\"\n showError() ? id() + '-error' : showHint() ? id() + '-hint' : null\n \"\n (click)=\"toggle()\"\n (keydown)=\"handleKeydown($event)\">\n <span\n class=\"ea-dropdown__value\"\n [class.ea-dropdown__value--placeholder]=\"!selectedLabel()\">\n <bdi>{{ selectedLabel() || resolvedPlaceholder() }}</bdi>\n </span>\n <ea-icon-chevron-down\n class=\"ea-dropdown__chevron\"\n [class.ea-dropdown__chevron--open]=\"isOpen()\" />\n </button>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n role=\"listbox\"\n [surfaceId]=\"id() + '-listbox'\"\n [aria-label]=\"label()\"\n [matchAnchorWidth]=\"true\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"close\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-dropdown__menu\"\n [ngClass]=\"menuClasses()\"\n role=\"none\">\n @for (group of renderedGroups(); track $index) {\n <div\n class=\"ea-dropdown__group\"\n [class.ea-dropdown__group--ruled]=\"group.rule\"\n [attr.role]=\"grouped() ? 'group' : 'presentation'\"\n [attr.aria-label]=\"group.label ?? null\">\n @if (group.label; as groupLabel) {\n <div\n class=\"ea-dropdown__group-label\"\n aria-hidden=\"true\">\n {{ groupLabel }}\n </div>\n }\n @for (entry of group.options; track entry.option.value) {\n <div\n class=\"ea-dropdown__option\"\n [class.ea-dropdown__option--selected]=\"entry.option.value === value()\"\n [class.ea-dropdown__option--focused]=\"entry.index === focusedIndex()\"\n [class.ea-dropdown__option--disabled]=\"entry.option.disabled\"\n [id]=\"id() + '-option-' + entry.index\"\n role=\"option\"\n [attr.aria-selected]=\"entry.index === selectedIndex()\"\n [attr.aria-disabled]=\"entry.option.disabled || null\"\n (click)=\"select(entry.option)\"\n (mouseenter)=\"focusedIndex.set(entry.index)\">\n {{ entry.option.label }}\n </div>\n }\n </div>\n }\n </div>\n </ea-popover>\n </div>\n\n <ea-field-messages\n [id]=\"id()\"\n [error]=\"errorText()\"\n [hint]=\"showHint() ? hint() : null\" />\n</div>\n",
18150
- styles: [".ea-dropdown-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-dropdown-field--2xs{font-size:var(--font-size-2xs)}.ea-dropdown-field--xs{font-size:var(--font-size-xs)}.ea-dropdown-field--sm{font-size:var(--font-size-sm)}.ea-dropdown-field--md{font-size:var(--font-size-md)}.ea-dropdown-field--lg{font-size:var(--font-size-lg)}.ea-dropdown-field--xl{font-size:var(--font-size-xl)}.ea-dropdown{position:relative}.ea-dropdown__trigger{display:flex;align-items:center;justify-content:space-between;gap:.5em;width:100%;min-height:2.5em;padding:.5em .75em;text-align:start;font-family:var(--font-family-sans);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);background-color:var(--color-bg-base);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors),var(--transition-shadow)}.ea-dropdown__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--error{border-color:var(--color-error-default)}.ea-dropdown__trigger--error.ea-dropdown__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-dropdown__trigger--error.ea-dropdown__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-dropdown__trigger--readonly{cursor:default}.ea-dropdown__trigger--readonly:focus-visible{border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-dropdown__trigger--readonly:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-dropdown__value--placeholder{color:var(--color-text-tertiary)}.ea-dropdown__chevron{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:var(--transition-transform)}.ea-dropdown__chevron--open{transform:rotate(180deg)}.ea-dropdown__menu{max-height:15rem;padding:.25em 0;overflow-y:auto;overscroll-behavior:none;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-dropdown-menu-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-dropdown__menu{border:1px solid CanvasText}}.ea-dropdown__menu--2xs{font-size:var(--font-size-2xs)}.ea-dropdown__menu--xs{font-size:var(--font-size-xs)}.ea-dropdown__menu--sm{font-size:var(--font-size-sm)}.ea-dropdown__menu--md{font-size:var(--font-size-md)}.ea-dropdown__menu--lg{font-size:var(--font-size-lg)}.ea-dropdown__menu--xl{font-size:var(--font-size-xl)}.ea-dropdown__group{position:relative}.ea-dropdown__group--ruled{padding-top:.25em;margin-top:.25em}.ea-dropdown__group--ruled:before{position:absolute;top:0;inset-inline-end:0;inset-inline-start:0;height:var(--border-width-thin);background-color:var(--color-divider);content:\"\"}.ea-dropdown__group-label{display:block;padding:.5em .75em .125em;font-size:.8125em;font-weight:var(--font-weight-semibold);text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-tertiary);-webkit-user-select:none;user-select:none}.ea-dropdown__option{padding:.5em .75em;font-size:inherit;white-space:nowrap;font-family:var(--font-family-sans);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-dropdown__option--focused{background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-dropdown__option--focused{background-color:Highlight;color:HighlightText}}.ea-dropdown__option--selected{color:var(--color-brand-text);font-weight:var(--font-weight-medium)}@media(forced-colors:active){.ea-dropdown__option--selected{background-color:Highlight;color:HighlightText}}.ea-dropdown__option--disabled{color:var(--color-text-disabled);cursor:default}@media(forced-colors:active){.ea-dropdown__option--disabled{color:GrayText}}\n"]
18392
+ template: "<div class=\"ea-dropdown-field ea-dropdown-field--{{ size() }}\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [icon]=\"labelIcon()\"\n [help]=\"labelHelp()\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-dropdown\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-dropdown__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n role=\"combobox\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? listboxId() : null\"\n [attr.aria-activedescendant]=\"searchable() ? null : activeOptionId()\"\n [attr.aria-labelledby]=\"triggerLabelledBy()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"hasError() || null\"\n [attr.aria-describedby]=\"\n showError() ? id() + '-error' : showHint() ? id() + '-hint' : null\n \"\n (click)=\"toggle()\"\n (keydown)=\"handleKeydown($event)\">\n <span\n class=\"ea-dropdown__value\"\n [class.ea-dropdown__value--placeholder]=\"!selectedLabel()\">\n <bdi>{{ selectedLabel() || resolvedPlaceholder() }}</bdi>\n </span>\n <ea-icon-chevron-down\n class=\"ea-dropdown__chevron\"\n [class.ea-dropdown__chevron--open]=\"isOpen()\" />\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"ea-dropdown__clear\"\n [attr.aria-label]=\"i18n.messages().dropdown.clear\"\n (click)=\"clear()\">\n <ea-icon-x aria-hidden=\"true\" />\n </button>\n }\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n [role]=\"searchable() ? 'dialog' : 'listbox'\"\n [surfaceId]=\"searchable() ? id() + '-popover' : listboxId()\"\n [aria-label]=\"searchable() ? i18n.messages().dropdown.dialogLabel : label()\"\n [matchAnchorWidth]=\"true\"\n [closeOnEscape]=\"false\"\n [scrollBehavior]=\"searchable() ? 'reposition' : 'close'\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-dropdown__menu\"\n [ngClass]=\"menuClasses()\"\n role=\"none\"\n (mousedown)=\"onMenuMousedown($event)\">\n @if (searchable()) {\n <div class=\"ea-dropdown__search\">\n <ea-icon-search\n class=\"ea-dropdown__search-icon\"\n aria-hidden=\"true\" />\n <input\n #searchEl\n type=\"text\"\n dir=\"auto\"\n class=\"ea-dropdown__search-input\"\n autocomplete=\"off\"\n [placeholder]=\"i18n.messages().dropdown.searchPlaceholder\"\n [value]=\"searchTerm()\"\n [attr.aria-controls]=\"listboxId()\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n (input)=\"onSearchInput(searchEl.value)\"\n (keydown)=\"handleSearchKeydown($event)\" />\n </div>\n }\n <div\n class=\"ea-dropdown__list\"\n [attr.id]=\"searchable() ? listboxId() : null\"\n [attr.role]=\"searchable() ? 'listbox' : 'none'\"\n [attr.aria-label]=\"searchable() ? (label() ?? null) : null\">\n @for (group of renderedGroups(); track $index) {\n <div\n class=\"ea-dropdown__group\"\n [class.ea-dropdown__group--ruled]=\"group.rule\"\n [attr.role]=\"grouped() ? 'group' : 'presentation'\"\n [attr.aria-label]=\"group.label ?? null\">\n @if (group.label; as groupLabel) {\n <div\n class=\"ea-dropdown__group-label\"\n aria-hidden=\"true\">\n {{ groupLabel }}\n </div>\n }\n @for (entry of group.options; track entry.option.value) {\n <div\n class=\"ea-dropdown__option\"\n [class.ea-dropdown__option--selected]=\"entry.option.value === value()\"\n [class.ea-dropdown__option--focused]=\"entry.index === focusedIndex()\"\n [class.ea-dropdown__option--disabled]=\"entry.option.disabled\"\n [id]=\"id() + '-option-' + entry.index\"\n role=\"option\"\n [attr.aria-selected]=\"entry.index === selectedIndex()\"\n [attr.aria-disabled]=\"entry.option.disabled || null\"\n (click)=\"select(entry.option)\"\n (mouseenter)=\"focusedIndex.set(entry.index)\">\n {{ entry.option.label }}\n </div>\n }\n </div>\n }\n </div>\n @if (searchable() && filteredOptions().length === 0) {\n <div\n class=\"ea-dropdown__empty\"\n role=\"status\">\n {{ i18n.messages().dropdown.searchEmpty }}\n </div>\n }\n </div>\n </ea-popover>\n </div>\n\n <ea-field-messages\n [id]=\"id()\"\n [error]=\"errorText()\"\n [hint]=\"showHint() ? hint() : null\" />\n</div>\n",
18393
+ styles: [".ea-dropdown-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-dropdown-field--2xs{font-size:var(--font-size-2xs)}.ea-dropdown-field--xs{font-size:var(--font-size-xs)}.ea-dropdown-field--sm{font-size:var(--font-size-sm)}.ea-dropdown-field--md{font-size:var(--font-size-md)}.ea-dropdown-field--lg{font-size:var(--font-size-lg)}.ea-dropdown-field--xl{font-size:var(--font-size-xl)}.ea-dropdown{position:relative}.ea-dropdown__trigger{display:flex;align-items:center;justify-content:space-between;gap:.5em;width:100%;min-height:2.5em;padding:.5em .75em;text-align:start;font-family:var(--font-family-sans);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);background-color:var(--color-bg-base);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors),var(--transition-shadow)}.ea-dropdown__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--error{border-color:var(--color-error-default)}.ea-dropdown__trigger--error.ea-dropdown__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-dropdown__trigger--error.ea-dropdown__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-dropdown__trigger--readonly{cursor:default}.ea-dropdown__trigger--readonly:focus-visible{border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-dropdown__trigger--readonly:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__trigger--clearable .ea-dropdown__value{margin-inline-end:2em}.ea-dropdown__clear{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--ea-icon-button-size, 1.75em);height:var(--ea-icon-button-size, 1.75em);padding:0;border:none;border-radius:var(--radius-sm);background:none;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-dropdown__clear>*{font-size:1.25em}.ea-dropdown__clear:after{content:\"\";position:absolute;top:50%;left:50%;width:max(100%,var(--ea-icon-button-target, 24px));height:max(100%,var(--ea-icon-button-target, 24px));transform:translate(-50%,-50%)}.ea-dropdown__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-dropdown__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dropdown__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dropdown__clear:disabled{cursor:default;opacity:.5}.ea-dropdown__clear{position:absolute;top:50%;inset-inline-end:2em;transform:translateY(-50%)}.ea-dropdown__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-dropdown__value--placeholder{color:var(--color-text-tertiary)}.ea-dropdown__chevron{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:var(--transition-transform)}.ea-dropdown__chevron--open{transform:rotate(180deg)}.ea-dropdown__menu{overflow:hidden;display:flex;flex-direction:column;max-height:15rem;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-dropdown-menu-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-dropdown__menu{border:1px solid CanvasText}}.ea-dropdown__menu--2xs{font-size:var(--font-size-2xs)}.ea-dropdown__menu--xs{font-size:var(--font-size-xs)}.ea-dropdown__menu--sm{font-size:var(--font-size-sm)}.ea-dropdown__menu--md{font-size:var(--font-size-md)}.ea-dropdown__menu--lg{font-size:var(--font-size-lg)}.ea-dropdown__menu--xl{font-size:var(--font-size-xl)}.ea-dropdown__search{position:relative;display:flex;flex-shrink:0;align-items:center;gap:.5em;padding:.5em .75em}.ea-dropdown__search:after{position:absolute;bottom:0;inset-inline-end:0;inset-inline-start:0;height:var(--border-width-thin);background-color:var(--color-divider);content:\"\"}.ea-dropdown__search-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-tertiary)}.ea-dropdown__search-input{flex:1;min-width:0;padding:0;font-size:inherit;font-family:var(--font-family-sans);border:none;background:none;color:var(--color-text-primary)}.ea-dropdown__search-input::placeholder{opacity:1;color:var(--color-text-tertiary)}.ea-dropdown__search-input:focus{outline:none}.ea-dropdown__list{overflow-y:auto;overscroll-behavior:none;flex:1;padding:.25em 0}.ea-dropdown__empty{padding:.75em;text-align:center;color:var(--color-text-tertiary)}.ea-dropdown__group{position:relative}.ea-dropdown__group--ruled{padding-top:.25em;margin-top:.25em}.ea-dropdown__group--ruled:before{position:absolute;top:0;inset-inline-end:0;inset-inline-start:0;height:var(--border-width-thin);background-color:var(--color-divider);content:\"\"}.ea-dropdown__group-label{display:block;padding:.5em .75em .125em;font-size:.8125em;font-weight:var(--font-weight-semibold);text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-tertiary);-webkit-user-select:none;user-select:none}.ea-dropdown__option{padding:.5em .75em;font-size:inherit;white-space:nowrap;font-family:var(--font-family-sans);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-dropdown__option--focused{background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-dropdown__option--focused{background-color:Highlight;color:HighlightText}}.ea-dropdown__option--selected{color:var(--color-brand-text);font-weight:var(--font-weight-medium)}@media(forced-colors:active){.ea-dropdown__option--selected{background-color:Highlight;color:HighlightText}}.ea-dropdown__option--disabled{color:var(--color-text-disabled);cursor:default}@media(forced-colors:active){.ea-dropdown__option--disabled{color:GrayText}}\n"]
18151
18394
  }]
18152
18395
  }],
18153
18396
  ctorParameters: () => [],
@@ -18156,6 +18399,14 @@ i0.ɵɵngDeclareClassMetadata({
18156
18399
  type: i0.ViewChild,
18157
18400
  args: ["triggerEl", { isSignal: true }]
18158
18401
  }],
18402
+ popover: [{
18403
+ type: i0.ViewChild,
18404
+ args: [i0.forwardRef(() => PopoverComponent), { isSignal: true }]
18405
+ }],
18406
+ searchEl: [{
18407
+ type: i0.ViewChild,
18408
+ args: ["searchEl", { isSignal: true }]
18409
+ }],
18159
18410
  label: [{
18160
18411
  type: i0.Input,
18161
18412
  args: [{
@@ -18228,6 +18479,22 @@ i0.ɵɵngDeclareClassMetadata({
18228
18479
  required: false
18229
18480
  }]
18230
18481
  }],
18482
+ clearable: [{
18483
+ type: i0.Input,
18484
+ args: [{
18485
+ isSignal: true,
18486
+ alias: "clearable",
18487
+ required: false
18488
+ }]
18489
+ }],
18490
+ searchable: [{
18491
+ type: i0.Input,
18492
+ args: [{
18493
+ isSignal: true,
18494
+ alias: "searchable",
18495
+ required: false
18496
+ }]
18497
+ }],
18231
18498
  hint: [{
18232
18499
  type: i0.Input,
18233
18500
  args: [{
@@ -21720,6 +21987,7 @@ var LineChartComponent = class LineChartComponent {
21720
21987
  "flip",
21721
21988
  "whenClipped",
21722
21989
  "maxWidth",
21990
+ "showDelay",
21723
21991
  "dismissDelay",
21724
21992
  "tooltipOpen"
21725
21993
  ]
@@ -22290,6 +22558,7 @@ var TagComponent = class TagComponent {
22290
22558
  "flip",
22291
22559
  "whenClipped",
22292
22560
  "maxWidth",
22561
+ "showDelay",
22293
22562
  "dismissDelay",
22294
22563
  "tooltipOpen"
22295
22564
  ]
@@ -23103,6 +23372,7 @@ var MultiSelectComponent = class MultiSelectComponent {
23103
23372
  "flip",
23104
23373
  "whenClipped",
23105
23374
  "maxWidth",
23375
+ "showDelay",
23106
23376
  "dismissDelay",
23107
23377
  "tooltipOpen"
23108
23378
  ]
@@ -24594,6 +24864,7 @@ var PieChartComponent = class PieChartComponent {
24594
24864
  "flip",
24595
24865
  "whenClipped",
24596
24866
  "maxWidth",
24867
+ "showDelay",
24597
24868
  "dismissDelay",
24598
24869
  "tooltipOpen"
24599
24870
  ]