@eagami/ui 5.50.0 → 5.52.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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import { CSP_NONCE, ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, HostBinding, HostListener, Injectable, InjectionToken, Injector, PLATFORM_ID, Renderer2, RendererStyleFlags2, TemplateRef, ViewContainerRef, ViewEncapsulation, afterNextRender, afterRenderEffect, computed, contentChild, effect, forwardRef, inject, input, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
2
+ import { CSP_NONCE, ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, HostBinding, HostListener, Injectable, InjectionToken, Injector, PLATFORM_ID, Renderer2, RendererStyleFlags2, TemplateRef, ViewContainerRef, ViewEncapsulation, afterNextRender, afterRenderEffect, computed, contentChild, effect, forwardRef, inject, input, linkedSignal, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
3
3
  import { NgClass, NgComponentOutlet, NgTemplateOutlet, isPlatformBrowser } from "@angular/common";
4
4
  import { NG_VALUE_ACCESSOR, NgControl, TouchedChangeEvent } from "@angular/forms";
5
5
  const EAGAMI_I18N_CONFIG = new InjectionToken("EAGAMI_I18N_CONFIG");
@@ -407,6 +407,18 @@ const ar = {
407
407
  tooLarge: (maxMb) => `الملف يتجاوز حد ${maxMb} MB`
408
408
  },
409
409
  breadcrumbs: { label: "مسار التنقل" },
410
+ chart: {
411
+ roleDescription: "مخطط",
412
+ lineChart: "مخطط خطي",
413
+ barChart: "مخطط شريطي",
414
+ pieChart: "مخطط دائري",
415
+ category: "الفئة",
416
+ value: "القيمة",
417
+ share: "النسبة",
418
+ noData: "لا توجد بيانات",
419
+ point: (series, label, value) => `${series}، ${label}: ${value}`,
420
+ slice: (label, value, percent) => `${label}: ${value}، ${percent}`
421
+ },
410
422
  codeInput: {
411
423
  groupLabel: (length) => `رمز التحقق، ${length} أرقام`,
412
424
  digitLabel: (index, length) => `الرقم ${index} من ${length}`
@@ -604,6 +616,18 @@ const de = {
604
616
  tooLarge: (maxMb) => `Datei überschreitet das Limit von ${maxMb} MB`
605
617
  },
606
618
  breadcrumbs: { label: "Brotkrümelnavigation" },
619
+ chart: {
620
+ roleDescription: "Diagramm",
621
+ lineChart: "Liniendiagramm",
622
+ barChart: "Balkendiagramm",
623
+ pieChart: "Kreisdiagramm",
624
+ category: "Kategorie",
625
+ value: "Wert",
626
+ share: "Anteil",
627
+ noData: "Keine Daten",
628
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
629
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
630
+ },
607
631
  codeInput: {
608
632
  groupLabel: (length) => `Bestätigungscode, ${length} Ziffern`,
609
633
  digitLabel: (index, length) => `Ziffer ${index} von ${length}`
@@ -801,6 +825,18 @@ const el = {
801
825
  tooLarge: (maxMb) => `Το αρχείο υπερβαίνει το όριο των ${maxMb} MB`
802
826
  },
803
827
  breadcrumbs: { label: "Διαδρομή πλοήγησης" },
828
+ chart: {
829
+ roleDescription: "γράφημα",
830
+ lineChart: "Γράφημα γραμμών",
831
+ barChart: "Ραβδόγραμμα",
832
+ pieChart: "Κυκλικό διάγραμμα",
833
+ category: "Κατηγορία",
834
+ value: "Τιμή",
835
+ share: "Μερίδιο",
836
+ noData: "Δεν υπάρχουν δεδομένα",
837
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
838
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
839
+ },
804
840
  codeInput: {
805
841
  groupLabel: (length) => `Κωδικός επαλήθευσης, ${length} ψηφία`,
806
842
  digitLabel: (index, length) => `Ψηφίο ${index} από ${length}`
@@ -998,6 +1034,18 @@ const en = {
998
1034
  tooLarge: (maxMb) => `File exceeds ${maxMb} MB limit`
999
1035
  },
1000
1036
  breadcrumbs: { label: "Breadcrumb" },
1037
+ chart: {
1038
+ roleDescription: "chart",
1039
+ lineChart: "Line chart",
1040
+ barChart: "Bar chart",
1041
+ pieChart: "Pie chart",
1042
+ category: "Category",
1043
+ value: "Value",
1044
+ share: "Share",
1045
+ noData: "No data",
1046
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
1047
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
1048
+ },
1001
1049
  codeInput: {
1002
1050
  groupLabel: (length) => `Verification code, ${length} digits`,
1003
1051
  digitLabel: (index, length) => `Digit ${index} of ${length}`
@@ -1195,6 +1243,18 @@ const esES = {
1195
1243
  tooLarge: (maxMb) => `El archivo supera el límite de ${maxMb} MB`
1196
1244
  },
1197
1245
  breadcrumbs: { label: "Ruta de navegación" },
1246
+ chart: {
1247
+ roleDescription: "gráfico",
1248
+ lineChart: "Gráfico de líneas",
1249
+ barChart: "Gráfico de barras",
1250
+ pieChart: "Gráfico circular",
1251
+ category: "Categoría",
1252
+ value: "Valor",
1253
+ share: "Proporción",
1254
+ noData: "Sin datos",
1255
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
1256
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
1257
+ },
1198
1258
  codeInput: {
1199
1259
  groupLabel: (length) => `Código de verificación, ${length} dígitos`,
1200
1260
  digitLabel: (index, length) => `Dígito ${index} de ${length}`
@@ -1392,6 +1452,18 @@ const frFR = {
1392
1452
  tooLarge: (maxMb) => `Le fichier dépasse la limite de ${maxMb} MB`
1393
1453
  },
1394
1454
  breadcrumbs: { label: "Fil d'Ariane" },
1455
+ chart: {
1456
+ roleDescription: "graphique",
1457
+ lineChart: "Graphique linéaire",
1458
+ barChart: "Graphique à barres",
1459
+ pieChart: "Graphique circulaire",
1460
+ category: "Catégorie",
1461
+ value: "Valeur",
1462
+ share: "Part",
1463
+ noData: "Aucune donnée",
1464
+ point: (series, label, value) => `${series}, ${label} : ${value}`,
1465
+ slice: (label, value, percent) => `${label} : ${value}, ${percent}`
1466
+ },
1395
1467
  codeInput: {
1396
1468
  groupLabel: (length) => `Code de vérification, ${length} chiffres`,
1397
1469
  digitLabel: (index, length) => `Chiffre ${index} sur ${length}`
@@ -1589,6 +1661,18 @@ const he = {
1589
1661
  tooLarge: (maxMb) => `הקובץ חורג ממגבלת ${maxMb} MB`
1590
1662
  },
1591
1663
  breadcrumbs: { label: "נתיב ניווט" },
1664
+ chart: {
1665
+ roleDescription: "תרשים",
1666
+ lineChart: "תרשים קווי",
1667
+ barChart: "תרשים עמודות",
1668
+ pieChart: "תרשים עוגה",
1669
+ category: "קטגוריה",
1670
+ value: "ערך",
1671
+ share: "נתח",
1672
+ noData: "אין נתונים",
1673
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
1674
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
1675
+ },
1592
1676
  codeInput: {
1593
1677
  groupLabel: (length) => `קוד אימות, ${length} ספרות`,
1594
1678
  digitLabel: (index, length) => `ספרה ${index} מתוך ${length}`
@@ -1786,6 +1870,18 @@ const hi = {
1786
1870
  tooLarge: (maxMb) => `फ़ाइल ${maxMb} MB की सीमा से अधिक है`
1787
1871
  },
1788
1872
  breadcrumbs: { label: "ब्रेडक्रंब" },
1873
+ chart: {
1874
+ roleDescription: "चार्ट",
1875
+ lineChart: "लाइन चार्ट",
1876
+ barChart: "बार चार्ट",
1877
+ pieChart: "पाई चार्ट",
1878
+ category: "श्रेणी",
1879
+ value: "मान",
1880
+ share: "हिस्सा",
1881
+ noData: "कोई डेटा नहीं",
1882
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
1883
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
1884
+ },
1789
1885
  codeInput: {
1790
1886
  groupLabel: (length) => `सत्यापन कोड, ${length} अंक`,
1791
1887
  digitLabel: (index, length) => `${length} में से अंक ${index}`
@@ -1983,6 +2079,18 @@ const is = {
1983
2079
  tooLarge: (maxMb) => `Skráin fer yfir ${maxMb} MB mörkin`
1984
2080
  },
1985
2081
  breadcrumbs: { label: "Brauðmolaslóð" },
2082
+ chart: {
2083
+ roleDescription: "graf",
2084
+ lineChart: "Línurit",
2085
+ barChart: "Súlurit",
2086
+ pieChart: "Kökurit",
2087
+ category: "Flokkur",
2088
+ value: "Gildi",
2089
+ share: "Hlutfall",
2090
+ noData: "Engin gögn",
2091
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
2092
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
2093
+ },
1986
2094
  codeInput: {
1987
2095
  groupLabel: (length) => `Staðfestingarkóði, ${length} tölustafir`,
1988
2096
  digitLabel: (index, length) => `Tölustafur ${index} af ${length}`
@@ -2180,6 +2288,18 @@ const nl = {
2180
2288
  tooLarge: (maxMb) => `Bestand overschrijdt de limiet van ${maxMb} MB`
2181
2289
  },
2182
2290
  breadcrumbs: { label: "Broodkruimelnavigatie" },
2291
+ chart: {
2292
+ roleDescription: "grafiek",
2293
+ lineChart: "Lijndiagram",
2294
+ barChart: "Staafdiagram",
2295
+ pieChart: "Cirkeldiagram",
2296
+ category: "Categorie",
2297
+ value: "Waarde",
2298
+ share: "Aandeel",
2299
+ noData: "Geen gegevens",
2300
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
2301
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
2302
+ },
2183
2303
  codeInput: {
2184
2304
  groupLabel: (length) => `Verificatiecode, ${length} cijfers`,
2185
2305
  digitLabel: (index, length) => `Cijfer ${index} van ${length}`
@@ -2377,6 +2497,18 @@ const pl = {
2377
2497
  tooLarge: (maxMb) => `Plik przekracza limit ${maxMb} MB`
2378
2498
  },
2379
2499
  breadcrumbs: { label: "Ścieżka nawigacji" },
2500
+ chart: {
2501
+ roleDescription: "wykres",
2502
+ lineChart: "Wykres liniowy",
2503
+ barChart: "Wykres słupkowy",
2504
+ pieChart: "Wykres kołowy",
2505
+ category: "Kategoria",
2506
+ value: "Wartość",
2507
+ share: "Udział",
2508
+ noData: "Brak danych",
2509
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
2510
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
2511
+ },
2380
2512
  codeInput: {
2381
2513
  groupLabel: (length) => `Kod weryfikacyjny, ${length} cyfr`,
2382
2514
  digitLabel: (index, length) => `Cyfra ${index} z ${length}`
@@ -2574,6 +2706,18 @@ const ptBR = {
2574
2706
  tooLarge: (maxMb) => `O arquivo excede o limite de ${maxMb} MB`
2575
2707
  },
2576
2708
  breadcrumbs: { label: "Trilha de navegação" },
2709
+ chart: {
2710
+ roleDescription: "gráfico",
2711
+ lineChart: "Gráfico de linhas",
2712
+ barChart: "Gráfico de barras",
2713
+ pieChart: "Gráfico de pizza",
2714
+ category: "Categoria",
2715
+ value: "Valor",
2716
+ share: "Participação",
2717
+ noData: "Sem dados",
2718
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
2719
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
2720
+ },
2577
2721
  codeInput: {
2578
2722
  groupLabel: (length) => `Código de verificação, ${length} dígitos`,
2579
2723
  digitLabel: (index, length) => `Dígito ${index} de ${length}`
@@ -2771,6 +2915,18 @@ const ru = {
2771
2915
  tooLarge: (maxMb) => `Файл превышает лимит ${maxMb} MB`
2772
2916
  },
2773
2917
  breadcrumbs: { label: "Навигационная цепочка" },
2918
+ chart: {
2919
+ roleDescription: "диаграмма",
2920
+ lineChart: "Линейный график",
2921
+ barChart: "Столбчатая диаграмма",
2922
+ pieChart: "Круговая диаграмма",
2923
+ category: "Категория",
2924
+ value: "Значение",
2925
+ share: "Доля",
2926
+ noData: "Нет данных",
2927
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
2928
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
2929
+ },
2774
2930
  codeInput: {
2775
2931
  groupLabel: (length) => `Код подтверждения, ${length} цифр`,
2776
2932
  digitLabel: (index, length) => `Цифра ${index} из ${length}`
@@ -2968,6 +3124,18 @@ const uk = {
2968
3124
  tooLarge: (maxMb) => `Файл перевищує ліміт ${maxMb} MB`
2969
3125
  },
2970
3126
  breadcrumbs: { label: "Навігаційний ланцюжок" },
3127
+ chart: {
3128
+ roleDescription: "діаграма",
3129
+ lineChart: "Лінійний графік",
3130
+ barChart: "Стовпчикова діаграма",
3131
+ pieChart: "Кругова діаграма",
3132
+ category: "Категорія",
3133
+ value: "Значення",
3134
+ share: "Частка",
3135
+ noData: "Немає даних",
3136
+ point: (series, label, value) => `${series}, ${label}: ${value}`,
3137
+ slice: (label, value, percent) => `${label}: ${value}, ${percent}`
3138
+ },
2971
3139
  codeInput: {
2972
3140
  groupLabel: (length) => `Код підтвердження, ${length} цифр`,
2973
3141
  digitLabel: (index, length) => `Цифра ${index} з ${length}`
@@ -3165,6 +3333,18 @@ const zhCN = {
3165
3333
  tooLarge: (maxMb) => `文件超过 ${maxMb} MB 限制`
3166
3334
  },
3167
3335
  breadcrumbs: { label: "面包屑导航" },
3336
+ chart: {
3337
+ roleDescription: "图表",
3338
+ lineChart: "折线图",
3339
+ barChart: "柱状图",
3340
+ pieChart: "饼图",
3341
+ category: "类别",
3342
+ value: "数值",
3343
+ share: "占比",
3344
+ noData: "无数据",
3345
+ point: (series, label, value) => `${series},${label}:${value}`,
3346
+ slice: (label, value, percent) => `${label}:${value},${percent}`
3347
+ },
3168
3348
  codeInput: {
3169
3349
  groupLabel: (length) => `验证码,共 ${length} 位`,
3170
3350
  digitLabel: (index, length) => `第 ${index} 位,共 ${length} 位`
@@ -3738,6 +3918,7 @@ var AccordionItemComponent = class AccordionItemComponent {
3738
3918
  accordion = inject(AccordionComponent);
3739
3919
  value = input.required(...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
3740
3920
  label = input.required(...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
3921
+ icon = input(void 0, ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
3741
3922
  disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
3742
3923
  id = input(uniqueId("ea-accordion-item"), ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
3743
3924
  isExpanded = computed(() => this.accordion.isExpanded(this.value()), ...ngDevMode ? [{ debugName: "isExpanded" }] : /* istanbul ignore next */ []);
@@ -3782,6 +3963,13 @@ var AccordionItemComponent = class AccordionItemComponent {
3782
3963
  isRequired: true,
3783
3964
  transformFunction: null
3784
3965
  },
3966
+ icon: {
3967
+ classPropertyName: "icon",
3968
+ publicName: "icon",
3969
+ isSignal: true,
3970
+ isRequired: false,
3971
+ transformFunction: null
3972
+ },
3785
3973
  disabled: {
3786
3974
  classPropertyName: "disabled",
3787
3975
  publicName: "disabled",
@@ -3798,12 +3986,25 @@ var AccordionItemComponent = class AccordionItemComponent {
3798
3986
  }
3799
3987
  },
3800
3988
  ngImport: i0,
3801
- template: "<div\n class=\"ea-accordion-item ea-accordion-item--{{ size() }}\"\n [class.ea-accordion-item--expanded]=\"isExpanded()\"\n [class.ea-accordion-item--disabled]=\"disabled()\">\n <div\n class=\"ea-accordion-item__header\"\n role=\"heading\"\n [attr.aria-level]=\"headingLevel()\">\n <button\n class=\"ea-accordion-item__trigger\"\n type=\"button\"\n [id]=\"id() + '-trigger'\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-controls]=\"id() + '-content'\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\">\n <span class=\"ea-accordion-item__label\">{{ label() }}</span>\n <ea-icon-chevron-down\n class=\"ea-accordion-item__chevron\"\n aria-hidden=\"true\" />\n </button>\n </div>\n @if (isExpanded()) {\n <div\n class=\"ea-accordion-item__content\"\n role=\"region\"\n [id]=\"id() + '-content'\"\n [attr.aria-labelledby]=\"id() + '-trigger'\">\n <ng-content />\n </div>\n }\n</div>\n",
3802
- styles: [".ea-accordion-item{border-bottom:var(--border-width-thin) solid var(--color-border-default)}.ea-accordion-item:last-child{border-bottom:none}.ea-accordion-item--2xs{font-size:var(--font-size-2xs)}.ea-accordion-item--xs{font-size:var(--font-size-xs)}.ea-accordion-item--sm{font-size:var(--font-size-sm)}.ea-accordion-item--md{font-size:var(--font-size-md)}.ea-accordion-item--lg{font-size:var(--font-size-lg)}.ea-accordion-item--xl{font-size:var(--font-size-xl)}.ea-accordion-item__trigger{display:flex;align-items:center;justify-content:space-between;gap:.75em;width:100%;padding:.75em 1em;font-size:inherit;font-weight:var(--font-weight-medium);font-family:var(--font-family-sans);line-height:var(--line-height-normal);text-align:start;background:none;border:none;color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-accordion-item__trigger:hover:not(:disabled){background-color:var(--color-state-hover)}.ea-accordion-item__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-accordion-item__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-accordion-item__trigger:disabled{opacity:.5;cursor:default}.ea-accordion-item__chevron{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:transform var(--duration-normal) var(--ease-out)}.ea-accordion-item--expanded .ea-accordion-item__chevron{transform:rotate(180deg)}.ea-accordion-item__content{padding:.5em 1em 1em;line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-accordion-item--disabled{opacity:.5}\n"],
3989
+ template: "<div\n class=\"ea-accordion-item ea-accordion-item--{{ size() }}\"\n [class.ea-accordion-item--expanded]=\"isExpanded()\"\n [class.ea-accordion-item--disabled]=\"disabled()\">\n <div\n class=\"ea-accordion-item__header\"\n role=\"heading\"\n [attr.aria-level]=\"headingLevel()\">\n <button\n class=\"ea-accordion-item__trigger\"\n type=\"button\"\n [id]=\"id() + '-trigger'\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-controls]=\"id() + '-content'\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\">\n @if (icon(); as leadingIcon) {\n <span\n class=\"ea-accordion-item__icon\"\n aria-hidden=\"true\">\n <ng-container *ngComponentOutlet=\"leadingIcon\" />\n </span>\n }\n <span class=\"ea-accordion-item__label\">{{ label() }}</span>\n <ea-icon-chevron-down\n class=\"ea-accordion-item__chevron\"\n aria-hidden=\"true\" />\n </button>\n </div>\n @if (isExpanded()) {\n <div\n class=\"ea-accordion-item__content\"\n role=\"region\"\n [id]=\"id() + '-content'\"\n [attr.aria-labelledby]=\"id() + '-trigger'\">\n <ng-content />\n </div>\n }\n</div>\n",
3990
+ styles: [".ea-accordion-item{border-bottom:var(--border-width-thin) solid var(--color-border-default)}.ea-accordion-item:last-child{border-bottom:none}.ea-accordion-item--2xs{font-size:var(--font-size-2xs)}.ea-accordion-item--xs{font-size:var(--font-size-xs)}.ea-accordion-item--sm{font-size:var(--font-size-sm)}.ea-accordion-item--md{font-size:var(--font-size-md)}.ea-accordion-item--lg{font-size:var(--font-size-lg)}.ea-accordion-item--xl{font-size:var(--font-size-xl)}.ea-accordion-item__trigger{display:flex;align-items:center;justify-content:space-between;gap:.75em;width:100%;padding:.75em 1em;font-size:inherit;font-weight:var(--font-weight-medium);font-family:var(--font-family-sans);line-height:var(--line-height-normal);text-align:start;background:none;border:none;color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-accordion-item__trigger:hover:not(:disabled){background-color:var(--color-state-hover)}.ea-accordion-item__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-accordion-item__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-accordion-item__trigger:disabled{opacity:.5;cursor:default}.ea-accordion-item__icon{display:inline-flex;flex-shrink:0;color:var(--color-text-secondary)}.ea-accordion-item__icon+.ea-accordion-item__label{flex-grow:1}.ea-accordion-item__chevron{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:transform var(--duration-normal) var(--ease-out)}.ea-accordion-item--expanded .ea-accordion-item__chevron{transform:rotate(180deg)}.ea-accordion-item__content{padding:.5em 1em 1em;line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-accordion-item--disabled{opacity:.5}\n"],
3803
3991
  dependencies: [{
3804
3992
  kind: "component",
3805
3993
  type: ChevronDownIconComponent,
3806
3994
  selector: "ea-icon-chevron-down"
3995
+ }, {
3996
+ kind: "directive",
3997
+ type: NgComponentOutlet,
3998
+ selector: "[ngComponentOutlet]",
3999
+ inputs: [
4000
+ "ngComponentOutlet",
4001
+ "ngComponentOutletInputs",
4002
+ "ngComponentOutletInjector",
4003
+ "ngComponentOutletEnvironmentInjector",
4004
+ "ngComponentOutletContent",
4005
+ "ngComponentOutletNgModule"
4006
+ ],
4007
+ exportAs: ["ngComponentOutlet"]
3807
4008
  }],
3808
4009
  changeDetection: i0.ChangeDetectionStrategy.OnPush
3809
4010
  });
@@ -3817,10 +4018,10 @@ i0.ɵɵngDeclareClassMetadata({
3817
4018
  type: Component,
3818
4019
  args: [{
3819
4020
  selector: "ea-accordion-item",
3820
- imports: [ChevronDownIconComponent],
4021
+ imports: [ChevronDownIconComponent, NgComponentOutlet],
3821
4022
  changeDetection: ChangeDetectionStrategy.OnPush,
3822
- template: "<div\n class=\"ea-accordion-item ea-accordion-item--{{ size() }}\"\n [class.ea-accordion-item--expanded]=\"isExpanded()\"\n [class.ea-accordion-item--disabled]=\"disabled()\">\n <div\n class=\"ea-accordion-item__header\"\n role=\"heading\"\n [attr.aria-level]=\"headingLevel()\">\n <button\n class=\"ea-accordion-item__trigger\"\n type=\"button\"\n [id]=\"id() + '-trigger'\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-controls]=\"id() + '-content'\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\">\n <span class=\"ea-accordion-item__label\">{{ label() }}</span>\n <ea-icon-chevron-down\n class=\"ea-accordion-item__chevron\"\n aria-hidden=\"true\" />\n </button>\n </div>\n @if (isExpanded()) {\n <div\n class=\"ea-accordion-item__content\"\n role=\"region\"\n [id]=\"id() + '-content'\"\n [attr.aria-labelledby]=\"id() + '-trigger'\">\n <ng-content />\n </div>\n }\n</div>\n",
3823
- styles: [".ea-accordion-item{border-bottom:var(--border-width-thin) solid var(--color-border-default)}.ea-accordion-item:last-child{border-bottom:none}.ea-accordion-item--2xs{font-size:var(--font-size-2xs)}.ea-accordion-item--xs{font-size:var(--font-size-xs)}.ea-accordion-item--sm{font-size:var(--font-size-sm)}.ea-accordion-item--md{font-size:var(--font-size-md)}.ea-accordion-item--lg{font-size:var(--font-size-lg)}.ea-accordion-item--xl{font-size:var(--font-size-xl)}.ea-accordion-item__trigger{display:flex;align-items:center;justify-content:space-between;gap:.75em;width:100%;padding:.75em 1em;font-size:inherit;font-weight:var(--font-weight-medium);font-family:var(--font-family-sans);line-height:var(--line-height-normal);text-align:start;background:none;border:none;color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-accordion-item__trigger:hover:not(:disabled){background-color:var(--color-state-hover)}.ea-accordion-item__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-accordion-item__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-accordion-item__trigger:disabled{opacity:.5;cursor:default}.ea-accordion-item__chevron{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:transform var(--duration-normal) var(--ease-out)}.ea-accordion-item--expanded .ea-accordion-item__chevron{transform:rotate(180deg)}.ea-accordion-item__content{padding:.5em 1em 1em;line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-accordion-item--disabled{opacity:.5}\n"]
4023
+ template: "<div\n class=\"ea-accordion-item ea-accordion-item--{{ size() }}\"\n [class.ea-accordion-item--expanded]=\"isExpanded()\"\n [class.ea-accordion-item--disabled]=\"disabled()\">\n <div\n class=\"ea-accordion-item__header\"\n role=\"heading\"\n [attr.aria-level]=\"headingLevel()\">\n <button\n class=\"ea-accordion-item__trigger\"\n type=\"button\"\n [id]=\"id() + '-trigger'\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-controls]=\"id() + '-content'\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\">\n @if (icon(); as leadingIcon) {\n <span\n class=\"ea-accordion-item__icon\"\n aria-hidden=\"true\">\n <ng-container *ngComponentOutlet=\"leadingIcon\" />\n </span>\n }\n <span class=\"ea-accordion-item__label\">{{ label() }}</span>\n <ea-icon-chevron-down\n class=\"ea-accordion-item__chevron\"\n aria-hidden=\"true\" />\n </button>\n </div>\n @if (isExpanded()) {\n <div\n class=\"ea-accordion-item__content\"\n role=\"region\"\n [id]=\"id() + '-content'\"\n [attr.aria-labelledby]=\"id() + '-trigger'\">\n <ng-content />\n </div>\n }\n</div>\n",
4024
+ styles: [".ea-accordion-item{border-bottom:var(--border-width-thin) solid var(--color-border-default)}.ea-accordion-item:last-child{border-bottom:none}.ea-accordion-item--2xs{font-size:var(--font-size-2xs)}.ea-accordion-item--xs{font-size:var(--font-size-xs)}.ea-accordion-item--sm{font-size:var(--font-size-sm)}.ea-accordion-item--md{font-size:var(--font-size-md)}.ea-accordion-item--lg{font-size:var(--font-size-lg)}.ea-accordion-item--xl{font-size:var(--font-size-xl)}.ea-accordion-item__trigger{display:flex;align-items:center;justify-content:space-between;gap:.75em;width:100%;padding:.75em 1em;font-size:inherit;font-weight:var(--font-weight-medium);font-family:var(--font-family-sans);line-height:var(--line-height-normal);text-align:start;background:none;border:none;color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-accordion-item__trigger:hover:not(:disabled){background-color:var(--color-state-hover)}.ea-accordion-item__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-accordion-item__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-accordion-item__trigger:disabled{opacity:.5;cursor:default}.ea-accordion-item__icon{display:inline-flex;flex-shrink:0;color:var(--color-text-secondary)}.ea-accordion-item__icon+.ea-accordion-item__label{flex-grow:1}.ea-accordion-item__chevron{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:transform var(--duration-normal) var(--ease-out)}.ea-accordion-item--expanded .ea-accordion-item__chevron{transform:rotate(180deg)}.ea-accordion-item__content{padding:.5em 1em 1em;line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-accordion-item--disabled{opacity:.5}\n"]
3824
4025
  }]
3825
4026
  }],
3826
4027
  propDecorators: {
@@ -3840,6 +4041,14 @@ i0.ɵɵngDeclareClassMetadata({
3840
4041
  required: true
3841
4042
  }]
3842
4043
  }],
4044
+ icon: [{
4045
+ type: i0.Input,
4046
+ args: [{
4047
+ isSignal: true,
4048
+ alias: "icon",
4049
+ required: false
4050
+ }]
4051
+ }],
3843
4052
  disabled: [{
3844
4053
  type: i0.Input,
3845
4054
  args: [{
@@ -6622,6 +6831,7 @@ var TooltipDirective = class TooltipDirective {
6622
6831
  whenClipped = input(false, ...ngDevMode ? [{ debugName: "whenClipped" }] : /* istanbul ignore next */ []);
6623
6832
  maxWidth = input(200, ...ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []);
6624
6833
  dismissDelay = input(150, ...ngDevMode ? [{ debugName: "dismissDelay" }] : /* istanbul ignore next */ []);
6834
+ tooltipOpen = input(null, ...ngDevMode ? [{ debugName: "tooltipOpen" }] : /* istanbul ignore next */ []);
6625
6835
  tooltipEl = null;
6626
6836
  placedPosition = "top";
6627
6837
  templateView = null;
@@ -6631,20 +6841,23 @@ var TooltipDirective = class TooltipDirective {
6631
6841
  tooltipId = `ea-tooltip-${Math.random().toString(36).slice(2, 9)}`;
6632
6842
  hoverMql = typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia("(hover: hover)") : null;
6633
6843
  showHandler = () => {
6844
+ if (this.controlled()) return;
6634
6845
  this.pointerInside = true;
6635
6846
  this.show();
6636
6847
  };
6637
6848
  pointerLeaveHandler = () => {
6849
+ if (this.controlled()) return;
6638
6850
  this.pointerInside = false;
6639
6851
  this.requestHide();
6640
6852
  };
6641
6853
  hideHandler = () => this.requestHide();
6642
6854
  focusoutHandler = () => {
6643
- if (!this.pointerInside) this.requestHide();
6855
+ if (!this.pointerInside && !this.controlled()) this.requestHide();
6644
6856
  };
6645
6857
  bubbleEnterHandler = () => this.cancelPendingHide();
6646
6858
  supportsFocusVisible = typeof CSS !== "undefined" && CSS.supports?.("selector(:focus-visible)") === true;
6647
6859
  focusHandler = (event) => {
6860
+ if (this.controlled()) return;
6648
6861
  const target = event.target;
6649
6862
  if (!this.supportsFocusVisible || target.matches(":focus-visible")) this.show();
6650
6863
  };
@@ -6675,6 +6888,15 @@ var TooltipDirective = class TooltipDirective {
6675
6888
  native.addEventListener("focusout", this.focusoutHandler);
6676
6889
  this.syncPointerListeners(this.hoverMql?.matches ?? true);
6677
6890
  this.hoverMql?.addEventListener("change", this.hoverChangeHandler);
6891
+ let wasControlled = false;
6892
+ afterRenderEffect(() => {
6893
+ const open = this.tooltipOpen();
6894
+ if (open !== null || wasControlled) untracked(() => open ? this.show() : this.hide());
6895
+ wasControlled = open !== null;
6896
+ });
6897
+ }
6898
+ controlled() {
6899
+ return this.tooltipOpen() !== null;
6678
6900
  }
6679
6901
  ngOnDestroy() {
6680
6902
  const native = this.el.nativeElement;
@@ -6939,6 +7161,13 @@ var TooltipDirective = class TooltipDirective {
6939
7161
  isSignal: true,
6940
7162
  isRequired: false,
6941
7163
  transformFunction: null
7164
+ },
7165
+ tooltipOpen: {
7166
+ classPropertyName: "tooltipOpen",
7167
+ publicName: "tooltipOpen",
7168
+ isSignal: true,
7169
+ isRequired: false,
7170
+ transformFunction: null
6942
7171
  }
6943
7172
  },
6944
7173
  ngImport: i0
@@ -7002,6 +7231,14 @@ i0.ɵɵngDeclareClassMetadata({
7002
7231
  alias: "dismissDelay",
7003
7232
  required: false
7004
7233
  }]
7234
+ }],
7235
+ tooltipOpen: [{
7236
+ type: i0.Input,
7237
+ args: [{
7238
+ isSignal: true,
7239
+ alias: "tooltipOpen",
7240
+ required: false
7241
+ }]
7005
7242
  }]
7006
7243
  }
7007
7244
  });
@@ -7697,7 +7934,8 @@ var AvatarEditorComponent = class AvatarEditorComponent {
7697
7934
  "flip",
7698
7935
  "whenClipped",
7699
7936
  "maxWidth",
7700
- "dismissDelay"
7937
+ "dismissDelay",
7938
+ "tooltipOpen"
7701
7939
  ]
7702
7940
  },
7703
7941
  {
@@ -8145,7 +8383,7 @@ var BadgeComponent = class BadgeComponent {
8145
8383
  },
8146
8384
  ngImport: i0,
8147
8385
  template: "<span\n class=\"ea-badge\"\n [ngClass]=\"hostClasses()\">\n <ng-content />\n</span>\n",
8148
- styles: [".ea-badge{display:inline-flex;align-items:center;gap:.25em;padding:.25em .625em;white-space:nowrap;font-family:var(--font-family-sans);font-weight:var(--font-weight-medium);line-height:var(--line-height-none);border-style:solid;border-width:var(--ea-badge-border-width, 0);border-color:var(--ea-badge-border-color, transparent);border-radius:var(--radius-full);forced-color-adjust:none}.ea-badge--xs{font-size:var(--ea-badge-font-size, var(--font-size-2xs))}.ea-badge--sm{font-size:var(--ea-badge-font-size, var(--font-size-xs))}.ea-badge--md{font-size:var(--ea-badge-font-size, var(--font-size-sm))}.ea-badge--lg{font-size:var(--ea-badge-font-size, var(--font-size-md))}.ea-badge--xl{font-size:var(--ea-badge-font-size, var(--font-size-lg))}.ea-badge--default{background-color:var(--ea-badge-background-color, var(--color-bg-muted));color:var(--ea-badge-color, var(--color-text-secondary))}.ea-badge--success{background-color:var(--ea-badge-background-color, var(--color-success-subtle));color:var(--ea-badge-color, var(--color-success-text))}.ea-badge--warning{background-color:var(--ea-badge-background-color, var(--color-warning-subtle));color:var(--ea-badge-color, var(--color-warning-text))}.ea-badge--error{background-color:var(--ea-badge-background-color, var(--color-error-subtle));color:var(--ea-badge-color, var(--color-error-text))}.ea-badge--info{background-color:var(--ea-badge-background-color, var(--color-info-subtle));color:var(--ea-badge-color, var(--color-info-text))}.ea-badge--uppercase{text-transform:uppercase}.ea-badge--pin{justify-content:center;box-sizing:border-box;min-width:var(--ea-badge-size, 1.8em);height:var(--ea-badge-size, 1.8em);padding:0 .375em;font-variant-numeric:tabular-nums}.ea-badge--pin.ea-badge--xs{font-size:var(--ea-badge-font-size, calc(var(--font-size-2xs) * .75))}.ea-badge--pin.ea-badge--sm{font-size:var(--ea-badge-font-size, calc(var(--font-size-xs) * .75))}.ea-badge--pin.ea-badge--md{font-size:var(--ea-badge-font-size, calc(var(--font-size-sm) * .75))}.ea-badge--pin.ea-badge--lg{font-size:var(--ea-badge-font-size, calc(var(--font-size-md) * .75))}.ea-badge--pin.ea-badge--xl{font-size:var(--ea-badge-font-size, calc(var(--font-size-lg) * .75))}\n"],
8386
+ styles: [".ea-badge{display:inline-flex;align-items:center;gap:.25em;padding:.25em .625em;white-space:nowrap;font-family:var(--font-family-sans);font-weight:var(--font-weight-medium);line-height:var(--line-height-none);border-style:solid;border-width:var(--ea-badge-border-width, 0);border-color:var(--ea-badge-border-color, transparent);border-radius:var(--radius-full);forced-color-adjust:none}.ea-badge--xs{font-size:var(--ea-badge-font-size, var(--font-size-xs))}.ea-badge--sm{font-size:var(--ea-badge-font-size, var(--font-size-sm))}.ea-badge--md{font-size:var(--ea-badge-font-size, var(--font-size-md))}.ea-badge--lg{font-size:var(--ea-badge-font-size, var(--font-size-lg))}.ea-badge--xl{font-size:var(--ea-badge-font-size, var(--font-size-xl))}.ea-badge--default{background-color:var(--ea-badge-background-color, var(--color-bg-muted));color:var(--ea-badge-color, var(--color-text-secondary))}.ea-badge--success{background-color:var(--ea-badge-background-color, var(--color-success-subtle));color:var(--ea-badge-color, var(--color-success-text))}.ea-badge--warning{background-color:var(--ea-badge-background-color, var(--color-warning-subtle));color:var(--ea-badge-color, var(--color-warning-text))}.ea-badge--error{background-color:var(--ea-badge-background-color, var(--color-error-subtle));color:var(--ea-badge-color, var(--color-error-text))}.ea-badge--info{background-color:var(--ea-badge-background-color, var(--color-info-subtle));color:var(--ea-badge-color, var(--color-info-text))}.ea-badge--uppercase{text-transform:uppercase}.ea-badge--pin{justify-content:center;box-sizing:border-box;min-width:var(--ea-badge-size, 1.8em);height:var(--ea-badge-size, 1.8em);padding:0 .375em;font-variant-numeric:tabular-nums}.ea-badge--pin.ea-badge--xs{font-size:var(--ea-badge-font-size, calc(var(--font-size-xs) * .75))}.ea-badge--pin.ea-badge--sm{font-size:var(--ea-badge-font-size, calc(var(--font-size-sm) * .75))}.ea-badge--pin.ea-badge--md{font-size:var(--ea-badge-font-size, calc(var(--font-size-md) * .75))}.ea-badge--pin.ea-badge--lg{font-size:var(--ea-badge-font-size, calc(var(--font-size-lg) * .75))}.ea-badge--pin.ea-badge--xl{font-size:var(--ea-badge-font-size, calc(var(--font-size-xl) * .75))}\n"],
8149
8387
  dependencies: [{
8150
8388
  kind: "directive",
8151
8389
  type: NgClass,
@@ -8169,7 +8407,7 @@ i0.ɵɵngDeclareClassMetadata({
8169
8407
  changeDetection: ChangeDetectionStrategy.OnPush,
8170
8408
  encapsulation: ViewEncapsulation.None,
8171
8409
  template: "<span\n class=\"ea-badge\"\n [ngClass]=\"hostClasses()\">\n <ng-content />\n</span>\n",
8172
- styles: [".ea-badge{display:inline-flex;align-items:center;gap:.25em;padding:.25em .625em;white-space:nowrap;font-family:var(--font-family-sans);font-weight:var(--font-weight-medium);line-height:var(--line-height-none);border-style:solid;border-width:var(--ea-badge-border-width, 0);border-color:var(--ea-badge-border-color, transparent);border-radius:var(--radius-full);forced-color-adjust:none}.ea-badge--xs{font-size:var(--ea-badge-font-size, var(--font-size-2xs))}.ea-badge--sm{font-size:var(--ea-badge-font-size, var(--font-size-xs))}.ea-badge--md{font-size:var(--ea-badge-font-size, var(--font-size-sm))}.ea-badge--lg{font-size:var(--ea-badge-font-size, var(--font-size-md))}.ea-badge--xl{font-size:var(--ea-badge-font-size, var(--font-size-lg))}.ea-badge--default{background-color:var(--ea-badge-background-color, var(--color-bg-muted));color:var(--ea-badge-color, var(--color-text-secondary))}.ea-badge--success{background-color:var(--ea-badge-background-color, var(--color-success-subtle));color:var(--ea-badge-color, var(--color-success-text))}.ea-badge--warning{background-color:var(--ea-badge-background-color, var(--color-warning-subtle));color:var(--ea-badge-color, var(--color-warning-text))}.ea-badge--error{background-color:var(--ea-badge-background-color, var(--color-error-subtle));color:var(--ea-badge-color, var(--color-error-text))}.ea-badge--info{background-color:var(--ea-badge-background-color, var(--color-info-subtle));color:var(--ea-badge-color, var(--color-info-text))}.ea-badge--uppercase{text-transform:uppercase}.ea-badge--pin{justify-content:center;box-sizing:border-box;min-width:var(--ea-badge-size, 1.8em);height:var(--ea-badge-size, 1.8em);padding:0 .375em;font-variant-numeric:tabular-nums}.ea-badge--pin.ea-badge--xs{font-size:var(--ea-badge-font-size, calc(var(--font-size-2xs) * .75))}.ea-badge--pin.ea-badge--sm{font-size:var(--ea-badge-font-size, calc(var(--font-size-xs) * .75))}.ea-badge--pin.ea-badge--md{font-size:var(--ea-badge-font-size, calc(var(--font-size-sm) * .75))}.ea-badge--pin.ea-badge--lg{font-size:var(--ea-badge-font-size, calc(var(--font-size-md) * .75))}.ea-badge--pin.ea-badge--xl{font-size:var(--ea-badge-font-size, calc(var(--font-size-lg) * .75))}\n"]
8410
+ styles: [".ea-badge{display:inline-flex;align-items:center;gap:.25em;padding:.25em .625em;white-space:nowrap;font-family:var(--font-family-sans);font-weight:var(--font-weight-medium);line-height:var(--line-height-none);border-style:solid;border-width:var(--ea-badge-border-width, 0);border-color:var(--ea-badge-border-color, transparent);border-radius:var(--radius-full);forced-color-adjust:none}.ea-badge--xs{font-size:var(--ea-badge-font-size, var(--font-size-xs))}.ea-badge--sm{font-size:var(--ea-badge-font-size, var(--font-size-sm))}.ea-badge--md{font-size:var(--ea-badge-font-size, var(--font-size-md))}.ea-badge--lg{font-size:var(--ea-badge-font-size, var(--font-size-lg))}.ea-badge--xl{font-size:var(--ea-badge-font-size, var(--font-size-xl))}.ea-badge--default{background-color:var(--ea-badge-background-color, var(--color-bg-muted));color:var(--ea-badge-color, var(--color-text-secondary))}.ea-badge--success{background-color:var(--ea-badge-background-color, var(--color-success-subtle));color:var(--ea-badge-color, var(--color-success-text))}.ea-badge--warning{background-color:var(--ea-badge-background-color, var(--color-warning-subtle));color:var(--ea-badge-color, var(--color-warning-text))}.ea-badge--error{background-color:var(--ea-badge-background-color, var(--color-error-subtle));color:var(--ea-badge-color, var(--color-error-text))}.ea-badge--info{background-color:var(--ea-badge-background-color, var(--color-info-subtle));color:var(--ea-badge-color, var(--color-info-text))}.ea-badge--uppercase{text-transform:uppercase}.ea-badge--pin{justify-content:center;box-sizing:border-box;min-width:var(--ea-badge-size, 1.8em);height:var(--ea-badge-size, 1.8em);padding:0 .375em;font-variant-numeric:tabular-nums}.ea-badge--pin.ea-badge--xs{font-size:var(--ea-badge-font-size, calc(var(--font-size-xs) * .75))}.ea-badge--pin.ea-badge--sm{font-size:var(--ea-badge-font-size, calc(var(--font-size-sm) * .75))}.ea-badge--pin.ea-badge--md{font-size:var(--ea-badge-font-size, calc(var(--font-size-md) * .75))}.ea-badge--pin.ea-badge--lg{font-size:var(--ea-badge-font-size, calc(var(--font-size-lg) * .75))}.ea-badge--pin.ea-badge--xl{font-size:var(--ea-badge-font-size, calc(var(--font-size-xl) * .75))}\n"]
8173
8411
  }]
8174
8412
  }],
8175
8413
  propDecorators: {
@@ -8207,6 +8445,904 @@ i0.ɵɵngDeclareClassMetadata({
8207
8445
  }]
8208
8446
  }
8209
8447
  });
8448
+ function intlLocalizes(locale) {
8449
+ try {
8450
+ return new Intl.NumberFormat(locale).resolvedOptions().locale.split("-")[0] === locale.split("-")[0];
8451
+ } catch {
8452
+ return false;
8453
+ }
8454
+ }
8455
+ function groupInteger(digits, sep, grouping) {
8456
+ const primary = grouping[0] ?? 3;
8457
+ const secondary = grouping[1] ?? primary;
8458
+ if (digits.length <= primary) return digits;
8459
+ let result = digits.slice(digits.length - primary);
8460
+ let rest = digits.slice(0, digits.length - primary);
8461
+ while (rest.length > 0) {
8462
+ const take = Math.min(secondary, rest.length);
8463
+ result = `${rest.slice(rest.length - take)}${sep}${result}`;
8464
+ rest = rest.slice(0, rest.length - take);
8465
+ }
8466
+ return result;
8467
+ }
8468
+ function formatGroupedNumber(value, locale, format, options) {
8469
+ if (intlLocalizes(locale)) return value.toLocaleString(locale, options);
8470
+ if (!isFinite(value)) return String(value);
8471
+ const magnitude = Math.abs(value).toString();
8472
+ if (magnitude.includes("e") || magnitude.includes("E")) return value.toString();
8473
+ const [intPart, fracPart] = magnitude.split(".");
8474
+ const grouped = groupInteger(intPart, format.group, format.grouping);
8475
+ const body = fracPart != null ? `${grouped}${format.decimal}${fracPart}` : grouped;
8476
+ return value < 0 ? `-${body}` : body;
8477
+ }
8478
+ function chartColor(index, override) {
8479
+ return override || `var(--color-chart-${index % 8 + 1})`;
8480
+ }
8481
+ function niceStep(span, maxTicks) {
8482
+ const raw = span / Math.max(1, maxTicks);
8483
+ const magnitude = Math.pow(10, Math.floor(Math.log10(raw)));
8484
+ const fraction = raw / magnitude;
8485
+ return (fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10) * magnitude;
8486
+ }
8487
+ function niceScale(min, max, maxTicks = 5) {
8488
+ if (!isFinite(min) || !isFinite(max)) return {
8489
+ min: 0,
8490
+ max: 1,
8491
+ ticks: [0, 1]
8492
+ };
8493
+ if (min === max) {
8494
+ const pad = min === 0 ? 1 : Math.abs(min) * .5;
8495
+ min -= min === 0 ? 0 : pad;
8496
+ max += pad;
8497
+ }
8498
+ const step = niceStep(max - min, maxTicks);
8499
+ const niceMin = Math.floor(min / step) * step;
8500
+ const niceMax = Math.ceil(max / step) * step;
8501
+ const ticks = [];
8502
+ const precision = Math.max(0, -Math.floor(Math.log10(step)) + 1);
8503
+ for (let tick = niceMin; tick <= niceMax + step / 2; tick += step) ticks.push(Number(tick.toFixed(precision)));
8504
+ return {
8505
+ min: niceMin,
8506
+ max: niceMax,
8507
+ ticks
8508
+ };
8509
+ }
8510
+ function estimateTextWidth(text, fontPx) {
8511
+ return text.length * fontPx * .6;
8512
+ }
8513
+ function injectChartViewport(size) {
8514
+ const host = inject(ElementRef).nativeElement;
8515
+ const destroyRef = inject(DestroyRef);
8516
+ const width = signal(480, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
8517
+ const fontSize = signal(16, ...ngDevMode ? [{ debugName: "fontSize" }] : /* istanbul ignore next */ []);
8518
+ const measure = () => {
8519
+ if (host.clientWidth > 0) width.set(host.clientWidth);
8520
+ const font = parseFloat(getComputedStyle(host).fontSize);
8521
+ if (font > 0) fontSize.set(font);
8522
+ };
8523
+ afterNextRender(() => {
8524
+ if (typeof ResizeObserver !== "undefined") {
8525
+ const observer = new ResizeObserver(measure);
8526
+ observer.observe(host);
8527
+ destroyRef.onDestroy(() => observer.disconnect());
8528
+ }
8529
+ });
8530
+ afterRenderEffect(() => {
8531
+ size();
8532
+ measure();
8533
+ });
8534
+ return {
8535
+ width: width.asReadonly(),
8536
+ fontSize: fontSize.asReadonly()
8537
+ };
8538
+ }
8539
+ function injectChartFormatter(formatValue) {
8540
+ const i18n = inject(EagamiI18nService);
8541
+ return computed(() => {
8542
+ const custom = formatValue();
8543
+ if (custom) return custom;
8544
+ const locale = i18n.locale();
8545
+ const format = i18n.messages().numberFormat;
8546
+ return (value) => formatGroupedNumber(value, locale, format, { maximumFractionDigits: 2 });
8547
+ });
8548
+ }
8549
+ function clamp$1(value, min, max) {
8550
+ return Math.min(max, Math.max(min, value));
8551
+ }
8552
+ const CHART_LABEL_ANGLES = {
8553
+ horizontal: 0,
8554
+ diagonal: 45,
8555
+ vertical: 90
8556
+ };
8557
+ const BREAK_HEIGHT = 2.5;
8558
+ function tickLength(axisPx) {
8559
+ return axisPx * .4 + 2;
8560
+ }
8561
+ function labelRoom(text, angle, axisPx) {
8562
+ if (angle === 0) return estimateTextWidth(text, axisPx) + axisPx;
8563
+ return axisPx * 1.15 / Math.sin(angle * Math.PI / 180);
8564
+ }
8565
+ function labelBand(widest, angle, axisPx, height) {
8566
+ if (!angle) return axisPx * 2.5 + 2 + 2;
8567
+ const radians = angle * Math.PI / 180;
8568
+ return Math.min(height / 2, axisPx * .8 + 2 + 2 + widest * Math.sin(radians) + axisPx * Math.cos(radians) + axisPx * .5);
8569
+ }
8570
+ function labelLine(axisY, angle, axisPx) {
8571
+ return angle ? axisY + tickLength(axisPx) + 2 + axisPx * .4 : axisY + axisPx * 1.5 + 2 + 2;
8572
+ }
8573
+ function axisBreak(x, top, bottom, y, axisPx) {
8574
+ const half = axisPx * .8;
8575
+ const gap = axisPx * .35;
8576
+ return {
8577
+ axis: `M${x},${top}L${x},${y - gap}M${x},${y + gap}L${x},${bottom}`,
8578
+ gap: {
8579
+ x: x - half,
8580
+ y: y - gap,
8581
+ width: 2 * half,
8582
+ height: 2 * gap
8583
+ },
8584
+ slashes: [-gap, gap].map((offset) => `M${x - half},${y + offset + half / 2}L${x + half},${y + offset - half / 2}`).join("")
8585
+ };
8586
+ }
8587
+ const BAR_GAP = 2;
8588
+ const BAR_RADIUS = 4;
8589
+ function barPath(x, y, w, h, side) {
8590
+ const r = side ? Math.max(0, side === "top" || side === "bottom" ? Math.min(BAR_RADIUS, w / 2, h) : Math.min(BAR_RADIUS, h / 2, w)) : 0;
8591
+ const arc = (tx, ty) => `A${r},${r} 0 0 1 ${tx},${ty}`;
8592
+ switch (r > 0 ? side : null) {
8593
+ case "top": return `M${x},${y + h}V${y + r}${arc(x + r, y)}H${x + w - r}${arc(x + w, y + r)}V${y + h}Z`;
8594
+ case "bottom": return `M${x},${y}H${x + w}V${y + h - r}${arc(x + w - r, y + h)}H${x + r}${arc(x, y + h - r)}Z`;
8595
+ case "right": return `M${x},${y}H${x + w - r}${arc(x + w, y + r)}V${y + h - r}${arc(x + w - r, y + h)}H${x}Z`;
8596
+ case "left": return `M${x + w},${y}V${y + h}H${x + r}${arc(x, y + h - r)}V${y + r}${arc(x + r, y)}Z`;
8597
+ default: return `M${x},${y}H${x + w}V${y + h}H${x}Z`;
8598
+ }
8599
+ }
8600
+ function truncate(text, maxWidth, fontPx) {
8601
+ if (estimateTextWidth(text, fontPx) <= maxWidth) return text;
8602
+ const chars = Math.max(1, Math.floor(maxWidth / (fontPx * .6)) - 1);
8603
+ return `${text.slice(0, chars)}…`;
8604
+ }
8605
+ var BarChartComponent = class BarChartComponent {
8606
+ i18n = inject(EagamiI18nService);
8607
+ labels = input([], ...ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []);
8608
+ series = input([], ...ngDevMode ? [{ debugName: "series" }] : /* istanbul ignore next */ []);
8609
+ orientation = input("vertical", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
8610
+ stacked = input(false, ...ngDevMode ? [{ debugName: "stacked" }] : /* istanbul ignore next */ []);
8611
+ showGrid = input(true, ...ngDevMode ? [{ debugName: "showGrid" }] : /* istanbul ignore next */ []);
8612
+ showLegend = input(true, ...ngDevMode ? [{ debugName: "showLegend" }] : /* istanbul ignore next */ []);
8613
+ showValues = input(false, ...ngDevMode ? [{ debugName: "showValues" }] : /* istanbul ignore next */ []);
8614
+ xLabelOrientation = input("horizontal", ...ngDevMode ? [{ debugName: "xLabelOrientation" }] : /* istanbul ignore next */ []);
8615
+ showAxisBreak = input(false, ...ngDevMode ? [{ debugName: "showAxisBreak" }] : /* istanbul ignore next */ []);
8616
+ height = input(240, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
8617
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
8618
+ animation = input("grow", ...ngDevMode ? [{ debugName: "animation" }] : /* istanbul ignore next */ []);
8619
+ animationDuration = input(600, ...ngDevMode ? [{ debugName: "animationDuration" }] : /* istanbul ignore next */ []);
8620
+ formatValue = input(null, ...ngDevMode ? [{ debugName: "formatValue" }] : /* istanbul ignore next */ []);
8621
+ ariaLabel = input(void 0, {
8622
+ ...ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {},
8623
+ alias: "aria-label"
8624
+ });
8625
+ pointClick = output();
8626
+ activePointChange = output();
8627
+ viewport = injectChartViewport(this.size);
8628
+ format = injectChartFormatter(this.formatValue);
8629
+ active = signal(null, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
8630
+ label = computed(() => this.ariaLabel() || this.i18n.messages().chart.barChart, ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
8631
+ count = computed(() => Math.max(this.labels().length, ...this.series().map((s) => s.data.length), 0), ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
8632
+ hasData = computed(() => this.series().some((s) => s.data.some((v) => v != null && isFinite(v))), ...ngDevMode ? [{ debugName: "hasData" }] : /* istanbul ignore next */ []);
8633
+ renderPass = computed(() => {
8634
+ this.labels();
8635
+ this.series();
8636
+ this.orientation();
8637
+ this.stacked();
8638
+ this.animation();
8639
+ this.animationDuration();
8640
+ return [{}];
8641
+ }, ...ngDevMode ? [{ debugName: "renderPass" }] : /* istanbul ignore next */ []);
8642
+ hostClasses = computed(() => ({
8643
+ [`ea-bar-chart--${this.size()}`]: true,
8644
+ [`ea-bar-chart--${this.orientation()}`]: true,
8645
+ [`ea-bar-chart--animate-${this.animation()}`]: true
8646
+ }), ...ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []);
8647
+ layout = computed(() => {
8648
+ const vertical = this.orientation() === "vertical";
8649
+ const stacked = this.stacked();
8650
+ const count = Math.max(1, this.count());
8651
+ const series = this.series();
8652
+ const width = this.viewport.width();
8653
+ const height = this.height();
8654
+ const fontPx = this.viewport.fontSize();
8655
+ const axisPx = fontPx * .75;
8656
+ const format = this.format();
8657
+ const valueAt = (s, i) => {
8658
+ const value = series[s]?.data[i];
8659
+ return value == null || !isFinite(value) ? null : value;
8660
+ };
8661
+ let lo = 0;
8662
+ let hi = 0;
8663
+ let lowestTop = Infinity;
8664
+ for (let i = 0; i < count; i++) {
8665
+ let up = 0;
8666
+ let down = 0;
8667
+ series.forEach((_, s) => {
8668
+ const value = valueAt(s, i) ?? 0;
8669
+ if (stacked) {
8670
+ up += Math.max(0, value);
8671
+ down += Math.min(0, value);
8672
+ } else {
8673
+ up = Math.max(up, value);
8674
+ down = Math.min(down, value);
8675
+ }
8676
+ });
8677
+ hi = Math.max(hi, up);
8678
+ lo = Math.min(lo, down);
8679
+ if (stacked && up > 0) lowestTop = Math.min(lowestTop, up);
8680
+ }
8681
+ if (!stacked) {
8682
+ for (const s of series) for (const value of s.data) if (value != null && isFinite(value) && value > 0) lowestTop = Math.min(lowestTop, value);
8683
+ }
8684
+ const breakable = vertical && this.showAxisBreak() && lo >= 0 && isFinite(lowestTop);
8685
+ const scaleLo = breakable ? lowestTop : lo;
8686
+ const labelTexts = Array.from({ length: count }, (_, i) => this.labels()[i] ?? "");
8687
+ const valueRoom = this.showValues() ? axisPx * 1.5 : 0;
8688
+ const provisionalTicks = niceScale(scaleLo, hi).ticks.map(format);
8689
+ const widestTick = Math.max(0, ...provisionalTicks.map((t) => estimateTextWidth(t, axisPx)));
8690
+ let left;
8691
+ let right;
8692
+ let top;
8693
+ let bottom;
8694
+ let categoryText;
8695
+ let angle = 0;
8696
+ if (vertical) {
8697
+ left = widestTick + axisPx;
8698
+ right = axisPx / 2;
8699
+ top = axisPx + valueRoom;
8700
+ categoryText = labelTexts;
8701
+ const orientation = this.xLabelOrientation();
8702
+ const band = Math.max(1, width - left - right) / count;
8703
+ angle = orientation === "auto" ? [
8704
+ 0,
8705
+ 45,
8706
+ 90
8707
+ ].find((a) => labelTexts.every((t) => labelRoom(t, a, axisPx) <= band)) ?? 90 : CHART_LABEL_ANGLES[orientation];
8708
+ bottom = labelBand(Math.max(0, ...labelTexts.map((t) => estimateTextWidth(t, axisPx))), angle, axisPx, height);
8709
+ } else {
8710
+ const maxLabel = width * .3;
8711
+ categoryText = labelTexts.map((t) => truncate(t, maxLabel, axisPx));
8712
+ left = Math.max(0, ...categoryText.map((t) => estimateTextWidth(t, axisPx))) + axisPx;
8713
+ right = Math.max(widestTick / 2, this.showValues() ? widestTick + axisPx : 0) + axisPx / 2;
8714
+ top = axisPx / 2;
8715
+ bottom = axisPx * 2.5;
8716
+ }
8717
+ const plotWidth = Math.max(1, width - left - right);
8718
+ const plotHeight = Math.max(1, height - top - bottom);
8719
+ const scale = niceScale(scaleLo, hi, Math.max(2, Math.floor((vertical ? plotHeight : plotWidth) / (vertical ? axisPx * 3 : widestTick + axisPx * 2))));
8720
+ let { min } = scale;
8721
+ const { max } = scale;
8722
+ const scaleTicks = [...scale.ticks];
8723
+ if (breakable && min > 0) {
8724
+ const step = scaleTicks[1] - scaleTicks[0];
8725
+ const clearance = axisPx * 6;
8726
+ const px = (value) => value / (max - min || 1) * plotHeight;
8727
+ for (let steps = 0; steps < 6 && min > 0 && px(lowestTop - min) < clearance; steps++) {
8728
+ min = Number((min - step).toPrecision(12));
8729
+ scaleTicks.unshift(min);
8730
+ }
8731
+ }
8732
+ const axisY = top + plotHeight;
8733
+ const breakY = breakable && min > 0 ? axisY - axisPx * BREAK_HEIGHT : null;
8734
+ const valuePos = (v) => {
8735
+ const t = (clamp$1(v, min, max) - min) / (max - min || 1);
8736
+ return vertical ? top + (1 - t) * plotHeight : left + t * plotWidth;
8737
+ };
8738
+ const baseline = valuePos(clamp$1(0, min, max));
8739
+ const categoryLength = vertical ? plotWidth : plotHeight;
8740
+ const categoryStart = vertical ? left : top;
8741
+ const band = categoryLength / count;
8742
+ const thicknessCap = fontPx * 1.5;
8743
+ const seriesCount = Math.max(1, series.length);
8744
+ const thickness = stacked ? Math.min(band * .6, thicknessCap) : Math.max(1, Math.min((band * .75 - BAR_GAP * (seriesCount - 1)) / seriesCount, thicknessCap));
8745
+ const groupWidth = stacked ? thickness : seriesCount * thickness + (seriesCount - 1) * BAR_GAP;
8746
+ const duration = this.animationDuration();
8747
+ const cascadeStep = count > 1 ? duration * .5 / (count - 1) : 0;
8748
+ const bars = [];
8749
+ const valueLabels = [];
8750
+ const toRect = (cat0, v0, v1, side) => {
8751
+ const [a, b] = [Math.min(v0, v1), Math.max(v0, v1)];
8752
+ return vertical ? barPath(cat0, a, thickness, b - a, side) : barPath(a, cat0, b - a, thickness, side);
8753
+ };
8754
+ const labelFor = (cat0, tip, value, negative) => {
8755
+ const offset = axisPx * .5;
8756
+ const text = format(value);
8757
+ return vertical ? {
8758
+ x: cat0 + thickness / 2,
8759
+ y: negative ? tip + offset + axisPx : tip - offset,
8760
+ text,
8761
+ anchor: "middle"
8762
+ } : {
8763
+ x: negative ? tip - offset : tip + offset,
8764
+ y: cat0 + thickness / 2,
8765
+ text,
8766
+ anchor: negative ? "end" : "start"
8767
+ };
8768
+ };
8769
+ for (let index = 0; index < count; index++) {
8770
+ const bandStart = categoryStart + index * band + (band - groupWidth) / 2;
8771
+ const delay = index * cascadeStep;
8772
+ if (stacked) {
8773
+ const segments = series.map((_, s) => ({
8774
+ s,
8775
+ value: valueAt(s, index)
8776
+ })).filter((seg) => !!seg.value);
8777
+ for (const direction of [1, -1]) {
8778
+ const run = segments.filter((seg) => Math.sign(seg.value) === direction);
8779
+ let sum = 0;
8780
+ run.forEach((seg, i) => {
8781
+ const from = valuePos(sum);
8782
+ sum += seg.value;
8783
+ const to = valuePos(sum);
8784
+ const towardTip = Math.sign(to - from);
8785
+ const start = i === 0 ? from : from + towardTip * BAR_GAP;
8786
+ const side = i === run.length - 1 ? vertical ? direction > 0 ? "top" : "bottom" : direction > 0 ? "right" : "left" : null;
8787
+ if (Math.abs(to - start) > 0) bars.push({
8788
+ series: seg.s,
8789
+ index,
8790
+ value: seg.value,
8791
+ color: chartColor(seg.s, series[seg.s].color),
8792
+ path: toRect(bandStart, start, to, side),
8793
+ delay
8794
+ });
8795
+ });
8796
+ if (this.showValues() && run.length) valueLabels.push({
8797
+ key: `${index}-${direction}`,
8798
+ ...labelFor(bandStart, valuePos(sum), sum, direction < 0)
8799
+ });
8800
+ }
8801
+ } else series.forEach((s, seriesIndex) => {
8802
+ const value = valueAt(seriesIndex, index);
8803
+ if (value == null) return;
8804
+ const cat0 = bandStart + seriesIndex * (thickness + BAR_GAP);
8805
+ const tip = valuePos(value);
8806
+ const negative = value < 0;
8807
+ const side = vertical ? negative ? "bottom" : "top" : negative ? "left" : "right";
8808
+ if (tip !== baseline) bars.push({
8809
+ series: seriesIndex,
8810
+ index,
8811
+ value,
8812
+ color: chartColor(seriesIndex, s.color),
8813
+ path: toRect(cat0, baseline, tip, side),
8814
+ delay
8815
+ });
8816
+ if (this.showValues()) valueLabels.push({
8817
+ key: `${index}-${seriesIndex}`,
8818
+ ...labelFor(cat0, tip, value, negative)
8819
+ });
8820
+ });
8821
+ }
8822
+ const ticks = scaleTicks.filter((value) => value >= min).map((value) => ({
8823
+ value,
8824
+ text: format(value),
8825
+ pos: valuePos(value)
8826
+ })).filter((tick) => breakY == null || tick.pos < breakY - axisPx);
8827
+ const widestRoom = Math.max(0, ...categoryText.map((t) => labelRoom(t, angle, axisPx)));
8828
+ const labelStep = vertical ? Math.max(1, Math.ceil(widestRoom / band)) : 1;
8829
+ const categories = categoryText.map((text, index) => ({
8830
+ text,
8831
+ index,
8832
+ pos: categoryStart + (index + .5) * band
8833
+ })).filter((c) => c.index % labelStep === 0);
8834
+ return {
8835
+ vertical,
8836
+ width,
8837
+ height,
8838
+ top,
8839
+ left,
8840
+ plotWidth,
8841
+ plotHeight,
8842
+ baseline,
8843
+ band,
8844
+ categoryStart,
8845
+ groupWidth,
8846
+ thickness,
8847
+ axisPx,
8848
+ ticks,
8849
+ categories,
8850
+ bars,
8851
+ valueLabels,
8852
+ valuePos,
8853
+ axisY,
8854
+ tickEndY: axisY + tickLength(axisPx),
8855
+ labelAngle: angle,
8856
+ labelY: labelLine(axisY, angle, axisPx),
8857
+ axisBreak: breakY == null ? null : axisBreak(left, top, axisY, breakY, axisPx)
8858
+ };
8859
+ }, ...ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []);
8860
+ tooltip = computed(() => {
8861
+ const active = this.active();
8862
+ if (!active) return null;
8863
+ const layout = this.layout();
8864
+ const center = layout.categoryStart + (active.index + .5) * layout.band;
8865
+ const tipValue = this.stacked() ? this.stackEnd(active.series, active.index) : this.valueAt(active.series, active.index) ?? 0;
8866
+ const tip = layout.valuePos(tipValue);
8867
+ const x = layout.vertical ? center : tip;
8868
+ const y = layout.vertical ? Math.min(tip, layout.baseline) : center;
8869
+ const rows = this.series().map((s, i) => ({
8870
+ name: s.name,
8871
+ color: chartColor(i, s.color),
8872
+ value: this.tableValue(s.data[active.index]),
8873
+ active: i === active.series
8874
+ }));
8875
+ return {
8876
+ x,
8877
+ y,
8878
+ title: this.labels()[active.index] ?? "",
8879
+ rows,
8880
+ key: `${active.series}-${active.index}`
8881
+ };
8882
+ }, ...ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []);
8883
+ tooltips = computed(() => {
8884
+ const tip = this.tooltip();
8885
+ return tip ? [tip] : [];
8886
+ }, ...ngDevMode ? [{ debugName: "tooltips" }] : /* istanbul ignore next */ []);
8887
+ announcement = computed(() => {
8888
+ const event = this.eventFor(this.active());
8889
+ return event ? this.i18n.messages().chart.point(event.seriesName, event.label, this.format()(event.value)) : "";
8890
+ }, ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
8891
+ showsLegend = computed(() => this.showLegend() && this.series().length > 1, ...ngDevMode ? [{ debugName: "showsLegend" }] : /* istanbul ignore next */ []);
8892
+ seriesColor(index) {
8893
+ return chartColor(index, this.series()[index]?.color);
8894
+ }
8895
+ isDimmed(bar) {
8896
+ const active = this.active();
8897
+ return !!active && (active.series !== bar.series || active.index !== bar.index);
8898
+ }
8899
+ tableValue(value) {
8900
+ return value == null || !isFinite(value) ? "–" : this.format()(value);
8901
+ }
8902
+ onPointerMove(event) {
8903
+ const rect = event.currentTarget.getBoundingClientRect();
8904
+ const layout = this.layout();
8905
+ const px = event.clientX - rect.left;
8906
+ const py = event.clientY - rect.top;
8907
+ const along = layout.vertical ? px : py;
8908
+ const across = layout.vertical ? py : px;
8909
+ const index = Math.floor((along - layout.categoryStart) / layout.band);
8910
+ if (index < 0 || index >= this.count()) {
8911
+ this.setActive(null);
8912
+ return;
8913
+ }
8914
+ const candidates = this.series().map((_, s) => s).filter((s) => this.valueAt(s, index) != null);
8915
+ if (!candidates.length) {
8916
+ this.setActive(null);
8917
+ return;
8918
+ }
8919
+ let series;
8920
+ if (this.stacked()) series = candidates.find((s) => {
8921
+ const end = layout.valuePos(this.stackEnd(s, index));
8922
+ const start = layout.valuePos(this.stackEnd(s, index) - (this.valueAt(s, index) ?? 0));
8923
+ return across >= Math.min(start, end) && across <= Math.max(start, end);
8924
+ }) ?? candidates[candidates.length - 1];
8925
+ else {
8926
+ const bandStart = layout.categoryStart + index * layout.band + (layout.band - layout.groupWidth) / 2;
8927
+ const slot = Math.floor((along - bandStart) / (layout.thickness + BAR_GAP));
8928
+ series = candidates.reduce((best, s) => Math.abs(s - slot) < Math.abs(best - slot) ? s : best);
8929
+ }
8930
+ this.setActive({
8931
+ series,
8932
+ index
8933
+ });
8934
+ }
8935
+ onPointerLeave() {
8936
+ this.setActive(null);
8937
+ }
8938
+ onClick() {
8939
+ const event = this.eventFor(this.active());
8940
+ if (event) this.pointClick.emit(event);
8941
+ }
8942
+ onFocus() {
8943
+ if (!this.active()) this.setActive(this.firstIn(0, 1));
8944
+ }
8945
+ onBlur() {
8946
+ this.setActive(null);
8947
+ }
8948
+ onKeydown(event) {
8949
+ const vertical = this.orientation() === "vertical";
8950
+ if (!this.active() && event.key.startsWith("Arrow")) {
8951
+ event.preventDefault();
8952
+ this.setActive(this.firstIn(0, 1));
8953
+ return;
8954
+ }
8955
+ const active = this.active() ?? this.firstIn(0, 1);
8956
+ if (!active) return;
8957
+ const nextCategory = vertical ? "ArrowRight" : "ArrowDown";
8958
+ const prevCategory = vertical ? "ArrowLeft" : "ArrowUp";
8959
+ const nextSeries = vertical ? "ArrowUp" : "ArrowRight";
8960
+ const prevSeries = vertical ? "ArrowDown" : "ArrowLeft";
8961
+ let next = active;
8962
+ switch (event.key) {
8963
+ case nextCategory:
8964
+ next = this.firstIn(active.index + 1, 1, active.series) ?? active;
8965
+ break;
8966
+ case prevCategory:
8967
+ next = this.firstIn(active.index - 1, -1, active.series) ?? active;
8968
+ break;
8969
+ case "Home":
8970
+ next = this.firstIn(0, 1, active.series) ?? active;
8971
+ break;
8972
+ case "End":
8973
+ next = this.firstIn(this.count() - 1, -1, active.series) ?? active;
8974
+ break;
8975
+ case nextSeries:
8976
+ case prevSeries: {
8977
+ const step = event.key === nextSeries ? 1 : -1;
8978
+ const seriesCount = this.series().length;
8979
+ for (let hop = 1; hop < seriesCount; hop++) {
8980
+ const series = (active.series + step * hop + seriesCount) % seriesCount;
8981
+ if (this.valueAt(series, active.index) != null) {
8982
+ next = {
8983
+ series,
8984
+ index: active.index
8985
+ };
8986
+ break;
8987
+ }
8988
+ }
8989
+ break;
8990
+ }
8991
+ case "Enter":
8992
+ case " ":
8993
+ this.onClick();
8994
+ break;
8995
+ case "Escape":
8996
+ next = null;
8997
+ break;
8998
+ default: return;
8999
+ }
9000
+ event.preventDefault();
9001
+ this.setActive(next);
9002
+ }
9003
+ valueAt(series, index) {
9004
+ const value = this.series()[series]?.data[index];
9005
+ return value == null || !isFinite(value) ? null : value;
9006
+ }
9007
+ stackEnd(series, index) {
9008
+ const own = this.valueAt(series, index) ?? 0;
9009
+ let sum = 0;
9010
+ for (let s = 0; s <= series; s++) {
9011
+ const value = this.valueAt(s, index) ?? 0;
9012
+ if (Math.sign(value) === Math.sign(own)) sum += value;
9013
+ }
9014
+ return sum;
9015
+ }
9016
+ firstIn(index, step, series) {
9017
+ for (let i = index; i >= 0 && i < this.count(); i += step) {
9018
+ if (series !== void 0 && this.valueAt(series, i) != null) return {
9019
+ series,
9020
+ index: i
9021
+ };
9022
+ const any = this.series().findIndex((_, s) => this.valueAt(s, i) != null);
9023
+ if (any !== -1) return {
9024
+ series: any,
9025
+ index: i
9026
+ };
9027
+ }
9028
+ return null;
9029
+ }
9030
+ eventFor(active) {
9031
+ if (!active) return null;
9032
+ const value = this.valueAt(active.series, active.index);
9033
+ if (value == null) return null;
9034
+ return {
9035
+ seriesIndex: active.series,
9036
+ seriesName: this.series()[active.series].name,
9037
+ index: active.index,
9038
+ label: this.labels()[active.index] ?? "",
9039
+ value
9040
+ };
9041
+ }
9042
+ setActive(next) {
9043
+ const current = this.active();
9044
+ if (current?.series === next?.series && current?.index === next?.index) return;
9045
+ this.active.set(next);
9046
+ this.activePointChange.emit(this.eventFor(next));
9047
+ }
9048
+ static ɵfac = i0.ɵɵngDeclareFactory({
9049
+ minVersion: "12.0.0",
9050
+ version: "22.2.0",
9051
+ ngImport: i0,
9052
+ type: BarChartComponent,
9053
+ deps: [],
9054
+ target: i0.ɵɵFactoryTarget.Component
9055
+ });
9056
+ static ɵcmp = i0.ɵɵngDeclareComponent({
9057
+ minVersion: "17.0.0",
9058
+ version: "22.2.0",
9059
+ type: BarChartComponent,
9060
+ isStandalone: true,
9061
+ selector: "ea-bar-chart",
9062
+ inputs: {
9063
+ labels: {
9064
+ classPropertyName: "labels",
9065
+ publicName: "labels",
9066
+ isSignal: true,
9067
+ isRequired: false,
9068
+ transformFunction: null
9069
+ },
9070
+ series: {
9071
+ classPropertyName: "series",
9072
+ publicName: "series",
9073
+ isSignal: true,
9074
+ isRequired: false,
9075
+ transformFunction: null
9076
+ },
9077
+ orientation: {
9078
+ classPropertyName: "orientation",
9079
+ publicName: "orientation",
9080
+ isSignal: true,
9081
+ isRequired: false,
9082
+ transformFunction: null
9083
+ },
9084
+ stacked: {
9085
+ classPropertyName: "stacked",
9086
+ publicName: "stacked",
9087
+ isSignal: true,
9088
+ isRequired: false,
9089
+ transformFunction: null
9090
+ },
9091
+ showGrid: {
9092
+ classPropertyName: "showGrid",
9093
+ publicName: "showGrid",
9094
+ isSignal: true,
9095
+ isRequired: false,
9096
+ transformFunction: null
9097
+ },
9098
+ showLegend: {
9099
+ classPropertyName: "showLegend",
9100
+ publicName: "showLegend",
9101
+ isSignal: true,
9102
+ isRequired: false,
9103
+ transformFunction: null
9104
+ },
9105
+ showValues: {
9106
+ classPropertyName: "showValues",
9107
+ publicName: "showValues",
9108
+ isSignal: true,
9109
+ isRequired: false,
9110
+ transformFunction: null
9111
+ },
9112
+ xLabelOrientation: {
9113
+ classPropertyName: "xLabelOrientation",
9114
+ publicName: "xLabelOrientation",
9115
+ isSignal: true,
9116
+ isRequired: false,
9117
+ transformFunction: null
9118
+ },
9119
+ showAxisBreak: {
9120
+ classPropertyName: "showAxisBreak",
9121
+ publicName: "showAxisBreak",
9122
+ isSignal: true,
9123
+ isRequired: false,
9124
+ transformFunction: null
9125
+ },
9126
+ height: {
9127
+ classPropertyName: "height",
9128
+ publicName: "height",
9129
+ isSignal: true,
9130
+ isRequired: false,
9131
+ transformFunction: null
9132
+ },
9133
+ size: {
9134
+ classPropertyName: "size",
9135
+ publicName: "size",
9136
+ isSignal: true,
9137
+ isRequired: false,
9138
+ transformFunction: null
9139
+ },
9140
+ animation: {
9141
+ classPropertyName: "animation",
9142
+ publicName: "animation",
9143
+ isSignal: true,
9144
+ isRequired: false,
9145
+ transformFunction: null
9146
+ },
9147
+ animationDuration: {
9148
+ classPropertyName: "animationDuration",
9149
+ publicName: "animationDuration",
9150
+ isSignal: true,
9151
+ isRequired: false,
9152
+ transformFunction: null
9153
+ },
9154
+ formatValue: {
9155
+ classPropertyName: "formatValue",
9156
+ publicName: "formatValue",
9157
+ isSignal: true,
9158
+ isRequired: false,
9159
+ transformFunction: null
9160
+ },
9161
+ ariaLabel: {
9162
+ classPropertyName: "ariaLabel",
9163
+ publicName: "aria-label",
9164
+ isSignal: true,
9165
+ isRequired: false,
9166
+ transformFunction: null
9167
+ }
9168
+ },
9169
+ outputs: {
9170
+ pointClick: "pointClick",
9171
+ activePointChange: "activePointChange"
9172
+ },
9173
+ ngImport: i0,
9174
+ template: "<div\n class=\"ea-bar-chart\"\n [ngClass]=\"hostClasses()\"\n [style.--ea-chart-duration]=\"animationDuration() + 'ms'\">\n @if (hasData()) {\n <div\n class=\"ea-bar-chart__plot\"\n role=\"group\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"i18n.messages().chart.roleDescription\"\n [attr.aria-label]=\"label()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\">\n @for (pass of renderPass(); track pass) {\n <svg\n class=\"ea-bar-chart__svg\"\n aria-hidden=\"true\"\n [attr.width]=\"layout().width\"\n [attr.height]=\"layout().height\"\n [attr.viewBox]=\"'0 0 ' + layout().width + ' ' + layout().height\"\n [style.--ea-bar-chart-baseline]=\"layout().baseline + 'px'\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerdown)=\"onPointerMove($event)\"\n (pointerleave)=\"onPointerLeave()\"\n (click)=\"onClick()\">\n <rect\n class=\"ea-bar-chart__hit\"\n [attr.x]=\"layout().left\"\n [attr.y]=\"layout().top\"\n [attr.width]=\"layout().plotWidth\"\n [attr.height]=\"layout().plotHeight\" />\n @for (tick of layout().ticks; track tick.value) {\n @if (layout().vertical) {\n @if (showGrid()) {\n <line\n class=\"ea-bar-chart__grid\"\n [attr.x1]=\"layout().left\"\n [attr.x2]=\"layout().left + layout().plotWidth\"\n [attr.y1]=\"tick.pos\"\n [attr.y2]=\"tick.pos\" />\n }\n <text\n class=\"ea-bar-chart__axis\"\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n [attr.x]=\"layout().left - layout().axisPx / 2\"\n [attr.y]=\"tick.pos\">\n {{ tick.text }}\n </text>\n } @else {\n @if (showGrid()) {\n <line\n class=\"ea-bar-chart__grid\"\n [attr.x1]=\"tick.pos\"\n [attr.x2]=\"tick.pos\"\n [attr.y1]=\"layout().top\"\n [attr.y2]=\"layout().top + layout().plotHeight\" />\n }\n <text\n class=\"ea-bar-chart__axis\"\n text-anchor=\"middle\"\n [attr.x]=\"tick.pos\"\n [attr.y]=\"layout().top + layout().plotHeight + layout().axisPx * 1.5\">\n {{ tick.text }}\n </text>\n }\n }\n @for (category of layout().categories; track category.index) {\n @if (layout().vertical) {\n <line\n class=\"ea-bar-chart__x-tick\"\n [attr.x1]=\"category.pos\"\n [attr.x2]=\"category.pos\"\n [attr.y1]=\"layout().axisY\"\n [attr.y2]=\"layout().tickEndY\" />\n <text\n class=\"ea-bar-chart__axis\"\n [attr.text-anchor]=\"layout().labelAngle ? 'end' : 'middle'\"\n [attr.dominant-baseline]=\"layout().labelAngle ? 'central' : null\"\n [attr.transform]=\"\n layout().labelAngle\n ? 'rotate(' +\n -layout().labelAngle +\n ' ' +\n category.pos +\n ' ' +\n layout().labelY +\n ')'\n : null\n \"\n [attr.x]=\"category.pos\"\n [attr.y]=\"layout().labelY\">\n {{ category.text }}\n </text>\n } @else {\n <text\n class=\"ea-bar-chart__axis\"\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n [attr.x]=\"layout().left - layout().axisPx / 2\"\n [attr.y]=\"category.pos\">\n {{ category.text }}\n </text>\n }\n }\n @for (bar of layout().bars; track $index) {\n <path\n class=\"ea-bar-chart__bar\"\n [class.ea-bar-chart__bar--dimmed]=\"isDimmed(bar)\"\n [style.--ea-chart-color]=\"bar.color\"\n [style.--ea-chart-delay]=\"bar.delay + 'ms'\"\n [attr.d]=\"bar.path\" />\n }\n @if (layout().axisBreak; as axisBreak) {\n <path\n class=\"ea-bar-chart__y-axis\"\n [attr.d]=\"axisBreak.axis\" />\n <path\n class=\"ea-bar-chart__axis-break\"\n [attr.d]=\"axisBreak.slashes\" />\n }\n @if (layout().vertical) {\n <line\n class=\"ea-bar-chart__baseline\"\n [attr.x1]=\"layout().left\"\n [attr.x2]=\"layout().left + layout().plotWidth\"\n [attr.y1]=\"layout().baseline\"\n [attr.y2]=\"layout().baseline\" />\n } @else {\n <line\n class=\"ea-bar-chart__baseline\"\n [attr.x1]=\"layout().baseline\"\n [attr.x2]=\"layout().baseline\"\n [attr.y1]=\"layout().top\"\n [attr.y2]=\"layout().top + layout().plotHeight\" />\n }\n @for (valueLabel of layout().valueLabels; track valueLabel.key) {\n <text\n class=\"ea-bar-chart__value\"\n [attr.text-anchor]=\"valueLabel.anchor\"\n [attr.dominant-baseline]=\"layout().vertical ? null : 'middle'\"\n [attr.x]=\"valueLabel.x\"\n [attr.y]=\"valueLabel.y\">\n {{ valueLabel.text }}\n </text>\n }\n @for (tip of tooltips(); track tip.key) {\n <rect\n class=\"ea-bar-chart__anchor\"\n width=\"2\"\n height=\"2\"\n [attr.x]=\"tip.x - 1\"\n [attr.y]=\"tip.y - 1\"\n [eaTooltip]=\"tooltipContent\"\n [tooltipOpen]=\"true\"\n [maxWidth]=\"undefined\" />\n }\n </svg>\n }\n <ng-template #tooltipContent>\n @if (tooltip(); as tip) {\n <div class=\"ea-bar-chart__tooltip\">\n <span class=\"ea-bar-chart__tooltip-title\">{{ tip.title }}</span>\n @for (row of tip.rows; track $index) {\n <span\n class=\"ea-bar-chart__tooltip-row\"\n [class.ea-bar-chart__tooltip-row--active]=\"row.active\">\n <span\n class=\"ea-bar-chart__swatch\"\n [style.--ea-chart-color]=\"row.color\">\n </span>\n <span class=\"ea-bar-chart__tooltip-name\">{{ row.name }}</span>\n <span class=\"ea-bar-chart__tooltip-value\">{{ row.value }}</span>\n </span>\n }\n </div>\n }\n </ng-template>\n <!-- Hidden through a block, since a table ignores the 1px size and keeps its full height -->\n <div class=\"ea-bar-chart__table\">\n <table>\n <caption>\n {{ label() }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.messages().chart.category }}</th>\n @for (s of series(); track $index) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of labels(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ row }}</th>\n @for (s of series(); track $index) {\n <td>{{ tableValue(s.data[i]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div\n class=\"ea-bar-chart__live\"\n aria-live=\"polite\">\n {{ announcement() }}\n </div>\n } @else {\n <div\n class=\"ea-bar-chart__empty\"\n role=\"img\"\n [attr.aria-label]=\"label()\"\n [style.height.px]=\"height()\">\n {{ i18n.messages().chart.noData }}\n </div>\n }\n @if (showsLegend()) {\n <ul\n class=\"ea-bar-chart__legend\"\n aria-hidden=\"true\">\n @for (s of series(); track $index; let i = $index) {\n <li class=\"ea-bar-chart__legend-item\">\n <span\n class=\"ea-bar-chart__swatch\"\n [style.--ea-chart-color]=\"seriesColor(i)\">\n </span>\n {{ s.name }}\n </li>\n }\n </ul>\n }\n</div>\n",
9175
+ styles: ["@keyframes ea-chart-fade{0%{opacity:0}}@keyframes ea-chart-draw{0%{stroke-dashoffset:1}}@keyframes ea-chart-grow-y{0%{transform:scaleY(0)}}@keyframes ea-chart-grow-x{0%{transform:scaleX(0)}}@keyframes ea-chart-grow{0%{transform:scale(0)}}ea-bar-chart{display:block}.ea-bar-chart{position:relative;display:flex;flex-direction:column;gap:.75em;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-bar-chart--2xs{font-size:var(--font-size-2xs)}.ea-bar-chart--xs{font-size:var(--font-size-xs)}.ea-bar-chart--sm{font-size:var(--font-size-sm)}.ea-bar-chart--md{font-size:var(--font-size-md)}.ea-bar-chart--lg{font-size:var(--font-size-lg)}.ea-bar-chart--xl{font-size:var(--font-size-xl)}.ea-bar-chart__plot{position:relative;border-radius:var(--radius-md);outline:none}.ea-bar-chart__plot:focus-visible{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-bar-chart__plot:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-bar-chart__plot svg{display:block;overflow:visible}.ea-bar-chart__svg{direction:ltr;touch-action:pan-y}.ea-bar-chart__hit{fill:transparent}.ea-bar-chart__grid{stroke:var(--color-divider);stroke-width:1px;shape-rendering:crispEdges}.ea-bar-chart__baseline{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges;pointer-events:none}.ea-bar-chart__axis{font-size:.75em;fill:var(--color-text-secondary)}.ea-bar-chart__x-tick{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges}.ea-bar-chart__y-axis{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges;fill:none}.ea-bar-chart__axis-break{fill:none;stroke:var(--color-border-strong);stroke-width:1.5px;stroke-linecap:round}.ea-bar-chart__value{font-size:.75em;fill:var(--color-text-secondary);font-variant-numeric:tabular-nums;fill:var(--color-text-primary);pointer-events:none}.ea-bar-chart__bar{fill:var(--ea-chart-color);pointer-events:none;transition:opacity var(--duration-fast) var(--ease-out);transform-box:view-box}.ea-bar-chart__bar--dimmed{opacity:.35}.ea-bar-chart--vertical .ea-bar-chart__bar{transform-origin:0 var(--ea-bar-chart-baseline)}.ea-bar-chart--horizontal .ea-bar-chart__bar{transform-origin:var(--ea-bar-chart-baseline) 0}.ea-bar-chart__tooltip{display:flex;flex-direction:column;gap:var(--space-1)}.ea-bar-chart__anchor{fill:transparent}.ea-bar-chart__tooltip-title{font-weight:var(--font-weight-medium)}.ea-bar-chart__tooltip-row{display:flex;align-items:center;gap:.5em}.ea-bar-chart__tooltip-row--active{font-weight:var(--font-weight-medium)}.ea-bar-chart__tooltip-value{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}.ea-bar-chart__swatch{flex-shrink:0;width:.75em;height:.75em;border-radius:var(--radius-sm);background-color:var(--ea-chart-color)}.ea-bar-chart__legend{display:flex;flex-wrap:wrap;justify-content:center;gap:.375em 1em;padding:0;margin:0;font-size:.875em;list-style:none;color:var(--color-text-secondary)}.ea-bar-chart__legend-item{display:flex;align-items:center;gap:.375em}.ea-bar-chart__table,.ea-bar-chart__live{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-bar-chart__empty{display:flex;align-items:center;justify-content:center;font-size:.875em;color:var(--color-text-tertiary)}.ea-bar-chart--animate-grow.ea-bar-chart--vertical .ea-bar-chart__bar,.ea-bar-chart--animate-cascade.ea-bar-chart--vertical .ea-bar-chart__bar{animation-name:ea-chart-grow-y}.ea-bar-chart--animate-grow.ea-bar-chart--horizontal .ea-bar-chart__bar,.ea-bar-chart--animate-cascade.ea-bar-chart--horizontal .ea-bar-chart__bar{animation-name:ea-chart-grow-x}.ea-bar-chart--animate-grow .ea-bar-chart__bar,.ea-bar-chart--animate-cascade .ea-bar-chart__bar{animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-bar-chart--animate-grow .ea-bar-chart__bar,.ea-bar-chart--animate-cascade .ea-bar-chart__bar{animation:none}}.ea-bar-chart--animate-grow .ea-bar-chart__value,.ea-bar-chart--animate-cascade .ea-bar-chart__value{animation-name:ea-chart-fade;animation-delay:calc(var(--ea-chart-duration, .6s) * .8);animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-bar-chart--animate-grow .ea-bar-chart__value,.ea-bar-chart--animate-cascade .ea-bar-chart__value{animation:none}}.ea-bar-chart--animate-cascade .ea-bar-chart__bar{animation-delay:var(--ea-chart-delay, 0ms)}.ea-bar-chart--animate-cascade .ea-bar-chart__value{animation-delay:calc(var(--ea-chart-duration, .6s) * 1.3)}.ea-bar-chart--animate-fade .ea-bar-chart__bar,.ea-bar-chart--animate-fade .ea-bar-chart__value{animation-name:ea-chart-fade;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-bar-chart--animate-fade .ea-bar-chart__bar,.ea-bar-chart--animate-fade .ea-bar-chart__value{animation:none}}\n"],
9176
+ dependencies: [{
9177
+ kind: "directive",
9178
+ type: NgClass,
9179
+ selector: "[ngClass]",
9180
+ inputs: ["class", "ngClass"]
9181
+ }, {
9182
+ kind: "directive",
9183
+ type: TooltipDirective,
9184
+ selector: "[eaTooltip]",
9185
+ inputs: [
9186
+ "eaTooltip",
9187
+ "tooltipPosition",
9188
+ "flip",
9189
+ "whenClipped",
9190
+ "maxWidth",
9191
+ "dismissDelay",
9192
+ "tooltipOpen"
9193
+ ]
9194
+ }],
9195
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
9196
+ encapsulation: i0.ViewEncapsulation.None
9197
+ });
9198
+ };
9199
+ i0.ɵɵngDeclareClassMetadata({
9200
+ minVersion: "12.0.0",
9201
+ version: "22.2.0",
9202
+ ngImport: i0,
9203
+ type: BarChartComponent,
9204
+ decorators: [{
9205
+ type: Component,
9206
+ args: [{
9207
+ selector: "ea-bar-chart",
9208
+ imports: [NgClass, TooltipDirective],
9209
+ changeDetection: ChangeDetectionStrategy.OnPush,
9210
+ encapsulation: ViewEncapsulation.None,
9211
+ template: "<div\n class=\"ea-bar-chart\"\n [ngClass]=\"hostClasses()\"\n [style.--ea-chart-duration]=\"animationDuration() + 'ms'\">\n @if (hasData()) {\n <div\n class=\"ea-bar-chart__plot\"\n role=\"group\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"i18n.messages().chart.roleDescription\"\n [attr.aria-label]=\"label()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\">\n @for (pass of renderPass(); track pass) {\n <svg\n class=\"ea-bar-chart__svg\"\n aria-hidden=\"true\"\n [attr.width]=\"layout().width\"\n [attr.height]=\"layout().height\"\n [attr.viewBox]=\"'0 0 ' + layout().width + ' ' + layout().height\"\n [style.--ea-bar-chart-baseline]=\"layout().baseline + 'px'\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerdown)=\"onPointerMove($event)\"\n (pointerleave)=\"onPointerLeave()\"\n (click)=\"onClick()\">\n <rect\n class=\"ea-bar-chart__hit\"\n [attr.x]=\"layout().left\"\n [attr.y]=\"layout().top\"\n [attr.width]=\"layout().plotWidth\"\n [attr.height]=\"layout().plotHeight\" />\n @for (tick of layout().ticks; track tick.value) {\n @if (layout().vertical) {\n @if (showGrid()) {\n <line\n class=\"ea-bar-chart__grid\"\n [attr.x1]=\"layout().left\"\n [attr.x2]=\"layout().left + layout().plotWidth\"\n [attr.y1]=\"tick.pos\"\n [attr.y2]=\"tick.pos\" />\n }\n <text\n class=\"ea-bar-chart__axis\"\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n [attr.x]=\"layout().left - layout().axisPx / 2\"\n [attr.y]=\"tick.pos\">\n {{ tick.text }}\n </text>\n } @else {\n @if (showGrid()) {\n <line\n class=\"ea-bar-chart__grid\"\n [attr.x1]=\"tick.pos\"\n [attr.x2]=\"tick.pos\"\n [attr.y1]=\"layout().top\"\n [attr.y2]=\"layout().top + layout().plotHeight\" />\n }\n <text\n class=\"ea-bar-chart__axis\"\n text-anchor=\"middle\"\n [attr.x]=\"tick.pos\"\n [attr.y]=\"layout().top + layout().plotHeight + layout().axisPx * 1.5\">\n {{ tick.text }}\n </text>\n }\n }\n @for (category of layout().categories; track category.index) {\n @if (layout().vertical) {\n <line\n class=\"ea-bar-chart__x-tick\"\n [attr.x1]=\"category.pos\"\n [attr.x2]=\"category.pos\"\n [attr.y1]=\"layout().axisY\"\n [attr.y2]=\"layout().tickEndY\" />\n <text\n class=\"ea-bar-chart__axis\"\n [attr.text-anchor]=\"layout().labelAngle ? 'end' : 'middle'\"\n [attr.dominant-baseline]=\"layout().labelAngle ? 'central' : null\"\n [attr.transform]=\"\n layout().labelAngle\n ? 'rotate(' +\n -layout().labelAngle +\n ' ' +\n category.pos +\n ' ' +\n layout().labelY +\n ')'\n : null\n \"\n [attr.x]=\"category.pos\"\n [attr.y]=\"layout().labelY\">\n {{ category.text }}\n </text>\n } @else {\n <text\n class=\"ea-bar-chart__axis\"\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n [attr.x]=\"layout().left - layout().axisPx / 2\"\n [attr.y]=\"category.pos\">\n {{ category.text }}\n </text>\n }\n }\n @for (bar of layout().bars; track $index) {\n <path\n class=\"ea-bar-chart__bar\"\n [class.ea-bar-chart__bar--dimmed]=\"isDimmed(bar)\"\n [style.--ea-chart-color]=\"bar.color\"\n [style.--ea-chart-delay]=\"bar.delay + 'ms'\"\n [attr.d]=\"bar.path\" />\n }\n @if (layout().axisBreak; as axisBreak) {\n <path\n class=\"ea-bar-chart__y-axis\"\n [attr.d]=\"axisBreak.axis\" />\n <path\n class=\"ea-bar-chart__axis-break\"\n [attr.d]=\"axisBreak.slashes\" />\n }\n @if (layout().vertical) {\n <line\n class=\"ea-bar-chart__baseline\"\n [attr.x1]=\"layout().left\"\n [attr.x2]=\"layout().left + layout().plotWidth\"\n [attr.y1]=\"layout().baseline\"\n [attr.y2]=\"layout().baseline\" />\n } @else {\n <line\n class=\"ea-bar-chart__baseline\"\n [attr.x1]=\"layout().baseline\"\n [attr.x2]=\"layout().baseline\"\n [attr.y1]=\"layout().top\"\n [attr.y2]=\"layout().top + layout().plotHeight\" />\n }\n @for (valueLabel of layout().valueLabels; track valueLabel.key) {\n <text\n class=\"ea-bar-chart__value\"\n [attr.text-anchor]=\"valueLabel.anchor\"\n [attr.dominant-baseline]=\"layout().vertical ? null : 'middle'\"\n [attr.x]=\"valueLabel.x\"\n [attr.y]=\"valueLabel.y\">\n {{ valueLabel.text }}\n </text>\n }\n @for (tip of tooltips(); track tip.key) {\n <rect\n class=\"ea-bar-chart__anchor\"\n width=\"2\"\n height=\"2\"\n [attr.x]=\"tip.x - 1\"\n [attr.y]=\"tip.y - 1\"\n [eaTooltip]=\"tooltipContent\"\n [tooltipOpen]=\"true\"\n [maxWidth]=\"undefined\" />\n }\n </svg>\n }\n <ng-template #tooltipContent>\n @if (tooltip(); as tip) {\n <div class=\"ea-bar-chart__tooltip\">\n <span class=\"ea-bar-chart__tooltip-title\">{{ tip.title }}</span>\n @for (row of tip.rows; track $index) {\n <span\n class=\"ea-bar-chart__tooltip-row\"\n [class.ea-bar-chart__tooltip-row--active]=\"row.active\">\n <span\n class=\"ea-bar-chart__swatch\"\n [style.--ea-chart-color]=\"row.color\">\n </span>\n <span class=\"ea-bar-chart__tooltip-name\">{{ row.name }}</span>\n <span class=\"ea-bar-chart__tooltip-value\">{{ row.value }}</span>\n </span>\n }\n </div>\n }\n </ng-template>\n <!-- Hidden through a block, since a table ignores the 1px size and keeps its full height -->\n <div class=\"ea-bar-chart__table\">\n <table>\n <caption>\n {{ label() }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.messages().chart.category }}</th>\n @for (s of series(); track $index) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of labels(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ row }}</th>\n @for (s of series(); track $index) {\n <td>{{ tableValue(s.data[i]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div\n class=\"ea-bar-chart__live\"\n aria-live=\"polite\">\n {{ announcement() }}\n </div>\n } @else {\n <div\n class=\"ea-bar-chart__empty\"\n role=\"img\"\n [attr.aria-label]=\"label()\"\n [style.height.px]=\"height()\">\n {{ i18n.messages().chart.noData }}\n </div>\n }\n @if (showsLegend()) {\n <ul\n class=\"ea-bar-chart__legend\"\n aria-hidden=\"true\">\n @for (s of series(); track $index; let i = $index) {\n <li class=\"ea-bar-chart__legend-item\">\n <span\n class=\"ea-bar-chart__swatch\"\n [style.--ea-chart-color]=\"seriesColor(i)\">\n </span>\n {{ s.name }}\n </li>\n }\n </ul>\n }\n</div>\n",
9212
+ styles: ["@keyframes ea-chart-fade{0%{opacity:0}}@keyframes ea-chart-draw{0%{stroke-dashoffset:1}}@keyframes ea-chart-grow-y{0%{transform:scaleY(0)}}@keyframes ea-chart-grow-x{0%{transform:scaleX(0)}}@keyframes ea-chart-grow{0%{transform:scale(0)}}ea-bar-chart{display:block}.ea-bar-chart{position:relative;display:flex;flex-direction:column;gap:.75em;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-bar-chart--2xs{font-size:var(--font-size-2xs)}.ea-bar-chart--xs{font-size:var(--font-size-xs)}.ea-bar-chart--sm{font-size:var(--font-size-sm)}.ea-bar-chart--md{font-size:var(--font-size-md)}.ea-bar-chart--lg{font-size:var(--font-size-lg)}.ea-bar-chart--xl{font-size:var(--font-size-xl)}.ea-bar-chart__plot{position:relative;border-radius:var(--radius-md);outline:none}.ea-bar-chart__plot:focus-visible{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-bar-chart__plot:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-bar-chart__plot svg{display:block;overflow:visible}.ea-bar-chart__svg{direction:ltr;touch-action:pan-y}.ea-bar-chart__hit{fill:transparent}.ea-bar-chart__grid{stroke:var(--color-divider);stroke-width:1px;shape-rendering:crispEdges}.ea-bar-chart__baseline{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges;pointer-events:none}.ea-bar-chart__axis{font-size:.75em;fill:var(--color-text-secondary)}.ea-bar-chart__x-tick{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges}.ea-bar-chart__y-axis{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges;fill:none}.ea-bar-chart__axis-break{fill:none;stroke:var(--color-border-strong);stroke-width:1.5px;stroke-linecap:round}.ea-bar-chart__value{font-size:.75em;fill:var(--color-text-secondary);font-variant-numeric:tabular-nums;fill:var(--color-text-primary);pointer-events:none}.ea-bar-chart__bar{fill:var(--ea-chart-color);pointer-events:none;transition:opacity var(--duration-fast) var(--ease-out);transform-box:view-box}.ea-bar-chart__bar--dimmed{opacity:.35}.ea-bar-chart--vertical .ea-bar-chart__bar{transform-origin:0 var(--ea-bar-chart-baseline)}.ea-bar-chart--horizontal .ea-bar-chart__bar{transform-origin:var(--ea-bar-chart-baseline) 0}.ea-bar-chart__tooltip{display:flex;flex-direction:column;gap:var(--space-1)}.ea-bar-chart__anchor{fill:transparent}.ea-bar-chart__tooltip-title{font-weight:var(--font-weight-medium)}.ea-bar-chart__tooltip-row{display:flex;align-items:center;gap:.5em}.ea-bar-chart__tooltip-row--active{font-weight:var(--font-weight-medium)}.ea-bar-chart__tooltip-value{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}.ea-bar-chart__swatch{flex-shrink:0;width:.75em;height:.75em;border-radius:var(--radius-sm);background-color:var(--ea-chart-color)}.ea-bar-chart__legend{display:flex;flex-wrap:wrap;justify-content:center;gap:.375em 1em;padding:0;margin:0;font-size:.875em;list-style:none;color:var(--color-text-secondary)}.ea-bar-chart__legend-item{display:flex;align-items:center;gap:.375em}.ea-bar-chart__table,.ea-bar-chart__live{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-bar-chart__empty{display:flex;align-items:center;justify-content:center;font-size:.875em;color:var(--color-text-tertiary)}.ea-bar-chart--animate-grow.ea-bar-chart--vertical .ea-bar-chart__bar,.ea-bar-chart--animate-cascade.ea-bar-chart--vertical .ea-bar-chart__bar{animation-name:ea-chart-grow-y}.ea-bar-chart--animate-grow.ea-bar-chart--horizontal .ea-bar-chart__bar,.ea-bar-chart--animate-cascade.ea-bar-chart--horizontal .ea-bar-chart__bar{animation-name:ea-chart-grow-x}.ea-bar-chart--animate-grow .ea-bar-chart__bar,.ea-bar-chart--animate-cascade .ea-bar-chart__bar{animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-bar-chart--animate-grow .ea-bar-chart__bar,.ea-bar-chart--animate-cascade .ea-bar-chart__bar{animation:none}}.ea-bar-chart--animate-grow .ea-bar-chart__value,.ea-bar-chart--animate-cascade .ea-bar-chart__value{animation-name:ea-chart-fade;animation-delay:calc(var(--ea-chart-duration, .6s) * .8);animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-bar-chart--animate-grow .ea-bar-chart__value,.ea-bar-chart--animate-cascade .ea-bar-chart__value{animation:none}}.ea-bar-chart--animate-cascade .ea-bar-chart__bar{animation-delay:var(--ea-chart-delay, 0ms)}.ea-bar-chart--animate-cascade .ea-bar-chart__value{animation-delay:calc(var(--ea-chart-duration, .6s) * 1.3)}.ea-bar-chart--animate-fade .ea-bar-chart__bar,.ea-bar-chart--animate-fade .ea-bar-chart__value{animation-name:ea-chart-fade;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-bar-chart--animate-fade .ea-bar-chart__bar,.ea-bar-chart--animate-fade .ea-bar-chart__value{animation:none}}\n"]
9213
+ }]
9214
+ }],
9215
+ propDecorators: {
9216
+ labels: [{
9217
+ type: i0.Input,
9218
+ args: [{
9219
+ isSignal: true,
9220
+ alias: "labels",
9221
+ required: false
9222
+ }]
9223
+ }],
9224
+ series: [{
9225
+ type: i0.Input,
9226
+ args: [{
9227
+ isSignal: true,
9228
+ alias: "series",
9229
+ required: false
9230
+ }]
9231
+ }],
9232
+ orientation: [{
9233
+ type: i0.Input,
9234
+ args: [{
9235
+ isSignal: true,
9236
+ alias: "orientation",
9237
+ required: false
9238
+ }]
9239
+ }],
9240
+ stacked: [{
9241
+ type: i0.Input,
9242
+ args: [{
9243
+ isSignal: true,
9244
+ alias: "stacked",
9245
+ required: false
9246
+ }]
9247
+ }],
9248
+ showGrid: [{
9249
+ type: i0.Input,
9250
+ args: [{
9251
+ isSignal: true,
9252
+ alias: "showGrid",
9253
+ required: false
9254
+ }]
9255
+ }],
9256
+ showLegend: [{
9257
+ type: i0.Input,
9258
+ args: [{
9259
+ isSignal: true,
9260
+ alias: "showLegend",
9261
+ required: false
9262
+ }]
9263
+ }],
9264
+ showValues: [{
9265
+ type: i0.Input,
9266
+ args: [{
9267
+ isSignal: true,
9268
+ alias: "showValues",
9269
+ required: false
9270
+ }]
9271
+ }],
9272
+ xLabelOrientation: [{
9273
+ type: i0.Input,
9274
+ args: [{
9275
+ isSignal: true,
9276
+ alias: "xLabelOrientation",
9277
+ required: false
9278
+ }]
9279
+ }],
9280
+ showAxisBreak: [{
9281
+ type: i0.Input,
9282
+ args: [{
9283
+ isSignal: true,
9284
+ alias: "showAxisBreak",
9285
+ required: false
9286
+ }]
9287
+ }],
9288
+ height: [{
9289
+ type: i0.Input,
9290
+ args: [{
9291
+ isSignal: true,
9292
+ alias: "height",
9293
+ required: false
9294
+ }]
9295
+ }],
9296
+ size: [{
9297
+ type: i0.Input,
9298
+ args: [{
9299
+ isSignal: true,
9300
+ alias: "size",
9301
+ required: false
9302
+ }]
9303
+ }],
9304
+ animation: [{
9305
+ type: i0.Input,
9306
+ args: [{
9307
+ isSignal: true,
9308
+ alias: "animation",
9309
+ required: false
9310
+ }]
9311
+ }],
9312
+ animationDuration: [{
9313
+ type: i0.Input,
9314
+ args: [{
9315
+ isSignal: true,
9316
+ alias: "animationDuration",
9317
+ required: false
9318
+ }]
9319
+ }],
9320
+ formatValue: [{
9321
+ type: i0.Input,
9322
+ args: [{
9323
+ isSignal: true,
9324
+ alias: "formatValue",
9325
+ required: false
9326
+ }]
9327
+ }],
9328
+ ariaLabel: [{
9329
+ type: i0.Input,
9330
+ args: [{
9331
+ isSignal: true,
9332
+ alias: "aria-label",
9333
+ required: false
9334
+ }]
9335
+ }],
9336
+ pointClick: [{
9337
+ type: i0.Output,
9338
+ args: ["pointClick"]
9339
+ }],
9340
+ activePointChange: [{
9341
+ type: i0.Output,
9342
+ args: ["activePointChange"]
9343
+ }]
9344
+ }
9345
+ });
8210
9346
  var ChevronRightIconComponent = class ChevronRightIconComponent extends IconComponentBase {
8211
9347
  static slug = "chevron-right";
8212
9348
  static category = "feather";
@@ -9131,7 +10267,8 @@ var CheckboxComponent = class CheckboxComponent {
9131
10267
  "flip",
9132
10268
  "whenClipped",
9133
10269
  "maxWidth",
9134
- "dismissDelay"
10270
+ "dismissDelay",
10271
+ "tooltipOpen"
9135
10272
  ]
9136
10273
  }
9137
10274
  ],
@@ -11455,7 +12592,7 @@ var ColorPickerComponent = class ColorPickerComponent {
11455
12592
  ],
11456
12593
  ngImport: i0,
11457
12594
  template: "<div class=\"ea-color-picker-field ea-color-picker-field--{{ size() }}\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [icon]=\"labelIcon()\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-color-picker\">\n <div\n class=\"ea-color-picker__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-color-picker__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-labelledby]=\"triggerLabelledBy()\"\n [attr.aria-controls]=\"isOpen() ? popoverId() : null\"\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)=\"onTriggerKeydown($event)\">\n <span\n class=\"ea-color-picker__swatch\"\n aria-hidden=\"true\">\n <span\n class=\"ea-color-picker__swatch-fill\"\n [style.--_ea-swatch-color]=\"value() ? displayColor() : null\">\n </span>\n </span>\n @if (!compact()) {\n <span\n class=\"ea-color-picker__trigger-value\"\n [class.ea-color-picker__trigger-value--placeholder]=\"!displayValue()\">\n <bdi>{{ displayValue() || resolvedPlaceholder() }}</bdi>\n </span>\n }\n </button>\n @if (clearable() && !compact() && value() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"ea-color-picker__clear\"\n [attr.aria-label]=\"i18n.messages().colorPicker.clear\"\n (click)=\"clear($event)\">\n <ea-icon-x\n class=\"ea-color-picker__clear-icon\"\n aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n [surfaceId]=\"popoverId()\"\n placement=\"bottom-start\"\n role=\"dialog\"\n [aria-label]=\"i18n.messages().colorPicker.dialogLabel\"\n [trapFocus]=\"true\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"close\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-color-picker__popover\"\n [ngClass]=\"popoverClasses()\"\n (keydown)=\"onPopoverKeydown($event)\">\n <div\n #svAreaEl\n class=\"ea-color-picker__sv-area\"\n role=\"slider\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.messages().colorPicker.saturationAndValue\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"satPercent()\"\n [attr.aria-valuetext]=\"\n i18n\n .messages()\n .colorPicker.saturationAndValueStatus(satPercent(), valPercent())\n \"\n [style.background-color]=\"hueColor()\"\n (pointerdown)=\"onSvPointerDown($event)\"\n (pointermove)=\"onSvPointerMove($event)\"\n (pointerup)=\"onSvPointerUp($event)\"\n (pointercancel)=\"onSvPointerUp($event)\"\n (keydown)=\"onSvKeydown($event)\">\n <div class=\"ea-color-picker__sv-area-sat\"></div>\n <div class=\"ea-color-picker__sv-area-val\"></div>\n <div\n class=\"ea-color-picker__sv-pointer\"\n [style.background-color]=\"opaqueColor()\"\n [style.left]=\"svPointerLeft()\"\n [style.top]=\"svPointerTop()\">\n </div>\n </div>\n\n <div\n class=\"ea-color-picker__sv-status\"\n aria-live=\"polite\">\n {{\n i18n\n .messages()\n .colorPicker.saturationAndValueStatus(satPercent(), valPercent())\n }}\n </div>\n\n <div class=\"ea-color-picker__sliders\">\n <div class=\"ea-color-picker__slider-row\">\n <span\n class=\"ea-color-picker__swatch ea-color-picker__swatch--lg\"\n aria-hidden=\"true\">\n <span\n class=\"ea-color-picker__swatch-fill\"\n [style.--_ea-swatch-color]=\"displayColor()\">\n </span>\n </span>\n <div class=\"ea-color-picker__strip-stack\">\n <div\n #hueTrackEl\n class=\"ea-color-picker__strip ea-color-picker__strip--hue\"\n role=\"slider\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.messages().colorPicker.hue\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"360\"\n [attr.aria-valuenow]=\"hueRounded()\"\n (pointerdown)=\"onHuePointerDown($event)\"\n (pointermove)=\"onHuePointerMove($event)\"\n (pointerup)=\"onHuePointerUp($event)\"\n (pointercancel)=\"onHuePointerUp($event)\"\n (keydown)=\"onHueKeydown($event)\">\n <div\n class=\"ea-color-picker__strip-thumb\"\n [style.left]=\"huePointerLeft()\">\n </div>\n </div>\n @if (showAlpha()) {\n <div\n #alphaTrackEl\n class=\"ea-color-picker__strip ea-color-picker__strip--alpha\"\n role=\"slider\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.messages().colorPicker.alpha\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-valuenow]=\"alphaPercentRounded()\"\n [attr.aria-valuetext]=\"alphaPercentRounded() + '%'\"\n [style.--ea-color-picker-alpha-base]=\"opaqueColor()\"\n (pointerdown)=\"onAlphaPointerDown($event)\"\n (pointermove)=\"onAlphaPointerMove($event)\"\n (pointerup)=\"onAlphaPointerUp($event)\"\n (pointercancel)=\"onAlphaPointerUp($event)\"\n (keydown)=\"onAlphaKeydown($event)\">\n <div\n class=\"ea-color-picker__strip-thumb\"\n [style.left]=\"alphaPointerLeft()\">\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <div\n class=\"ea-color-picker__inputs\"\n [class.ea-color-picker__inputs--hex]=\"activeFormat() === 'hex'\">\n @switch (activeFormat()) {\n @case ('hex') {\n <label\n class=\"ea-color-picker__input-group ea-color-picker__input-group--hex\">\n <span class=\"ea-color-picker__input-label\">HEX</span>\n <input\n class=\"ea-color-picker__input\"\n type=\"text\"\n dir=\"auto\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n maxlength=\"9\"\n [value]=\"hexInputValue()\"\n (input)=\"onHexInput($event)\"\n (blur)=\"onHexBlur()\" />\n </label>\n }\n @case ('rgb') {\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">R</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"rgb().r\"\n (input)=\"onRgbInput('r', $event)\" />\n </label>\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">G</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"rgb().g\"\n (input)=\"onRgbInput('g', $event)\" />\n </label>\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">B</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"rgb().b\"\n (input)=\"onRgbInput('b', $event)\" />\n </label>\n @if (showAlpha()) {\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">A</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"alphaPercentRounded()\"\n (input)=\"onAlphaInput($event)\" />\n </label>\n }\n }\n @case ('hsl') {\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">H</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"hslDisplay().h\"\n (input)=\"onHslInput('h', $event)\" />\n </label>\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">S</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"hslDisplay().s\"\n (input)=\"onHslInput('s', $event)\" />\n </label>\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">L</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"hslDisplay().l\"\n (input)=\"onHslInput('l', $event)\" />\n </label>\n @if (showAlpha()) {\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">A</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"alphaPercentRounded()\"\n (input)=\"onAlphaInput($event)\" />\n </label>\n }\n }\n }\n @if (canToggleFormat()) {\n <button\n type=\"button\"\n class=\"ea-color-picker__format-toggle\"\n [attr.aria-label]=\"formatToggleLabel()\"\n (click)=\"cycleInputMode()\">\n {{ formatLabel() }}\n </button>\n }\n </div>\n\n @if (hasEyeDropper()) {\n <div class=\"ea-color-picker__tools\">\n <button\n type=\"button\"\n class=\"ea-color-picker__tool-btn\"\n [attr.aria-label]=\"i18n.messages().colorPicker.eyedropper\"\n (click)=\"pickFromScreen()\">\n <ea-icon-droplet aria-hidden=\"true\" />\n <span>{{ i18n.messages().colorPicker.eyedropper }}</span>\n </button>\n </div>\n }\n\n @if (presets().length > 0) {\n <div class=\"ea-color-picker__presets\">\n <span\n class=\"ea-color-picker__presets-label\"\n [id]=\"id() + '-presets-label'\">\n {{ i18n.messages().colorPicker.presets }}\n </span>\n <div\n class=\"ea-color-picker__presets-grid\"\n role=\"group\"\n [attr.aria-labelledby]=\"id() + '-presets-label'\">\n @for (preset of presets(); track preset) {\n <button\n type=\"button\"\n class=\"ea-color-picker__preset\"\n [attr.aria-label]=\"preset\"\n [attr.aria-pressed]=\"activePresets().has(preset)\"\n [style.background-color]=\"preset\"\n (click)=\"selectPreset(preset)\">\n </button>\n }\n </div>\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",
11458
- styles: [".ea-color-picker-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-color-picker-field--2xs{font-size:var(--font-size-2xs)}.ea-color-picker-field--xs{font-size:var(--font-size-xs)}.ea-color-picker-field--sm{font-size:var(--font-size-sm)}.ea-color-picker-field--md{font-size:var(--font-size-md)}.ea-color-picker-field--lg{font-size:var(--font-size-lg)}.ea-color-picker-field--xl{font-size:var(--font-size-xl)}.ea-color-picker,.ea-color-picker__trigger-wrapper{position:relative}.ea-color-picker__trigger{display:flex;align-items:center;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-color-picker__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--error{border-color:var(--color-error-default)}.ea-color-picker__trigger--error.ea-color-picker__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-color-picker__trigger--error.ea-color-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--compact{width:auto;min-height:0;padding:.375em}.ea-color-picker__trigger--compact .ea-color-picker__swatch{width:1.5em;height:1.5em}.ea-color-picker__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-color-picker__trigger--readonly{cursor:default}.ea-color-picker__trigger--readonly:focus-visible{border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-color-picker__trigger--readonly:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family-mono);font-size:.85em}.ea-color-picker__trigger-value--placeholder{color:var(--color-text-tertiary);font-family:var(--font-family-sans);font-size:1em}.ea-color-picker__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-color-picker__clear>*{font-size:1.25em}.ea-color-picker__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-color-picker__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__clear:disabled{cursor:default;opacity:.5}.ea-color-picker__clear{z-index:1;position:absolute;top:50%;inset-inline-end:var(--space-2);transform:translateY(-50%)}.ea-color-picker__swatch{position:relative;overflow:hidden;flex-shrink:0;width:1.125em;height:1.125em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);forced-color-adjust:none}.ea-color-picker__swatch--lg{width:2.5em;height:2.5em;border-radius:var(--radius-md)}.ea-color-picker__swatch-fill{position:absolute;inset:0;display:block;background-color:var(--color-bg-base);background-image:linear-gradient(var(--_ea-swatch-color, transparent),var(--_ea-swatch-color, transparent)),linear-gradient(45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(-45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--color-neutral-200) 75%),linear-gradient(-45deg,transparent 75%,var(--color-neutral-200) 75%);background-size:100% 100%,8px 8px,8px 8px,8px 8px,8px 8px;background-position:0 0,0 0,0 4px,4px -4px,-4px 0;forced-color-adjust:none}.ea-color-picker__popover{display:flex;flex-direction:column;gap:.75em;width:17.5em;padding:.75em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-color-picker-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-color-picker__popover{border:1px solid CanvasText}}.ea-color-picker__popover--2xs{font-size:var(--font-size-2xs)}.ea-color-picker__popover--xs{font-size:var(--font-size-xs)}.ea-color-picker__popover--sm{font-size:var(--font-size-sm)}.ea-color-picker__popover--md{font-size:var(--font-size-md)}.ea-color-picker__popover--lg{font-size:var(--font-size-lg)}.ea-color-picker__popover--xl{font-size:var(--font-size-xl)}.ea-color-picker__sv-area{position:relative;overflow:hidden;width:100%;height:10em;border-radius:var(--radius-sm);cursor:crosshair;forced-color-adjust:none;touch-action:none}.ea-color-picker__sv-area:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__sv-area:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__sv-area-sat{position:absolute;inset:0;background:linear-gradient(to right,var(--color-picker-sv-white),transparent);forced-color-adjust:none}.ea-color-picker__sv-area-val{position:absolute;inset:0;background:linear-gradient(to top,var(--color-picker-sv-black),transparent);forced-color-adjust:none}.ea-color-picker__sv-pointer{position:absolute;z-index:1;width:.875em;height:.875em;border:2px solid var(--color-neutral-0);border-radius:var(--radius-full);box-shadow:0 0 0 1px var(--color-picker-thumb-halo);pointer-events:none;transform:translate(-50%,-50%)}.ea-color-picker__sv-status{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-color-picker__slider-row{display:flex;align-items:center;gap:.5em}.ea-color-picker__strip-stack{display:flex;flex-direction:column;flex:1;gap:.5em}.ea-color-picker__strip{position:relative;width:100%;height:.75em;border-radius:var(--radius-full);cursor:pointer;forced-color-adjust:none;touch-action:none}.ea-color-picker__strip:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__strip:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__strip--hue{background:linear-gradient(to right,var(--color-picker-hue-red) 0%,var(--color-picker-hue-yellow) 17%,var(--color-picker-hue-green) 33%,var(--color-picker-hue-cyan) 50%,var(--color-picker-hue-blue) 67%,var(--color-picker-hue-magenta) 83%,var(--color-picker-hue-red) 100%)}.ea-color-picker__strip--alpha{background-color:var(--color-bg-base);background-image:linear-gradient(to right,transparent 0%,var(--ea-color-picker-alpha-base, currentcolor) 100%),linear-gradient(45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(-45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--color-neutral-200) 75%),linear-gradient(-45deg,transparent 75%,var(--color-neutral-200) 75%);background-size:100% 100%,8px 8px,8px 8px,8px 8px,8px 8px;background-position:0 0,0 0,0 4px,4px -4px,-4px 0}.ea-color-picker__strip-thumb{position:absolute;top:50%;width:.875em;height:.875em;border:2px solid var(--color-neutral-0);border-radius:var(--radius-full);box-shadow:0 0 0 1px var(--color-picker-thumb-halo);pointer-events:none;transform:translate(-50%,-50%)}.ea-color-picker__inputs{display:flex;align-items:end;gap:.25em}.ea-color-picker__input-group{display:flex;flex:1;flex-direction:column;gap:.25em;min-width:0;text-align:center}.ea-color-picker__input-group--hex{flex:1}.ea-color-picker__format-toggle{flex-shrink:0;min-width:5.2em;padding:.4em .8em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);font-family:var(--font-family-sans);font-size:.625em;font-weight:var(--font-weight-medium);letter-spacing:.04em;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-color-picker__format-toggle:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__format-toggle:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__format-toggle:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__input-label{font-size:.625em;font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-tertiary)}.ea-color-picker__input{width:100%;min-width:0;padding:.375em .5em;background-color:var(--color-bg-base);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);font-family:var(--font-family-mono);font-size:.75em;text-align:center;color:var(--color-text-primary)}.ea-color-picker__input:focus-visible{outline:none;border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__input:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__input--num{appearance:textfield}.ea-color-picker__input--num::-webkit-outer-spin-button,.ea-color-picker__input--num::-webkit-inner-spin-button{appearance:none;margin:0}.ea-color-picker__tools{display:flex;justify-content:flex-start}.ea-color-picker__tool-btn{display:inline-flex;align-items:center;gap:.5em;padding:.375em .75em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);font-family:var(--font-family-sans);font-size:.75em;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-color-picker__tool-btn:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__tool-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__tool-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__tool-btn ea-icon-droplet{width:.875em;height:.875em}.ea-color-picker__presets{display:flex;flex-direction:column;gap:.375em;padding-top:.5em;border-top:var(--border-width-thin) solid var(--color-border-default)}.ea-color-picker__presets-label{font-size:.625em;font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-tertiary)}.ea-color-picker__presets-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:.25em}.ea-color-picker__preset{width:100%;aspect-ratio:1;padding:0;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);cursor:pointer;forced-color-adjust:none;transition:transform var(--duration-fast) var(--ease-out)}.ea-color-picker__preset:hover{transform:scale(1.1)}.ea-color-picker__preset:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__preset:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__preset[aria-selected=true]{box-shadow:0 0 0 2px var(--color-brand-default)}\n"],
12595
+ styles: [".ea-color-picker-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-color-picker-field--2xs{font-size:var(--font-size-2xs)}.ea-color-picker-field--xs{font-size:var(--font-size-xs)}.ea-color-picker-field--sm{font-size:var(--font-size-sm)}.ea-color-picker-field--md{font-size:var(--font-size-md)}.ea-color-picker-field--lg{font-size:var(--font-size-lg)}.ea-color-picker-field--xl{font-size:var(--font-size-xl)}.ea-color-picker,.ea-color-picker__trigger-wrapper{position:relative}.ea-color-picker__trigger{display:flex;align-items:center;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-color-picker__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--error{border-color:var(--color-error-default)}.ea-color-picker__trigger--error.ea-color-picker__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-color-picker__trigger--error.ea-color-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--compact{width:auto;min-height:0;padding:.375em}.ea-color-picker__trigger--compact .ea-color-picker__swatch{width:1.5em;height:1.5em}.ea-color-picker__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-color-picker__trigger--readonly{cursor:default}.ea-color-picker__trigger--readonly:focus-visible{border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-color-picker__trigger--readonly:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family-mono);font-size:.875em}.ea-color-picker__trigger-value--placeholder{color:var(--color-text-tertiary);font-family:var(--font-family-sans);font-size:1em}.ea-color-picker__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-color-picker__clear>*{font-size:1.25em}.ea-color-picker__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-color-picker__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__clear:disabled{cursor:default;opacity:.5}.ea-color-picker__clear{z-index:1;position:absolute;top:50%;inset-inline-end:var(--space-2);transform:translateY(-50%)}.ea-color-picker__swatch{position:relative;overflow:hidden;flex-shrink:0;width:1.125em;height:1.125em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);forced-color-adjust:none}.ea-color-picker__swatch--lg{width:2.5em;height:2.5em;border-radius:var(--radius-md)}.ea-color-picker__swatch-fill{position:absolute;inset:0;display:block;background-color:var(--color-bg-base);background-image:linear-gradient(var(--_ea-swatch-color, transparent),var(--_ea-swatch-color, transparent)),linear-gradient(45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(-45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--color-neutral-200) 75%),linear-gradient(-45deg,transparent 75%,var(--color-neutral-200) 75%);background-size:100% 100%,8px 8px,8px 8px,8px 8px,8px 8px;background-position:0 0,0 0,0 4px,4px -4px,-4px 0;forced-color-adjust:none}.ea-color-picker__popover{display:flex;flex-direction:column;gap:.75em;width:17.5em;padding:.75em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-color-picker-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-color-picker__popover{border:1px solid CanvasText}}.ea-color-picker__popover--2xs{font-size:var(--font-size-2xs)}.ea-color-picker__popover--xs{font-size:var(--font-size-xs)}.ea-color-picker__popover--sm{font-size:var(--font-size-sm)}.ea-color-picker__popover--md{font-size:var(--font-size-md)}.ea-color-picker__popover--lg{font-size:var(--font-size-lg)}.ea-color-picker__popover--xl{font-size:var(--font-size-xl)}.ea-color-picker__sv-area{position:relative;overflow:hidden;width:100%;height:10em;border-radius:var(--radius-sm);cursor:crosshair;forced-color-adjust:none;touch-action:none}.ea-color-picker__sv-area:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__sv-area:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__sv-area-sat{position:absolute;inset:0;background:linear-gradient(to right,var(--color-picker-sv-white),transparent);forced-color-adjust:none}.ea-color-picker__sv-area-val{position:absolute;inset:0;background:linear-gradient(to top,var(--color-picker-sv-black),transparent);forced-color-adjust:none}.ea-color-picker__sv-pointer{position:absolute;z-index:1;width:.875em;height:.875em;border:2px solid var(--color-neutral-0);border-radius:var(--radius-full);box-shadow:0 0 0 1px var(--color-picker-thumb-halo);pointer-events:none;transform:translate(-50%,-50%)}.ea-color-picker__sv-status{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-color-picker__slider-row{display:flex;align-items:center;gap:.5em}.ea-color-picker__strip-stack{display:flex;flex-direction:column;flex:1;gap:.5em}.ea-color-picker__strip{position:relative;width:100%;height:.75em;border-radius:var(--radius-full);cursor:pointer;forced-color-adjust:none;touch-action:none}.ea-color-picker__strip:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__strip:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__strip--hue{background:linear-gradient(to right,var(--color-picker-hue-red) 0%,var(--color-picker-hue-yellow) 17%,var(--color-picker-hue-green) 33%,var(--color-picker-hue-cyan) 50%,var(--color-picker-hue-blue) 67%,var(--color-picker-hue-magenta) 83%,var(--color-picker-hue-red) 100%)}.ea-color-picker__strip--alpha{background-color:var(--color-bg-base);background-image:linear-gradient(to right,transparent 0%,var(--ea-color-picker-alpha-base, currentcolor) 100%),linear-gradient(45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(-45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--color-neutral-200) 75%),linear-gradient(-45deg,transparent 75%,var(--color-neutral-200) 75%);background-size:100% 100%,8px 8px,8px 8px,8px 8px,8px 8px;background-position:0 0,0 0,0 4px,4px -4px,-4px 0}.ea-color-picker__strip-thumb{position:absolute;top:50%;width:.875em;height:.875em;border:2px solid var(--color-neutral-0);border-radius:var(--radius-full);box-shadow:0 0 0 1px var(--color-picker-thumb-halo);pointer-events:none;transform:translate(-50%,-50%)}.ea-color-picker__inputs{display:flex;align-items:end;gap:.25em}.ea-color-picker__input-group{display:flex;flex:1;flex-direction:column;gap:.25em;min-width:0;text-align:center}.ea-color-picker__input-group--hex{flex:1}.ea-color-picker__format-toggle{flex-shrink:0;min-width:5.2em;padding:.4em .8em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);font-family:var(--font-family-sans);font-size:.625em;font-weight:var(--font-weight-medium);letter-spacing:.04em;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-color-picker__format-toggle:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__format-toggle:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__format-toggle:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__input-label{font-size:.625em;font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-tertiary)}.ea-color-picker__input{width:100%;min-width:0;padding:.375em .5em;background-color:var(--color-bg-base);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);font-family:var(--font-family-mono);font-size:.75em;text-align:center;color:var(--color-text-primary)}.ea-color-picker__input:focus-visible{outline:none;border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__input:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__input--num{appearance:textfield}.ea-color-picker__input--num::-webkit-outer-spin-button,.ea-color-picker__input--num::-webkit-inner-spin-button{appearance:none;margin:0}.ea-color-picker__tools{display:flex;justify-content:flex-start}.ea-color-picker__tool-btn{display:inline-flex;align-items:center;gap:.5em;padding:.375em .75em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);font-family:var(--font-family-sans);font-size:.75em;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-color-picker__tool-btn:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__tool-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__tool-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__tool-btn ea-icon-droplet{width:.875em;height:.875em}.ea-color-picker__presets{display:flex;flex-direction:column;gap:.375em;padding-top:.5em;border-top:var(--border-width-thin) solid var(--color-border-default)}.ea-color-picker__presets-label{font-size:.625em;font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-tertiary)}.ea-color-picker__presets-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:.25em}.ea-color-picker__preset{width:100%;aspect-ratio:1;padding:0;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);cursor:pointer;forced-color-adjust:none;transition:transform var(--duration-fast) var(--ease-out)}.ea-color-picker__preset:hover{transform:scale(1.1)}.ea-color-picker__preset:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__preset:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__preset[aria-selected=true]{box-shadow:0 0 0 2px var(--color-brand-default)}\n"],
11459
12596
  dependencies: [
11460
12597
  {
11461
12598
  kind: "component",
@@ -11547,7 +12684,7 @@ i0.ɵɵngDeclareClassMetadata({
11547
12684
  multi: true
11548
12685
  }],
11549
12686
  template: "<div class=\"ea-color-picker-field ea-color-picker-field--{{ size() }}\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [icon]=\"labelIcon()\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-color-picker\">\n <div\n class=\"ea-color-picker__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-color-picker__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-labelledby]=\"triggerLabelledBy()\"\n [attr.aria-controls]=\"isOpen() ? popoverId() : null\"\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)=\"onTriggerKeydown($event)\">\n <span\n class=\"ea-color-picker__swatch\"\n aria-hidden=\"true\">\n <span\n class=\"ea-color-picker__swatch-fill\"\n [style.--_ea-swatch-color]=\"value() ? displayColor() : null\">\n </span>\n </span>\n @if (!compact()) {\n <span\n class=\"ea-color-picker__trigger-value\"\n [class.ea-color-picker__trigger-value--placeholder]=\"!displayValue()\">\n <bdi>{{ displayValue() || resolvedPlaceholder() }}</bdi>\n </span>\n }\n </button>\n @if (clearable() && !compact() && value() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"ea-color-picker__clear\"\n [attr.aria-label]=\"i18n.messages().colorPicker.clear\"\n (click)=\"clear($event)\">\n <ea-icon-x\n class=\"ea-color-picker__clear-icon\"\n aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n [surfaceId]=\"popoverId()\"\n placement=\"bottom-start\"\n role=\"dialog\"\n [aria-label]=\"i18n.messages().colorPicker.dialogLabel\"\n [trapFocus]=\"true\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"close\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-color-picker__popover\"\n [ngClass]=\"popoverClasses()\"\n (keydown)=\"onPopoverKeydown($event)\">\n <div\n #svAreaEl\n class=\"ea-color-picker__sv-area\"\n role=\"slider\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.messages().colorPicker.saturationAndValue\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"satPercent()\"\n [attr.aria-valuetext]=\"\n i18n\n .messages()\n .colorPicker.saturationAndValueStatus(satPercent(), valPercent())\n \"\n [style.background-color]=\"hueColor()\"\n (pointerdown)=\"onSvPointerDown($event)\"\n (pointermove)=\"onSvPointerMove($event)\"\n (pointerup)=\"onSvPointerUp($event)\"\n (pointercancel)=\"onSvPointerUp($event)\"\n (keydown)=\"onSvKeydown($event)\">\n <div class=\"ea-color-picker__sv-area-sat\"></div>\n <div class=\"ea-color-picker__sv-area-val\"></div>\n <div\n class=\"ea-color-picker__sv-pointer\"\n [style.background-color]=\"opaqueColor()\"\n [style.left]=\"svPointerLeft()\"\n [style.top]=\"svPointerTop()\">\n </div>\n </div>\n\n <div\n class=\"ea-color-picker__sv-status\"\n aria-live=\"polite\">\n {{\n i18n\n .messages()\n .colorPicker.saturationAndValueStatus(satPercent(), valPercent())\n }}\n </div>\n\n <div class=\"ea-color-picker__sliders\">\n <div class=\"ea-color-picker__slider-row\">\n <span\n class=\"ea-color-picker__swatch ea-color-picker__swatch--lg\"\n aria-hidden=\"true\">\n <span\n class=\"ea-color-picker__swatch-fill\"\n [style.--_ea-swatch-color]=\"displayColor()\">\n </span>\n </span>\n <div class=\"ea-color-picker__strip-stack\">\n <div\n #hueTrackEl\n class=\"ea-color-picker__strip ea-color-picker__strip--hue\"\n role=\"slider\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.messages().colorPicker.hue\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"360\"\n [attr.aria-valuenow]=\"hueRounded()\"\n (pointerdown)=\"onHuePointerDown($event)\"\n (pointermove)=\"onHuePointerMove($event)\"\n (pointerup)=\"onHuePointerUp($event)\"\n (pointercancel)=\"onHuePointerUp($event)\"\n (keydown)=\"onHueKeydown($event)\">\n <div\n class=\"ea-color-picker__strip-thumb\"\n [style.left]=\"huePointerLeft()\">\n </div>\n </div>\n @if (showAlpha()) {\n <div\n #alphaTrackEl\n class=\"ea-color-picker__strip ea-color-picker__strip--alpha\"\n role=\"slider\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.messages().colorPicker.alpha\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-valuenow]=\"alphaPercentRounded()\"\n [attr.aria-valuetext]=\"alphaPercentRounded() + '%'\"\n [style.--ea-color-picker-alpha-base]=\"opaqueColor()\"\n (pointerdown)=\"onAlphaPointerDown($event)\"\n (pointermove)=\"onAlphaPointerMove($event)\"\n (pointerup)=\"onAlphaPointerUp($event)\"\n (pointercancel)=\"onAlphaPointerUp($event)\"\n (keydown)=\"onAlphaKeydown($event)\">\n <div\n class=\"ea-color-picker__strip-thumb\"\n [style.left]=\"alphaPointerLeft()\">\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <div\n class=\"ea-color-picker__inputs\"\n [class.ea-color-picker__inputs--hex]=\"activeFormat() === 'hex'\">\n @switch (activeFormat()) {\n @case ('hex') {\n <label\n class=\"ea-color-picker__input-group ea-color-picker__input-group--hex\">\n <span class=\"ea-color-picker__input-label\">HEX</span>\n <input\n class=\"ea-color-picker__input\"\n type=\"text\"\n dir=\"auto\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n maxlength=\"9\"\n [value]=\"hexInputValue()\"\n (input)=\"onHexInput($event)\"\n (blur)=\"onHexBlur()\" />\n </label>\n }\n @case ('rgb') {\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">R</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"rgb().r\"\n (input)=\"onRgbInput('r', $event)\" />\n </label>\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">G</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"rgb().g\"\n (input)=\"onRgbInput('g', $event)\" />\n </label>\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">B</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"rgb().b\"\n (input)=\"onRgbInput('b', $event)\" />\n </label>\n @if (showAlpha()) {\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">A</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"alphaPercentRounded()\"\n (input)=\"onAlphaInput($event)\" />\n </label>\n }\n }\n @case ('hsl') {\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">H</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"hslDisplay().h\"\n (input)=\"onHslInput('h', $event)\" />\n </label>\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">S</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"hslDisplay().s\"\n (input)=\"onHslInput('s', $event)\" />\n </label>\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">L</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"hslDisplay().l\"\n (input)=\"onHslInput('l', $event)\" />\n </label>\n @if (showAlpha()) {\n <label class=\"ea-color-picker__input-group\">\n <span class=\"ea-color-picker__input-label\">A</span>\n <input\n class=\"ea-color-picker__input ea-color-picker__input--num\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"\\d*\"\n maxlength=\"3\"\n [value]=\"alphaPercentRounded()\"\n (input)=\"onAlphaInput($event)\" />\n </label>\n }\n }\n }\n @if (canToggleFormat()) {\n <button\n type=\"button\"\n class=\"ea-color-picker__format-toggle\"\n [attr.aria-label]=\"formatToggleLabel()\"\n (click)=\"cycleInputMode()\">\n {{ formatLabel() }}\n </button>\n }\n </div>\n\n @if (hasEyeDropper()) {\n <div class=\"ea-color-picker__tools\">\n <button\n type=\"button\"\n class=\"ea-color-picker__tool-btn\"\n [attr.aria-label]=\"i18n.messages().colorPicker.eyedropper\"\n (click)=\"pickFromScreen()\">\n <ea-icon-droplet aria-hidden=\"true\" />\n <span>{{ i18n.messages().colorPicker.eyedropper }}</span>\n </button>\n </div>\n }\n\n @if (presets().length > 0) {\n <div class=\"ea-color-picker__presets\">\n <span\n class=\"ea-color-picker__presets-label\"\n [id]=\"id() + '-presets-label'\">\n {{ i18n.messages().colorPicker.presets }}\n </span>\n <div\n class=\"ea-color-picker__presets-grid\"\n role=\"group\"\n [attr.aria-labelledby]=\"id() + '-presets-label'\">\n @for (preset of presets(); track preset) {\n <button\n type=\"button\"\n class=\"ea-color-picker__preset\"\n [attr.aria-label]=\"preset\"\n [attr.aria-pressed]=\"activePresets().has(preset)\"\n [style.background-color]=\"preset\"\n (click)=\"selectPreset(preset)\">\n </button>\n }\n </div>\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",
11550
- styles: [".ea-color-picker-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-color-picker-field--2xs{font-size:var(--font-size-2xs)}.ea-color-picker-field--xs{font-size:var(--font-size-xs)}.ea-color-picker-field--sm{font-size:var(--font-size-sm)}.ea-color-picker-field--md{font-size:var(--font-size-md)}.ea-color-picker-field--lg{font-size:var(--font-size-lg)}.ea-color-picker-field--xl{font-size:var(--font-size-xl)}.ea-color-picker,.ea-color-picker__trigger-wrapper{position:relative}.ea-color-picker__trigger{display:flex;align-items:center;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-color-picker__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--error{border-color:var(--color-error-default)}.ea-color-picker__trigger--error.ea-color-picker__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-color-picker__trigger--error.ea-color-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--compact{width:auto;min-height:0;padding:.375em}.ea-color-picker__trigger--compact .ea-color-picker__swatch{width:1.5em;height:1.5em}.ea-color-picker__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-color-picker__trigger--readonly{cursor:default}.ea-color-picker__trigger--readonly:focus-visible{border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-color-picker__trigger--readonly:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family-mono);font-size:.85em}.ea-color-picker__trigger-value--placeholder{color:var(--color-text-tertiary);font-family:var(--font-family-sans);font-size:1em}.ea-color-picker__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-color-picker__clear>*{font-size:1.25em}.ea-color-picker__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-color-picker__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__clear:disabled{cursor:default;opacity:.5}.ea-color-picker__clear{z-index:1;position:absolute;top:50%;inset-inline-end:var(--space-2);transform:translateY(-50%)}.ea-color-picker__swatch{position:relative;overflow:hidden;flex-shrink:0;width:1.125em;height:1.125em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);forced-color-adjust:none}.ea-color-picker__swatch--lg{width:2.5em;height:2.5em;border-radius:var(--radius-md)}.ea-color-picker__swatch-fill{position:absolute;inset:0;display:block;background-color:var(--color-bg-base);background-image:linear-gradient(var(--_ea-swatch-color, transparent),var(--_ea-swatch-color, transparent)),linear-gradient(45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(-45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--color-neutral-200) 75%),linear-gradient(-45deg,transparent 75%,var(--color-neutral-200) 75%);background-size:100% 100%,8px 8px,8px 8px,8px 8px,8px 8px;background-position:0 0,0 0,0 4px,4px -4px,-4px 0;forced-color-adjust:none}.ea-color-picker__popover{display:flex;flex-direction:column;gap:.75em;width:17.5em;padding:.75em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-color-picker-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-color-picker__popover{border:1px solid CanvasText}}.ea-color-picker__popover--2xs{font-size:var(--font-size-2xs)}.ea-color-picker__popover--xs{font-size:var(--font-size-xs)}.ea-color-picker__popover--sm{font-size:var(--font-size-sm)}.ea-color-picker__popover--md{font-size:var(--font-size-md)}.ea-color-picker__popover--lg{font-size:var(--font-size-lg)}.ea-color-picker__popover--xl{font-size:var(--font-size-xl)}.ea-color-picker__sv-area{position:relative;overflow:hidden;width:100%;height:10em;border-radius:var(--radius-sm);cursor:crosshair;forced-color-adjust:none;touch-action:none}.ea-color-picker__sv-area:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__sv-area:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__sv-area-sat{position:absolute;inset:0;background:linear-gradient(to right,var(--color-picker-sv-white),transparent);forced-color-adjust:none}.ea-color-picker__sv-area-val{position:absolute;inset:0;background:linear-gradient(to top,var(--color-picker-sv-black),transparent);forced-color-adjust:none}.ea-color-picker__sv-pointer{position:absolute;z-index:1;width:.875em;height:.875em;border:2px solid var(--color-neutral-0);border-radius:var(--radius-full);box-shadow:0 0 0 1px var(--color-picker-thumb-halo);pointer-events:none;transform:translate(-50%,-50%)}.ea-color-picker__sv-status{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-color-picker__slider-row{display:flex;align-items:center;gap:.5em}.ea-color-picker__strip-stack{display:flex;flex-direction:column;flex:1;gap:.5em}.ea-color-picker__strip{position:relative;width:100%;height:.75em;border-radius:var(--radius-full);cursor:pointer;forced-color-adjust:none;touch-action:none}.ea-color-picker__strip:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__strip:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__strip--hue{background:linear-gradient(to right,var(--color-picker-hue-red) 0%,var(--color-picker-hue-yellow) 17%,var(--color-picker-hue-green) 33%,var(--color-picker-hue-cyan) 50%,var(--color-picker-hue-blue) 67%,var(--color-picker-hue-magenta) 83%,var(--color-picker-hue-red) 100%)}.ea-color-picker__strip--alpha{background-color:var(--color-bg-base);background-image:linear-gradient(to right,transparent 0%,var(--ea-color-picker-alpha-base, currentcolor) 100%),linear-gradient(45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(-45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--color-neutral-200) 75%),linear-gradient(-45deg,transparent 75%,var(--color-neutral-200) 75%);background-size:100% 100%,8px 8px,8px 8px,8px 8px,8px 8px;background-position:0 0,0 0,0 4px,4px -4px,-4px 0}.ea-color-picker__strip-thumb{position:absolute;top:50%;width:.875em;height:.875em;border:2px solid var(--color-neutral-0);border-radius:var(--radius-full);box-shadow:0 0 0 1px var(--color-picker-thumb-halo);pointer-events:none;transform:translate(-50%,-50%)}.ea-color-picker__inputs{display:flex;align-items:end;gap:.25em}.ea-color-picker__input-group{display:flex;flex:1;flex-direction:column;gap:.25em;min-width:0;text-align:center}.ea-color-picker__input-group--hex{flex:1}.ea-color-picker__format-toggle{flex-shrink:0;min-width:5.2em;padding:.4em .8em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);font-family:var(--font-family-sans);font-size:.625em;font-weight:var(--font-weight-medium);letter-spacing:.04em;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-color-picker__format-toggle:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__format-toggle:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__format-toggle:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__input-label{font-size:.625em;font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-tertiary)}.ea-color-picker__input{width:100%;min-width:0;padding:.375em .5em;background-color:var(--color-bg-base);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);font-family:var(--font-family-mono);font-size:.75em;text-align:center;color:var(--color-text-primary)}.ea-color-picker__input:focus-visible{outline:none;border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__input:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__input--num{appearance:textfield}.ea-color-picker__input--num::-webkit-outer-spin-button,.ea-color-picker__input--num::-webkit-inner-spin-button{appearance:none;margin:0}.ea-color-picker__tools{display:flex;justify-content:flex-start}.ea-color-picker__tool-btn{display:inline-flex;align-items:center;gap:.5em;padding:.375em .75em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);font-family:var(--font-family-sans);font-size:.75em;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-color-picker__tool-btn:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__tool-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__tool-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__tool-btn ea-icon-droplet{width:.875em;height:.875em}.ea-color-picker__presets{display:flex;flex-direction:column;gap:.375em;padding-top:.5em;border-top:var(--border-width-thin) solid var(--color-border-default)}.ea-color-picker__presets-label{font-size:.625em;font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-tertiary)}.ea-color-picker__presets-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:.25em}.ea-color-picker__preset{width:100%;aspect-ratio:1;padding:0;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);cursor:pointer;forced-color-adjust:none;transition:transform var(--duration-fast) var(--ease-out)}.ea-color-picker__preset:hover{transform:scale(1.1)}.ea-color-picker__preset:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__preset:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__preset[aria-selected=true]{box-shadow:0 0 0 2px var(--color-brand-default)}\n"]
12687
+ styles: [".ea-color-picker-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-color-picker-field--2xs{font-size:var(--font-size-2xs)}.ea-color-picker-field--xs{font-size:var(--font-size-xs)}.ea-color-picker-field--sm{font-size:var(--font-size-sm)}.ea-color-picker-field--md{font-size:var(--font-size-md)}.ea-color-picker-field--lg{font-size:var(--font-size-lg)}.ea-color-picker-field--xl{font-size:var(--font-size-xl)}.ea-color-picker,.ea-color-picker__trigger-wrapper{position:relative}.ea-color-picker__trigger{display:flex;align-items:center;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-color-picker__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--error{border-color:var(--color-error-default)}.ea-color-picker__trigger--error.ea-color-picker__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-color-picker__trigger--error.ea-color-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger--compact{width:auto;min-height:0;padding:.375em}.ea-color-picker__trigger--compact .ea-color-picker__swatch{width:1.5em;height:1.5em}.ea-color-picker__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-color-picker__trigger--readonly{cursor:default}.ea-color-picker__trigger--readonly:focus-visible{border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-color-picker__trigger--readonly:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family-mono);font-size:.875em}.ea-color-picker__trigger-value--placeholder{color:var(--color-text-tertiary);font-family:var(--font-family-sans);font-size:1em}.ea-color-picker__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-color-picker__clear>*{font-size:1.25em}.ea-color-picker__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-color-picker__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__clear:disabled{cursor:default;opacity:.5}.ea-color-picker__clear{z-index:1;position:absolute;top:50%;inset-inline-end:var(--space-2);transform:translateY(-50%)}.ea-color-picker__swatch{position:relative;overflow:hidden;flex-shrink:0;width:1.125em;height:1.125em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);forced-color-adjust:none}.ea-color-picker__swatch--lg{width:2.5em;height:2.5em;border-radius:var(--radius-md)}.ea-color-picker__swatch-fill{position:absolute;inset:0;display:block;background-color:var(--color-bg-base);background-image:linear-gradient(var(--_ea-swatch-color, transparent),var(--_ea-swatch-color, transparent)),linear-gradient(45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(-45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--color-neutral-200) 75%),linear-gradient(-45deg,transparent 75%,var(--color-neutral-200) 75%);background-size:100% 100%,8px 8px,8px 8px,8px 8px,8px 8px;background-position:0 0,0 0,0 4px,4px -4px,-4px 0;forced-color-adjust:none}.ea-color-picker__popover{display:flex;flex-direction:column;gap:.75em;width:17.5em;padding:.75em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-color-picker-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-color-picker__popover{border:1px solid CanvasText}}.ea-color-picker__popover--2xs{font-size:var(--font-size-2xs)}.ea-color-picker__popover--xs{font-size:var(--font-size-xs)}.ea-color-picker__popover--sm{font-size:var(--font-size-sm)}.ea-color-picker__popover--md{font-size:var(--font-size-md)}.ea-color-picker__popover--lg{font-size:var(--font-size-lg)}.ea-color-picker__popover--xl{font-size:var(--font-size-xl)}.ea-color-picker__sv-area{position:relative;overflow:hidden;width:100%;height:10em;border-radius:var(--radius-sm);cursor:crosshair;forced-color-adjust:none;touch-action:none}.ea-color-picker__sv-area:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__sv-area:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__sv-area-sat{position:absolute;inset:0;background:linear-gradient(to right,var(--color-picker-sv-white),transparent);forced-color-adjust:none}.ea-color-picker__sv-area-val{position:absolute;inset:0;background:linear-gradient(to top,var(--color-picker-sv-black),transparent);forced-color-adjust:none}.ea-color-picker__sv-pointer{position:absolute;z-index:1;width:.875em;height:.875em;border:2px solid var(--color-neutral-0);border-radius:var(--radius-full);box-shadow:0 0 0 1px var(--color-picker-thumb-halo);pointer-events:none;transform:translate(-50%,-50%)}.ea-color-picker__sv-status{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-color-picker__slider-row{display:flex;align-items:center;gap:.5em}.ea-color-picker__strip-stack{display:flex;flex-direction:column;flex:1;gap:.5em}.ea-color-picker__strip{position:relative;width:100%;height:.75em;border-radius:var(--radius-full);cursor:pointer;forced-color-adjust:none;touch-action:none}.ea-color-picker__strip:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__strip:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__strip--hue{background:linear-gradient(to right,var(--color-picker-hue-red) 0%,var(--color-picker-hue-yellow) 17%,var(--color-picker-hue-green) 33%,var(--color-picker-hue-cyan) 50%,var(--color-picker-hue-blue) 67%,var(--color-picker-hue-magenta) 83%,var(--color-picker-hue-red) 100%)}.ea-color-picker__strip--alpha{background-color:var(--color-bg-base);background-image:linear-gradient(to right,transparent 0%,var(--ea-color-picker-alpha-base, currentcolor) 100%),linear-gradient(45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(-45deg,var(--color-neutral-200) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--color-neutral-200) 75%),linear-gradient(-45deg,transparent 75%,var(--color-neutral-200) 75%);background-size:100% 100%,8px 8px,8px 8px,8px 8px,8px 8px;background-position:0 0,0 0,0 4px,4px -4px,-4px 0}.ea-color-picker__strip-thumb{position:absolute;top:50%;width:.875em;height:.875em;border:2px solid var(--color-neutral-0);border-radius:var(--radius-full);box-shadow:0 0 0 1px var(--color-picker-thumb-halo);pointer-events:none;transform:translate(-50%,-50%)}.ea-color-picker__inputs{display:flex;align-items:end;gap:.25em}.ea-color-picker__input-group{display:flex;flex:1;flex-direction:column;gap:.25em;min-width:0;text-align:center}.ea-color-picker__input-group--hex{flex:1}.ea-color-picker__format-toggle{flex-shrink:0;min-width:5.2em;padding:.4em .8em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);font-family:var(--font-family-sans);font-size:.625em;font-weight:var(--font-weight-medium);letter-spacing:.04em;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-color-picker__format-toggle:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__format-toggle:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__format-toggle:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__input-label{font-size:.625em;font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-tertiary)}.ea-color-picker__input{width:100%;min-width:0;padding:.375em .5em;background-color:var(--color-bg-base);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);font-family:var(--font-family-mono);font-size:.75em;text-align:center;color:var(--color-text-primary)}.ea-color-picker__input:focus-visible{outline:none;border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__input:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__input--num{appearance:textfield}.ea-color-picker__input--num::-webkit-outer-spin-button,.ea-color-picker__input--num::-webkit-inner-spin-button{appearance:none;margin:0}.ea-color-picker__tools{display:flex;justify-content:flex-start}.ea-color-picker__tool-btn{display:inline-flex;align-items:center;gap:.5em;padding:.375em .75em;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);background-color:var(--color-bg-base);font-family:var(--font-family-sans);font-size:.75em;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}.ea-color-picker__tool-btn:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-color-picker__tool-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__tool-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__tool-btn ea-icon-droplet{width:.875em;height:.875em}.ea-color-picker__presets{display:flex;flex-direction:column;gap:.375em;padding-top:.5em;border-top:var(--border-width-thin) solid var(--color-border-default)}.ea-color-picker__presets-label{font-size:.625em;font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-tertiary)}.ea-color-picker__presets-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:.25em}.ea-color-picker__preset{width:100%;aspect-ratio:1;padding:0;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-sm);cursor:pointer;forced-color-adjust:none;transition:transform var(--duration-fast) var(--ease-out)}.ea-color-picker__preset:hover{transform:scale(1.1)}.ea-color-picker__preset:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-color-picker__preset:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-color-picker__preset[aria-selected=true]{box-shadow:0 0 0 2px var(--color-brand-default)}\n"]
11551
12688
  }]
11552
12689
  }],
11553
12690
  propDecorators: {
@@ -18083,6 +19220,1094 @@ function roundTo(value, digits) {
18083
19220
  const factor = 10 ** digits;
18084
19221
  return (Math.round(value * factor) / factor).toString();
18085
19222
  }
19223
+ const EDGE_INSET = 8;
19224
+ const DRAG_THRESHOLD = 4;
19225
+ const WHEEL_LINE_PX = 16;
19226
+ const ZOOM_RATE = .01;
19227
+ function valueBetween(a, b, position, curve) {
19228
+ if (curve === "step") return position < (a.position + b.position) / 2 ? a.value : b.value;
19229
+ return a.value + (b.value - a.value) * (position - a.position) / (b.position - a.position);
19230
+ }
19231
+ function linearPath(points) {
19232
+ return points.map((p, i) => `${i ? "L" : "M"}${p.x},${p.y}`).join("");
19233
+ }
19234
+ function stepPath(points) {
19235
+ let d = `M${points[0].x},${points[0].y}`;
19236
+ for (let i = 1; i < points.length; i++) {
19237
+ const mid = (points[i - 1].x + points[i].x) / 2;
19238
+ d += `H${mid}V${points[i].y}H${points[i].x}`;
19239
+ }
19240
+ return d;
19241
+ }
19242
+ function smoothPath(points) {
19243
+ const n = points.length;
19244
+ if (n < 3) return linearPath(points);
19245
+ const slopes = [];
19246
+ for (let i = 0; i < n - 1; i++) slopes.push((points[i + 1].y - points[i].y) / (points[i + 1].x - points[i].x));
19247
+ const tangents = [slopes[0]];
19248
+ for (let i = 1; i < n - 1; i++) tangents.push(slopes[i - 1] * slopes[i] <= 0 ? 0 : (slopes[i - 1] + slopes[i]) / 2);
19249
+ tangents.push(slopes[n - 2]);
19250
+ for (let i = 0; i < n - 1; i++) {
19251
+ if (slopes[i] === 0) {
19252
+ tangents[i] = 0;
19253
+ tangents[i + 1] = 0;
19254
+ continue;
19255
+ }
19256
+ const a = tangents[i] / slopes[i];
19257
+ const b = tangents[i + 1] / slopes[i];
19258
+ const s = a * a + b * b;
19259
+ if (s > 9) {
19260
+ const k = 3 / Math.sqrt(s);
19261
+ tangents[i] = k * a * slopes[i];
19262
+ tangents[i + 1] = k * b * slopes[i];
19263
+ }
19264
+ }
19265
+ let d = `M${points[0].x},${points[0].y}`;
19266
+ for (let i = 0; i < n - 1; i++) {
19267
+ const p = points[i];
19268
+ const q = points[i + 1];
19269
+ const third = (q.x - p.x) / 3;
19270
+ d += `C${p.x + third},${p.y + tangents[i] * third},${q.x - third},${q.y - tangents[i + 1] * third},${q.x},${q.y}`;
19271
+ }
19272
+ return d;
19273
+ }
19274
+ const CURVES = {
19275
+ linear: linearPath,
19276
+ smooth: smoothPath,
19277
+ step: stepPath
19278
+ };
19279
+ let nextId = 0;
19280
+ var LineChartComponent = class LineChartComponent {
19281
+ i18n = inject(EagamiI18nService);
19282
+ labels = input([], ...ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []);
19283
+ series = input([], ...ngDevMode ? [{ debugName: "series" }] : /* istanbul ignore next */ []);
19284
+ xValues = input(null, ...ngDevMode ? [{ debugName: "xValues" }] : /* istanbul ignore next */ []);
19285
+ xTicks = input(null, ...ngDevMode ? [{ debugName: "xTicks" }] : /* istanbul ignore next */ []);
19286
+ visibleXSpan = input(null, ...ngDevMode ? [{ debugName: "visibleXSpan" }] : /* istanbul ignore next */ []);
19287
+ curve = input("linear", ...ngDevMode ? [{ debugName: "curve" }] : /* istanbul ignore next */ []);
19288
+ showArea = input(false, ...ngDevMode ? [{ debugName: "showArea" }] : /* istanbul ignore next */ []);
19289
+ showPoints = input(true, ...ngDevMode ? [{ debugName: "showPoints" }] : /* istanbul ignore next */ []);
19290
+ showGrid = input(true, ...ngDevMode ? [{ debugName: "showGrid" }] : /* istanbul ignore next */ []);
19291
+ showLegend = input(true, ...ngDevMode ? [{ debugName: "showLegend" }] : /* istanbul ignore next */ []);
19292
+ yMin = input(void 0, ...ngDevMode ? [{ debugName: "yMin" }] : /* istanbul ignore next */ []);
19293
+ yMax = input(void 0, ...ngDevMode ? [{ debugName: "yMax" }] : /* istanbul ignore next */ []);
19294
+ xLabelOrientation = input("horizontal", ...ngDevMode ? [{ debugName: "xLabelOrientation" }] : /* istanbul ignore next */ []);
19295
+ showAxisBreak = input(false, ...ngDevMode ? [{ debugName: "showAxisBreak" }] : /* istanbul ignore next */ []);
19296
+ height = input(240, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
19297
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
19298
+ animation = input("draw", ...ngDevMode ? [{ debugName: "animation" }] : /* istanbul ignore next */ []);
19299
+ animationDuration = input(600, ...ngDevMode ? [{ debugName: "animationDuration" }] : /* istanbul ignore next */ []);
19300
+ formatValue = input(null, ...ngDevMode ? [{ debugName: "formatValue" }] : /* istanbul ignore next */ []);
19301
+ ariaLabel = input(void 0, {
19302
+ ...ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {},
19303
+ alias: "aria-label"
19304
+ });
19305
+ pointClick = output();
19306
+ activePointChange = output();
19307
+ visibleRangeChange = output();
19308
+ viewport = injectChartViewport(this.size);
19309
+ format = injectChartFormatter(this.formatValue);
19310
+ active = signal(null, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
19311
+ clipId = `ea-line-chart-clip-${nextId++}`;
19312
+ breakMaskId = `${this.clipId}-break`;
19313
+ panEnd = linkedSignal(() => {
19314
+ this.xValues();
19315
+ this.series();
19316
+ this.visibleXSpan();
19317
+ return null;
19318
+ }, ...ngDevMode ? [{ debugName: "panEnd" }] : /* istanbul ignore next */ []);
19319
+ zoomSpan = linkedSignal(() => this.visibleXSpan(), ...ngDevMode ? [{ debugName: "zoomSpan" }] : /* istanbul ignore next */ []);
19320
+ gestureSpan = null;
19321
+ panning = signal(false, ...ngDevMode ? [{ debugName: "panning" }] : /* istanbul ignore next */ []);
19322
+ drag = null;
19323
+ suppressClick = false;
19324
+ label = computed(() => this.ariaLabel() || this.i18n.messages().chart.lineChart, ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
19325
+ count = computed(() => Math.max(this.labels().length, ...this.series().map((s) => s.data.length), 0), ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
19326
+ hasData = computed(() => this.series().some((s) => s.data.some((v) => this.isValue(v))), ...ngDevMode ? [{ debugName: "hasData" }] : /* istanbul ignore next */ []);
19327
+ positions = computed(() => {
19328
+ const xValues = this.xValues();
19329
+ return Array.from({ length: this.count() }, (_, i) => xValues ? xValues[i] ?? NaN : i);
19330
+ }, ...ngDevMode ? [{ debugName: "positions" }] : /* istanbul ignore next */ []);
19331
+ domain = computed(() => {
19332
+ const known = [...this.positions(), ...this.xTicks()?.map((t) => t.value) ?? []].filter((p) => isFinite(p));
19333
+ const first = known.length ? Math.min(...known) : 0;
19334
+ const last = known.length ? Math.max(...known) : 0;
19335
+ const span = this.zoomSpan();
19336
+ if (span == null || !(span > 0) || last - first <= span) return {
19337
+ first,
19338
+ last,
19339
+ start: first,
19340
+ end: last,
19341
+ span: null
19342
+ };
19343
+ const end = clamp$1(this.panEnd() ?? last, first + span, last);
19344
+ return {
19345
+ first,
19346
+ last,
19347
+ start: end - span,
19348
+ end,
19349
+ span
19350
+ };
19351
+ }, ...ngDevMode ? [{ debugName: "domain" }] : /* istanbul ignore next */ []);
19352
+ windowed = computed(() => this.domain().span != null, ...ngDevMode ? [{ debugName: "windowed" }] : /* istanbul ignore next */ []);
19353
+ renderPass = computed(() => {
19354
+ this.labels();
19355
+ this.series();
19356
+ this.xValues();
19357
+ this.animation();
19358
+ this.animationDuration();
19359
+ return [{}];
19360
+ }, ...ngDevMode ? [{ debugName: "renderPass" }] : /* istanbul ignore next */ []);
19361
+ hostClasses = computed(() => ({
19362
+ [`ea-line-chart--${this.size()}`]: true,
19363
+ [`ea-line-chart--animate-${this.animation()}`]: true,
19364
+ "ea-line-chart--pannable": this.windowed(),
19365
+ "ea-line-chart--panning": this.panning()
19366
+ }), ...ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []);
19367
+ runs = computed(() => {
19368
+ const positions = this.positions();
19369
+ return this.series().map((s) => {
19370
+ const runs = [];
19371
+ let run = [];
19372
+ positions.forEach((position, index) => {
19373
+ const value = s.data[index];
19374
+ if (!this.isValue(value) || !isFinite(position)) {
19375
+ if (run.length) runs.push(run);
19376
+ run = [];
19377
+ return;
19378
+ }
19379
+ run.push({
19380
+ index,
19381
+ position,
19382
+ value
19383
+ });
19384
+ });
19385
+ if (run.length) runs.push(run);
19386
+ return runs;
19387
+ });
19388
+ }, ...ngDevMode ? [{ debugName: "runs" }] : /* istanbul ignore next */ []);
19389
+ visibleValues = computed(() => {
19390
+ const runs = this.runs().flat();
19391
+ const domain = this.domain();
19392
+ if (domain.span == null) return runs.flatMap((run) => run.map((p) => p.value));
19393
+ const curve = this.curve();
19394
+ const values = [];
19395
+ for (const run of runs) run.forEach((point, i) => {
19396
+ if (point.position >= domain.start && point.position <= domain.end) values.push(point.value);
19397
+ const next = run[i + 1];
19398
+ for (const edge of next ? [domain.start, domain.end] : []) if (point.position < edge && next.position > edge) values.push(valueBetween(point, next, edge, curve));
19399
+ });
19400
+ return values;
19401
+ }, ...ngDevMode ? [{ debugName: "visibleValues" }] : /* istanbul ignore next */ []);
19402
+ layout = computed(() => {
19403
+ const width = this.viewport.width();
19404
+ const height = this.height();
19405
+ const axisPx = this.viewport.fontSize() * .75;
19406
+ const orientation = this.xLabelOrientation();
19407
+ const fixedAngle = orientation === "auto" ? 0 : CHART_LABEL_ANGLES[orientation];
19408
+ const plot = this.plotArea(width, height, axisPx, fixedAngle);
19409
+ const angle = orientation === "auto" ? [
19410
+ 0,
19411
+ 45,
19412
+ 90
19413
+ ].find((a) => this.labelsFit(plot.candidates, a, axisPx)) ?? 90 : fixedAngle;
19414
+ const { plotHeight, min, max, tickTexts, left, plotWidth, x, xLabels } = angle === fixedAngle ? plot : this.plotArea(width, height, axisPx, angle);
19415
+ const top = axisPx;
19416
+ const y = (v) => top + (1 - (clamp$1(v, min, max) - min) / (max - min || 1)) * plotHeight;
19417
+ const baselineY = y(clamp$1(0, min, max));
19418
+ const breakY = this.showAxisBreak() && min > 0 ? top + plotHeight - axisPx * BREAK_HEIGHT : null;
19419
+ const axisY = top + plotHeight;
19420
+ const curve = CURVES[this.curve()];
19421
+ const series = this.series().map((s, seriesIndex) => {
19422
+ const runs = this.runs()[seriesIndex].map((run) => run.map((p) => ({
19423
+ x: x(p.index),
19424
+ y: y(p.value),
19425
+ index: p.index,
19426
+ value: p.value
19427
+ })));
19428
+ return {
19429
+ name: s.name,
19430
+ color: chartColor(seriesIndex, s.color),
19431
+ paths: runs.map(curve),
19432
+ areas: runs.map((seg) => `${curve(seg)}L${seg[seg.length - 1].x},${baselineY}L${seg[0].x},${baselineY}Z`),
19433
+ points: runs.flat()
19434
+ };
19435
+ });
19436
+ return {
19437
+ width,
19438
+ height,
19439
+ top,
19440
+ left,
19441
+ plotWidth,
19442
+ plotHeight,
19443
+ baselineY,
19444
+ windowed: this.domain().span != null,
19445
+ axisBreak: breakY == null ? null : axisBreak(left, top, axisY, breakY, axisPx),
19446
+ axisY,
19447
+ tickEndY: axisY + tickLength(axisPx),
19448
+ labelAngle: angle,
19449
+ labelY: labelLine(axisY, angle, axisPx),
19450
+ tickX: left - axisPx / 2,
19451
+ ticks: tickTexts.map((t) => ({
19452
+ ...t,
19453
+ y: y(t.value)
19454
+ })).filter((t) => breakY == null || t.y < breakY - axisPx),
19455
+ xLabels,
19456
+ series,
19457
+ x,
19458
+ y
19459
+ };
19460
+ }, ...ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []);
19461
+ plotArea(width, height, axisPx, angle) {
19462
+ const format = this.format();
19463
+ const domain = this.domain();
19464
+ const windowed = domain.span != null;
19465
+ const top = axisPx;
19466
+ const bottom = labelBand(this.widestXLabel(axisPx), angle, axisPx, height);
19467
+ const plotHeight = Math.max(1, height - top - bottom);
19468
+ const maxTicks = Math.max(2, Math.floor(plotHeight / (axisPx * 3)));
19469
+ const { min, max, ticks } = this.yScale(this.visibleValues(), plotHeight, axisPx, maxTicks);
19470
+ const tickTexts = ticks.map((value) => ({
19471
+ value,
19472
+ text: format(value)
19473
+ }));
19474
+ const gutterTexts = [...tickTexts.map((t) => t.text), ...windowed ? this.yScale(this.runs().flatMap((runs) => runs.flat().map((p) => p.value)), plotHeight, axisPx, maxTicks).ticks.map(format) : []];
19475
+ const left = Math.max(0, ...gutterTexts.map((t) => estimateTextWidth(t, axisPx))) + axisPx;
19476
+ const positions = this.positions();
19477
+ const xAxis = (right) => {
19478
+ const plotWidth = Math.max(1, width - left - right);
19479
+ const at = this.atPosition(domain, left, plotWidth);
19480
+ const x = (i) => at(positions[i]);
19481
+ return {
19482
+ plotWidth,
19483
+ x,
19484
+ xLabels: this.xLabels(domain, at, x, plotWidth, axisPx, angle),
19485
+ candidates: this.xLabelCandidates(domain, at, x)
19486
+ };
19487
+ };
19488
+ const axis = xAxis(axisPx / 2);
19489
+ const xLabels = axis.xLabels.map((label) => {
19490
+ if (angle) return {
19491
+ ...label,
19492
+ textX: label.x
19493
+ };
19494
+ const half = estimateTextWidth(label.text, axisPx) / 2;
19495
+ return {
19496
+ ...label,
19497
+ textX: clamp$1(label.x, half, width - half)
19498
+ };
19499
+ });
19500
+ return {
19501
+ plotHeight,
19502
+ min,
19503
+ max,
19504
+ tickTexts,
19505
+ left,
19506
+ ...axis,
19507
+ xLabels
19508
+ };
19509
+ }
19510
+ tooltip = computed(() => {
19511
+ const active = this.active();
19512
+ if (!active) return null;
19513
+ const layout = this.layout();
19514
+ const x = layout.x(active.index);
19515
+ const activeValue = this.series()[active.series]?.data[active.index];
19516
+ const rows = this.series().map((s, i) => {
19517
+ const value = s.data[active.index];
19518
+ return {
19519
+ name: s.name,
19520
+ color: chartColor(i, s.color),
19521
+ value: this.tableValue(value),
19522
+ active: i === active.series
19523
+ };
19524
+ });
19525
+ return {
19526
+ x,
19527
+ y: this.isValue(activeValue) ? layout.y(activeValue) : layout.top,
19528
+ title: this.labels()[active.index] ?? "",
19529
+ rows,
19530
+ key: `${active.series}-${active.index}`
19531
+ };
19532
+ }, ...ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []);
19533
+ tooltips = computed(() => {
19534
+ const tip = this.tooltip();
19535
+ return tip ? [tip] : [];
19536
+ }, ...ngDevMode ? [{ debugName: "tooltips" }] : /* istanbul ignore next */ []);
19537
+ announcement = computed(() => {
19538
+ const event = this.eventFor(this.active());
19539
+ return event ? this.i18n.messages().chart.point(event.seriesName, event.label, this.format()(event.value)) : "";
19540
+ }, ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
19541
+ showsLegend = computed(() => this.showLegend() && this.series().length > 1, ...ngDevMode ? [{ debugName: "showsLegend" }] : /* istanbul ignore next */ []);
19542
+ seriesColor(index) {
19543
+ return chartColor(index, this.series()[index]?.color);
19544
+ }
19545
+ isDimmed(index) {
19546
+ const active = this.active();
19547
+ return !!active && active.series !== index && this.series().length > 1;
19548
+ }
19549
+ isActivePoint(seriesIndex, index) {
19550
+ const active = this.active();
19551
+ return !!active && active.series === seriesIndex && active.index === index;
19552
+ }
19553
+ tableValue(value) {
19554
+ return this.isValue(value) ? this.format()(value) : "–";
19555
+ }
19556
+ onPointerDown(event) {
19557
+ this.suppressClick = false;
19558
+ const domain = this.domain();
19559
+ if (domain.span != null && event.button === 0) this.drag = {
19560
+ pointerId: event.pointerId,
19561
+ x: event.clientX,
19562
+ end: domain.end,
19563
+ moved: false
19564
+ };
19565
+ this.onPointerMove(event);
19566
+ }
19567
+ onPointerMove(event) {
19568
+ if (this.drag && event.buttons === 0) this.endDrag();
19569
+ const drag = this.drag;
19570
+ if (drag && drag.pointerId === event.pointerId) {
19571
+ const dx = event.clientX - drag.x;
19572
+ if (drag.moved || Math.abs(dx) >= DRAG_THRESHOLD) {
19573
+ if (!drag.moved) {
19574
+ drag.moved = true;
19575
+ this.panning.set(true);
19576
+ this.setActive(null);
19577
+ event.currentTarget.setPointerCapture?.(event.pointerId);
19578
+ }
19579
+ this.panTo(drag.end - dx * this.unitsPerPx());
19580
+ return;
19581
+ }
19582
+ }
19583
+ const rect = event.currentTarget.getBoundingClientRect();
19584
+ const index = this.indexAt(event.clientX - rect.left);
19585
+ const py = event.clientY - rect.top;
19586
+ const layout = this.layout();
19587
+ let series = -1;
19588
+ let nearest = Infinity;
19589
+ this.series().forEach((_, i) => {
19590
+ const value = this.valueAt(i, index);
19591
+ if (value == null) return;
19592
+ const distance = Math.abs(layout.y(value) - py);
19593
+ if (distance < nearest) {
19594
+ nearest = distance;
19595
+ series = i;
19596
+ }
19597
+ });
19598
+ this.setActive(series === -1 ? null : {
19599
+ series,
19600
+ index
19601
+ });
19602
+ }
19603
+ onPointerUp(event) {
19604
+ if (this.drag?.pointerId === event.pointerId) {
19605
+ this.suppressClick = this.drag.moved;
19606
+ this.endDrag();
19607
+ }
19608
+ }
19609
+ onPointerLeave() {
19610
+ if (!this.drag?.moved) this.setActive(null);
19611
+ }
19612
+ onWheel(event) {
19613
+ if (event.ctrlKey && event.deltaY && this.visibleXSpan() != null) {
19614
+ event.preventDefault();
19615
+ const { start, end } = this.domain();
19616
+ this.zoomTo((end - start) * Math.exp(event.deltaY * ZOOM_RATE), {
19617
+ clientX: event.clientX,
19618
+ currentTarget: event.currentTarget
19619
+ });
19620
+ return;
19621
+ }
19622
+ const domain = this.domain();
19623
+ if (domain.span == null) return;
19624
+ const delta = Math.abs(event.deltaX) > Math.abs(event.deltaY) ? event.deltaX : event.shiftKey ? event.deltaY : 0;
19625
+ if (!delta) return;
19626
+ event.preventDefault();
19627
+ const unit = event.deltaMode === WheelEvent.DOM_DELTA_LINE ? WHEEL_LINE_PX : event.deltaMode === WheelEvent.DOM_DELTA_PAGE ? this.layout().plotWidth : 1;
19628
+ this.setActive(null);
19629
+ this.panTo(domain.end + delta * unit * this.unitsPerPx());
19630
+ }
19631
+ onClick() {
19632
+ if (this.suppressClick) {
19633
+ this.suppressClick = false;
19634
+ return;
19635
+ }
19636
+ const event = this.eventFor(this.active());
19637
+ if (event) this.pointClick.emit(event);
19638
+ }
19639
+ onFocus() {
19640
+ if (!this.active()) this.setActive(this.firstPoint());
19641
+ }
19642
+ onBlur() {
19643
+ this.setActive(null);
19644
+ }
19645
+ onKeydown(event) {
19646
+ if (!this.active() && event.key.startsWith("Arrow")) {
19647
+ event.preventDefault();
19648
+ this.setActive(this.firstPoint());
19649
+ return;
19650
+ }
19651
+ const active = this.active() ?? this.firstPoint();
19652
+ if (!active) return;
19653
+ const count = this.count();
19654
+ const seriesCount = this.series().length;
19655
+ let next = active;
19656
+ switch (event.key) {
19657
+ case "ArrowRight":
19658
+ next = this.nearestValid(active.series, active.index + 1, 1);
19659
+ break;
19660
+ case "ArrowLeft":
19661
+ next = this.nearestValid(active.series, active.index - 1, -1);
19662
+ break;
19663
+ case "Home":
19664
+ next = this.nearestValid(active.series, 0, 1);
19665
+ break;
19666
+ case "End":
19667
+ next = this.nearestValid(active.series, count - 1, -1);
19668
+ break;
19669
+ case "ArrowUp":
19670
+ case "ArrowDown": {
19671
+ const step = event.key === "ArrowDown" ? 1 : -1;
19672
+ for (let hop = 1; hop < seriesCount; hop++) {
19673
+ const series = (active.series + step * hop + seriesCount) % seriesCount;
19674
+ if (this.valueAt(series, active.index) != null) {
19675
+ next = {
19676
+ series,
19677
+ index: active.index
19678
+ };
19679
+ break;
19680
+ }
19681
+ }
19682
+ break;
19683
+ }
19684
+ case "Enter":
19685
+ case " ":
19686
+ this.onClick();
19687
+ break;
19688
+ case "Escape":
19689
+ next = null;
19690
+ break;
19691
+ default: return;
19692
+ }
19693
+ event.preventDefault();
19694
+ const target = next ?? (event.key === "Escape" ? null : active);
19695
+ if (target) this.reveal(target.index);
19696
+ this.setActive(target);
19697
+ }
19698
+ isValue(value) {
19699
+ return value != null && isFinite(value);
19700
+ }
19701
+ yScale(values, plotHeight, axisPx, maxTicks) {
19702
+ const yMin = this.yMin();
19703
+ const yMax = this.yMax();
19704
+ const dataMin = Math.min(...values);
19705
+ const dataMax = Math.max(...values);
19706
+ let lo = yMin ?? dataMin;
19707
+ let hi = yMax ?? dataMax;
19708
+ const zeroFloor = this.showArea() && yMin === void 0 && !(dataMin < 0);
19709
+ if (zeroFloor) lo = Math.min(lo, 0);
19710
+ if (lo > hi) [lo, hi] = [hi, lo];
19711
+ const clearance = axisPx;
19712
+ const breakClearance = axisPx * 6;
19713
+ const derivedFloor = yMin === void 0 && !zeroFloor && dataMin > 0;
19714
+ if (this.windowed() && isFinite(lo) && isFinite(hi)) {
19715
+ const spread = hi - lo || Math.abs(hi) || 1;
19716
+ const pad = clearance * spread / Math.max(1, plotHeight - 2 * clearance);
19717
+ const breakPad = breakClearance * spread / Math.max(1, plotHeight - clearance - breakClearance);
19718
+ const min = yMin ?? (zeroFloor ? lo : derivedFloor ? Math.max(0, lo - breakPad) : lo - pad);
19719
+ const max = yMax ?? hi + pad;
19720
+ return {
19721
+ min,
19722
+ max,
19723
+ ticks: niceScale(min, max, maxTicks).ticks.filter((t) => t >= min && t <= max)
19724
+ };
19725
+ }
19726
+ const scale = niceScale(lo, hi, maxTicks);
19727
+ const step = scale.ticks[1] - scale.ticks[0];
19728
+ const ticks = [...scale.ticks];
19729
+ let min = yMin ?? scale.min;
19730
+ let max = yMax ?? scale.max;
19731
+ if (min > max) [min, max] = [max, min];
19732
+ const px = (value) => value / (max - min || 1) * plotHeight;
19733
+ const lowTight = () => yMin === void 0 && !zeroFloor && px(dataMin - min) < (derivedFloor && min > 0 ? breakClearance : clearance);
19734
+ const highTight = yMax === void 0 && px(max - dataMax) < clearance;
19735
+ for (let steps = 0; steps < 6 && lowTight() && !(derivedFloor && min <= 0); steps++) {
19736
+ min = Number((min - step).toPrecision(12));
19737
+ ticks.unshift(min);
19738
+ }
19739
+ if (highTight) {
19740
+ max = Number((max + step).toPrecision(12));
19741
+ ticks.push(max);
19742
+ }
19743
+ return {
19744
+ min,
19745
+ max,
19746
+ ticks: ticks.filter((t) => t >= min && t <= max)
19747
+ };
19748
+ }
19749
+ atPosition(domain, left, plotWidth) {
19750
+ const inset = domain.span != null ? EDGE_INSET : 0;
19751
+ const inner = Math.max(1, plotWidth - 2 * inset);
19752
+ const extent = domain.end - domain.start;
19753
+ const scale = inner / extent;
19754
+ return (position) => extent > 0 ? left + inset + (position - domain.start) * scale : left + plotWidth / 2;
19755
+ }
19756
+ xLabelCandidates(domain, at, x) {
19757
+ const inView = (position) => position >= domain.start && position <= domain.end;
19758
+ const ticks = this.xTicks();
19759
+ if (ticks) return ticks.filter((t) => inView(t.value)).map((t) => ({
19760
+ key: t.value,
19761
+ text: t.label,
19762
+ x: at(t.value)
19763
+ }));
19764
+ const positions = this.positions();
19765
+ return positions.map((position, index) => ({
19766
+ key: index,
19767
+ text: this.labels()[index] ?? "",
19768
+ x: x(index)
19769
+ })).filter((l) => inView(positions[l.key]));
19770
+ }
19771
+ labelsFit(labels, angle, axisPx) {
19772
+ return labels.every((label, i) => i === 0 || label.x - labels[i - 1].x >= (labelRoom(label.text, angle, axisPx) + labelRoom(labels[i - 1].text, angle, axisPx)) / 2);
19773
+ }
19774
+ xLabels(domain, at, x, plotWidth, axisPx, angle) {
19775
+ const candidates = this.xLabelCandidates(domain, at, x);
19776
+ if (this.xTicks()) return candidates;
19777
+ const texts = this.positions().map((_, i) => this.labels()[i] ?? "");
19778
+ if (!this.xValues()) {
19779
+ const count = texts.length;
19780
+ const extent = domain.end - domain.start;
19781
+ const spacing = count > 1 ? (plotWidth - (domain.span != null ? 2 * EDGE_INSET : 0)) / extent : plotWidth;
19782
+ const room = Math.max(0, ...texts.map((t) => labelRoom(t, angle, axisPx)));
19783
+ const step = Math.max(1, Math.ceil(room / spacing));
19784
+ return candidates.filter((l) => l.key % step === 0);
19785
+ }
19786
+ const labels = [];
19787
+ let edge = -Infinity;
19788
+ for (const label of candidates) {
19789
+ const half = labelRoom(label.text, angle, axisPx) / 2;
19790
+ if (label.x - half >= edge) {
19791
+ labels.push(label);
19792
+ edge = label.x + half;
19793
+ }
19794
+ }
19795
+ return labels;
19796
+ }
19797
+ widestXLabel(axisPx) {
19798
+ const texts = this.xTicks()?.map((t) => t.label) ?? this.labels();
19799
+ return Math.max(0, ...texts.map((t) => estimateTextWidth(t, axisPx)));
19800
+ }
19801
+ onGestureStart(event) {
19802
+ if (this.visibleXSpan() == null) return;
19803
+ event.preventDefault();
19804
+ const { start, end } = this.domain();
19805
+ this.gestureSpan = end - start;
19806
+ }
19807
+ onGestureChange(event) {
19808
+ if (this.gestureSpan == null || !("scale" in event) || !("clientX" in event)) return;
19809
+ const { scale, clientX } = event;
19810
+ if (typeof scale !== "number" || typeof clientX !== "number" || !(scale > 0)) return;
19811
+ event.preventDefault();
19812
+ this.zoomTo(this.gestureSpan / scale, {
19813
+ clientX,
19814
+ currentTarget: event.currentTarget
19815
+ });
19816
+ }
19817
+ onGestureEnd() {
19818
+ this.gestureSpan = null;
19819
+ }
19820
+ zoomTo(span, { clientX, currentTarget }) {
19821
+ const domain = this.domain();
19822
+ const full = domain.last - domain.first;
19823
+ if (!(full > 0) || !(currentTarget instanceof Element)) return;
19824
+ const next = clamp$1(span, Math.min(this.minSpan(), full), full);
19825
+ const shown = domain.end - domain.start;
19826
+ const inset = domain.span != null ? EDGE_INSET : 0;
19827
+ const { left, plotWidth } = this.layout();
19828
+ const ratio = clamp$1((clientX - currentTarget.getBoundingClientRect().left - left - inset) / Math.max(1, plotWidth - 2 * inset), 0, 1);
19829
+ const end = clamp$1(domain.start + ratio * shown + (1 - ratio) * next, domain.first + next, domain.last);
19830
+ this.setActive(null);
19831
+ this.zoomSpan.set(next);
19832
+ this.panEnd.set(end);
19833
+ this.visibleRangeChange.emit({
19834
+ start: end - next,
19835
+ end
19836
+ });
19837
+ }
19838
+ minSpan() {
19839
+ const known = this.positions().filter((p) => isFinite(p)).sort((a, b) => a - b);
19840
+ const gaps = known.slice(1).map((p, i) => p - known[i]).filter((gap) => gap > 0);
19841
+ return gaps.length ? Math.min(...gaps) * 2 : 1;
19842
+ }
19843
+ unitsPerPx() {
19844
+ return (this.domain().span ?? 0) / Math.max(1, this.layout().plotWidth - 2 * EDGE_INSET);
19845
+ }
19846
+ panTo(end) {
19847
+ const domain = this.domain();
19848
+ if (domain.span == null) return;
19849
+ const next = clamp$1(end, domain.first + domain.span, domain.last);
19850
+ if (next === domain.end) return;
19851
+ this.panEnd.set(next);
19852
+ this.visibleRangeChange.emit({
19853
+ start: next - domain.span,
19854
+ end: next
19855
+ });
19856
+ }
19857
+ endDrag() {
19858
+ this.drag = null;
19859
+ this.panning.set(false);
19860
+ }
19861
+ reveal(index) {
19862
+ const domain = this.domain();
19863
+ const position = this.positions()[index];
19864
+ if (domain.span == null) return;
19865
+ if (position < domain.start) this.panTo(position + domain.span);
19866
+ else if (position > domain.end) this.panTo(position);
19867
+ }
19868
+ indexAt(px) {
19869
+ const layout = this.layout();
19870
+ const count = this.count();
19871
+ const domain = this.domain();
19872
+ if (!this.xValues()) {
19873
+ if (count < 2) return 0;
19874
+ const inset = domain.span != null ? EDGE_INSET : 0;
19875
+ const inner = Math.max(1, layout.plotWidth - 2 * inset);
19876
+ return clamp$1(Math.round(domain.start + (px - layout.left - inset) / inner * (domain.end - domain.start)), Math.ceil(domain.start), Math.floor(domain.end));
19877
+ }
19878
+ const positions = this.positions();
19879
+ let best = -1;
19880
+ let nearest = Infinity;
19881
+ for (let index = 0; index < count; index++) {
19882
+ const position = positions[index];
19883
+ if (position < domain.start || position > domain.end || !this.series().some((_, s) => this.valueAt(s, index) != null)) continue;
19884
+ const distance = Math.abs(layout.x(index) - px);
19885
+ if (distance < nearest) {
19886
+ nearest = distance;
19887
+ best = index;
19888
+ }
19889
+ }
19890
+ return best;
19891
+ }
19892
+ valueAt(series, index) {
19893
+ const value = this.series()[series]?.data[index];
19894
+ return this.isValue(value) && isFinite(this.positions()[index]) ? value : null;
19895
+ }
19896
+ firstPoint() {
19897
+ const domain = this.domain();
19898
+ for (let index = 0; index < this.count(); index++) {
19899
+ if (this.positions()[index] < domain.start) continue;
19900
+ const series = this.series().findIndex((_, s) => this.valueAt(s, index) != null);
19901
+ if (series !== -1) return {
19902
+ series,
19903
+ index
19904
+ };
19905
+ }
19906
+ return null;
19907
+ }
19908
+ nearestValid(series, index, step) {
19909
+ for (let i = index; i >= 0 && i < this.count(); i += step) if (this.valueAt(series, i) != null) return {
19910
+ series,
19911
+ index: i
19912
+ };
19913
+ return null;
19914
+ }
19915
+ eventFor(active) {
19916
+ if (!active) return null;
19917
+ const value = this.valueAt(active.series, active.index);
19918
+ if (value == null) return null;
19919
+ return {
19920
+ seriesIndex: active.series,
19921
+ seriesName: this.series()[active.series].name,
19922
+ index: active.index,
19923
+ label: this.labels()[active.index] ?? "",
19924
+ value
19925
+ };
19926
+ }
19927
+ setActive(next) {
19928
+ const current = this.active();
19929
+ if (current?.series === next?.series && current?.index === next?.index) return;
19930
+ this.active.set(next);
19931
+ this.activePointChange.emit(this.eventFor(next));
19932
+ }
19933
+ static ɵfac = i0.ɵɵngDeclareFactory({
19934
+ minVersion: "12.0.0",
19935
+ version: "22.2.0",
19936
+ ngImport: i0,
19937
+ type: LineChartComponent,
19938
+ deps: [],
19939
+ target: i0.ɵɵFactoryTarget.Component
19940
+ });
19941
+ static ɵcmp = i0.ɵɵngDeclareComponent({
19942
+ minVersion: "17.0.0",
19943
+ version: "22.2.0",
19944
+ type: LineChartComponent,
19945
+ isStandalone: true,
19946
+ selector: "ea-line-chart",
19947
+ inputs: {
19948
+ labels: {
19949
+ classPropertyName: "labels",
19950
+ publicName: "labels",
19951
+ isSignal: true,
19952
+ isRequired: false,
19953
+ transformFunction: null
19954
+ },
19955
+ series: {
19956
+ classPropertyName: "series",
19957
+ publicName: "series",
19958
+ isSignal: true,
19959
+ isRequired: false,
19960
+ transformFunction: null
19961
+ },
19962
+ xValues: {
19963
+ classPropertyName: "xValues",
19964
+ publicName: "xValues",
19965
+ isSignal: true,
19966
+ isRequired: false,
19967
+ transformFunction: null
19968
+ },
19969
+ xTicks: {
19970
+ classPropertyName: "xTicks",
19971
+ publicName: "xTicks",
19972
+ isSignal: true,
19973
+ isRequired: false,
19974
+ transformFunction: null
19975
+ },
19976
+ visibleXSpan: {
19977
+ classPropertyName: "visibleXSpan",
19978
+ publicName: "visibleXSpan",
19979
+ isSignal: true,
19980
+ isRequired: false,
19981
+ transformFunction: null
19982
+ },
19983
+ curve: {
19984
+ classPropertyName: "curve",
19985
+ publicName: "curve",
19986
+ isSignal: true,
19987
+ isRequired: false,
19988
+ transformFunction: null
19989
+ },
19990
+ showArea: {
19991
+ classPropertyName: "showArea",
19992
+ publicName: "showArea",
19993
+ isSignal: true,
19994
+ isRequired: false,
19995
+ transformFunction: null
19996
+ },
19997
+ showPoints: {
19998
+ classPropertyName: "showPoints",
19999
+ publicName: "showPoints",
20000
+ isSignal: true,
20001
+ isRequired: false,
20002
+ transformFunction: null
20003
+ },
20004
+ showGrid: {
20005
+ classPropertyName: "showGrid",
20006
+ publicName: "showGrid",
20007
+ isSignal: true,
20008
+ isRequired: false,
20009
+ transformFunction: null
20010
+ },
20011
+ showLegend: {
20012
+ classPropertyName: "showLegend",
20013
+ publicName: "showLegend",
20014
+ isSignal: true,
20015
+ isRequired: false,
20016
+ transformFunction: null
20017
+ },
20018
+ yMin: {
20019
+ classPropertyName: "yMin",
20020
+ publicName: "yMin",
20021
+ isSignal: true,
20022
+ isRequired: false,
20023
+ transformFunction: null
20024
+ },
20025
+ yMax: {
20026
+ classPropertyName: "yMax",
20027
+ publicName: "yMax",
20028
+ isSignal: true,
20029
+ isRequired: false,
20030
+ transformFunction: null
20031
+ },
20032
+ xLabelOrientation: {
20033
+ classPropertyName: "xLabelOrientation",
20034
+ publicName: "xLabelOrientation",
20035
+ isSignal: true,
20036
+ isRequired: false,
20037
+ transformFunction: null
20038
+ },
20039
+ showAxisBreak: {
20040
+ classPropertyName: "showAxisBreak",
20041
+ publicName: "showAxisBreak",
20042
+ isSignal: true,
20043
+ isRequired: false,
20044
+ transformFunction: null
20045
+ },
20046
+ height: {
20047
+ classPropertyName: "height",
20048
+ publicName: "height",
20049
+ isSignal: true,
20050
+ isRequired: false,
20051
+ transformFunction: null
20052
+ },
20053
+ size: {
20054
+ classPropertyName: "size",
20055
+ publicName: "size",
20056
+ isSignal: true,
20057
+ isRequired: false,
20058
+ transformFunction: null
20059
+ },
20060
+ animation: {
20061
+ classPropertyName: "animation",
20062
+ publicName: "animation",
20063
+ isSignal: true,
20064
+ isRequired: false,
20065
+ transformFunction: null
20066
+ },
20067
+ animationDuration: {
20068
+ classPropertyName: "animationDuration",
20069
+ publicName: "animationDuration",
20070
+ isSignal: true,
20071
+ isRequired: false,
20072
+ transformFunction: null
20073
+ },
20074
+ formatValue: {
20075
+ classPropertyName: "formatValue",
20076
+ publicName: "formatValue",
20077
+ isSignal: true,
20078
+ isRequired: false,
20079
+ transformFunction: null
20080
+ },
20081
+ ariaLabel: {
20082
+ classPropertyName: "ariaLabel",
20083
+ publicName: "aria-label",
20084
+ isSignal: true,
20085
+ isRequired: false,
20086
+ transformFunction: null
20087
+ }
20088
+ },
20089
+ outputs: {
20090
+ pointClick: "pointClick",
20091
+ activePointChange: "activePointChange",
20092
+ visibleRangeChange: "visibleRangeChange"
20093
+ },
20094
+ ngImport: i0,
20095
+ template: "<div\n class=\"ea-line-chart\"\n [ngClass]=\"hostClasses()\"\n [style.--ea-chart-duration]=\"animationDuration() + 'ms'\">\n @if (hasData()) {\n <div\n class=\"ea-line-chart__plot\"\n role=\"group\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"i18n.messages().chart.roleDescription\"\n [attr.aria-label]=\"label()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\">\n @for (pass of renderPass(); track pass) {\n <svg\n class=\"ea-line-chart__svg\"\n aria-hidden=\"true\"\n [attr.width]=\"layout().width\"\n [attr.height]=\"layout().height\"\n [attr.viewBox]=\"'0 0 ' + layout().width + ' ' + layout().height\"\n [style.--ea-line-chart-baseline]=\"layout().baselineY + 'px'\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n (pointerleave)=\"onPointerLeave()\"\n (wheel)=\"onWheel($event)\"\n (gesturestart)=\"onGestureStart($event)\"\n (gesturechange)=\"onGestureChange($event)\"\n (gestureend)=\"onGestureEnd()\"\n (click)=\"onClick()\">\n @if (layout().windowed) {\n <defs>\n <clipPath [attr.id]=\"clipId\">\n <rect\n [attr.x]=\"layout().left\"\n y=\"0\"\n [attr.width]=\"layout().plotWidth\"\n [attr.height]=\"layout().height\" />\n </clipPath>\n </defs>\n }\n <rect\n class=\"ea-line-chart__hit\"\n [attr.x]=\"layout().left\"\n [attr.y]=\"layout().top\"\n [attr.width]=\"layout().plotWidth\"\n [attr.height]=\"layout().plotHeight\" />\n @for (tick of layout().ticks; track tick.value) {\n @if (showGrid()) {\n <line\n class=\"ea-line-chart__grid\"\n [attr.x1]=\"layout().left\"\n [attr.x2]=\"layout().left + layout().plotWidth\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\" />\n }\n <text\n class=\"ea-line-chart__axis ea-line-chart__axis--y\"\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n [attr.x]=\"layout().tickX\"\n [attr.y]=\"tick.y\">\n {{ tick.text }}\n </text>\n }\n <line\n class=\"ea-line-chart__baseline\"\n [attr.x1]=\"layout().left\"\n [attr.x2]=\"layout().left + layout().plotWidth\"\n [attr.y1]=\"layout().top + layout().plotHeight\"\n [attr.y2]=\"layout().top + layout().plotHeight\" />\n @if (layout().axisBreak; as axisBreak) {\n <path\n class=\"ea-line-chart__y-axis\"\n [attr.d]=\"axisBreak.axis\" />\n <path\n class=\"ea-line-chart__axis-break\"\n [attr.d]=\"axisBreak.slashes\" />\n }\n @for (xLabel of layout().xLabels; track xLabel.key) {\n <line\n class=\"ea-line-chart__x-tick\"\n [attr.x1]=\"xLabel.x\"\n [attr.x2]=\"xLabel.x\"\n [attr.y1]=\"layout().axisY\"\n [attr.y2]=\"layout().tickEndY\" />\n <text\n class=\"ea-line-chart__axis ea-line-chart__axis--x\"\n [attr.text-anchor]=\"layout().labelAngle ? 'end' : 'middle'\"\n [attr.dominant-baseline]=\"layout().labelAngle ? 'central' : null\"\n [attr.transform]=\"\n layout().labelAngle\n ? 'rotate(' +\n -layout().labelAngle +\n ' ' +\n xLabel.x +\n ' ' +\n layout().labelY +\n ')'\n : null\n \"\n [attr.x]=\"xLabel.textX\"\n [attr.y]=\"layout().labelY\">\n {{ xLabel.text }}\n </text>\n }\n @if (layout().axisBreak; as axisBreak) {\n <!-- Keeps the break's gap open under a crosshair drawn along the y-axis -->\n <mask\n maskUnits=\"userSpaceOnUse\"\n [attr.id]=\"breakMaskId\">\n <rect\n fill=\"white\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"layout().width\"\n [attr.height]=\"layout().height\" />\n <rect\n fill=\"black\"\n [attr.x]=\"axisBreak.gap.x\"\n [attr.y]=\"axisBreak.gap.y\"\n [attr.width]=\"axisBreak.gap.width\"\n [attr.height]=\"axisBreak.gap.height\" />\n </mask>\n }\n @if (tooltip(); as tip) {\n <line\n class=\"ea-line-chart__crosshair\"\n [attr.mask]=\"layout().axisBreak ? 'url(#' + breakMaskId + ')' : null\"\n [attr.x1]=\"tip.x\"\n [attr.x2]=\"tip.x\"\n [attr.y1]=\"layout().top\"\n [attr.y2]=\"layout().top + layout().plotHeight\" />\n }\n <g [attr.clip-path]=\"layout().windowed ? 'url(#' + clipId + ')' : null\">\n <g class=\"ea-line-chart__lines\">\n @for (line of layout().series; track $index; let s = $index) {\n <g\n class=\"ea-line-chart__series\"\n [class.ea-line-chart__series--dimmed]=\"isDimmed(s)\"\n [style.--ea-chart-color]=\"line.color\">\n @if (showArea()) {\n @for (area of line.areas; track $index) {\n <path\n class=\"ea-line-chart__area\"\n [attr.d]=\"area\" />\n }\n }\n @for (path of line.paths; track $index) {\n <path\n class=\"ea-line-chart__line\"\n pathLength=\"1\"\n [attr.d]=\"path\" />\n }\n @for (point of line.points; track point.index) {\n @if (showPoints() || isActivePoint(s, point.index)) {\n <circle\n class=\"ea-line-chart__point\"\n [class.ea-line-chart__point--active]=\"\n isActivePoint(s, point.index)\n \"\n [attr.cx]=\"point.x\"\n [attr.cy]=\"point.y\"\n [attr.r]=\"isActivePoint(s, point.index) ? 6 : 4\" />\n }\n }\n </g>\n }\n </g>\n </g>\n @for (tip of tooltips(); track tip.key) {\n <rect\n class=\"ea-line-chart__anchor\"\n width=\"12\"\n height=\"12\"\n [attr.x]=\"tip.x - 6\"\n [attr.y]=\"tip.y - 6\"\n [eaTooltip]=\"tooltipContent\"\n [tooltipOpen]=\"true\"\n [maxWidth]=\"undefined\" />\n }\n </svg>\n }\n <ng-template #tooltipContent>\n @if (tooltip(); as tip) {\n <div class=\"ea-line-chart__tooltip\">\n <span class=\"ea-line-chart__tooltip-title\">{{ tip.title }}</span>\n @for (row of tip.rows; track $index) {\n <span\n class=\"ea-line-chart__tooltip-row\"\n [class.ea-line-chart__tooltip-row--active]=\"row.active\">\n <span\n class=\"ea-line-chart__swatch\"\n [style.--ea-chart-color]=\"row.color\">\n </span>\n <span class=\"ea-line-chart__tooltip-name\">{{ row.name }}</span>\n <span class=\"ea-line-chart__tooltip-value\">{{ row.value }}</span>\n </span>\n }\n </div>\n }\n </ng-template>\n <!-- Hidden through a block, since a table ignores the 1px size and keeps its full height -->\n <div class=\"ea-line-chart__table\">\n <table>\n <caption>\n {{ label() }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.messages().chart.category }}</th>\n\n @for (s of series(); track $index) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of labels(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ row }}</th>\n\n @for (s of series(); track $index) {\n <td>{{ tableValue(s.data[i]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div\n class=\"ea-line-chart__live\"\n aria-live=\"polite\">\n {{ announcement() }}\n </div>\n } @else {\n <div\n class=\"ea-line-chart__empty\"\n role=\"img\"\n [attr.aria-label]=\"label()\"\n [style.height.px]=\"height()\">\n {{ i18n.messages().chart.noData }}\n </div>\n }\n @if (showsLegend()) {\n <ul\n class=\"ea-line-chart__legend\"\n aria-hidden=\"true\">\n @for (s of series(); track $index; let i = $index) {\n <li class=\"ea-line-chart__legend-item\">\n <span\n class=\"ea-line-chart__legend-line\"\n [style.--ea-chart-color]=\"seriesColor(i)\">\n </span>\n {{ s.name }}\n </li>\n }\n </ul>\n }\n</div>\n",
20096
+ styles: ["@keyframes ea-chart-fade{0%{opacity:0}}@keyframes ea-chart-draw{0%{stroke-dashoffset:1}}@keyframes ea-chart-grow-y{0%{transform:scaleY(0)}}@keyframes ea-chart-grow-x{0%{transform:scaleX(0)}}@keyframes ea-chart-grow{0%{transform:scale(0)}}ea-line-chart{display:block}.ea-line-chart{position:relative;display:flex;flex-direction:column;gap:.75em;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-line-chart--2xs{font-size:var(--font-size-2xs)}.ea-line-chart--xs{font-size:var(--font-size-xs)}.ea-line-chart--sm{font-size:var(--font-size-sm)}.ea-line-chart--md{font-size:var(--font-size-md)}.ea-line-chart--lg{font-size:var(--font-size-lg)}.ea-line-chart--xl{font-size:var(--font-size-xl)}.ea-line-chart__plot{position:relative;border-radius:var(--radius-md);outline:none}.ea-line-chart__plot:focus-visible{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-line-chart__plot:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-line-chart__plot svg{display:block;overflow:visible}.ea-line-chart__svg{direction:ltr;touch-action:pan-y}.ea-line-chart__hit{fill:transparent}.ea-line-chart__grid{stroke:var(--color-divider);stroke-width:1px;shape-rendering:crispEdges}.ea-line-chart__baseline{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges}.ea-line-chart__axis{font-size:.75em;fill:var(--color-text-secondary)}.ea-line-chart__x-tick{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges}.ea-line-chart__y-axis{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges;fill:none}.ea-line-chart__axis-break{fill:none;stroke:var(--color-border-strong);stroke-width:1.5px;stroke-linecap:round}.ea-line-chart__crosshair{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges;pointer-events:none}.ea-line-chart__series{pointer-events:none;transition:opacity var(--duration-fast) var(--ease-out)}.ea-line-chart__series--dimmed{opacity:.35}.ea-line-chart__area{fill:var(--ea-chart-color);fill-opacity:.12}.ea-line-chart__line{fill:none;stroke:var(--ea-chart-color);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.ea-line-chart__point{fill:var(--ea-chart-color);stroke:var(--ea-chart-surface, var(--color-bg-base));stroke-width:2px}.ea-line-chart__tooltip{display:flex;flex-direction:column;gap:var(--space-1)}.ea-line-chart__anchor{fill:transparent}.ea-line-chart__tooltip-title{font-weight:var(--font-weight-medium)}.ea-line-chart__tooltip-row{display:flex;align-items:center;gap:.5em}.ea-line-chart__tooltip-row--active{font-weight:var(--font-weight-medium)}.ea-line-chart__tooltip-value{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}.ea-line-chart__swatch{flex-shrink:0;width:.75em;height:.75em;border-radius:var(--radius-sm);background-color:var(--ea-chart-color)}.ea-line-chart__legend{display:flex;flex-wrap:wrap;justify-content:center;gap:.375em 1em;padding:0;margin:0;font-size:.875em;list-style:none;color:var(--color-text-secondary)}.ea-line-chart__legend-item{display:flex;align-items:center;gap:.375em}.ea-line-chart__legend-line{width:1em;height:2px;border-radius:var(--radius-full);background-color:var(--ea-chart-color)}.ea-line-chart__table,.ea-line-chart__live{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-line-chart__empty{display:flex;align-items:center;justify-content:center;font-size:.875em;color:var(--color-text-tertiary)}.ea-line-chart--pannable .ea-line-chart__svg{cursor:grab}.ea-line-chart--panning .ea-line-chart__svg{cursor:grabbing;-webkit-user-select:none;user-select:none}.ea-line-chart--animate-draw .ea-line-chart__line{stroke-dasharray:1;animation-name:ea-chart-draw;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-draw .ea-line-chart__line{animation:none}}.ea-line-chart--animate-draw .ea-line-chart__area,.ea-line-chart--animate-draw .ea-line-chart__point{animation-name:ea-chart-fade;animation-delay:var(--ea-chart-duration, .6s);animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-draw .ea-line-chart__area,.ea-line-chart--animate-draw .ea-line-chart__point{animation:none}}.ea-line-chart--animate-reveal .ea-line-chart__lines{clip-path:inset(-8px);animation-name:ea-line-chart-reveal;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-reveal .ea-line-chart__lines{animation:none}}.ea-line-chart--animate-fade .ea-line-chart__series{animation-name:ea-chart-fade;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-fade .ea-line-chart__series{animation:none}}.ea-line-chart--animate-rise .ea-line-chart__series{animation-name:ea-chart-grow-y;transform-origin:0 var(--ea-line-chart-baseline);animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-rise .ea-line-chart__series{animation:none}}@keyframes ea-line-chart-reveal{0%{clip-path:inset(-8px 100% -8px -8px)}}\n"],
20097
+ dependencies: [{
20098
+ kind: "directive",
20099
+ type: NgClass,
20100
+ selector: "[ngClass]",
20101
+ inputs: ["class", "ngClass"]
20102
+ }, {
20103
+ kind: "directive",
20104
+ type: TooltipDirective,
20105
+ selector: "[eaTooltip]",
20106
+ inputs: [
20107
+ "eaTooltip",
20108
+ "tooltipPosition",
20109
+ "flip",
20110
+ "whenClipped",
20111
+ "maxWidth",
20112
+ "dismissDelay",
20113
+ "tooltipOpen"
20114
+ ]
20115
+ }],
20116
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
20117
+ encapsulation: i0.ViewEncapsulation.None
20118
+ });
20119
+ };
20120
+ i0.ɵɵngDeclareClassMetadata({
20121
+ minVersion: "12.0.0",
20122
+ version: "22.2.0",
20123
+ ngImport: i0,
20124
+ type: LineChartComponent,
20125
+ decorators: [{
20126
+ type: Component,
20127
+ args: [{
20128
+ selector: "ea-line-chart",
20129
+ imports: [NgClass, TooltipDirective],
20130
+ changeDetection: ChangeDetectionStrategy.OnPush,
20131
+ encapsulation: ViewEncapsulation.None,
20132
+ template: "<div\n class=\"ea-line-chart\"\n [ngClass]=\"hostClasses()\"\n [style.--ea-chart-duration]=\"animationDuration() + 'ms'\">\n @if (hasData()) {\n <div\n class=\"ea-line-chart__plot\"\n role=\"group\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"i18n.messages().chart.roleDescription\"\n [attr.aria-label]=\"label()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\">\n @for (pass of renderPass(); track pass) {\n <svg\n class=\"ea-line-chart__svg\"\n aria-hidden=\"true\"\n [attr.width]=\"layout().width\"\n [attr.height]=\"layout().height\"\n [attr.viewBox]=\"'0 0 ' + layout().width + ' ' + layout().height\"\n [style.--ea-line-chart-baseline]=\"layout().baselineY + 'px'\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n (pointerleave)=\"onPointerLeave()\"\n (wheel)=\"onWheel($event)\"\n (gesturestart)=\"onGestureStart($event)\"\n (gesturechange)=\"onGestureChange($event)\"\n (gestureend)=\"onGestureEnd()\"\n (click)=\"onClick()\">\n @if (layout().windowed) {\n <defs>\n <clipPath [attr.id]=\"clipId\">\n <rect\n [attr.x]=\"layout().left\"\n y=\"0\"\n [attr.width]=\"layout().plotWidth\"\n [attr.height]=\"layout().height\" />\n </clipPath>\n </defs>\n }\n <rect\n class=\"ea-line-chart__hit\"\n [attr.x]=\"layout().left\"\n [attr.y]=\"layout().top\"\n [attr.width]=\"layout().plotWidth\"\n [attr.height]=\"layout().plotHeight\" />\n @for (tick of layout().ticks; track tick.value) {\n @if (showGrid()) {\n <line\n class=\"ea-line-chart__grid\"\n [attr.x1]=\"layout().left\"\n [attr.x2]=\"layout().left + layout().plotWidth\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\" />\n }\n <text\n class=\"ea-line-chart__axis ea-line-chart__axis--y\"\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n [attr.x]=\"layout().tickX\"\n [attr.y]=\"tick.y\">\n {{ tick.text }}\n </text>\n }\n <line\n class=\"ea-line-chart__baseline\"\n [attr.x1]=\"layout().left\"\n [attr.x2]=\"layout().left + layout().plotWidth\"\n [attr.y1]=\"layout().top + layout().plotHeight\"\n [attr.y2]=\"layout().top + layout().plotHeight\" />\n @if (layout().axisBreak; as axisBreak) {\n <path\n class=\"ea-line-chart__y-axis\"\n [attr.d]=\"axisBreak.axis\" />\n <path\n class=\"ea-line-chart__axis-break\"\n [attr.d]=\"axisBreak.slashes\" />\n }\n @for (xLabel of layout().xLabels; track xLabel.key) {\n <line\n class=\"ea-line-chart__x-tick\"\n [attr.x1]=\"xLabel.x\"\n [attr.x2]=\"xLabel.x\"\n [attr.y1]=\"layout().axisY\"\n [attr.y2]=\"layout().tickEndY\" />\n <text\n class=\"ea-line-chart__axis ea-line-chart__axis--x\"\n [attr.text-anchor]=\"layout().labelAngle ? 'end' : 'middle'\"\n [attr.dominant-baseline]=\"layout().labelAngle ? 'central' : null\"\n [attr.transform]=\"\n layout().labelAngle\n ? 'rotate(' +\n -layout().labelAngle +\n ' ' +\n xLabel.x +\n ' ' +\n layout().labelY +\n ')'\n : null\n \"\n [attr.x]=\"xLabel.textX\"\n [attr.y]=\"layout().labelY\">\n {{ xLabel.text }}\n </text>\n }\n @if (layout().axisBreak; as axisBreak) {\n <!-- Keeps the break's gap open under a crosshair drawn along the y-axis -->\n <mask\n maskUnits=\"userSpaceOnUse\"\n [attr.id]=\"breakMaskId\">\n <rect\n fill=\"white\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"layout().width\"\n [attr.height]=\"layout().height\" />\n <rect\n fill=\"black\"\n [attr.x]=\"axisBreak.gap.x\"\n [attr.y]=\"axisBreak.gap.y\"\n [attr.width]=\"axisBreak.gap.width\"\n [attr.height]=\"axisBreak.gap.height\" />\n </mask>\n }\n @if (tooltip(); as tip) {\n <line\n class=\"ea-line-chart__crosshair\"\n [attr.mask]=\"layout().axisBreak ? 'url(#' + breakMaskId + ')' : null\"\n [attr.x1]=\"tip.x\"\n [attr.x2]=\"tip.x\"\n [attr.y1]=\"layout().top\"\n [attr.y2]=\"layout().top + layout().plotHeight\" />\n }\n <g [attr.clip-path]=\"layout().windowed ? 'url(#' + clipId + ')' : null\">\n <g class=\"ea-line-chart__lines\">\n @for (line of layout().series; track $index; let s = $index) {\n <g\n class=\"ea-line-chart__series\"\n [class.ea-line-chart__series--dimmed]=\"isDimmed(s)\"\n [style.--ea-chart-color]=\"line.color\">\n @if (showArea()) {\n @for (area of line.areas; track $index) {\n <path\n class=\"ea-line-chart__area\"\n [attr.d]=\"area\" />\n }\n }\n @for (path of line.paths; track $index) {\n <path\n class=\"ea-line-chart__line\"\n pathLength=\"1\"\n [attr.d]=\"path\" />\n }\n @for (point of line.points; track point.index) {\n @if (showPoints() || isActivePoint(s, point.index)) {\n <circle\n class=\"ea-line-chart__point\"\n [class.ea-line-chart__point--active]=\"\n isActivePoint(s, point.index)\n \"\n [attr.cx]=\"point.x\"\n [attr.cy]=\"point.y\"\n [attr.r]=\"isActivePoint(s, point.index) ? 6 : 4\" />\n }\n }\n </g>\n }\n </g>\n </g>\n @for (tip of tooltips(); track tip.key) {\n <rect\n class=\"ea-line-chart__anchor\"\n width=\"12\"\n height=\"12\"\n [attr.x]=\"tip.x - 6\"\n [attr.y]=\"tip.y - 6\"\n [eaTooltip]=\"tooltipContent\"\n [tooltipOpen]=\"true\"\n [maxWidth]=\"undefined\" />\n }\n </svg>\n }\n <ng-template #tooltipContent>\n @if (tooltip(); as tip) {\n <div class=\"ea-line-chart__tooltip\">\n <span class=\"ea-line-chart__tooltip-title\">{{ tip.title }}</span>\n @for (row of tip.rows; track $index) {\n <span\n class=\"ea-line-chart__tooltip-row\"\n [class.ea-line-chart__tooltip-row--active]=\"row.active\">\n <span\n class=\"ea-line-chart__swatch\"\n [style.--ea-chart-color]=\"row.color\">\n </span>\n <span class=\"ea-line-chart__tooltip-name\">{{ row.name }}</span>\n <span class=\"ea-line-chart__tooltip-value\">{{ row.value }}</span>\n </span>\n }\n </div>\n }\n </ng-template>\n <!-- Hidden through a block, since a table ignores the 1px size and keeps its full height -->\n <div class=\"ea-line-chart__table\">\n <table>\n <caption>\n {{ label() }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.messages().chart.category }}</th>\n\n @for (s of series(); track $index) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of labels(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ row }}</th>\n\n @for (s of series(); track $index) {\n <td>{{ tableValue(s.data[i]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div\n class=\"ea-line-chart__live\"\n aria-live=\"polite\">\n {{ announcement() }}\n </div>\n } @else {\n <div\n class=\"ea-line-chart__empty\"\n role=\"img\"\n [attr.aria-label]=\"label()\"\n [style.height.px]=\"height()\">\n {{ i18n.messages().chart.noData }}\n </div>\n }\n @if (showsLegend()) {\n <ul\n class=\"ea-line-chart__legend\"\n aria-hidden=\"true\">\n @for (s of series(); track $index; let i = $index) {\n <li class=\"ea-line-chart__legend-item\">\n <span\n class=\"ea-line-chart__legend-line\"\n [style.--ea-chart-color]=\"seriesColor(i)\">\n </span>\n {{ s.name }}\n </li>\n }\n </ul>\n }\n</div>\n",
20133
+ styles: ["@keyframes ea-chart-fade{0%{opacity:0}}@keyframes ea-chart-draw{0%{stroke-dashoffset:1}}@keyframes ea-chart-grow-y{0%{transform:scaleY(0)}}@keyframes ea-chart-grow-x{0%{transform:scaleX(0)}}@keyframes ea-chart-grow{0%{transform:scale(0)}}ea-line-chart{display:block}.ea-line-chart{position:relative;display:flex;flex-direction:column;gap:.75em;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-line-chart--2xs{font-size:var(--font-size-2xs)}.ea-line-chart--xs{font-size:var(--font-size-xs)}.ea-line-chart--sm{font-size:var(--font-size-sm)}.ea-line-chart--md{font-size:var(--font-size-md)}.ea-line-chart--lg{font-size:var(--font-size-lg)}.ea-line-chart--xl{font-size:var(--font-size-xl)}.ea-line-chart__plot{position:relative;border-radius:var(--radius-md);outline:none}.ea-line-chart__plot:focus-visible{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-line-chart__plot:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-line-chart__plot svg{display:block;overflow:visible}.ea-line-chart__svg{direction:ltr;touch-action:pan-y}.ea-line-chart__hit{fill:transparent}.ea-line-chart__grid{stroke:var(--color-divider);stroke-width:1px;shape-rendering:crispEdges}.ea-line-chart__baseline{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges}.ea-line-chart__axis{font-size:.75em;fill:var(--color-text-secondary)}.ea-line-chart__x-tick{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges}.ea-line-chart__y-axis{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges;fill:none}.ea-line-chart__axis-break{fill:none;stroke:var(--color-border-strong);stroke-width:1.5px;stroke-linecap:round}.ea-line-chart__crosshair{stroke:var(--color-border-strong);stroke-width:1px;shape-rendering:crispEdges;pointer-events:none}.ea-line-chart__series{pointer-events:none;transition:opacity var(--duration-fast) var(--ease-out)}.ea-line-chart__series--dimmed{opacity:.35}.ea-line-chart__area{fill:var(--ea-chart-color);fill-opacity:.12}.ea-line-chart__line{fill:none;stroke:var(--ea-chart-color);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.ea-line-chart__point{fill:var(--ea-chart-color);stroke:var(--ea-chart-surface, var(--color-bg-base));stroke-width:2px}.ea-line-chart__tooltip{display:flex;flex-direction:column;gap:var(--space-1)}.ea-line-chart__anchor{fill:transparent}.ea-line-chart__tooltip-title{font-weight:var(--font-weight-medium)}.ea-line-chart__tooltip-row{display:flex;align-items:center;gap:.5em}.ea-line-chart__tooltip-row--active{font-weight:var(--font-weight-medium)}.ea-line-chart__tooltip-value{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}.ea-line-chart__swatch{flex-shrink:0;width:.75em;height:.75em;border-radius:var(--radius-sm);background-color:var(--ea-chart-color)}.ea-line-chart__legend{display:flex;flex-wrap:wrap;justify-content:center;gap:.375em 1em;padding:0;margin:0;font-size:.875em;list-style:none;color:var(--color-text-secondary)}.ea-line-chart__legend-item{display:flex;align-items:center;gap:.375em}.ea-line-chart__legend-line{width:1em;height:2px;border-radius:var(--radius-full);background-color:var(--ea-chart-color)}.ea-line-chart__table,.ea-line-chart__live{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-line-chart__empty{display:flex;align-items:center;justify-content:center;font-size:.875em;color:var(--color-text-tertiary)}.ea-line-chart--pannable .ea-line-chart__svg{cursor:grab}.ea-line-chart--panning .ea-line-chart__svg{cursor:grabbing;-webkit-user-select:none;user-select:none}.ea-line-chart--animate-draw .ea-line-chart__line{stroke-dasharray:1;animation-name:ea-chart-draw;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-draw .ea-line-chart__line{animation:none}}.ea-line-chart--animate-draw .ea-line-chart__area,.ea-line-chart--animate-draw .ea-line-chart__point{animation-name:ea-chart-fade;animation-delay:var(--ea-chart-duration, .6s);animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-draw .ea-line-chart__area,.ea-line-chart--animate-draw .ea-line-chart__point{animation:none}}.ea-line-chart--animate-reveal .ea-line-chart__lines{clip-path:inset(-8px);animation-name:ea-line-chart-reveal;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-reveal .ea-line-chart__lines{animation:none}}.ea-line-chart--animate-fade .ea-line-chart__series{animation-name:ea-chart-fade;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-fade .ea-line-chart__series{animation:none}}.ea-line-chart--animate-rise .ea-line-chart__series{animation-name:ea-chart-grow-y;transform-origin:0 var(--ea-line-chart-baseline);animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-line-chart--animate-rise .ea-line-chart__series{animation:none}}@keyframes ea-line-chart-reveal{0%{clip-path:inset(-8px 100% -8px -8px)}}\n"]
20134
+ }]
20135
+ }],
20136
+ propDecorators: {
20137
+ labels: [{
20138
+ type: i0.Input,
20139
+ args: [{
20140
+ isSignal: true,
20141
+ alias: "labels",
20142
+ required: false
20143
+ }]
20144
+ }],
20145
+ series: [{
20146
+ type: i0.Input,
20147
+ args: [{
20148
+ isSignal: true,
20149
+ alias: "series",
20150
+ required: false
20151
+ }]
20152
+ }],
20153
+ xValues: [{
20154
+ type: i0.Input,
20155
+ args: [{
20156
+ isSignal: true,
20157
+ alias: "xValues",
20158
+ required: false
20159
+ }]
20160
+ }],
20161
+ xTicks: [{
20162
+ type: i0.Input,
20163
+ args: [{
20164
+ isSignal: true,
20165
+ alias: "xTicks",
20166
+ required: false
20167
+ }]
20168
+ }],
20169
+ visibleXSpan: [{
20170
+ type: i0.Input,
20171
+ args: [{
20172
+ isSignal: true,
20173
+ alias: "visibleXSpan",
20174
+ required: false
20175
+ }]
20176
+ }],
20177
+ curve: [{
20178
+ type: i0.Input,
20179
+ args: [{
20180
+ isSignal: true,
20181
+ alias: "curve",
20182
+ required: false
20183
+ }]
20184
+ }],
20185
+ showArea: [{
20186
+ type: i0.Input,
20187
+ args: [{
20188
+ isSignal: true,
20189
+ alias: "showArea",
20190
+ required: false
20191
+ }]
20192
+ }],
20193
+ showPoints: [{
20194
+ type: i0.Input,
20195
+ args: [{
20196
+ isSignal: true,
20197
+ alias: "showPoints",
20198
+ required: false
20199
+ }]
20200
+ }],
20201
+ showGrid: [{
20202
+ type: i0.Input,
20203
+ args: [{
20204
+ isSignal: true,
20205
+ alias: "showGrid",
20206
+ required: false
20207
+ }]
20208
+ }],
20209
+ showLegend: [{
20210
+ type: i0.Input,
20211
+ args: [{
20212
+ isSignal: true,
20213
+ alias: "showLegend",
20214
+ required: false
20215
+ }]
20216
+ }],
20217
+ yMin: [{
20218
+ type: i0.Input,
20219
+ args: [{
20220
+ isSignal: true,
20221
+ alias: "yMin",
20222
+ required: false
20223
+ }]
20224
+ }],
20225
+ yMax: [{
20226
+ type: i0.Input,
20227
+ args: [{
20228
+ isSignal: true,
20229
+ alias: "yMax",
20230
+ required: false
20231
+ }]
20232
+ }],
20233
+ xLabelOrientation: [{
20234
+ type: i0.Input,
20235
+ args: [{
20236
+ isSignal: true,
20237
+ alias: "xLabelOrientation",
20238
+ required: false
20239
+ }]
20240
+ }],
20241
+ showAxisBreak: [{
20242
+ type: i0.Input,
20243
+ args: [{
20244
+ isSignal: true,
20245
+ alias: "showAxisBreak",
20246
+ required: false
20247
+ }]
20248
+ }],
20249
+ height: [{
20250
+ type: i0.Input,
20251
+ args: [{
20252
+ isSignal: true,
20253
+ alias: "height",
20254
+ required: false
20255
+ }]
20256
+ }],
20257
+ size: [{
20258
+ type: i0.Input,
20259
+ args: [{
20260
+ isSignal: true,
20261
+ alias: "size",
20262
+ required: false
20263
+ }]
20264
+ }],
20265
+ animation: [{
20266
+ type: i0.Input,
20267
+ args: [{
20268
+ isSignal: true,
20269
+ alias: "animation",
20270
+ required: false
20271
+ }]
20272
+ }],
20273
+ animationDuration: [{
20274
+ type: i0.Input,
20275
+ args: [{
20276
+ isSignal: true,
20277
+ alias: "animationDuration",
20278
+ required: false
20279
+ }]
20280
+ }],
20281
+ formatValue: [{
20282
+ type: i0.Input,
20283
+ args: [{
20284
+ isSignal: true,
20285
+ alias: "formatValue",
20286
+ required: false
20287
+ }]
20288
+ }],
20289
+ ariaLabel: [{
20290
+ type: i0.Input,
20291
+ args: [{
20292
+ isSignal: true,
20293
+ alias: "aria-label",
20294
+ required: false
20295
+ }]
20296
+ }],
20297
+ pointClick: [{
20298
+ type: i0.Output,
20299
+ args: ["pointClick"]
20300
+ }],
20301
+ activePointChange: [{
20302
+ type: i0.Output,
20303
+ args: ["activePointChange"]
20304
+ }],
20305
+ visibleRangeChange: [{
20306
+ type: i0.Output,
20307
+ args: ["visibleRangeChange"]
20308
+ }]
20309
+ }
20310
+ });
18086
20311
  var MenuComponent = class MenuComponent {
18087
20312
  injector = inject(Injector);
18088
20313
  i18n = inject(EagamiI18nService);
@@ -18749,7 +20974,8 @@ var TagComponent = class TagComponent {
18749
20974
  "flip",
18750
20975
  "whenClipped",
18751
20976
  "maxWidth",
18752
- "dismissDelay"
20977
+ "dismissDelay",
20978
+ "tooltipOpen"
18753
20979
  ]
18754
20980
  },
18755
20981
  {
@@ -19423,7 +21649,7 @@ var MultiSelectComponent = class MultiSelectComponent {
19423
21649
  ],
19424
21650
  ngImport: i0,
19425
21651
  template: "<div class=\"ea-multi-select-field ea-multi-select-field--{{ size() }}\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [icon]=\"labelIcon()\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-multi-select\">\n <div\n #wrapperEl\n class=\"ea-multi-select__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\"\n (click)=\"onTriggerAreaClick()\">\n <div\n #triggerEl\n class=\"ea-multi-select__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n role=\"combobox\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-labelledby]=\"label() ? id() + '-label' : null\"\n [attr.aria-label]=\"label() ? null : (ariaLabel() ?? null)\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? listboxId() : null\"\n [attr.aria-activedescendant]=\"isOpen() && !searchable() ? activeOptionId() : null\"\n [attr.aria-disabled]=\"isDisabled() || null\"\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 (keydown)=\"handleTriggerKeydown($event)\">\n <span class=\"ea-multi-select__trigger-content\">\n @if (!hasValue()) {\n <span class=\"ea-multi-select__trigger-placeholder\">\n <bdi>{{ resolvedPlaceholder() }}</bdi>\n </span>\n } @else {\n @for (opt of visibleChips(); track opt.value) {\n <ea-tag\n [size]=\"size()\"\n variant=\"default\"\n [maxWidth]=\"maxChipWidth()\"\n [removable]=\"!isDisabled() && !readonly()\"\n [removeTabbable]=\"false\"\n [removeLabel]=\"i18n.messages().multiSelect.removeOption(opt.label)\"\n (removed)=\"removeChip(opt)\">\n <span>{{ opt.label }}</span>\n </ea-tag>\n }\n @if (hiddenChipCount() > 0) {\n <span class=\"ea-multi-select__more\">+{{ hiddenChipCount() }}</span>\n }\n }\n </span>\n </div>\n @if (hasValue() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"ea-multi-select__clear\"\n [attr.aria-label]=\"i18n.messages().multiSelect.clearAll\"\n (click)=\"clear($event)\">\n <ea-icon-x\n class=\"ea-multi-select__clear-icon\"\n aria-hidden=\"true\" />\n </button>\n }\n <ea-icon-chevron-down\n class=\"ea-multi-select__trigger-icon\"\n aria-hidden=\"true\" />\n </div>\n\n <ea-popover\n [anchor]=\"wrapperEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n [aria-label]=\"i18n.messages().multiSelect.dialogLabel\"\n [matchAnchorWidth]=\"true\"\n [maxWidth]=\"popoverMaxWidth()\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"reposition\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-multi-select__popover\"\n [ngClass]=\"menuClasses()\"\n [style.max-height.px]=\"popoverMaxHeight()\">\n @if (searchable()) {\n <div class=\"ea-multi-select__search\">\n <ea-icon-search\n class=\"ea-multi-select__search-icon\"\n aria-hidden=\"true\" />\n <input\n #searchEl\n type=\"text\"\n dir=\"auto\"\n class=\"ea-multi-select__search-input\"\n autocomplete=\"off\"\n [placeholder]=\"resolvedSearchPlaceholder()\"\n [value]=\"searchTerm()\"\n [attr.aria-controls]=\"listboxId()\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"handlePopoverKeydown($event)\" />\n </div>\n }\n\n <ul\n #listEl\n class=\"ea-multi-select__list\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [id]=\"listboxId()\"\n [attr.aria-label]=\"label() ?? ariaLabel() ?? null\">\n @if (selectAllVisible()) {\n <li\n class=\"ea-multi-select__option ea-multi-select__option--select-all\"\n [class.ea-multi-select__option--focused]=\"focusedIndex() === 0\"\n [id]=\"id() + '-opt-0'\"\n role=\"option\"\n [attr.aria-selected]=\"selectAllState() === 'all'\"\n [attr.aria-checked]=\"selectAllAriaChecked()\"\n (click)=\"onSelectAllClick()\">\n <ea-checkbox\n size=\"sm\"\n inert\n aria-hidden=\"true\"\n [checked]=\"selectAllState() === 'all'\"\n [indeterminate]=\"selectAllState() === 'some'\" />\n <span class=\"ea-multi-select__option-label\">\n {{ i18n.messages().multiSelect.selectAll }}\n </span>\n </li>\n }\n @for (group of renderedGroups(); track $index) {\n <li\n class=\"ea-multi-select__group\"\n [class.ea-multi-select__group--ruled]=\"group.rule\"\n role=\"presentation\">\n @if (group.label; as groupLabel) {\n <span\n class=\"ea-multi-select__group-label\"\n aria-hidden=\"true\">\n {{ groupLabel }}\n </span>\n }\n <ul\n class=\"ea-multi-select__group-options\"\n [attr.role]=\"grouped() ? 'group' : 'presentation'\"\n [attr.aria-label]=\"group.label ?? null\">\n @for (entry of group.options; track entry.option.value) {\n <li\n class=\"ea-multi-select__option\"\n [class.ea-multi-select__option--focused]=\"\n focusedIndex() === entry.index + selectAllOffset()\n \"\n [class.ea-multi-select__option--disabled]=\"entry.option.disabled\"\n [id]=\"id() + '-opt-' + (entry.index + selectAllOffset())\"\n role=\"option\"\n [attr.aria-selected]=\"selectedSet().has(entry.option.value)\"\n [attr.aria-disabled]=\"entry.option.disabled || null\"\n (click)=\"onOptionClick(entry.option, entry.index)\">\n <ea-checkbox\n size=\"sm\"\n inert\n aria-hidden=\"true\"\n [checked]=\"selectedSet().has(entry.option.value)\"\n [disabled]=\"!!entry.option.disabled\" />\n <span\n #optionLabelEl\n class=\"ea-multi-select__option-label\"\n [attr.data-value]=\"entry.option.value\"\n [eaTooltip]=\"\n clippedOptions().has(entry.option.value) ? entry.option.label : ''\n \">\n {{ entry.option.label }}\n </span>\n </li>\n }\n </ul>\n </li>\n }\n @if (creatableText(); as newText) {\n <li\n class=\"ea-multi-select__option ea-multi-select__option--create\"\n [class.ea-multi-select__option--focused]=\"focusedIndex() === createRow()\"\n [id]=\"id() + '-opt-' + createRow()\"\n role=\"option\"\n [attr.aria-selected]=\"false\"\n (click)=\"createOption()\">\n <ea-icon-plus\n class=\"ea-multi-select__create-icon\"\n aria-hidden=\"true\" />\n <span class=\"ea-multi-select__option-label\">\n {{ i18n.messages().multiSelect.create(newText) }}\n </span>\n </li>\n }\n </ul>\n @if (filteredOptions().length === 0 && !creatableText()) {\n <div\n class=\"ea-multi-select__empty\"\n role=\"status\">\n {{ i18n.messages().multiSelect.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",
19426
- styles: [".ea-multi-select-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-multi-select-field--2xs{font-size:var(--font-size-2xs)}.ea-multi-select-field--xs{font-size:var(--font-size-xs)}.ea-multi-select-field--sm{font-size:var(--font-size-sm)}.ea-multi-select-field--md{font-size:var(--font-size-md)}.ea-multi-select-field--lg{font-size:var(--font-size-lg)}.ea-multi-select-field--xl{font-size:var(--font-size-xl)}.ea-multi-select{position:relative}.ea-multi-select__trigger-wrapper{position:relative;display:flex;align-items:center;gap:.5em;width:100%;min-height:2.5em;padding:.375em .75em;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-multi-select__trigger-wrapper:has(ea-tag){padding-block:.125em}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger:focus-visible){box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger:focus-visible){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open){border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error){border-color:var(--color-error-default)}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error.ea-multi-select__trigger--open){box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error.ea-multi-select__trigger--open){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--disabled){background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly){cursor:default}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly:focus-visible){border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly:focus-visible){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger{display:flex;align-items:center;flex:1;min-width:0;text-align:start;font-family:var(--font-family-sans);cursor:pointer}.ea-multi-select__trigger:focus-visible{outline:none}.ea-multi-select__trigger--disabled,.ea-multi-select__trigger--readonly{cursor:default}.ea-multi-select__trigger-content{display:flex;flex-wrap:nowrap;align-items:center;gap:.25em;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}.ea-multi-select__trigger-content::-webkit-scrollbar{display:none}.ea-multi-select__trigger-content ea-tag{flex-shrink:0;--ea-tag-padding-block: 0}.ea-multi-select__trigger-placeholder{color:var(--color-text-tertiary)}.ea-multi-select__trigger-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:var(--transition-transform)}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open) .ea-multi-select__trigger-icon{transform:rotate(180deg)}.ea-multi-select__more{display:inline-flex;flex-shrink:0;align-items:center;padding:0 .4411764706em;border-radius:var(--radius-lg);background-color:var(--color-bg-muted);font-size:.85em;font-weight:var(--font-weight-medium);color:var(--color-text-secondary)}.ea-multi-select__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-multi-select__clear>*{font-size:1.25em}.ea-multi-select__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-multi-select__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-multi-select__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__clear:disabled{cursor:default;opacity:.5}.ea-multi-select__clear{flex-shrink:0}.ea-multi-select__popover{display:flex;flex-direction:column;overflow:hidden;max-height:20rem;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-multi-select-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-multi-select__popover{border:1px solid CanvasText}}.ea-multi-select__popover--2xs{font-size:var(--font-size-2xs)}.ea-multi-select__popover--xs{font-size:var(--font-size-xs)}.ea-multi-select__popover--sm{font-size:var(--font-size-sm)}.ea-multi-select__popover--md{font-size:var(--font-size-md)}.ea-multi-select__popover--lg{font-size:var(--font-size-lg)}.ea-multi-select__popover--xl{font-size:var(--font-size-xl)}.ea-multi-select__search{display:flex;align-items:center;gap:.5em;flex-shrink:0;padding:.5em .75em;border-bottom:var(--border-width-thin) solid var(--color-border-default)}.ea-multi-select__search-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-tertiary)}.ea-multi-select__search-input{flex:1;min-width:0;padding:0;border:none;background:none;font-family:var(--font-family-sans);font-size:inherit;color:var(--color-text-primary)}.ea-multi-select__search-input::placeholder{color:var(--color-text-tertiary);opacity:1}.ea-multi-select__search-input:focus{outline:none}.ea-multi-select__list{overflow-y:auto;overscroll-behavior:none;flex:1;margin:0;padding:.25em 0;list-style:none}.ea-multi-select__group{position:relative}.ea-multi-select__group--ruled{padding-top:.25em;margin-top:.25em}.ea-multi-select__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-multi-select__group-options{padding:0;margin:0;list-style:none}.ea-multi-select__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-multi-select__option{display:flex;align-items:center;gap:.5em;padding:.375em .75em;font-size:inherit;font-family:var(--font-family-sans);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-multi-select__option--focused{background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-multi-select__option--focused{background-color:Highlight;color:HighlightText}}.ea-multi-select__option--disabled{color:var(--color-text-disabled);cursor:default}@media(forced-colors:active){.ea-multi-select__option--disabled{color:GrayText}}.ea-multi-select__option--select-all{border-bottom:var(--border-width-thin) solid var(--color-border-default);font-weight:var(--font-weight-medium)}.ea-multi-select__option--create{font-weight:var(--font-weight-medium);color:var(--color-brand-text)}.ea-multi-select__option:hover:not(.ea-multi-select__option--disabled){background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-multi-select__option:hover:not(.ea-multi-select__option--disabled){background-color:Highlight;color:HighlightText}}.ea-multi-select__option ea-checkbox{pointer-events:none;display:inline-flex;align-items:center;line-height:1}.ea-multi-select__create-icon{flex-shrink:0;width:1em;height:1em}.ea-multi-select__option-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-multi-select__empty{padding:.75em;font-size:inherit;text-align:center;color:var(--color-text-tertiary);list-style:none}\n"],
21652
+ styles: [".ea-multi-select-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-multi-select-field--2xs{font-size:var(--font-size-2xs)}.ea-multi-select-field--xs{font-size:var(--font-size-xs)}.ea-multi-select-field--sm{font-size:var(--font-size-sm)}.ea-multi-select-field--md{font-size:var(--font-size-md)}.ea-multi-select-field--lg{font-size:var(--font-size-lg)}.ea-multi-select-field--xl{font-size:var(--font-size-xl)}.ea-multi-select{position:relative}.ea-multi-select__trigger-wrapper{position:relative;display:flex;align-items:center;gap:.5em;width:100%;min-height:2.5em;padding:.375em .75em;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-multi-select__trigger-wrapper:has(ea-tag){padding-block:.125em}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger:focus-visible){box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger:focus-visible){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open){border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error){border-color:var(--color-error-default)}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error.ea-multi-select__trigger--open){box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error.ea-multi-select__trigger--open){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--disabled){background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly){cursor:default}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly:focus-visible){border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly:focus-visible){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger{display:flex;align-items:center;flex:1;min-width:0;text-align:start;font-family:var(--font-family-sans);cursor:pointer}.ea-multi-select__trigger:focus-visible{outline:none}.ea-multi-select__trigger--disabled,.ea-multi-select__trigger--readonly{cursor:default}.ea-multi-select__trigger-content{display:flex;flex-wrap:nowrap;align-items:center;gap:.25em;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}.ea-multi-select__trigger-content::-webkit-scrollbar{display:none}.ea-multi-select__trigger-content ea-tag{flex-shrink:0;--ea-tag-padding-block: 0}.ea-multi-select__trigger-placeholder{color:var(--color-text-tertiary)}.ea-multi-select__trigger-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:var(--transition-transform)}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open) .ea-multi-select__trigger-icon{transform:rotate(180deg)}.ea-multi-select__more{display:inline-flex;flex-shrink:0;align-items:center;padding:0 .4285714286em;font-size:.875em;font-weight:var(--font-weight-medium);border-radius:var(--radius-lg);background-color:var(--color-bg-muted);color:var(--color-text-secondary)}.ea-multi-select__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-multi-select__clear>*{font-size:1.25em}.ea-multi-select__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-multi-select__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-multi-select__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__clear:disabled{cursor:default;opacity:.5}.ea-multi-select__clear{flex-shrink:0}.ea-multi-select__popover{display:flex;flex-direction:column;overflow:hidden;max-height:20rem;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-multi-select-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-multi-select__popover{border:1px solid CanvasText}}.ea-multi-select__popover--2xs{font-size:var(--font-size-2xs)}.ea-multi-select__popover--xs{font-size:var(--font-size-xs)}.ea-multi-select__popover--sm{font-size:var(--font-size-sm)}.ea-multi-select__popover--md{font-size:var(--font-size-md)}.ea-multi-select__popover--lg{font-size:var(--font-size-lg)}.ea-multi-select__popover--xl{font-size:var(--font-size-xl)}.ea-multi-select__search{display:flex;align-items:center;gap:.5em;flex-shrink:0;padding:.5em .75em;border-bottom:var(--border-width-thin) solid var(--color-border-default)}.ea-multi-select__search-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-tertiary)}.ea-multi-select__search-input{flex:1;min-width:0;padding:0;border:none;background:none;font-family:var(--font-family-sans);font-size:inherit;color:var(--color-text-primary)}.ea-multi-select__search-input::placeholder{color:var(--color-text-tertiary);opacity:1}.ea-multi-select__search-input:focus{outline:none}.ea-multi-select__list{overflow-y:auto;overscroll-behavior:none;flex:1;margin:0;padding:.25em 0;list-style:none}.ea-multi-select__group{position:relative}.ea-multi-select__group--ruled{padding-top:.25em;margin-top:.25em}.ea-multi-select__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-multi-select__group-options{padding:0;margin:0;list-style:none}.ea-multi-select__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-multi-select__option{display:flex;align-items:center;gap:.5em;padding:.375em .75em;font-size:inherit;font-family:var(--font-family-sans);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-multi-select__option--focused{background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-multi-select__option--focused{background-color:Highlight;color:HighlightText}}.ea-multi-select__option--disabled{color:var(--color-text-disabled);cursor:default}@media(forced-colors:active){.ea-multi-select__option--disabled{color:GrayText}}.ea-multi-select__option--select-all{border-bottom:var(--border-width-thin) solid var(--color-border-default);font-weight:var(--font-weight-medium)}.ea-multi-select__option--create{font-weight:var(--font-weight-medium);color:var(--color-brand-text)}.ea-multi-select__option:hover:not(.ea-multi-select__option--disabled){background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-multi-select__option:hover:not(.ea-multi-select__option--disabled){background-color:Highlight;color:HighlightText}}.ea-multi-select__option ea-checkbox{pointer-events:none;display:inline-flex;align-items:center;line-height:1}.ea-multi-select__create-icon{flex-shrink:0;width:1em;height:1em}.ea-multi-select__option-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-multi-select__empty{padding:.75em;font-size:inherit;text-align:center;color:var(--color-text-tertiary);list-style:none}\n"],
19427
21653
  dependencies: [
19428
21654
  {
19429
21655
  kind: "component",
@@ -19541,7 +21767,8 @@ var MultiSelectComponent = class MultiSelectComponent {
19541
21767
  "flip",
19542
21768
  "whenClipped",
19543
21769
  "maxWidth",
19544
- "dismissDelay"
21770
+ "dismissDelay",
21771
+ "tooltipOpen"
19545
21772
  ]
19546
21773
  },
19547
21774
  {
@@ -19582,7 +21809,7 @@ i0.ɵɵngDeclareClassMetadata({
19582
21809
  multi: true
19583
21810
  }],
19584
21811
  template: "<div class=\"ea-multi-select-field ea-multi-select-field--{{ size() }}\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [icon]=\"labelIcon()\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-multi-select\">\n <div\n #wrapperEl\n class=\"ea-multi-select__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\"\n (click)=\"onTriggerAreaClick()\">\n <div\n #triggerEl\n class=\"ea-multi-select__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n role=\"combobox\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-labelledby]=\"label() ? id() + '-label' : null\"\n [attr.aria-label]=\"label() ? null : (ariaLabel() ?? null)\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? listboxId() : null\"\n [attr.aria-activedescendant]=\"isOpen() && !searchable() ? activeOptionId() : null\"\n [attr.aria-disabled]=\"isDisabled() || null\"\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 (keydown)=\"handleTriggerKeydown($event)\">\n <span class=\"ea-multi-select__trigger-content\">\n @if (!hasValue()) {\n <span class=\"ea-multi-select__trigger-placeholder\">\n <bdi>{{ resolvedPlaceholder() }}</bdi>\n </span>\n } @else {\n @for (opt of visibleChips(); track opt.value) {\n <ea-tag\n [size]=\"size()\"\n variant=\"default\"\n [maxWidth]=\"maxChipWidth()\"\n [removable]=\"!isDisabled() && !readonly()\"\n [removeTabbable]=\"false\"\n [removeLabel]=\"i18n.messages().multiSelect.removeOption(opt.label)\"\n (removed)=\"removeChip(opt)\">\n <span>{{ opt.label }}</span>\n </ea-tag>\n }\n @if (hiddenChipCount() > 0) {\n <span class=\"ea-multi-select__more\">+{{ hiddenChipCount() }}</span>\n }\n }\n </span>\n </div>\n @if (hasValue() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"ea-multi-select__clear\"\n [attr.aria-label]=\"i18n.messages().multiSelect.clearAll\"\n (click)=\"clear($event)\">\n <ea-icon-x\n class=\"ea-multi-select__clear-icon\"\n aria-hidden=\"true\" />\n </button>\n }\n <ea-icon-chevron-down\n class=\"ea-multi-select__trigger-icon\"\n aria-hidden=\"true\" />\n </div>\n\n <ea-popover\n [anchor]=\"wrapperEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n [aria-label]=\"i18n.messages().multiSelect.dialogLabel\"\n [matchAnchorWidth]=\"true\"\n [maxWidth]=\"popoverMaxWidth()\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"reposition\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-multi-select__popover\"\n [ngClass]=\"menuClasses()\"\n [style.max-height.px]=\"popoverMaxHeight()\">\n @if (searchable()) {\n <div class=\"ea-multi-select__search\">\n <ea-icon-search\n class=\"ea-multi-select__search-icon\"\n aria-hidden=\"true\" />\n <input\n #searchEl\n type=\"text\"\n dir=\"auto\"\n class=\"ea-multi-select__search-input\"\n autocomplete=\"off\"\n [placeholder]=\"resolvedSearchPlaceholder()\"\n [value]=\"searchTerm()\"\n [attr.aria-controls]=\"listboxId()\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"handlePopoverKeydown($event)\" />\n </div>\n }\n\n <ul\n #listEl\n class=\"ea-multi-select__list\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [id]=\"listboxId()\"\n [attr.aria-label]=\"label() ?? ariaLabel() ?? null\">\n @if (selectAllVisible()) {\n <li\n class=\"ea-multi-select__option ea-multi-select__option--select-all\"\n [class.ea-multi-select__option--focused]=\"focusedIndex() === 0\"\n [id]=\"id() + '-opt-0'\"\n role=\"option\"\n [attr.aria-selected]=\"selectAllState() === 'all'\"\n [attr.aria-checked]=\"selectAllAriaChecked()\"\n (click)=\"onSelectAllClick()\">\n <ea-checkbox\n size=\"sm\"\n inert\n aria-hidden=\"true\"\n [checked]=\"selectAllState() === 'all'\"\n [indeterminate]=\"selectAllState() === 'some'\" />\n <span class=\"ea-multi-select__option-label\">\n {{ i18n.messages().multiSelect.selectAll }}\n </span>\n </li>\n }\n @for (group of renderedGroups(); track $index) {\n <li\n class=\"ea-multi-select__group\"\n [class.ea-multi-select__group--ruled]=\"group.rule\"\n role=\"presentation\">\n @if (group.label; as groupLabel) {\n <span\n class=\"ea-multi-select__group-label\"\n aria-hidden=\"true\">\n {{ groupLabel }}\n </span>\n }\n <ul\n class=\"ea-multi-select__group-options\"\n [attr.role]=\"grouped() ? 'group' : 'presentation'\"\n [attr.aria-label]=\"group.label ?? null\">\n @for (entry of group.options; track entry.option.value) {\n <li\n class=\"ea-multi-select__option\"\n [class.ea-multi-select__option--focused]=\"\n focusedIndex() === entry.index + selectAllOffset()\n \"\n [class.ea-multi-select__option--disabled]=\"entry.option.disabled\"\n [id]=\"id() + '-opt-' + (entry.index + selectAllOffset())\"\n role=\"option\"\n [attr.aria-selected]=\"selectedSet().has(entry.option.value)\"\n [attr.aria-disabled]=\"entry.option.disabled || null\"\n (click)=\"onOptionClick(entry.option, entry.index)\">\n <ea-checkbox\n size=\"sm\"\n inert\n aria-hidden=\"true\"\n [checked]=\"selectedSet().has(entry.option.value)\"\n [disabled]=\"!!entry.option.disabled\" />\n <span\n #optionLabelEl\n class=\"ea-multi-select__option-label\"\n [attr.data-value]=\"entry.option.value\"\n [eaTooltip]=\"\n clippedOptions().has(entry.option.value) ? entry.option.label : ''\n \">\n {{ entry.option.label }}\n </span>\n </li>\n }\n </ul>\n </li>\n }\n @if (creatableText(); as newText) {\n <li\n class=\"ea-multi-select__option ea-multi-select__option--create\"\n [class.ea-multi-select__option--focused]=\"focusedIndex() === createRow()\"\n [id]=\"id() + '-opt-' + createRow()\"\n role=\"option\"\n [attr.aria-selected]=\"false\"\n (click)=\"createOption()\">\n <ea-icon-plus\n class=\"ea-multi-select__create-icon\"\n aria-hidden=\"true\" />\n <span class=\"ea-multi-select__option-label\">\n {{ i18n.messages().multiSelect.create(newText) }}\n </span>\n </li>\n }\n </ul>\n @if (filteredOptions().length === 0 && !creatableText()) {\n <div\n class=\"ea-multi-select__empty\"\n role=\"status\">\n {{ i18n.messages().multiSelect.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",
19585
- styles: [".ea-multi-select-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-multi-select-field--2xs{font-size:var(--font-size-2xs)}.ea-multi-select-field--xs{font-size:var(--font-size-xs)}.ea-multi-select-field--sm{font-size:var(--font-size-sm)}.ea-multi-select-field--md{font-size:var(--font-size-md)}.ea-multi-select-field--lg{font-size:var(--font-size-lg)}.ea-multi-select-field--xl{font-size:var(--font-size-xl)}.ea-multi-select{position:relative}.ea-multi-select__trigger-wrapper{position:relative;display:flex;align-items:center;gap:.5em;width:100%;min-height:2.5em;padding:.375em .75em;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-multi-select__trigger-wrapper:has(ea-tag){padding-block:.125em}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger:focus-visible){box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger:focus-visible){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open){border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error){border-color:var(--color-error-default)}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error.ea-multi-select__trigger--open){box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error.ea-multi-select__trigger--open){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--disabled){background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly){cursor:default}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly:focus-visible){border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly:focus-visible){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger{display:flex;align-items:center;flex:1;min-width:0;text-align:start;font-family:var(--font-family-sans);cursor:pointer}.ea-multi-select__trigger:focus-visible{outline:none}.ea-multi-select__trigger--disabled,.ea-multi-select__trigger--readonly{cursor:default}.ea-multi-select__trigger-content{display:flex;flex-wrap:nowrap;align-items:center;gap:.25em;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}.ea-multi-select__trigger-content::-webkit-scrollbar{display:none}.ea-multi-select__trigger-content ea-tag{flex-shrink:0;--ea-tag-padding-block: 0}.ea-multi-select__trigger-placeholder{color:var(--color-text-tertiary)}.ea-multi-select__trigger-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:var(--transition-transform)}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open) .ea-multi-select__trigger-icon{transform:rotate(180deg)}.ea-multi-select__more{display:inline-flex;flex-shrink:0;align-items:center;padding:0 .4411764706em;border-radius:var(--radius-lg);background-color:var(--color-bg-muted);font-size:.85em;font-weight:var(--font-weight-medium);color:var(--color-text-secondary)}.ea-multi-select__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-multi-select__clear>*{font-size:1.25em}.ea-multi-select__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-multi-select__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-multi-select__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__clear:disabled{cursor:default;opacity:.5}.ea-multi-select__clear{flex-shrink:0}.ea-multi-select__popover{display:flex;flex-direction:column;overflow:hidden;max-height:20rem;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-multi-select-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-multi-select__popover{border:1px solid CanvasText}}.ea-multi-select__popover--2xs{font-size:var(--font-size-2xs)}.ea-multi-select__popover--xs{font-size:var(--font-size-xs)}.ea-multi-select__popover--sm{font-size:var(--font-size-sm)}.ea-multi-select__popover--md{font-size:var(--font-size-md)}.ea-multi-select__popover--lg{font-size:var(--font-size-lg)}.ea-multi-select__popover--xl{font-size:var(--font-size-xl)}.ea-multi-select__search{display:flex;align-items:center;gap:.5em;flex-shrink:0;padding:.5em .75em;border-bottom:var(--border-width-thin) solid var(--color-border-default)}.ea-multi-select__search-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-tertiary)}.ea-multi-select__search-input{flex:1;min-width:0;padding:0;border:none;background:none;font-family:var(--font-family-sans);font-size:inherit;color:var(--color-text-primary)}.ea-multi-select__search-input::placeholder{color:var(--color-text-tertiary);opacity:1}.ea-multi-select__search-input:focus{outline:none}.ea-multi-select__list{overflow-y:auto;overscroll-behavior:none;flex:1;margin:0;padding:.25em 0;list-style:none}.ea-multi-select__group{position:relative}.ea-multi-select__group--ruled{padding-top:.25em;margin-top:.25em}.ea-multi-select__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-multi-select__group-options{padding:0;margin:0;list-style:none}.ea-multi-select__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-multi-select__option{display:flex;align-items:center;gap:.5em;padding:.375em .75em;font-size:inherit;font-family:var(--font-family-sans);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-multi-select__option--focused{background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-multi-select__option--focused{background-color:Highlight;color:HighlightText}}.ea-multi-select__option--disabled{color:var(--color-text-disabled);cursor:default}@media(forced-colors:active){.ea-multi-select__option--disabled{color:GrayText}}.ea-multi-select__option--select-all{border-bottom:var(--border-width-thin) solid var(--color-border-default);font-weight:var(--font-weight-medium)}.ea-multi-select__option--create{font-weight:var(--font-weight-medium);color:var(--color-brand-text)}.ea-multi-select__option:hover:not(.ea-multi-select__option--disabled){background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-multi-select__option:hover:not(.ea-multi-select__option--disabled){background-color:Highlight;color:HighlightText}}.ea-multi-select__option ea-checkbox{pointer-events:none;display:inline-flex;align-items:center;line-height:1}.ea-multi-select__create-icon{flex-shrink:0;width:1em;height:1em}.ea-multi-select__option-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-multi-select__empty{padding:.75em;font-size:inherit;text-align:center;color:var(--color-text-tertiary);list-style:none}\n"]
21812
+ styles: [".ea-multi-select-field{display:flex;flex-direction:column;gap:.375em;--ea-field-label-size: .875em;--ea-field-messages-size: .8125em}.ea-multi-select-field--2xs{font-size:var(--font-size-2xs)}.ea-multi-select-field--xs{font-size:var(--font-size-xs)}.ea-multi-select-field--sm{font-size:var(--font-size-sm)}.ea-multi-select-field--md{font-size:var(--font-size-md)}.ea-multi-select-field--lg{font-size:var(--font-size-lg)}.ea-multi-select-field--xl{font-size:var(--font-size-xl)}.ea-multi-select{position:relative}.ea-multi-select__trigger-wrapper{position:relative;display:flex;align-items:center;gap:.5em;width:100%;min-height:2.5em;padding:.375em .75em;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-multi-select__trigger-wrapper:has(ea-tag){padding-block:.125em}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger:focus-visible){box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger:focus-visible){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open){border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error){border-color:var(--color-error-default)}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error.ea-multi-select__trigger--open){box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--error.ea-multi-select__trigger--open){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--disabled){background-color:var(--color-bg-muted);opacity:.6;cursor:default}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly){cursor:default}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly:focus-visible){border-color:var(--color-border-focus);box-shadow:none}@media(forced-colors:active){.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--readonly:focus-visible){outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__trigger{display:flex;align-items:center;flex:1;min-width:0;text-align:start;font-family:var(--font-family-sans);cursor:pointer}.ea-multi-select__trigger:focus-visible{outline:none}.ea-multi-select__trigger--disabled,.ea-multi-select__trigger--readonly{cursor:default}.ea-multi-select__trigger-content{display:flex;flex-wrap:nowrap;align-items:center;gap:.25em;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}.ea-multi-select__trigger-content::-webkit-scrollbar{display:none}.ea-multi-select__trigger-content ea-tag{flex-shrink:0;--ea-tag-padding-block: 0}.ea-multi-select__trigger-placeholder{color:var(--color-text-tertiary)}.ea-multi-select__trigger-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary);transition:var(--transition-transform)}.ea-multi-select__trigger-wrapper:has(.ea-multi-select__trigger--open) .ea-multi-select__trigger-icon{transform:rotate(180deg)}.ea-multi-select__more{display:inline-flex;flex-shrink:0;align-items:center;padding:0 .4285714286em;font-size:.875em;font-weight:var(--font-weight-medium);border-radius:var(--radius-lg);background-color:var(--color-bg-muted);color:var(--color-text-secondary)}.ea-multi-select__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-multi-select__clear>*{font-size:1.25em}.ea-multi-select__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-multi-select__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-multi-select__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-multi-select__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-multi-select__clear:disabled{cursor:default;opacity:.5}.ea-multi-select__clear{flex-shrink:0}.ea-multi-select__popover{display:flex;flex-direction:column;overflow:hidden;max-height:20rem;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-multi-select-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-multi-select__popover{border:1px solid CanvasText}}.ea-multi-select__popover--2xs{font-size:var(--font-size-2xs)}.ea-multi-select__popover--xs{font-size:var(--font-size-xs)}.ea-multi-select__popover--sm{font-size:var(--font-size-sm)}.ea-multi-select__popover--md{font-size:var(--font-size-md)}.ea-multi-select__popover--lg{font-size:var(--font-size-lg)}.ea-multi-select__popover--xl{font-size:var(--font-size-xl)}.ea-multi-select__search{display:flex;align-items:center;gap:.5em;flex-shrink:0;padding:.5em .75em;border-bottom:var(--border-width-thin) solid var(--color-border-default)}.ea-multi-select__search-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-tertiary)}.ea-multi-select__search-input{flex:1;min-width:0;padding:0;border:none;background:none;font-family:var(--font-family-sans);font-size:inherit;color:var(--color-text-primary)}.ea-multi-select__search-input::placeholder{color:var(--color-text-tertiary);opacity:1}.ea-multi-select__search-input:focus{outline:none}.ea-multi-select__list{overflow-y:auto;overscroll-behavior:none;flex:1;margin:0;padding:.25em 0;list-style:none}.ea-multi-select__group{position:relative}.ea-multi-select__group--ruled{padding-top:.25em;margin-top:.25em}.ea-multi-select__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-multi-select__group-options{padding:0;margin:0;list-style:none}.ea-multi-select__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-multi-select__option{display:flex;align-items:center;gap:.5em;padding:.375em .75em;font-size:inherit;font-family:var(--font-family-sans);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-multi-select__option--focused{background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-multi-select__option--focused{background-color:Highlight;color:HighlightText}}.ea-multi-select__option--disabled{color:var(--color-text-disabled);cursor:default}@media(forced-colors:active){.ea-multi-select__option--disabled{color:GrayText}}.ea-multi-select__option--select-all{border-bottom:var(--border-width-thin) solid var(--color-border-default);font-weight:var(--font-weight-medium)}.ea-multi-select__option--create{font-weight:var(--font-weight-medium);color:var(--color-brand-text)}.ea-multi-select__option:hover:not(.ea-multi-select__option--disabled){background-color:var(--color-state-hover)}@media(forced-colors:active){.ea-multi-select__option:hover:not(.ea-multi-select__option--disabled){background-color:Highlight;color:HighlightText}}.ea-multi-select__option ea-checkbox{pointer-events:none;display:inline-flex;align-items:center;line-height:1}.ea-multi-select__create-icon{flex-shrink:0;width:1em;height:1em}.ea-multi-select__option-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-multi-select__empty{padding:.75em;font-size:inherit;text-align:center;color:var(--color-text-tertiary);list-style:none}\n"]
19586
21813
  }]
19587
21814
  }],
19588
21815
  ctorParameters: () => [],
@@ -20312,36 +22539,6 @@ i0.ɵɵngDeclareClassMetadata({
20312
22539
  }]
20313
22540
  }
20314
22541
  });
20315
- function intlLocalizes(locale) {
20316
- try {
20317
- return new Intl.NumberFormat(locale).resolvedOptions().locale.split("-")[0] === locale.split("-")[0];
20318
- } catch {
20319
- return false;
20320
- }
20321
- }
20322
- function groupInteger(digits, sep, grouping) {
20323
- const primary = grouping[0] ?? 3;
20324
- const secondary = grouping[1] ?? primary;
20325
- if (digits.length <= primary) return digits;
20326
- let result = digits.slice(digits.length - primary);
20327
- let rest = digits.slice(0, digits.length - primary);
20328
- while (rest.length > 0) {
20329
- const take = Math.min(secondary, rest.length);
20330
- result = `${rest.slice(rest.length - take)}${sep}${result}`;
20331
- rest = rest.slice(0, rest.length - take);
20332
- }
20333
- return result;
20334
- }
20335
- function formatGroupedNumber(value, locale, format, options) {
20336
- if (intlLocalizes(locale)) return value.toLocaleString(locale, options);
20337
- if (!isFinite(value)) return String(value);
20338
- const magnitude = Math.abs(value).toString();
20339
- if (magnitude.includes("e") || magnitude.includes("E")) return value.toString();
20340
- const [intPart, fracPart] = magnitude.split(".");
20341
- const grouped = groupInteger(intPart, format.group, format.grouping);
20342
- const body = fracPart != null ? `${grouped}${format.decimal}${fracPart}` : grouped;
20343
- return value < 0 ? `-${body}` : body;
20344
- }
20345
22542
  const PAGE_SIZE_ALL = -1;
20346
22543
  var PaginatorComponent = class PaginatorComponent {
20347
22544
  i18n = inject(EagamiI18nService);
@@ -20705,6 +22902,449 @@ i0.ɵɵngDeclareClassMetadata({
20705
22902
  }]
20706
22903
  }
20707
22904
  });
22905
+ const ACTIVE_OFFSET = 6;
22906
+ const DONUT_RATIO = .6;
22907
+ function polar(cx, cy, r, angle) {
22908
+ return [cx + r * Math.cos(angle), cy + r * Math.sin(angle)];
22909
+ }
22910
+ function slicePath(cx, cy, outer, inner, start, end) {
22911
+ if (end - start >= Math.PI * 2 - 1e-6) {
22912
+ const ring = (r, sweep) => `M${cx + r},${cy}A${r},${r} 0 1 ${sweep} ${cx - r},${cy}A${r},${r} 0 1 ${sweep} ${cx + r},${cy}Z`;
22913
+ return inner > 0 ? `${ring(outer, 1)}${ring(inner, 0)}` : ring(outer, 1);
22914
+ }
22915
+ const large = end - start > Math.PI ? 1 : 0;
22916
+ const [ox0, oy0] = polar(cx, cy, outer, start);
22917
+ const [ox1, oy1] = polar(cx, cy, outer, end);
22918
+ if (inner <= 0) return `M${cx},${cy}L${ox0},${oy0}A${outer},${outer} 0 ${large} 1 ${ox1},${oy1}Z`;
22919
+ const [ix0, iy0] = polar(cx, cy, inner, start);
22920
+ const [ix1, iy1] = polar(cx, cy, inner, end);
22921
+ return `M${ox0},${oy0}A${outer},${outer} 0 ${large} 1 ${ox1},${oy1}L${ix1},${iy1}A${inner},${inner} 0 ${large} 0 ${ix0},${iy0}Z`;
22922
+ }
22923
+ var PieChartComponent = class PieChartComponent {
22924
+ i18n = inject(EagamiI18nService);
22925
+ data = input([], ...ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []);
22926
+ variant = input("pie", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
22927
+ showLegend = input(true, ...ngDevMode ? [{ debugName: "showLegend" }] : /* istanbul ignore next */ []);
22928
+ showPercentages = input(true, ...ngDevMode ? [{ debugName: "showPercentages" }] : /* istanbul ignore next */ []);
22929
+ height = input(240, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
22930
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
22931
+ animation = input("sweep", ...ngDevMode ? [{ debugName: "animation" }] : /* istanbul ignore next */ []);
22932
+ animationDuration = input(600, ...ngDevMode ? [{ debugName: "animationDuration" }] : /* istanbul ignore next */ []);
22933
+ formatValue = input(null, ...ngDevMode ? [{ debugName: "formatValue" }] : /* istanbul ignore next */ []);
22934
+ ariaLabel = input(void 0, {
22935
+ ...ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {},
22936
+ alias: "aria-label"
22937
+ });
22938
+ sliceClick = output();
22939
+ activeSliceChange = output();
22940
+ viewport = injectChartViewport(this.size);
22941
+ format = injectChartFormatter(this.formatValue);
22942
+ active = signal(null, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
22943
+ label = computed(() => this.ariaLabel() || this.i18n.messages().chart.pieChart, ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
22944
+ total = computed(() => this.data().reduce((sum, slice) => sum + this.sliceValue(slice), 0), ...ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []);
22945
+ hasData = computed(() => this.total() > 0, ...ngDevMode ? [{ debugName: "hasData" }] : /* istanbul ignore next */ []);
22946
+ renderPass = computed(() => {
22947
+ this.data();
22948
+ this.variant();
22949
+ this.animation();
22950
+ this.animationDuration();
22951
+ return [{}];
22952
+ }, ...ngDevMode ? [{ debugName: "renderPass" }] : /* istanbul ignore next */ []);
22953
+ hostClasses = computed(() => ({
22954
+ [`ea-pie-chart--${this.size()}`]: true,
22955
+ [`ea-pie-chart--${this.variant()}`]: true,
22956
+ [`ea-pie-chart--animate-${this.animation()}`]: true
22957
+ }), ...ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []);
22958
+ layout = computed(() => {
22959
+ const diameter = Math.max(1, Math.min(this.viewport.width(), this.height()));
22960
+ const cx = diameter / 2;
22961
+ const cy = diameter / 2;
22962
+ const outer = Math.max(1, diameter / 2 - ACTIVE_OFFSET);
22963
+ const inner = this.variant() === "donut" ? outer * DONUT_RATIO : 0;
22964
+ const total = this.total();
22965
+ const slices = [];
22966
+ let angle = -Math.PI / 2;
22967
+ this.data().forEach((slice, index) => {
22968
+ const value = this.sliceValue(slice);
22969
+ if (value <= 0 || total <= 0) return;
22970
+ const sweep = value / total * Math.PI * 2;
22971
+ slices.push({
22972
+ index,
22973
+ path: slicePath(cx, cy, outer, inner, angle, angle + sweep),
22974
+ color: chartColor(index, slice.color),
22975
+ midAngle: angle + sweep / 2,
22976
+ start: angle,
22977
+ end: angle + sweep
22978
+ });
22979
+ angle += sweep;
22980
+ });
22981
+ return {
22982
+ diameter,
22983
+ cx,
22984
+ cy,
22985
+ outer,
22986
+ inner,
22987
+ slices
22988
+ };
22989
+ }, ...ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []);
22990
+ legend = computed(() => this.data().map((slice, index) => ({
22991
+ label: slice.label,
22992
+ color: chartColor(index, slice.color),
22993
+ percent: this.formatPercent(this.percentOf(index))
22994
+ })), ...ngDevMode ? [{ debugName: "legend" }] : /* istanbul ignore next */ []);
22995
+ tooltip = computed(() => {
22996
+ const index = this.active();
22997
+ const layout = this.layout();
22998
+ const slice = layout.slices.find((s) => s.index === index);
22999
+ if (index === null || !slice) return null;
23000
+ const reach = layout.inner > 0 ? (layout.outer + layout.inner) / 2 : layout.outer * .6;
23001
+ const [x, y] = polar(layout.cx, layout.cy, reach, slice.midAngle);
23002
+ return {
23003
+ x,
23004
+ y,
23005
+ title: this.data()[index].label,
23006
+ color: slice.color,
23007
+ detail: `${this.format()(this.sliceValue(this.data()[index]))} (${this.formatPercent(this.percentOf(index))})`,
23008
+ key: index
23009
+ };
23010
+ }, ...ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []);
23011
+ tooltips = computed(() => {
23012
+ const tip = this.tooltip();
23013
+ return tip ? [tip] : [];
23014
+ }, ...ngDevMode ? [{ debugName: "tooltips" }] : /* istanbul ignore next */ []);
23015
+ announcement = computed(() => {
23016
+ const event = this.eventFor(this.active());
23017
+ return event ? this.i18n.messages().chart.slice(event.label, this.format()(event.value), this.formatPercent(event.percent)) : "";
23018
+ }, ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
23019
+ tableValue(slice) {
23020
+ return this.format()(this.sliceValue(slice));
23021
+ }
23022
+ tablePercent(index) {
23023
+ return this.formatPercent(this.percentOf(index));
23024
+ }
23025
+ isDimmed(index) {
23026
+ const active = this.active();
23027
+ return active !== null && active !== index;
23028
+ }
23029
+ offset(slice) {
23030
+ if (this.active() !== slice.index || this.layout().slices.length < 2) return null;
23031
+ const [dx, dy] = polar(0, 0, ACTIVE_OFFSET, slice.midAngle);
23032
+ return `translate(${dx}px, ${dy}px)`;
23033
+ }
23034
+ onPointerMove(event) {
23035
+ const rect = event.currentTarget.getBoundingClientRect();
23036
+ const layout = this.layout();
23037
+ const dx = event.clientX - rect.left - layout.cx;
23038
+ const dy = event.clientY - rect.top - layout.cy;
23039
+ const distance = Math.hypot(dx, dy);
23040
+ if (distance < layout.inner || distance > layout.outer + ACTIVE_OFFSET) {
23041
+ this.setActive(null);
23042
+ return;
23043
+ }
23044
+ let angle = Math.atan2(dy, dx);
23045
+ if (angle < -Math.PI / 2) angle += Math.PI * 2;
23046
+ const slice = layout.slices.find((s) => angle >= s.start && angle < s.end);
23047
+ this.setActive(slice ? slice.index : null);
23048
+ }
23049
+ onPointerLeave() {
23050
+ this.setActive(null);
23051
+ }
23052
+ onClick() {
23053
+ const event = this.eventFor(this.active());
23054
+ if (event) this.sliceClick.emit(event);
23055
+ }
23056
+ onFocus() {
23057
+ if (this.active() === null) this.setActive(this.layout().slices[0]?.index ?? null);
23058
+ }
23059
+ onBlur() {
23060
+ this.setActive(null);
23061
+ }
23062
+ onKeydown(event) {
23063
+ const slices = this.layout().slices;
23064
+ if (!slices.length) return;
23065
+ if (this.active() === null && event.key.startsWith("Arrow")) {
23066
+ event.preventDefault();
23067
+ this.setActive(slices[0].index);
23068
+ return;
23069
+ }
23070
+ const position = Math.max(0, slices.findIndex((s) => s.index === this.active()));
23071
+ let next = slices[position].index;
23072
+ switch (event.key) {
23073
+ case "ArrowRight":
23074
+ case "ArrowDown":
23075
+ next = slices[(position + 1) % slices.length].index;
23076
+ break;
23077
+ case "ArrowLeft":
23078
+ case "ArrowUp":
23079
+ next = slices[(position - 1 + slices.length) % slices.length].index;
23080
+ break;
23081
+ case "Home":
23082
+ next = slices[0].index;
23083
+ break;
23084
+ case "End":
23085
+ next = slices[slices.length - 1].index;
23086
+ break;
23087
+ case "Enter":
23088
+ case " ":
23089
+ this.onClick();
23090
+ break;
23091
+ case "Escape":
23092
+ next = null;
23093
+ break;
23094
+ default: return;
23095
+ }
23096
+ event.preventDefault();
23097
+ this.setActive(next);
23098
+ }
23099
+ sliceValue(slice) {
23100
+ return isFinite(slice.value) ? Math.max(0, slice.value) : 0;
23101
+ }
23102
+ percentOf(index) {
23103
+ const total = this.total();
23104
+ const slice = this.data()[index];
23105
+ return total > 0 && slice ? this.sliceValue(slice) / total * 100 : 0;
23106
+ }
23107
+ formatPercent(percent) {
23108
+ return `${formatGroupedNumber(percent, this.i18n.locale(), this.i18n.messages().numberFormat, { maximumFractionDigits: 1 })}%`;
23109
+ }
23110
+ eventFor(index) {
23111
+ const slice = index === null ? void 0 : this.data()[index];
23112
+ if (index === null || !slice) return null;
23113
+ return {
23114
+ index,
23115
+ label: slice.label,
23116
+ value: this.sliceValue(slice),
23117
+ percent: this.percentOf(index)
23118
+ };
23119
+ }
23120
+ setActive(next) {
23121
+ if (this.active() === next) return;
23122
+ this.active.set(next);
23123
+ this.activeSliceChange.emit(this.eventFor(next));
23124
+ }
23125
+ static ɵfac = i0.ɵɵngDeclareFactory({
23126
+ minVersion: "12.0.0",
23127
+ version: "22.2.0",
23128
+ ngImport: i0,
23129
+ type: PieChartComponent,
23130
+ deps: [],
23131
+ target: i0.ɵɵFactoryTarget.Component
23132
+ });
23133
+ static ɵcmp = i0.ɵɵngDeclareComponent({
23134
+ minVersion: "17.0.0",
23135
+ version: "22.2.0",
23136
+ type: PieChartComponent,
23137
+ isStandalone: true,
23138
+ selector: "ea-pie-chart",
23139
+ inputs: {
23140
+ data: {
23141
+ classPropertyName: "data",
23142
+ publicName: "data",
23143
+ isSignal: true,
23144
+ isRequired: false,
23145
+ transformFunction: null
23146
+ },
23147
+ variant: {
23148
+ classPropertyName: "variant",
23149
+ publicName: "variant",
23150
+ isSignal: true,
23151
+ isRequired: false,
23152
+ transformFunction: null
23153
+ },
23154
+ showLegend: {
23155
+ classPropertyName: "showLegend",
23156
+ publicName: "showLegend",
23157
+ isSignal: true,
23158
+ isRequired: false,
23159
+ transformFunction: null
23160
+ },
23161
+ showPercentages: {
23162
+ classPropertyName: "showPercentages",
23163
+ publicName: "showPercentages",
23164
+ isSignal: true,
23165
+ isRequired: false,
23166
+ transformFunction: null
23167
+ },
23168
+ height: {
23169
+ classPropertyName: "height",
23170
+ publicName: "height",
23171
+ isSignal: true,
23172
+ isRequired: false,
23173
+ transformFunction: null
23174
+ },
23175
+ size: {
23176
+ classPropertyName: "size",
23177
+ publicName: "size",
23178
+ isSignal: true,
23179
+ isRequired: false,
23180
+ transformFunction: null
23181
+ },
23182
+ animation: {
23183
+ classPropertyName: "animation",
23184
+ publicName: "animation",
23185
+ isSignal: true,
23186
+ isRequired: false,
23187
+ transformFunction: null
23188
+ },
23189
+ animationDuration: {
23190
+ classPropertyName: "animationDuration",
23191
+ publicName: "animationDuration",
23192
+ isSignal: true,
23193
+ isRequired: false,
23194
+ transformFunction: null
23195
+ },
23196
+ formatValue: {
23197
+ classPropertyName: "formatValue",
23198
+ publicName: "formatValue",
23199
+ isSignal: true,
23200
+ isRequired: false,
23201
+ transformFunction: null
23202
+ },
23203
+ ariaLabel: {
23204
+ classPropertyName: "ariaLabel",
23205
+ publicName: "aria-label",
23206
+ isSignal: true,
23207
+ isRequired: false,
23208
+ transformFunction: null
23209
+ }
23210
+ },
23211
+ outputs: {
23212
+ sliceClick: "sliceClick",
23213
+ activeSliceChange: "activeSliceChange"
23214
+ },
23215
+ ngImport: i0,
23216
+ template: "<div\n class=\"ea-pie-chart\"\n [ngClass]=\"hostClasses()\"\n [style.--ea-chart-duration]=\"animationDuration() + 'ms'\">\n @if (hasData()) {\n <div\n class=\"ea-pie-chart__plot\"\n role=\"group\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"i18n.messages().chart.roleDescription\"\n [attr.aria-label]=\"label()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\">\n <div class=\"ea-pie-chart__figure\">\n @for (pass of renderPass(); track pass) {\n <svg\n class=\"ea-pie-chart__svg\"\n aria-hidden=\"true\"\n [attr.width]=\"layout().diameter\"\n [attr.height]=\"layout().diameter\"\n [attr.viewBox]=\"'0 0 ' + layout().diameter + ' ' + layout().diameter\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerdown)=\"onPointerMove($event)\"\n (pointerleave)=\"onPointerLeave()\"\n (click)=\"onClick()\">\n @for (slice of layout().slices; track slice.index) {\n <path\n class=\"ea-pie-chart__slice\"\n fill-rule=\"evenodd\"\n [class.ea-pie-chart__slice--dimmed]=\"isDimmed(slice.index)\"\n [style.--ea-chart-color]=\"slice.color\"\n [style.transform]=\"offset(slice)\"\n [attr.d]=\"slice.path\" />\n }\n @for (tip of tooltips(); track tip.key) {\n <rect\n class=\"ea-pie-chart__anchor\"\n width=\"2\"\n height=\"2\"\n [attr.x]=\"tip.x - 1\"\n [attr.y]=\"tip.y - 1\"\n [eaTooltip]=\"tooltipContent\"\n [tooltipOpen]=\"true\"\n [maxWidth]=\"undefined\" />\n }\n </svg>\n }\n <ng-template #tooltipContent>\n @if (tooltip(); as tip) {\n <div class=\"ea-pie-chart__tooltip\">\n <span class=\"ea-pie-chart__tooltip-row\">\n <span\n class=\"ea-pie-chart__swatch\"\n [style.--ea-chart-color]=\"tip.color\">\n </span>\n <span class=\"ea-pie-chart__tooltip-title\">{{ tip.title }}</span>\n </span>\n <span class=\"ea-pie-chart__tooltip-value\">{{ tip.detail }}</span>\n </div>\n }\n </ng-template>\n </div>\n <table class=\"ea-pie-chart__table\">\n <caption>\n {{ label() }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.messages().chart.category }}</th>\n <th scope=\"col\">{{ i18n.messages().chart.value }}</th>\n <th scope=\"col\">{{ i18n.messages().chart.share }}</th>\n </tr>\n </thead>\n <tbody>\n @for (slice of data(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ slice.label }}</th>\n <td>{{ tableValue(slice) }}</td>\n <td>{{ tablePercent(i) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div\n class=\"ea-pie-chart__live\"\n aria-live=\"polite\">\n {{ announcement() }}\n </div>\n } @else {\n <div\n class=\"ea-pie-chart__empty\"\n role=\"img\"\n [attr.aria-label]=\"label()\"\n [style.height.px]=\"height()\">\n {{ i18n.messages().chart.noData }}\n </div>\n }\n @if (showLegend() && hasData()) {\n <ul\n class=\"ea-pie-chart__legend\"\n aria-hidden=\"true\">\n @for (item of legend(); track $index) {\n <li class=\"ea-pie-chart__legend-item\">\n <span\n class=\"ea-pie-chart__swatch\"\n [style.--ea-chart-color]=\"item.color\">\n </span>\n {{ item.label }}\n @if (showPercentages()) {\n <span class=\"ea-pie-chart__legend-percent\">{{ item.percent }}</span>\n }\n </li>\n }\n </ul>\n }\n</div>\n",
23217
+ styles: ["@keyframes ea-chart-fade{0%{opacity:0}}@keyframes ea-chart-draw{0%{stroke-dashoffset:1}}@keyframes ea-chart-grow-y{0%{transform:scaleY(0)}}@keyframes ea-chart-grow-x{0%{transform:scaleX(0)}}@keyframes ea-chart-grow{0%{transform:scale(0)}}@property --ea-pie-chart-sweep{syntax: \"<angle>\"; inherits: false; initial-value: 360deg;}ea-pie-chart{display:block}.ea-pie-chart{position:relative;display:flex;flex-direction:column;gap:.75em;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-pie-chart--2xs{font-size:var(--font-size-2xs)}.ea-pie-chart--xs{font-size:var(--font-size-xs)}.ea-pie-chart--sm{font-size:var(--font-size-sm)}.ea-pie-chart--md{font-size:var(--font-size-md)}.ea-pie-chart--lg{font-size:var(--font-size-lg)}.ea-pie-chart--xl{font-size:var(--font-size-xl)}.ea-pie-chart__plot{position:relative;border-radius:var(--radius-md);outline:none}.ea-pie-chart__plot:focus-visible{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-pie-chart__plot:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-pie-chart__plot svg{display:block;overflow:visible}.ea-pie-chart__plot{display:flex;justify-content:center}.ea-pie-chart__figure{position:relative}.ea-pie-chart__svg{display:block;touch-action:pan-y}.ea-pie-chart__slice{stroke:var(--ea-chart-surface, var(--color-bg-base));stroke-width:2px;stroke-linejoin:round;fill:var(--ea-chart-color);transition:opacity var(--duration-fast) var(--ease-out),transform var(--duration-fast) var(--ease-out)}.ea-pie-chart__slice--dimmed{opacity:.35}.ea-pie-chart__tooltip{display:flex;flex-direction:column;gap:var(--space-1)}.ea-pie-chart__anchor{fill:transparent}.ea-pie-chart__tooltip-title{font-weight:var(--font-weight-medium)}.ea-pie-chart__tooltip-row{display:flex;align-items:center;gap:.5em}.ea-pie-chart__tooltip-value{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}.ea-pie-chart__swatch{flex-shrink:0;width:.75em;height:.75em;border-radius:var(--radius-sm);background-color:var(--ea-chart-color)}.ea-pie-chart__legend{display:flex;flex-wrap:wrap;justify-content:center;gap:.375em 1em;padding:0;margin:0;font-size:.875em;list-style:none;color:var(--color-text-secondary)}.ea-pie-chart__legend-item{display:flex;align-items:center;gap:.375em}.ea-pie-chart__legend-percent{font-variant-numeric:tabular-nums;color:var(--color-text-tertiary)}.ea-pie-chart__table,.ea-pie-chart__live{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-pie-chart__empty{display:flex;align-items:center;justify-content:center;font-size:.875em;color:var(--color-text-tertiary)}.ea-pie-chart--animate-sweep .ea-pie-chart__svg{-webkit-mask-image:conic-gradient(currentColor var(--ea-pie-chart-sweep),transparent 0);mask-image:conic-gradient(currentColor var(--ea-pie-chart-sweep),transparent 0);animation-name:ea-pie-chart-sweep;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-pie-chart--animate-sweep .ea-pie-chart__svg{animation:none}}.ea-pie-chart--animate-grow .ea-pie-chart__svg{animation-name:ea-chart-grow;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-pie-chart--animate-grow .ea-pie-chart__svg{animation:none}}.ea-pie-chart--animate-fade .ea-pie-chart__svg{animation-name:ea-chart-fade;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-pie-chart--animate-fade .ea-pie-chart__svg{animation:none}}@keyframes ea-pie-chart-sweep{0%{--ea-pie-chart-sweep: 0deg}}\n"],
23218
+ dependencies: [{
23219
+ kind: "directive",
23220
+ type: NgClass,
23221
+ selector: "[ngClass]",
23222
+ inputs: ["class", "ngClass"]
23223
+ }, {
23224
+ kind: "directive",
23225
+ type: TooltipDirective,
23226
+ selector: "[eaTooltip]",
23227
+ inputs: [
23228
+ "eaTooltip",
23229
+ "tooltipPosition",
23230
+ "flip",
23231
+ "whenClipped",
23232
+ "maxWidth",
23233
+ "dismissDelay",
23234
+ "tooltipOpen"
23235
+ ]
23236
+ }],
23237
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
23238
+ encapsulation: i0.ViewEncapsulation.None
23239
+ });
23240
+ };
23241
+ i0.ɵɵngDeclareClassMetadata({
23242
+ minVersion: "12.0.0",
23243
+ version: "22.2.0",
23244
+ ngImport: i0,
23245
+ type: PieChartComponent,
23246
+ decorators: [{
23247
+ type: Component,
23248
+ args: [{
23249
+ selector: "ea-pie-chart",
23250
+ imports: [NgClass, TooltipDirective],
23251
+ changeDetection: ChangeDetectionStrategy.OnPush,
23252
+ encapsulation: ViewEncapsulation.None,
23253
+ template: "<div\n class=\"ea-pie-chart\"\n [ngClass]=\"hostClasses()\"\n [style.--ea-chart-duration]=\"animationDuration() + 'ms'\">\n @if (hasData()) {\n <div\n class=\"ea-pie-chart__plot\"\n role=\"group\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"i18n.messages().chart.roleDescription\"\n [attr.aria-label]=\"label()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\">\n <div class=\"ea-pie-chart__figure\">\n @for (pass of renderPass(); track pass) {\n <svg\n class=\"ea-pie-chart__svg\"\n aria-hidden=\"true\"\n [attr.width]=\"layout().diameter\"\n [attr.height]=\"layout().diameter\"\n [attr.viewBox]=\"'0 0 ' + layout().diameter + ' ' + layout().diameter\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerdown)=\"onPointerMove($event)\"\n (pointerleave)=\"onPointerLeave()\"\n (click)=\"onClick()\">\n @for (slice of layout().slices; track slice.index) {\n <path\n class=\"ea-pie-chart__slice\"\n fill-rule=\"evenodd\"\n [class.ea-pie-chart__slice--dimmed]=\"isDimmed(slice.index)\"\n [style.--ea-chart-color]=\"slice.color\"\n [style.transform]=\"offset(slice)\"\n [attr.d]=\"slice.path\" />\n }\n @for (tip of tooltips(); track tip.key) {\n <rect\n class=\"ea-pie-chart__anchor\"\n width=\"2\"\n height=\"2\"\n [attr.x]=\"tip.x - 1\"\n [attr.y]=\"tip.y - 1\"\n [eaTooltip]=\"tooltipContent\"\n [tooltipOpen]=\"true\"\n [maxWidth]=\"undefined\" />\n }\n </svg>\n }\n <ng-template #tooltipContent>\n @if (tooltip(); as tip) {\n <div class=\"ea-pie-chart__tooltip\">\n <span class=\"ea-pie-chart__tooltip-row\">\n <span\n class=\"ea-pie-chart__swatch\"\n [style.--ea-chart-color]=\"tip.color\">\n </span>\n <span class=\"ea-pie-chart__tooltip-title\">{{ tip.title }}</span>\n </span>\n <span class=\"ea-pie-chart__tooltip-value\">{{ tip.detail }}</span>\n </div>\n }\n </ng-template>\n </div>\n <table class=\"ea-pie-chart__table\">\n <caption>\n {{ label() }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.messages().chart.category }}</th>\n <th scope=\"col\">{{ i18n.messages().chart.value }}</th>\n <th scope=\"col\">{{ i18n.messages().chart.share }}</th>\n </tr>\n </thead>\n <tbody>\n @for (slice of data(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ slice.label }}</th>\n <td>{{ tableValue(slice) }}</td>\n <td>{{ tablePercent(i) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div\n class=\"ea-pie-chart__live\"\n aria-live=\"polite\">\n {{ announcement() }}\n </div>\n } @else {\n <div\n class=\"ea-pie-chart__empty\"\n role=\"img\"\n [attr.aria-label]=\"label()\"\n [style.height.px]=\"height()\">\n {{ i18n.messages().chart.noData }}\n </div>\n }\n @if (showLegend() && hasData()) {\n <ul\n class=\"ea-pie-chart__legend\"\n aria-hidden=\"true\">\n @for (item of legend(); track $index) {\n <li class=\"ea-pie-chart__legend-item\">\n <span\n class=\"ea-pie-chart__swatch\"\n [style.--ea-chart-color]=\"item.color\">\n </span>\n {{ item.label }}\n @if (showPercentages()) {\n <span class=\"ea-pie-chart__legend-percent\">{{ item.percent }}</span>\n }\n </li>\n }\n </ul>\n }\n</div>\n",
23254
+ styles: ["@keyframes ea-chart-fade{0%{opacity:0}}@keyframes ea-chart-draw{0%{stroke-dashoffset:1}}@keyframes ea-chart-grow-y{0%{transform:scaleY(0)}}@keyframes ea-chart-grow-x{0%{transform:scaleX(0)}}@keyframes ea-chart-grow{0%{transform:scale(0)}}@property --ea-pie-chart-sweep{syntax: \"<angle>\"; inherits: false; initial-value: 360deg;}ea-pie-chart{display:block}.ea-pie-chart{position:relative;display:flex;flex-direction:column;gap:.75em;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-pie-chart--2xs{font-size:var(--font-size-2xs)}.ea-pie-chart--xs{font-size:var(--font-size-xs)}.ea-pie-chart--sm{font-size:var(--font-size-sm)}.ea-pie-chart--md{font-size:var(--font-size-md)}.ea-pie-chart--lg{font-size:var(--font-size-lg)}.ea-pie-chart--xl{font-size:var(--font-size-xl)}.ea-pie-chart__plot{position:relative;border-radius:var(--radius-md);outline:none}.ea-pie-chart__plot:focus-visible{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-pie-chart__plot:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-pie-chart__plot svg{display:block;overflow:visible}.ea-pie-chart__plot{display:flex;justify-content:center}.ea-pie-chart__figure{position:relative}.ea-pie-chart__svg{display:block;touch-action:pan-y}.ea-pie-chart__slice{stroke:var(--ea-chart-surface, var(--color-bg-base));stroke-width:2px;stroke-linejoin:round;fill:var(--ea-chart-color);transition:opacity var(--duration-fast) var(--ease-out),transform var(--duration-fast) var(--ease-out)}.ea-pie-chart__slice--dimmed{opacity:.35}.ea-pie-chart__tooltip{display:flex;flex-direction:column;gap:var(--space-1)}.ea-pie-chart__anchor{fill:transparent}.ea-pie-chart__tooltip-title{font-weight:var(--font-weight-medium)}.ea-pie-chart__tooltip-row{display:flex;align-items:center;gap:.5em}.ea-pie-chart__tooltip-value{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}.ea-pie-chart__swatch{flex-shrink:0;width:.75em;height:.75em;border-radius:var(--radius-sm);background-color:var(--ea-chart-color)}.ea-pie-chart__legend{display:flex;flex-wrap:wrap;justify-content:center;gap:.375em 1em;padding:0;margin:0;font-size:.875em;list-style:none;color:var(--color-text-secondary)}.ea-pie-chart__legend-item{display:flex;align-items:center;gap:.375em}.ea-pie-chart__legend-percent{font-variant-numeric:tabular-nums;color:var(--color-text-tertiary)}.ea-pie-chart__table,.ea-pie-chart__live{position:absolute;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);width:1px;height:1px;padding:0;margin:-1px;white-space:nowrap;border:0}.ea-pie-chart__empty{display:flex;align-items:center;justify-content:center;font-size:.875em;color:var(--color-text-tertiary)}.ea-pie-chart--animate-sweep .ea-pie-chart__svg{-webkit-mask-image:conic-gradient(currentColor var(--ea-pie-chart-sweep),transparent 0);mask-image:conic-gradient(currentColor var(--ea-pie-chart-sweep),transparent 0);animation-name:ea-pie-chart-sweep;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-pie-chart--animate-sweep .ea-pie-chart__svg{animation:none}}.ea-pie-chart--animate-grow .ea-pie-chart__svg{animation-name:ea-chart-grow;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-pie-chart--animate-grow .ea-pie-chart__svg{animation:none}}.ea-pie-chart--animate-fade .ea-pie-chart__svg{animation-name:ea-chart-fade;animation-duration:var(--ea-chart-duration, .6s);animation-timing-function:var(--ease-out);animation-fill-mode:both}@media(prefers-reduced-motion:reduce){.ea-pie-chart--animate-fade .ea-pie-chart__svg{animation:none}}@keyframes ea-pie-chart-sweep{0%{--ea-pie-chart-sweep: 0deg}}\n"]
23255
+ }]
23256
+ }],
23257
+ propDecorators: {
23258
+ data: [{
23259
+ type: i0.Input,
23260
+ args: [{
23261
+ isSignal: true,
23262
+ alias: "data",
23263
+ required: false
23264
+ }]
23265
+ }],
23266
+ variant: [{
23267
+ type: i0.Input,
23268
+ args: [{
23269
+ isSignal: true,
23270
+ alias: "variant",
23271
+ required: false
23272
+ }]
23273
+ }],
23274
+ showLegend: [{
23275
+ type: i0.Input,
23276
+ args: [{
23277
+ isSignal: true,
23278
+ alias: "showLegend",
23279
+ required: false
23280
+ }]
23281
+ }],
23282
+ showPercentages: [{
23283
+ type: i0.Input,
23284
+ args: [{
23285
+ isSignal: true,
23286
+ alias: "showPercentages",
23287
+ required: false
23288
+ }]
23289
+ }],
23290
+ height: [{
23291
+ type: i0.Input,
23292
+ args: [{
23293
+ isSignal: true,
23294
+ alias: "height",
23295
+ required: false
23296
+ }]
23297
+ }],
23298
+ size: [{
23299
+ type: i0.Input,
23300
+ args: [{
23301
+ isSignal: true,
23302
+ alias: "size",
23303
+ required: false
23304
+ }]
23305
+ }],
23306
+ animation: [{
23307
+ type: i0.Input,
23308
+ args: [{
23309
+ isSignal: true,
23310
+ alias: "animation",
23311
+ required: false
23312
+ }]
23313
+ }],
23314
+ animationDuration: [{
23315
+ type: i0.Input,
23316
+ args: [{
23317
+ isSignal: true,
23318
+ alias: "animationDuration",
23319
+ required: false
23320
+ }]
23321
+ }],
23322
+ formatValue: [{
23323
+ type: i0.Input,
23324
+ args: [{
23325
+ isSignal: true,
23326
+ alias: "formatValue",
23327
+ required: false
23328
+ }]
23329
+ }],
23330
+ ariaLabel: [{
23331
+ type: i0.Input,
23332
+ args: [{
23333
+ isSignal: true,
23334
+ alias: "aria-label",
23335
+ required: false
23336
+ }]
23337
+ }],
23338
+ sliceClick: [{
23339
+ type: i0.Output,
23340
+ args: ["sliceClick"]
23341
+ }],
23342
+ activeSliceChange: [{
23343
+ type: i0.Output,
23344
+ args: ["activeSliceChange"]
23345
+ }]
23346
+ }
23347
+ });
20708
23348
  var ProgressBarComponent = class ProgressBarComponent {
20709
23349
  i18n = inject(EagamiI18nService);
20710
23350
  value = input(0, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
@@ -69602,6 +72242,6 @@ const ICONS = [
69602
72242
  ZoomInIconComponent,
69603
72243
  ZoomOutIconComponent
69604
72244
  ].sort((a, b) => a.slug.localeCompare(b.slug));
69605
- export { AccessibilityIconComponent, AccordionComponent, AccordionItemComponent, ActivityIconComponent, AirplayIconComponent, AlarmClockIconComponent, AlertCircleIconComponent, AlertComponent, AlertOctagonIconComponent, AlertTriangleIconComponent, AlignCenterIconComponent, AlignJustifyIconComponent, AlignLeftIconComponent, AlignRightIconComponent, AnchorIconComponent, AndroidIconComponent, AngularIconComponent, AnthropicIconComponent, ApertureIconComponent, ArchiveIconComponent, ArrayIconComponent, ArrowDownCircleIconComponent, ArrowDownIconComponent, ArrowDownLeftIconComponent, ArrowDownRightIconComponent, ArrowLeftCircleIconComponent, ArrowLeftIconComponent, ArrowLeftRightIconComponent, ArrowRightCircleIconComponent, ArrowRightIconComponent, ArrowUpCircleIconComponent, ArrowUpDownIconComponent, ArrowUpIconComponent, ArrowUpLeftIconComponent, ArrowUpRightIconComponent, AspectRatioIconComponent, AtSignIconComponent, AutocompleteComponent, AvatarComponent, AvatarEditorComponent, AwardIconComponent, BadgeCheckIconComponent, BadgeComponent, BanIconComponent, BarChart2IconComponent, BarChartIconComponent, BatteryChargingIconComponent, BatteryIconComponent, BellIconComponent, BellOffIconComponent, BellRingIconComponent, BitcoinIconComponent, BlueskyIconComponent, BluetoothIconComponent, BoldIconComponent, BookIconComponent, BookOpenIconComponent, BookmarkCheckIconComponent, BookmarkIconComponent, BookmarkPlusIconComponent, BoomboxIconComponent, BotIconComponent, BottleIconComponent, BoxIconComponent, BrainIconComponent, BreadcrumbsComponent, BriefcaseIconComponent, BugIconComponent, BuildingIconComponent, ButtonComponent, CalculatorIconComponent, CalendarCheckIconComponent, CalendarDaysIconComponent, CalendarIconComponent, CalendarPlusIconComponent, CameraIconComponent, CameraOffIconComponent, CandleIconComponent, CardComponent, CassetteTapeIconComponent, CastIconComponent, CheckCheckIconComponent, CheckCircleIconComponent, CheckIconComponent, CheckSquareIconComponent, CheckboxComponent, ChevronDownIconComponent, ChevronLeftIconComponent, ChevronRightIconComponent, ChevronUpIconComponent, ChevronsDownIconComponent, ChevronsLeftIconComponent, ChevronsRightIconComponent, ChevronsUpDownIconComponent, ChevronsUpIconComponent, ChromeIconComponent, CircleIconComponent, ClapperboardIconComponent, ClipboardCheckIconComponent, ClipboardIconComponent, ClipboardListIconComponent, ClipboardPasteIconComponent, ClockIconComponent, CloudDrizzleIconComponent, CloudIconComponent, CloudLightningIconComponent, CloudOffIconComponent, CloudRainIconComponent, CloudSnowIconComponent, CloudSunIconComponent, CloudflareIconComponent, CodeIconComponent, CodeInputComponent, CodepenIconComponent, CodesandboxIconComponent, CoffeeIconComponent, CoinsIconComponent, ColorPickerComponent, ColumnsIconComponent, CommandIconComponent, CommandPaletteComponent, CompassIconComponent, ContrastIconComponent, CookieIconComponent, CopyIconComponent, CornerDownLeftIconComponent, CornerDownRightIconComponent, CornerLeftDownIconComponent, CornerLeftUpIconComponent, CornerRightDownIconComponent, CornerRightUpIconComponent, CornerUpLeftIconComponent, CornerUpRightIconComponent, CosineWaveIconComponent, CpuIconComponent, CreditCardIconComponent, CropIconComponent, CrosshairIconComponent, CrownIconComponent, DEFAULT_PALETTE_ROLES, DataTableComponent, DatabaseIconComponent, DatePickerComponent, DeleteIconComponent, DialogComponent, DiamondIconComponent, Dice1IconComponent, Dice2IconComponent, Dice3IconComponent, Dice4IconComponent, Dice5IconComponent, Dice6IconComponent, DiscIconComponent, DiscordIconComponent, DivideCircleIconComponent, DivideIconComponent, DivideSquareIconComponent, DividerComponent, DockerIconComponent, DollarSignIconComponent, DoubleExclamationMarkIconComponent, DoubleQuestionMarkIconComponent, DownloadCloudIconComponent, DownloadIconComponent, DrawerComponent, DribbbleIconComponent, DropboxIconComponent, DropdownComponent, DropletIconComponent, EAGAMI_ALL_LOCALES, EAGAMI_I18N_CONFIG, EAGAMI_LOCALES, EAGAMI_LOCALE_META, EagamiI18nService, EagamiIconComponent, EagamiWordmarkComponent, Edit2IconComponent, Edit3IconComponent, EditIconComponent, EjectIconComponent, EmptyStateComponent, EuroIconComponent, ExclamationMarkIconComponent, ExclamationQuestionMarkIconComponent, ExternalLinkIconComponent, EyeIconComponent, EyeOffIconComponent, Facebook2IconComponent, FacebookIconComponent, FastForwardIconComponent, FeatherIconComponent, FieldLabelComponent, FieldMessagesComponent, Figma2IconComponent, FigmaIconComponent, FileAudioIconComponent, FileCheckIconComponent, FileCodeIconComponent, FileIconComponent, FileImageIconComponent, FileMinusIconComponent, FilePdfIconComponent, FilePlusIconComponent, FileTextIconComponent, FileUploaderComponent, FileVideoIconComponent, FilmIconComponent, FilterIconComponent, FilterXIconComponent, FingerprintIconComponent, FirstPlaceMedalIconComponent, FlagIconComponent, FlameIconComponent, FlaskConicalIconComponent, FolderIconComponent, FolderMinusIconComponent, FolderOpenIconComponent, FolderPlusIconComponent, FormFieldComponent, ForwardIconComponent, FramerIconComponent, FrownIconComponent, GaugeIconComponent, GeminiIconComponent, GiftIconComponent, GitBranchIconComponent, GitCommitIconComponent, GitCompareIconComponent, GitMergeIconComponent, GitPullRequestIconComponent, Github2IconComponent, GithubIconComponent, GitlabIconComponent, GlobeIconComponent, GoogleIconComponent, GraduationCapIconComponent, GridIconComponent, GripHorizontalIconComponent, GripVerticalIconComponent, HalfCircleIconComponent, HalfHeartIconComponent, HardDriveIconComponent, HashIconComponent, HeadphonesIconComponent, HeadsetIconComponent, HeartIconComponent, HelpCircleIconComponent, HeptagonIconComponent, HexagonIconComponent, HistoryIconComponent, HomeIconComponent, HourglassIconComponent, ICONS, IconComponentBase, ImageIconComponent, ImagePlayIconComponent, ImagePlusIconComponent, ImageSearchIconComponent, ImagesIconComponent, InboxIconComponent, InfoIconComponent, InputComponent, InstagramIconComponent, ItalicIconComponent, KeyIconComponent, KeyboardIconComponent, KeyframeIconComponent, KubernetesIconComponent, LampIconComponent, LanguagesIconComponent, LaptopIconComponent, LayersIconComponent, LayoutDashboardIconComponent, LayoutIconComponent, LeafIconComponent, LeftHalfStarIconComponent, LifeBuoyIconComponent, LightbulbIconComponent, Link2IconComponent, LinkIconComponent, Linkedin2IconComponent, LinkedinIconComponent, ListChecksIconComponent, ListIconComponent, ListOrderedIconComponent, LoaderIconComponent, LockIconComponent, LogInIconComponent, LogOutIconComponent, MailCheckIconComponent, MailIconComponent, MapIconComponent, MapPinIconComponent, MastercardIconComponent, Maximize2IconComponent, MaximizeIconComponent, MegaphoneIconComponent, MehIconComponent, MenuComponent, MenuIconComponent, MenuItemComponent, MenuTriggerDirective, MessageCircleIconComponent, MessageSquareIconComponent, MicIconComponent, MicOffIconComponent, MicVocalIconComponent, MicroscopeIconComponent, MicrosoftIconComponent, Minimize2IconComponent, MinimizeIconComponent, MinusCircleIconComponent, MinusIconComponent, MinusSquareIconComponent, MongodbIconComponent, MonitorIconComponent, MonitorPlayIconComponent, MoonIconComponent, MoreHorizontalIconComponent, MoreVerticalIconComponent, MousePointerIconComponent, MoveIconComponent, MultiSelectComponent, MusicIconComponent, Navigation2IconComponent, NavigationIconComponent, NetlifyIconComponent, NewspaperIconComponent, NodejsIconComponent, NotionIconComponent, NpmIconComponent, NumberInputComponent, OctagonIconComponent, PAGE_SIZE_ALL, PackageIconComponent, PaginatorComponent, PaletteIconComponent, PaperclipIconComponent, PauseCircleIconComponent, PauseIconComponent, PaypalIconComponent, PenToolIconComponent, PentagonIconComponent, PercentIconComponent, PhoneCallIconComponent, PhoneForwardedIconComponent, PhoneIconComponent, PhoneIncomingIconComponent, PhoneMissedIconComponent, PhoneOffIconComponent, PhoneOutgoingIconComponent, PictureInPictureIconComponent, PieChartIconComponent, PinIconComponent, PinterestIconComponent, PlaneIconComponent, PlayCircleIconComponent, PlayIconComponent, PlaylistIconComponent, PlugIconComponent, PlusCircleIconComponent, PlusIconComponent, PlusSquareIconComponent, PocketIconComponent, PodcastIconComponent, PopoverComponent, PowerIconComponent, PrinterIconComponent, ProgressBarComponent, ProjectorIconComponent, PythonIconComponent, QrCodeIconComponent, QuestionExclamationMarkIconComponent, QuestionMarkIconComponent, QuoteIconComponent, RadioComponent, RadioGroupComponent, RadioIconComponent, RadioReceiverIconComponent, RadioTowerIconComponent, RangeSliderComponent, RatingComponent, ReactIconComponent, ReceiptIconComponent, RecordIconComponent, RectangleHorizontalIconComponent, RectangleVerticalIconComponent, RedditIconComponent, RedoIconComponent, RefreshCcwIconComponent, RefreshCwIconComponent, Repeat1IconComponent, RepeatIconComponent, ReplyIconComponent, RewindIconComponent, RightHalfStarIconComponent, RocketIconComponent, RotateCcwIconComponent, RotateCcwSquareIconComponent, RotateCwIconComponent, RowsIconComponent, RssIconComponent, SaveIconComponent, ScanIconComponent, ScissorsIconComponent, ScreenShareIconComponent, SearchIconComponent, SecondPlaceMedalIconComponent, SegmentedComponent, SendIconComponent, ServerIconComponent, SettingsIconComponent, Share2IconComponent, ShareIconComponent, ShieldAlertIconComponent, ShieldCheckIconComponent, ShieldIconComponent, ShieldOffIconComponent, ShopifyIconComponent, ShoppingBagIconComponent, ShoppingCartIconComponent, ShuffleIconComponent, SidebarIconComponent, SineWaveIconComponent, SkeletonComponent, SkipBackIconComponent, SkipForwardIconComponent, Slack2IconComponent, SlackIconComponent, SlashIconComponent, SliderComponent, SlidersIconComponent, SmartphoneIconComponent, SmileIconComponent, SnowflakeIconComponent, SoccerBallIconComponent, SparklesIconComponent, SpeakerIconComponent, SpinnerComponent, SpotifyIconComponent, SquareIconComponent, SquarePlayIconComponent, StarIconComponent, StepBackIconComponent, StepComponent, StepForwardIconComponent, StepperComponent, StopCircleIconComponent, StrikethroughIconComponent, StripeIconComponent, SubtitlesIconComponent, SubtitlesOffIconComponent, SunIconComponent, SunriseIconComponent, SunsetIconComponent, SvelteIconComponent, SwitchCameraIconComponent, SwitchComponent, TabComponent, TableIconComponent, TabletIconComponent, TabsComponent, TagComponent, TagIconComponent, TailwindIconComponent, TargetIconComponent, TelegramIconComponent, TerminalIconComponent, TextareaComponent, ThermometerIconComponent, ThirdPlaceMedalIconComponent, ThreadsIconComponent, ThumbsDownIconComponent, ThumbsUpIconComponent, TiktokIconComponent, TimePickerComponent, TimecodeIconComponent, TimelineComponent, TimerIconComponent, ToastComponent, ToastService, ToggleLeftIconComponent, ToggleRightIconComponent, ToolIconComponent, TooltipDirective, TranscodeIconComponent, TransferListComponent, Trash2IconComponent, TrashIconComponent, TreeComponent, TrelloIconComponent, TrendingDownIconComponent, TrendingUpIconComponent, TriangleIconComponent, TrimIconComponent, TrophyIconComponent, TruckIconComponent, TvIconComponent, Twitch2IconComponent, TwitchIconComponent, TwitterIconComponent, TypeIconComponent, UmbrellaIconComponent, UnderlineIconComponent, UndoIconComponent, UnlinkIconComponent, UnlockIconComponent, UploadCloudIconComponent, UploadIconComponent, UserCheckIconComponent, UserCircleIconComponent, UserIconComponent, UserMinusIconComponent, UserPlusIconComponent, UserXIconComponent, UsersIconComponent, VercelIconComponent, VideoIconComponent, VideoOffIconComponent, VirtualListComponent, VoicemailIconComponent, Volume1IconComponent, Volume2IconComponent, VolumeIconComponent, VolumeXIconComponent, VueIconComponent, WCAG_AA, WalletIconComponent, WandIconComponent, WatchIconComponent, WaveformIconComponent, WebcamIconComponent, WhatsappIconComponent, WifiIconComponent, WifiOffIconComponent, WindIconComponent, WordpressIconComponent, XCircleIconComponent, XIconComponent, XOctagonIconComponent, XSquareIconComponent, XTwitterIconComponent, Youtube2IconComponent, YoutubeIconComponent, ZapIconComponent, ZapOffIconComponent, ZoomInIconComponent, ZoomOutIconComponent, applyPalette, ar, computePopoverPosition, contrastRatio, de, derivePalette, el, en, esES, formatViolations, frFR, frenchSpacing, he, hexToOklch, hi, iconDisplayName, is, isGrouped, nl, oklchToHex, pl, provideEagamiUi, ptBR, relativeLuminance, ru, uk, validatePalette, visibleNodeIds, walkTree, zhCN };
72245
+ export { AccessibilityIconComponent, AccordionComponent, AccordionItemComponent, ActivityIconComponent, AirplayIconComponent, AlarmClockIconComponent, AlertCircleIconComponent, AlertComponent, AlertOctagonIconComponent, AlertTriangleIconComponent, AlignCenterIconComponent, AlignJustifyIconComponent, AlignLeftIconComponent, AlignRightIconComponent, AnchorIconComponent, AndroidIconComponent, AngularIconComponent, AnthropicIconComponent, ApertureIconComponent, ArchiveIconComponent, ArrayIconComponent, ArrowDownCircleIconComponent, ArrowDownIconComponent, ArrowDownLeftIconComponent, ArrowDownRightIconComponent, ArrowLeftCircleIconComponent, ArrowLeftIconComponent, ArrowLeftRightIconComponent, ArrowRightCircleIconComponent, ArrowRightIconComponent, ArrowUpCircleIconComponent, ArrowUpDownIconComponent, ArrowUpIconComponent, ArrowUpLeftIconComponent, ArrowUpRightIconComponent, AspectRatioIconComponent, AtSignIconComponent, AutocompleteComponent, AvatarComponent, AvatarEditorComponent, AwardIconComponent, BadgeCheckIconComponent, BadgeComponent, BanIconComponent, BarChart2IconComponent, BarChartComponent, BarChartIconComponent, BatteryChargingIconComponent, BatteryIconComponent, BellIconComponent, BellOffIconComponent, BellRingIconComponent, BitcoinIconComponent, BlueskyIconComponent, BluetoothIconComponent, BoldIconComponent, BookIconComponent, BookOpenIconComponent, BookmarkCheckIconComponent, BookmarkIconComponent, BookmarkPlusIconComponent, BoomboxIconComponent, BotIconComponent, BottleIconComponent, BoxIconComponent, BrainIconComponent, BreadcrumbsComponent, BriefcaseIconComponent, BugIconComponent, BuildingIconComponent, ButtonComponent, CalculatorIconComponent, CalendarCheckIconComponent, CalendarDaysIconComponent, CalendarIconComponent, CalendarPlusIconComponent, CameraIconComponent, CameraOffIconComponent, CandleIconComponent, CardComponent, CassetteTapeIconComponent, CastIconComponent, CheckCheckIconComponent, CheckCircleIconComponent, CheckIconComponent, CheckSquareIconComponent, CheckboxComponent, ChevronDownIconComponent, ChevronLeftIconComponent, ChevronRightIconComponent, ChevronUpIconComponent, ChevronsDownIconComponent, ChevronsLeftIconComponent, ChevronsRightIconComponent, ChevronsUpDownIconComponent, ChevronsUpIconComponent, ChromeIconComponent, CircleIconComponent, ClapperboardIconComponent, ClipboardCheckIconComponent, ClipboardIconComponent, ClipboardListIconComponent, ClipboardPasteIconComponent, ClockIconComponent, CloudDrizzleIconComponent, CloudIconComponent, CloudLightningIconComponent, CloudOffIconComponent, CloudRainIconComponent, CloudSnowIconComponent, CloudSunIconComponent, CloudflareIconComponent, CodeIconComponent, CodeInputComponent, CodepenIconComponent, CodesandboxIconComponent, CoffeeIconComponent, CoinsIconComponent, ColorPickerComponent, ColumnsIconComponent, CommandIconComponent, CommandPaletteComponent, CompassIconComponent, ContrastIconComponent, CookieIconComponent, CopyIconComponent, CornerDownLeftIconComponent, CornerDownRightIconComponent, CornerLeftDownIconComponent, CornerLeftUpIconComponent, CornerRightDownIconComponent, CornerRightUpIconComponent, CornerUpLeftIconComponent, CornerUpRightIconComponent, CosineWaveIconComponent, CpuIconComponent, CreditCardIconComponent, CropIconComponent, CrosshairIconComponent, CrownIconComponent, DEFAULT_PALETTE_ROLES, DataTableComponent, DatabaseIconComponent, DatePickerComponent, DeleteIconComponent, DialogComponent, DiamondIconComponent, Dice1IconComponent, Dice2IconComponent, Dice3IconComponent, Dice4IconComponent, Dice5IconComponent, Dice6IconComponent, DiscIconComponent, DiscordIconComponent, DivideCircleIconComponent, DivideIconComponent, DivideSquareIconComponent, DividerComponent, DockerIconComponent, DollarSignIconComponent, DoubleExclamationMarkIconComponent, DoubleQuestionMarkIconComponent, DownloadCloudIconComponent, DownloadIconComponent, DrawerComponent, DribbbleIconComponent, DropboxIconComponent, DropdownComponent, DropletIconComponent, EAGAMI_ALL_LOCALES, EAGAMI_I18N_CONFIG, EAGAMI_LOCALES, EAGAMI_LOCALE_META, EagamiI18nService, EagamiIconComponent, EagamiWordmarkComponent, Edit2IconComponent, Edit3IconComponent, EditIconComponent, EjectIconComponent, EmptyStateComponent, EuroIconComponent, ExclamationMarkIconComponent, ExclamationQuestionMarkIconComponent, ExternalLinkIconComponent, EyeIconComponent, EyeOffIconComponent, Facebook2IconComponent, FacebookIconComponent, FastForwardIconComponent, FeatherIconComponent, FieldLabelComponent, FieldMessagesComponent, Figma2IconComponent, FigmaIconComponent, FileAudioIconComponent, FileCheckIconComponent, FileCodeIconComponent, FileIconComponent, FileImageIconComponent, FileMinusIconComponent, FilePdfIconComponent, FilePlusIconComponent, FileTextIconComponent, FileUploaderComponent, FileVideoIconComponent, FilmIconComponent, FilterIconComponent, FilterXIconComponent, FingerprintIconComponent, FirstPlaceMedalIconComponent, FlagIconComponent, FlameIconComponent, FlaskConicalIconComponent, FolderIconComponent, FolderMinusIconComponent, FolderOpenIconComponent, FolderPlusIconComponent, FormFieldComponent, ForwardIconComponent, FramerIconComponent, FrownIconComponent, GaugeIconComponent, GeminiIconComponent, GiftIconComponent, GitBranchIconComponent, GitCommitIconComponent, GitCompareIconComponent, GitMergeIconComponent, GitPullRequestIconComponent, Github2IconComponent, GithubIconComponent, GitlabIconComponent, GlobeIconComponent, GoogleIconComponent, GraduationCapIconComponent, GridIconComponent, GripHorizontalIconComponent, GripVerticalIconComponent, HalfCircleIconComponent, HalfHeartIconComponent, HardDriveIconComponent, HashIconComponent, HeadphonesIconComponent, HeadsetIconComponent, HeartIconComponent, HelpCircleIconComponent, HeptagonIconComponent, HexagonIconComponent, HistoryIconComponent, HomeIconComponent, HourglassIconComponent, ICONS, IconComponentBase, ImageIconComponent, ImagePlayIconComponent, ImagePlusIconComponent, ImageSearchIconComponent, ImagesIconComponent, InboxIconComponent, InfoIconComponent, InputComponent, InstagramIconComponent, ItalicIconComponent, KeyIconComponent, KeyboardIconComponent, KeyframeIconComponent, KubernetesIconComponent, LampIconComponent, LanguagesIconComponent, LaptopIconComponent, LayersIconComponent, LayoutDashboardIconComponent, LayoutIconComponent, LeafIconComponent, LeftHalfStarIconComponent, LifeBuoyIconComponent, LightbulbIconComponent, LineChartComponent, Link2IconComponent, LinkIconComponent, Linkedin2IconComponent, LinkedinIconComponent, ListChecksIconComponent, ListIconComponent, ListOrderedIconComponent, LoaderIconComponent, LockIconComponent, LogInIconComponent, LogOutIconComponent, MailCheckIconComponent, MailIconComponent, MapIconComponent, MapPinIconComponent, MastercardIconComponent, Maximize2IconComponent, MaximizeIconComponent, MegaphoneIconComponent, MehIconComponent, MenuComponent, MenuIconComponent, MenuItemComponent, MenuTriggerDirective, MessageCircleIconComponent, MessageSquareIconComponent, MicIconComponent, MicOffIconComponent, MicVocalIconComponent, MicroscopeIconComponent, MicrosoftIconComponent, Minimize2IconComponent, MinimizeIconComponent, MinusCircleIconComponent, MinusIconComponent, MinusSquareIconComponent, MongodbIconComponent, MonitorIconComponent, MonitorPlayIconComponent, MoonIconComponent, MoreHorizontalIconComponent, MoreVerticalIconComponent, MousePointerIconComponent, MoveIconComponent, MultiSelectComponent, MusicIconComponent, Navigation2IconComponent, NavigationIconComponent, NetlifyIconComponent, NewspaperIconComponent, NodejsIconComponent, NotionIconComponent, NpmIconComponent, NumberInputComponent, OctagonIconComponent, PAGE_SIZE_ALL, PackageIconComponent, PaginatorComponent, PaletteIconComponent, PaperclipIconComponent, PauseCircleIconComponent, PauseIconComponent, PaypalIconComponent, PenToolIconComponent, PentagonIconComponent, PercentIconComponent, PhoneCallIconComponent, PhoneForwardedIconComponent, PhoneIconComponent, PhoneIncomingIconComponent, PhoneMissedIconComponent, PhoneOffIconComponent, PhoneOutgoingIconComponent, PictureInPictureIconComponent, PieChartComponent, PieChartIconComponent, PinIconComponent, PinterestIconComponent, PlaneIconComponent, PlayCircleIconComponent, PlayIconComponent, PlaylistIconComponent, PlugIconComponent, PlusCircleIconComponent, PlusIconComponent, PlusSquareIconComponent, PocketIconComponent, PodcastIconComponent, PopoverComponent, PowerIconComponent, PrinterIconComponent, ProgressBarComponent, ProjectorIconComponent, PythonIconComponent, QrCodeIconComponent, QuestionExclamationMarkIconComponent, QuestionMarkIconComponent, QuoteIconComponent, RadioComponent, RadioGroupComponent, RadioIconComponent, RadioReceiverIconComponent, RadioTowerIconComponent, RangeSliderComponent, RatingComponent, ReactIconComponent, ReceiptIconComponent, RecordIconComponent, RectangleHorizontalIconComponent, RectangleVerticalIconComponent, RedditIconComponent, RedoIconComponent, RefreshCcwIconComponent, RefreshCwIconComponent, Repeat1IconComponent, RepeatIconComponent, ReplyIconComponent, RewindIconComponent, RightHalfStarIconComponent, RocketIconComponent, RotateCcwIconComponent, RotateCcwSquareIconComponent, RotateCwIconComponent, RowsIconComponent, RssIconComponent, SaveIconComponent, ScanIconComponent, ScissorsIconComponent, ScreenShareIconComponent, SearchIconComponent, SecondPlaceMedalIconComponent, SegmentedComponent, SendIconComponent, ServerIconComponent, SettingsIconComponent, Share2IconComponent, ShareIconComponent, ShieldAlertIconComponent, ShieldCheckIconComponent, ShieldIconComponent, ShieldOffIconComponent, ShopifyIconComponent, ShoppingBagIconComponent, ShoppingCartIconComponent, ShuffleIconComponent, SidebarIconComponent, SineWaveIconComponent, SkeletonComponent, SkipBackIconComponent, SkipForwardIconComponent, Slack2IconComponent, SlackIconComponent, SlashIconComponent, SliderComponent, SlidersIconComponent, SmartphoneIconComponent, SmileIconComponent, SnowflakeIconComponent, SoccerBallIconComponent, SparklesIconComponent, SpeakerIconComponent, SpinnerComponent, SpotifyIconComponent, SquareIconComponent, SquarePlayIconComponent, StarIconComponent, StepBackIconComponent, StepComponent, StepForwardIconComponent, StepperComponent, StopCircleIconComponent, StrikethroughIconComponent, StripeIconComponent, SubtitlesIconComponent, SubtitlesOffIconComponent, SunIconComponent, SunriseIconComponent, SunsetIconComponent, SvelteIconComponent, SwitchCameraIconComponent, SwitchComponent, TabComponent, TableIconComponent, TabletIconComponent, TabsComponent, TagComponent, TagIconComponent, TailwindIconComponent, TargetIconComponent, TelegramIconComponent, TerminalIconComponent, TextareaComponent, ThermometerIconComponent, ThirdPlaceMedalIconComponent, ThreadsIconComponent, ThumbsDownIconComponent, ThumbsUpIconComponent, TiktokIconComponent, TimePickerComponent, TimecodeIconComponent, TimelineComponent, TimerIconComponent, ToastComponent, ToastService, ToggleLeftIconComponent, ToggleRightIconComponent, ToolIconComponent, TooltipDirective, TranscodeIconComponent, TransferListComponent, Trash2IconComponent, TrashIconComponent, TreeComponent, TrelloIconComponent, TrendingDownIconComponent, TrendingUpIconComponent, TriangleIconComponent, TrimIconComponent, TrophyIconComponent, TruckIconComponent, TvIconComponent, Twitch2IconComponent, TwitchIconComponent, TwitterIconComponent, TypeIconComponent, UmbrellaIconComponent, UnderlineIconComponent, UndoIconComponent, UnlinkIconComponent, UnlockIconComponent, UploadCloudIconComponent, UploadIconComponent, UserCheckIconComponent, UserCircleIconComponent, UserIconComponent, UserMinusIconComponent, UserPlusIconComponent, UserXIconComponent, UsersIconComponent, VercelIconComponent, VideoIconComponent, VideoOffIconComponent, VirtualListComponent, VoicemailIconComponent, Volume1IconComponent, Volume2IconComponent, VolumeIconComponent, VolumeXIconComponent, VueIconComponent, WCAG_AA, WalletIconComponent, WandIconComponent, WatchIconComponent, WaveformIconComponent, WebcamIconComponent, WhatsappIconComponent, WifiIconComponent, WifiOffIconComponent, WindIconComponent, WordpressIconComponent, XCircleIconComponent, XIconComponent, XOctagonIconComponent, XSquareIconComponent, XTwitterIconComponent, Youtube2IconComponent, YoutubeIconComponent, ZapIconComponent, ZapOffIconComponent, ZoomInIconComponent, ZoomOutIconComponent, applyPalette, ar, computePopoverPosition, contrastRatio, de, derivePalette, el, en, esES, formatViolations, frFR, frenchSpacing, he, hexToOklch, hi, iconDisplayName, is, isGrouped, nl, oklchToHex, pl, provideEagamiUi, ptBR, relativeLuminance, ru, uk, validatePalette, visibleNodeIds, walkTree, zhCN };
69606
72246
 
69607
72247
  //# sourceMappingURL=eagami-ui.mjs.map