@eagami/ui 4.8.0 → 5.0.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.
@@ -425,6 +425,8 @@ const messages$e = {
425
425
  zoom: 'تكبير/تصغير',
426
426
  zoomIn: 'تكبير',
427
427
  remove: 'إزالة الصورة',
428
+ invalidType: 'يجب أن يكون الملف صورة',
429
+ tooLarge: (maxMb) => `الملف يتجاوز حد ${maxMb} MB`,
428
430
  },
429
431
  breadcrumbs: {
430
432
  label: 'مسار التنقل',
@@ -452,6 +454,11 @@ const messages$e = {
452
454
  dataTable: {
453
455
  noData: 'لا توجد بيانات متاحة',
454
456
  },
457
+ numberFormat: {
458
+ decimal: '.',
459
+ group: ',',
460
+ grouping: [3],
461
+ },
455
462
  datePicker: {
456
463
  placeholder: 'اختر التاريخ…',
457
464
  clear: 'مسح التاريخ',
@@ -460,6 +467,29 @@ const messages$e = {
460
467
  nextMonth: 'الشهر التالي',
461
468
  nextYear: 'السنة التالية',
462
469
  today: 'اليوم',
470
+ weekdaysShort: [
471
+ 'الأحد',
472
+ 'الاثنين',
473
+ 'الثلاثاء',
474
+ 'الأربعاء',
475
+ 'الخميس',
476
+ 'الجمعة',
477
+ 'السبت',
478
+ ],
479
+ months: [
480
+ 'يناير',
481
+ 'فبراير',
482
+ 'مارس',
483
+ 'أبريل',
484
+ 'مايو',
485
+ 'يونيو',
486
+ 'يوليو',
487
+ 'أغسطس',
488
+ 'سبتمبر',
489
+ 'أكتوبر',
490
+ 'نوفمبر',
491
+ 'ديسمبر',
492
+ ],
463
493
  },
464
494
  dialog: {
465
495
  close: 'إغلاق مربع الحوار',
@@ -595,6 +625,8 @@ const messages$d = {
595
625
  zoom: 'Zoom',
596
626
  zoomIn: 'Vergrößern',
597
627
  remove: 'Bild entfernen',
628
+ invalidType: 'Datei muss ein Bild sein',
629
+ tooLarge: (maxMb) => `Datei überschreitet das Limit von ${maxMb} MB`,
598
630
  },
599
631
  breadcrumbs: {
600
632
  label: 'Brotkrümelnavigation',
@@ -622,6 +654,11 @@ const messages$d = {
622
654
  dataTable: {
623
655
  noData: 'Keine Daten verfügbar',
624
656
  },
657
+ numberFormat: {
658
+ decimal: ',',
659
+ group: '.',
660
+ grouping: [3],
661
+ },
625
662
  datePicker: {
626
663
  placeholder: 'Datum auswählen…',
627
664
  clear: 'Datum löschen',
@@ -630,6 +667,21 @@ const messages$d = {
630
667
  nextMonth: 'Nächster Monat',
631
668
  nextYear: 'Nächstes Jahr',
632
669
  today: 'Heute',
670
+ weekdaysShort: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
671
+ months: [
672
+ 'Januar',
673
+ 'Februar',
674
+ 'März',
675
+ 'April',
676
+ 'Mai',
677
+ 'Juni',
678
+ 'Juli',
679
+ 'August',
680
+ 'September',
681
+ 'Oktober',
682
+ 'November',
683
+ 'Dezember',
684
+ ],
633
685
  },
634
686
  dialog: {
635
687
  close: 'Dialog schließen',
@@ -765,6 +817,8 @@ const messages$c = {
765
817
  zoom: 'Ζουμ',
766
818
  zoomIn: 'Μεγέθυνση',
767
819
  remove: 'Αφαίρεση εικόνας',
820
+ invalidType: 'Το αρχείο πρέπει να είναι εικόνα',
821
+ tooLarge: (maxMb) => `Το αρχείο υπερβαίνει το όριο των ${maxMb} MB`,
768
822
  },
769
823
  breadcrumbs: {
770
824
  label: 'Διαδρομή πλοήγησης',
@@ -792,6 +846,11 @@ const messages$c = {
792
846
  dataTable: {
793
847
  noData: 'Δεν υπάρχουν διαθέσιμα δεδομένα',
794
848
  },
849
+ numberFormat: {
850
+ decimal: ',',
851
+ group: '.',
852
+ grouping: [3],
853
+ },
795
854
  datePicker: {
796
855
  placeholder: 'Επιλέξτε ημερομηνία…',
797
856
  clear: 'Εκκαθάριση ημερομηνίας',
@@ -800,6 +859,21 @@ const messages$c = {
800
859
  nextMonth: 'Επόμενος μήνας',
801
860
  nextYear: 'Επόμενο έτος',
802
861
  today: 'Σήμερα',
862
+ weekdaysShort: ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],
863
+ months: [
864
+ 'Ιανουαρίου',
865
+ 'Φεβρουαρίου',
866
+ 'Μαρτίου',
867
+ 'Απριλίου',
868
+ 'Μαΐου',
869
+ 'Ιουνίου',
870
+ 'Ιουλίου',
871
+ 'Αυγούστου',
872
+ 'Σεπτεμβρίου',
873
+ 'Οκτωβρίου',
874
+ 'Νοεμβρίου',
875
+ 'Δεκεμβρίου',
876
+ ],
803
877
  },
804
878
  dialog: {
805
879
  close: 'Κλείσιμο παραθύρου διαλόγου',
@@ -935,6 +1009,8 @@ const messages$b = {
935
1009
  zoom: 'Zoom',
936
1010
  zoomIn: 'Zoom in',
937
1011
  remove: 'Remove image',
1012
+ invalidType: 'File must be an image',
1013
+ tooLarge: (maxMb) => `File exceeds ${maxMb} MB limit`,
938
1014
  },
939
1015
  breadcrumbs: {
940
1016
  label: 'Breadcrumb',
@@ -962,6 +1038,11 @@ const messages$b = {
962
1038
  dataTable: {
963
1039
  noData: 'No data available',
964
1040
  },
1041
+ numberFormat: {
1042
+ decimal: '.',
1043
+ group: ',',
1044
+ grouping: [3],
1045
+ },
965
1046
  datePicker: {
966
1047
  placeholder: 'Select date…',
967
1048
  clear: 'Clear date',
@@ -970,6 +1051,21 @@ const messages$b = {
970
1051
  nextMonth: 'Next month',
971
1052
  nextYear: 'Next year',
972
1053
  today: 'Today',
1054
+ weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
1055
+ months: [
1056
+ 'January',
1057
+ 'February',
1058
+ 'March',
1059
+ 'April',
1060
+ 'May',
1061
+ 'June',
1062
+ 'July',
1063
+ 'August',
1064
+ 'September',
1065
+ 'October',
1066
+ 'November',
1067
+ 'December',
1068
+ ],
973
1069
  },
974
1070
  dialog: {
975
1071
  close: 'Close dialog',
@@ -1105,6 +1201,8 @@ const messages$a = {
1105
1201
  zoom: 'Ampliación',
1106
1202
  zoomIn: 'Acercar',
1107
1203
  remove: 'Eliminar imagen',
1204
+ invalidType: 'El archivo debe ser una imagen',
1205
+ tooLarge: (maxMb) => `El archivo supera el límite de ${maxMb} MB`,
1108
1206
  },
1109
1207
  breadcrumbs: {
1110
1208
  label: 'Ruta de navegación',
@@ -1132,6 +1230,11 @@ const messages$a = {
1132
1230
  dataTable: {
1133
1231
  noData: 'No hay datos disponibles',
1134
1232
  },
1233
+ numberFormat: {
1234
+ decimal: ',',
1235
+ group: '.',
1236
+ grouping: [3],
1237
+ },
1135
1238
  datePicker: {
1136
1239
  placeholder: 'Seleccionar fecha…',
1137
1240
  clear: 'Borrar fecha',
@@ -1140,6 +1243,21 @@ const messages$a = {
1140
1243
  nextMonth: 'Mes siguiente',
1141
1244
  nextYear: 'Año siguiente',
1142
1245
  today: 'Hoy',
1246
+ weekdaysShort: ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],
1247
+ months: [
1248
+ 'enero',
1249
+ 'febrero',
1250
+ 'marzo',
1251
+ 'abril',
1252
+ 'mayo',
1253
+ 'junio',
1254
+ 'julio',
1255
+ 'agosto',
1256
+ 'septiembre',
1257
+ 'octubre',
1258
+ 'noviembre',
1259
+ 'diciembre',
1260
+ ],
1143
1261
  },
1144
1262
  dialog: {
1145
1263
  close: 'Cerrar diálogo',
@@ -1275,6 +1393,8 @@ const messages$9 = {
1275
1393
  zoom: 'Zoom',
1276
1394
  zoomIn: 'Zoomer',
1277
1395
  remove: "Supprimer l'image",
1396
+ invalidType: 'Le fichier doit être une image',
1397
+ tooLarge: (maxMb) => `Le fichier dépasse la limite de ${maxMb} MB`,
1278
1398
  },
1279
1399
  breadcrumbs: {
1280
1400
  label: "Fil d'Ariane",
@@ -1302,6 +1422,11 @@ const messages$9 = {
1302
1422
  dataTable: {
1303
1423
  noData: 'Aucune donnée disponible',
1304
1424
  },
1425
+ numberFormat: {
1426
+ decimal: ',',
1427
+ group: '\u202F',
1428
+ grouping: [3],
1429
+ },
1305
1430
  datePicker: {
1306
1431
  placeholder: 'Sélectionner une date…',
1307
1432
  clear: 'Effacer la date',
@@ -1310,6 +1435,21 @@ const messages$9 = {
1310
1435
  nextMonth: 'Mois suivant',
1311
1436
  nextYear: 'Année suivante',
1312
1437
  today: "Aujourd'hui",
1438
+ weekdaysShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
1439
+ months: [
1440
+ 'janvier',
1441
+ 'février',
1442
+ 'mars',
1443
+ 'avril',
1444
+ 'mai',
1445
+ 'juin',
1446
+ 'juillet',
1447
+ 'août',
1448
+ 'septembre',
1449
+ 'octobre',
1450
+ 'novembre',
1451
+ 'décembre',
1452
+ ],
1313
1453
  },
1314
1454
  dialog: {
1315
1455
  close: 'Fermer la boîte de dialogue',
@@ -1445,6 +1585,8 @@ const messages$8 = {
1445
1585
  zoom: 'זום',
1446
1586
  zoomIn: 'התקרבות',
1447
1587
  remove: 'הסרת תמונה',
1588
+ invalidType: 'הקובץ חייב להיות תמונה',
1589
+ tooLarge: (maxMb) => `הקובץ חורג ממגבלת ${maxMb} MB`,
1448
1590
  },
1449
1591
  breadcrumbs: {
1450
1592
  label: 'נתיב ניווט',
@@ -1472,6 +1614,11 @@ const messages$8 = {
1472
1614
  dataTable: {
1473
1615
  noData: 'אין נתונים זמינים',
1474
1616
  },
1617
+ numberFormat: {
1618
+ decimal: '.',
1619
+ group: ',',
1620
+ grouping: [3],
1621
+ },
1475
1622
  datePicker: {
1476
1623
  placeholder: 'בחר תאריך…',
1477
1624
  clear: 'ניקוי תאריך',
@@ -1480,6 +1627,21 @@ const messages$8 = {
1480
1627
  nextMonth: 'חודש הבא',
1481
1628
  nextYear: 'שנה הבאה',
1482
1629
  today: 'היום',
1630
+ weekdaysShort: ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'],
1631
+ months: [
1632
+ 'ינואר',
1633
+ 'פברואר',
1634
+ 'מרץ',
1635
+ 'אפריל',
1636
+ 'מאי',
1637
+ 'יוני',
1638
+ 'יולי',
1639
+ 'אוגוסט',
1640
+ 'ספטמבר',
1641
+ 'אוקטובר',
1642
+ 'נובמבר',
1643
+ 'דצמבר',
1644
+ ],
1483
1645
  },
1484
1646
  dialog: {
1485
1647
  close: 'סגירת חלון',
@@ -1615,6 +1777,8 @@ const messages$7 = {
1615
1777
  zoom: 'ज़ूम',
1616
1778
  zoomIn: 'ज़ूम इन',
1617
1779
  remove: 'छवि हटाएं',
1780
+ invalidType: 'फ़ाइल एक छवि होनी चाहिए',
1781
+ tooLarge: (maxMb) => `फ़ाइल ${maxMb} MB की सीमा से अधिक है`,
1618
1782
  },
1619
1783
  breadcrumbs: {
1620
1784
  label: 'ब्रेडक्रंब',
@@ -1642,6 +1806,11 @@ const messages$7 = {
1642
1806
  dataTable: {
1643
1807
  noData: 'कोई डेटा उपलब्ध नहीं',
1644
1808
  },
1809
+ numberFormat: {
1810
+ decimal: '.',
1811
+ group: ',',
1812
+ grouping: [3, 2],
1813
+ },
1645
1814
  datePicker: {
1646
1815
  placeholder: 'तारीख चुनें…',
1647
1816
  clear: 'तारीख साफ़ करें',
@@ -1650,6 +1819,21 @@ const messages$7 = {
1650
1819
  nextMonth: 'अगला महीना',
1651
1820
  nextYear: 'अगला वर्ष',
1652
1821
  today: 'आज',
1822
+ weekdaysShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
1823
+ months: [
1824
+ 'जनवरी',
1825
+ 'फ़रवरी',
1826
+ 'मार्च',
1827
+ 'अप्रैल',
1828
+ 'मई',
1829
+ 'जून',
1830
+ 'जुलाई',
1831
+ 'अगस्त',
1832
+ 'सितंबर',
1833
+ 'अक्टूबर',
1834
+ 'नवंबर',
1835
+ 'दिसंबर',
1836
+ ],
1653
1837
  },
1654
1838
  dialog: {
1655
1839
  close: 'संवाद बंद करें',
@@ -1785,6 +1969,8 @@ const messages$6 = {
1785
1969
  zoom: 'Aðdráttur',
1786
1970
  zoomIn: 'Auka aðdrátt',
1787
1971
  remove: 'Fjarlægja mynd',
1972
+ invalidType: 'Skráin verður að vera mynd',
1973
+ tooLarge: (maxMb) => `Skráin fer yfir ${maxMb} MB mörkin`,
1788
1974
  },
1789
1975
  breadcrumbs: {
1790
1976
  label: 'Brauðmolaslóð',
@@ -1812,6 +1998,11 @@ const messages$6 = {
1812
1998
  dataTable: {
1813
1999
  noData: 'Engin gögn til staðar',
1814
2000
  },
2001
+ numberFormat: {
2002
+ decimal: ',',
2003
+ group: '.',
2004
+ grouping: [3],
2005
+ },
1815
2006
  datePicker: {
1816
2007
  placeholder: 'Veldu dagsetningu…',
1817
2008
  clear: 'Hreinsa dagsetningu',
@@ -1820,6 +2011,21 @@ const messages$6 = {
1820
2011
  nextMonth: 'Næsti mánuður',
1821
2012
  nextYear: 'Næsta ár',
1822
2013
  today: 'Í dag',
2014
+ weekdaysShort: ['sun.', 'mán.', 'þri.', 'mið.', 'fim.', 'fös.', 'lau.'],
2015
+ months: [
2016
+ 'janúar',
2017
+ 'febrúar',
2018
+ 'mars',
2019
+ 'apríl',
2020
+ 'maí',
2021
+ 'júní',
2022
+ 'júlí',
2023
+ 'ágúst',
2024
+ 'september',
2025
+ 'október',
2026
+ 'nóvember',
2027
+ 'desember',
2028
+ ],
1823
2029
  },
1824
2030
  dialog: {
1825
2031
  close: 'Loka glugga',
@@ -1955,6 +2161,8 @@ const messages$5 = {
1955
2161
  zoom: 'Zoom',
1956
2162
  zoomIn: 'Inzoomen',
1957
2163
  remove: 'Afbeelding verwijderen',
2164
+ invalidType: 'Bestand moet een afbeelding zijn',
2165
+ tooLarge: (maxMb) => `Bestand overschrijdt de limiet van ${maxMb} MB`,
1958
2166
  },
1959
2167
  breadcrumbs: {
1960
2168
  label: 'Broodkruimelnavigatie',
@@ -1982,6 +2190,11 @@ const messages$5 = {
1982
2190
  dataTable: {
1983
2191
  noData: 'Geen gegevens beschikbaar',
1984
2192
  },
2193
+ numberFormat: {
2194
+ decimal: ',',
2195
+ group: '.',
2196
+ grouping: [3],
2197
+ },
1985
2198
  datePicker: {
1986
2199
  placeholder: 'Selecteer datum…',
1987
2200
  clear: 'Datum wissen',
@@ -1990,6 +2203,21 @@ const messages$5 = {
1990
2203
  nextMonth: 'Volgende maand',
1991
2204
  nextYear: 'Volgend jaar',
1992
2205
  today: 'Vandaag',
2206
+ weekdaysShort: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
2207
+ months: [
2208
+ 'januari',
2209
+ 'februari',
2210
+ 'maart',
2211
+ 'april',
2212
+ 'mei',
2213
+ 'juni',
2214
+ 'juli',
2215
+ 'augustus',
2216
+ 'september',
2217
+ 'oktober',
2218
+ 'november',
2219
+ 'december',
2220
+ ],
1993
2221
  },
1994
2222
  dialog: {
1995
2223
  close: 'Dialoogvenster sluiten',
@@ -2125,6 +2353,8 @@ const messages$4 = {
2125
2353
  zoom: 'Powiększenie',
2126
2354
  zoomIn: 'Powiększ',
2127
2355
  remove: 'Usuń obraz',
2356
+ invalidType: 'Plik musi być obrazem',
2357
+ tooLarge: (maxMb) => `Plik przekracza limit ${maxMb} MB`,
2128
2358
  },
2129
2359
  breadcrumbs: {
2130
2360
  label: 'Ścieżka nawigacji',
@@ -2152,6 +2382,11 @@ const messages$4 = {
2152
2382
  dataTable: {
2153
2383
  noData: 'Brak dostępnych danych',
2154
2384
  },
2385
+ numberFormat: {
2386
+ decimal: ',',
2387
+ group: '\u00A0',
2388
+ grouping: [3],
2389
+ },
2155
2390
  datePicker: {
2156
2391
  placeholder: 'Wybierz datę…',
2157
2392
  clear: 'Wyczyść datę',
@@ -2160,6 +2395,21 @@ const messages$4 = {
2160
2395
  nextMonth: 'Następny miesiąc',
2161
2396
  nextYear: 'Następny rok',
2162
2397
  today: 'Dzisiaj',
2398
+ weekdaysShort: ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],
2399
+ months: [
2400
+ 'styczeń',
2401
+ 'luty',
2402
+ 'marzec',
2403
+ 'kwiecień',
2404
+ 'maj',
2405
+ 'czerwiec',
2406
+ 'lipiec',
2407
+ 'sierpień',
2408
+ 'wrzesień',
2409
+ 'październik',
2410
+ 'listopad',
2411
+ 'grudzień',
2412
+ ],
2163
2413
  },
2164
2414
  dialog: {
2165
2415
  close: 'Zamknij okno dialogowe',
@@ -2295,6 +2545,8 @@ const messages$3 = {
2295
2545
  zoom: 'Zoom',
2296
2546
  zoomIn: 'Aumentar zoom',
2297
2547
  remove: 'Remover imagem',
2548
+ invalidType: 'O arquivo deve ser uma imagem',
2549
+ tooLarge: (maxMb) => `O arquivo excede o limite de ${maxMb} MB`,
2298
2550
  },
2299
2551
  breadcrumbs: {
2300
2552
  label: 'Trilha de navegação',
@@ -2322,6 +2574,11 @@ const messages$3 = {
2322
2574
  dataTable: {
2323
2575
  noData: 'Nenhum dado disponível',
2324
2576
  },
2577
+ numberFormat: {
2578
+ decimal: ',',
2579
+ group: '.',
2580
+ grouping: [3],
2581
+ },
2325
2582
  datePicker: {
2326
2583
  placeholder: 'Selecione a data…',
2327
2584
  clear: 'Limpar data',
@@ -2330,6 +2587,21 @@ const messages$3 = {
2330
2587
  nextMonth: 'Próximo mês',
2331
2588
  nextYear: 'Próximo ano',
2332
2589
  today: 'Hoje',
2590
+ weekdaysShort: ['dom.', 'seg.', 'ter.', 'qua.', 'qui.', 'sex.', 'sáb.'],
2591
+ months: [
2592
+ 'janeiro',
2593
+ 'fevereiro',
2594
+ 'março',
2595
+ 'abril',
2596
+ 'maio',
2597
+ 'junho',
2598
+ 'julho',
2599
+ 'agosto',
2600
+ 'setembro',
2601
+ 'outubro',
2602
+ 'novembro',
2603
+ 'dezembro',
2604
+ ],
2333
2605
  },
2334
2606
  dialog: {
2335
2607
  close: 'Fechar diálogo',
@@ -2465,6 +2737,8 @@ const messages$2 = {
2465
2737
  zoom: 'Масштаб',
2466
2738
  zoomIn: 'Увеличить',
2467
2739
  remove: 'Удалить изображение',
2740
+ invalidType: 'Файл должен быть изображением',
2741
+ tooLarge: (maxMb) => `Файл превышает лимит ${maxMb} MB`,
2468
2742
  },
2469
2743
  breadcrumbs: {
2470
2744
  label: 'Навигационная цепочка',
@@ -2492,6 +2766,11 @@ const messages$2 = {
2492
2766
  dataTable: {
2493
2767
  noData: 'Нет доступных данных',
2494
2768
  },
2769
+ numberFormat: {
2770
+ decimal: ',',
2771
+ group: '\u00A0',
2772
+ grouping: [3],
2773
+ },
2495
2774
  datePicker: {
2496
2775
  placeholder: 'Выберите дату…',
2497
2776
  clear: 'Очистить дату',
@@ -2500,6 +2779,21 @@ const messages$2 = {
2500
2779
  nextMonth: 'Следующий месяц',
2501
2780
  nextYear: 'Следующий год',
2502
2781
  today: 'Сегодня',
2782
+ weekdaysShort: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
2783
+ months: [
2784
+ 'январь',
2785
+ 'февраль',
2786
+ 'март',
2787
+ 'апрель',
2788
+ 'май',
2789
+ 'июнь',
2790
+ 'июль',
2791
+ 'август',
2792
+ 'сентябрь',
2793
+ 'октябрь',
2794
+ 'ноябрь',
2795
+ 'декабрь',
2796
+ ],
2503
2797
  },
2504
2798
  dialog: {
2505
2799
  close: 'Закрыть диалог',
@@ -2635,6 +2929,8 @@ const messages$1 = {
2635
2929
  zoom: 'Масштаб',
2636
2930
  zoomIn: 'Збільшити',
2637
2931
  remove: 'Видалити зображення',
2932
+ invalidType: 'Файл має бути зображенням',
2933
+ tooLarge: (maxMb) => `Файл перевищує ліміт ${maxMb} MB`,
2638
2934
  },
2639
2935
  breadcrumbs: {
2640
2936
  label: 'Навігаційний ланцюжок',
@@ -2662,6 +2958,11 @@ const messages$1 = {
2662
2958
  dataTable: {
2663
2959
  noData: 'Дані відсутні',
2664
2960
  },
2961
+ numberFormat: {
2962
+ decimal: ',',
2963
+ group: '\u00A0',
2964
+ grouping: [3],
2965
+ },
2665
2966
  datePicker: {
2666
2967
  placeholder: 'Виберіть дату…',
2667
2968
  clear: 'Очистити дату',
@@ -2670,6 +2971,21 @@ const messages$1 = {
2670
2971
  nextMonth: 'Наступний місяць',
2671
2972
  nextYear: 'Наступний рік',
2672
2973
  today: 'Сьогодні',
2974
+ weekdaysShort: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
2975
+ months: [
2976
+ 'січень',
2977
+ 'лютий',
2978
+ 'березень',
2979
+ 'квітень',
2980
+ 'травень',
2981
+ 'червень',
2982
+ 'липень',
2983
+ 'серпень',
2984
+ 'вересень',
2985
+ 'жовтень',
2986
+ 'листопад',
2987
+ 'грудень',
2988
+ ],
2673
2989
  },
2674
2990
  dialog: {
2675
2991
  close: 'Закрити діалог',
@@ -2805,6 +3121,8 @@ const messages = {
2805
3121
  zoom: '缩放',
2806
3122
  zoomIn: '放大',
2807
3123
  remove: '移除图片',
3124
+ invalidType: '文件必须是图片',
3125
+ tooLarge: (maxMb) => `文件超过 ${maxMb} MB 限制`,
2808
3126
  },
2809
3127
  breadcrumbs: {
2810
3128
  label: '面包屑导航',
@@ -2832,6 +3150,11 @@ const messages = {
2832
3150
  dataTable: {
2833
3151
  noData: '暂无数据',
2834
3152
  },
3153
+ numberFormat: {
3154
+ decimal: '.',
3155
+ group: ',',
3156
+ grouping: [3],
3157
+ },
2835
3158
  datePicker: {
2836
3159
  placeholder: '选择日期…',
2837
3160
  clear: '清除日期',
@@ -2840,6 +3163,21 @@ const messages = {
2840
3163
  nextMonth: '下个月',
2841
3164
  nextYear: '下一年',
2842
3165
  today: '今天',
3166
+ weekdaysShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
3167
+ months: [
3168
+ '一月',
3169
+ '二月',
3170
+ '三月',
3171
+ '四月',
3172
+ '五月',
3173
+ '六月',
3174
+ '七月',
3175
+ '八月',
3176
+ '九月',
3177
+ '十月',
3178
+ '十一月',
3179
+ '十二月',
3180
+ ],
2843
3181
  },
2844
3182
  dialog: {
2845
3183
  close: '关闭对话框',
@@ -4047,6 +4385,21 @@ class PopoverComponent {
4047
4385
  // The surface is portaled to <body>, escaping the anchor's dir context, so
4048
4386
  // mirror the anchor's resolved direction onto it explicitly.
4049
4387
  surface.dir = isRtl(anchor) ? 'rtl' : 'ltr';
4388
+ // For the same reason, mirror the anchor's resolved font-family custom
4389
+ // properties so panel content honours a consumer's font override set on the
4390
+ // trigger's ancestor instead of falling back to the root font.
4391
+ const anchorStyle = window.getComputedStyle(anchor);
4392
+ for (const name of [
4393
+ '--font-family-sans',
4394
+ '--font-family-mono',
4395
+ '--font-family-serif',
4396
+ '--font-family-brand',
4397
+ ]) {
4398
+ const value = anchorStyle.getPropertyValue(name).trim();
4399
+ if (value) {
4400
+ surface.style.setProperty(name, value);
4401
+ }
4402
+ }
4050
4403
  const anchorRect = anchor.getBoundingClientRect();
4051
4404
  const surfaceRect = surface.getBoundingClientRect();
4052
4405
  this.position.set(computePopoverPosition(anchorRect, { width: surfaceRect.width, height: surfaceRect.height }, { width: window.innerWidth, height: window.innerHeight }, {
@@ -4082,14 +4435,14 @@ class PopoverComponent {
4082
4435
  this.closeRequested.emit();
4083
4436
  }
4084
4437
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4085
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.16", type: PopoverComponent, isStandalone: true, selector: "ea-popover", inputs: { anchor: { classPropertyName: "anchor", publicName: "anchor", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, flip: { classPropertyName: "flip", publicName: "flip", isSignal: true, isRequired: false, transformFunction: null }, clamp: { classPropertyName: "clamp", publicName: "clamp", isSignal: true, isRequired: false, transformFunction: null }, matchAnchorWidth: { classPropertyName: "matchAnchorWidth", publicName: "matchAnchorWidth", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsideClick: { classPropertyName: "closeOnOutsideClick", publicName: "closeOnOutsideClick", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, scrollBehavior: { classPropertyName: "scrollBehavior", publicName: "scrollBehavior", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeRequested: "closeRequested" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()" }, properties: { "attr.role": "null", "attr.aria-label": "null" } }, viewQueries: [{ propertyName: "surfaceEl", first: true, predicate: ["surfaceEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<!--\n The surface is rendered unconditionally so the `<ng-content/>` slot always\n exists. If we gated it on `@if (open())`, Angular would re-project the\n consumer's content at the popover host's position whenever the surface was\n absent, leaking menu items / picker controls into the document flow (made\n worse by `display: contents` on the host). Hiding via `display: none` keeps\n the projected DOM owned by the surface and out of the flow when closed.\n-->\n<div\n #surfaceEl\n [class]=\"surfaceClass()\"\n [id]=\"surfaceId()\"\n [attr.role]=\"open() ? role() : null\"\n [attr.aria-label]=\"open() ? ariaLabel() : null\"\n [attr.aria-hidden]=\"open() ? null : true\"\n [style]=\"surfaceStyle()\">\n <ng-content />\n</div>\n", styles: [":host{display:contents}.ea-popover__surface{z-index:var(--z-index-popover);position:fixed;visibility:hidden}.ea-popover__surface--positioned{visibility:visible}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4438
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.16", type: PopoverComponent, isStandalone: true, selector: "ea-popover", inputs: { anchor: { classPropertyName: "anchor", publicName: "anchor", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, flip: { classPropertyName: "flip", publicName: "flip", isSignal: true, isRequired: false, transformFunction: null }, clamp: { classPropertyName: "clamp", publicName: "clamp", isSignal: true, isRequired: false, transformFunction: null }, matchAnchorWidth: { classPropertyName: "matchAnchorWidth", publicName: "matchAnchorWidth", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsideClick: { classPropertyName: "closeOnOutsideClick", publicName: "closeOnOutsideClick", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, scrollBehavior: { classPropertyName: "scrollBehavior", publicName: "scrollBehavior", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeRequested: "closeRequested" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()" }, properties: { "attr.role": "null", "attr.aria-label": "null" } }, viewQueries: [{ propertyName: "surfaceEl", first: true, predicate: ["surfaceEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<!--\n The surface is rendered unconditionally so the `<ng-content/>` slot always\n exists. If we gated it on `@if (open())`, Angular would re-project the\n consumer's content at the popover host's position whenever the surface was\n absent, leaking menu items / picker controls into the document flow (made\n worse by `display: contents` on the host). Hiding via `display: none` keeps\n the projected DOM owned by the surface and out of the flow when closed.\n-->\n<div\n #surfaceEl\n [class]=\"surfaceClass()\"\n [id]=\"surfaceId()\"\n [attr.role]=\"open() ? role() : null\"\n [attr.aria-label]=\"open() ? ariaLabel() : null\"\n [attr.aria-hidden]=\"open() ? null : true\"\n [style]=\"surfaceStyle()\">\n <ng-content />\n</div>\n", styles: [":host{display:contents}.ea-popover__surface{z-index:var(--z-index-popover);position:fixed;visibility:hidden;font-family:var(--font-family-sans)}.ea-popover__surface--positioned{visibility:visible}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4086
4439
  }
4087
4440
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: PopoverComponent, decorators: [{
4088
4441
  type: Component,
4089
4442
  args: [{ selector: 'ea-popover', changeDetection: ChangeDetectionStrategy.OnPush, host: {
4090
4443
  '[attr.role]': 'null',
4091
4444
  '[attr.aria-label]': 'null',
4092
- }, template: "<!--\n The surface is rendered unconditionally so the `<ng-content/>` slot always\n exists. If we gated it on `@if (open())`, Angular would re-project the\n consumer's content at the popover host's position whenever the surface was\n absent, leaking menu items / picker controls into the document flow (made\n worse by `display: contents` on the host). Hiding via `display: none` keeps\n the projected DOM owned by the surface and out of the flow when closed.\n-->\n<div\n #surfaceEl\n [class]=\"surfaceClass()\"\n [id]=\"surfaceId()\"\n [attr.role]=\"open() ? role() : null\"\n [attr.aria-label]=\"open() ? ariaLabel() : null\"\n [attr.aria-hidden]=\"open() ? null : true\"\n [style]=\"surfaceStyle()\">\n <ng-content />\n</div>\n", styles: [":host{display:contents}.ea-popover__surface{z-index:var(--z-index-popover);position:fixed;visibility:hidden}.ea-popover__surface--positioned{visibility:visible}\n"] }]
4445
+ }, template: "<!--\n The surface is rendered unconditionally so the `<ng-content/>` slot always\n exists. If we gated it on `@if (open())`, Angular would re-project the\n consumer's content at the popover host's position whenever the surface was\n absent, leaking menu items / picker controls into the document flow (made\n worse by `display: contents` on the host). Hiding via `display: none` keeps\n the projected DOM owned by the surface and out of the flow when closed.\n-->\n<div\n #surfaceEl\n [class]=\"surfaceClass()\"\n [id]=\"surfaceId()\"\n [attr.role]=\"open() ? role() : null\"\n [attr.aria-label]=\"open() ? ariaLabel() : null\"\n [attr.aria-hidden]=\"open() ? null : true\"\n [style]=\"surfaceStyle()\">\n <ng-content />\n</div>\n", styles: [":host{display:contents}.ea-popover__surface{z-index:var(--z-index-popover);position:fixed;visibility:hidden;font-family:var(--font-family-sans)}.ea-popover__surface--positioned{visibility:visible}\n"] }]
4093
4446
  }], ctorParameters: () => [], propDecorators: { surfaceEl: [{ type: i0.ViewChild, args: ['surfaceEl', { isSignal: true }] }], anchor: [{ type: i0.Input, args: [{ isSignal: true, alias: "anchor", required: true }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], flip: [{ type: i0.Input, args: [{ isSignal: true, alias: "flip", required: false }] }], clamp: [{ type: i0.Input, args: [{ isSignal: true, alias: "clamp", required: false }] }], matchAnchorWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "matchAnchorWidth", required: false }] }], closeOnOutsideClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnOutsideClick", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], scrollBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollBehavior", required: false }] }], closeRequested: [{ type: i0.Output, args: ["closeRequested"] }], onDocumentClick: [{
4094
4447
  type: HostListener,
4095
4448
  args: ['document:click', ['$event']]
@@ -5394,12 +5747,12 @@ class AvatarEditorComponent {
5394
5747
  }
5395
5748
  loadFile(file) {
5396
5749
  if (!file.type.startsWith('image/')) {
5397
- this.errored.emit('File must be an image');
5750
+ this.errored.emit(this.i18n.messages().avatarEditor.invalidType);
5398
5751
  return;
5399
5752
  }
5400
5753
  if (file.size > this.maxFileSize()) {
5401
5754
  const maxMb = Math.round(this.maxFileSize() / (1024 * 1024));
5402
- this.errored.emit(`File exceeds ${maxMb} MB limit`);
5755
+ this.errored.emit(this.i18n.messages().avatarEditor.tooLarge(maxMb));
5403
5756
  return;
5404
5757
  }
5405
5758
  this.isAtOriginal.set(false);
@@ -6417,6 +6770,22 @@ class ColorPickerComponent {
6417
6770
  * expanded back into a 6-digit canonical form. */
6418
6771
  hexInputValue = signal('', ...(ngDevMode ? [{ debugName: "hexInputValue" }] : /* istanbul ignore next */ []));
6419
6772
  _formDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_formDisabled" }] : /* istanbul ignore next */ []));
6773
+ /** The last value this component emitted, so the value-sync effect can tell an
6774
+ * external `[(value)]` / reset change from its own commit and skip the echo. */
6775
+ lastCommitted = null;
6776
+ // Sync internal HSV when `value` is set from outside (an input binding), which
6777
+ // otherwise only happens through the forms `writeValue` path. Without this a
6778
+ // `[(value)]`-bound initial color renders on the swatch as black.
6779
+ valueSync = effect(() => {
6780
+ const v = this.value();
6781
+ if (v === null || v === this.lastCommitted) {
6782
+ return;
6783
+ }
6784
+ const parsed = parseColor(v);
6785
+ if (parsed) {
6786
+ this.applyRgba(parsed.r, parsed.g, parsed.b, parsed.a, false);
6787
+ }
6788
+ }, ...(ngDevMode ? [{ debugName: "valueSync" }] : /* istanbul ignore next */ []));
6420
6789
  onChange = () => { };
6421
6790
  onTouched = () => { };
6422
6791
  isDisabled = computed(() => this.disabled() || this._formDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
@@ -6893,6 +7262,7 @@ class ColorPickerComponent {
6893
7262
  if (out === this.value()) {
6894
7263
  return;
6895
7264
  }
7265
+ this.lastCommitted = out;
6896
7266
  this.value.set(out);
6897
7267
  this.onChange(out);
6898
7268
  this.changed.emit(out);
@@ -7953,6 +8323,24 @@ class DatePickerComponent {
7953
8323
  showHint = computed(() => !!this.hint() && !this.hasError(), ...(ngDevMode ? [{ debugName: "showHint" }] : /* istanbul ignore next */ []));
7954
8324
  /** Locale used for date formatting: explicit `locale` input, else the global locale. */
7955
8325
  effectiveLocale = computed(() => this.locale() ?? this.i18n.locale(), ...(ngDevMode ? [{ debugName: "effectiveLocale" }] : /* istanbul ignore next */ []));
8326
+ /** True when the active date locale is a registered locale we ship a bundle
8327
+ * for (no distinct per-instance `locale` override), so the bundled calendar
8328
+ * names apply and the calendar stays localized regardless of the runtime's
8329
+ * `Intl` locale coverage. */
8330
+ bundleCalendarApplies = computed(() => this.effectiveLocale() === this.i18n.locale(), ...(ngDevMode ? [{ debugName: "bundleCalendarApplies" }] : /* istanbul ignore next */ []));
8331
+ /** Whether the runtime's `Intl` actually has date data for the active locale.
8332
+ * Some browsers ship a reduced ICU that silently falls back to English for
8333
+ * less common locales, so a matching request is not a given. */
8334
+ intlLocalizesEffectiveLocale = computed(() => {
8335
+ const requested = this.effectiveLocale();
8336
+ try {
8337
+ const resolved = new Intl.DateTimeFormat(requested).resolvedOptions().locale;
8338
+ return resolved.split('-')[0] === requested.split('-')[0];
8339
+ }
8340
+ catch {
8341
+ return false;
8342
+ }
8343
+ }, ...(ngDevMode ? [{ debugName: "intlLocalizesEffectiveLocale" }] : /* istanbul ignore next */ []));
7956
8344
  /** Placeholder text: explicit `placeholder` input, else the active locale's default. */
7957
8345
  resolvedPlaceholder = computed(() => this.placeholder() ?? this.i18n.messages().datePicker.placeholder, ...(ngDevMode ? [{ debugName: "resolvedPlaceholder" }] : /* istanbul ignore next */ []));
7958
8346
  triggerClasses = computed(() => ({
@@ -7964,34 +8352,54 @@ class DatePickerComponent {
7964
8352
  wrapperClasses = computed(() => ({
7965
8353
  [`ea-date-picker__trigger-wrapper--${this.size()}`]: true,
7966
8354
  }), ...(ngDevMode ? [{ debugName: "wrapperClasses" }] : /* istanbul ignore next */ []));
8355
+ // The calendar popover is portaled to the document body, so it cannot inherit
8356
+ // the trigger's font-size; this size class carries the scale over to it.
8357
+ popoverClasses = computed(() => ({
8358
+ [`ea-date-picker__popover--${this.size()}`]: true,
8359
+ }), ...(ngDevMode ? [{ debugName: "popoverClasses" }] : /* istanbul ignore next */ []));
7967
8360
  displayValue = computed(() => {
7968
8361
  const val = this.value();
7969
8362
  if (!val) {
7970
8363
  return '';
7971
8364
  }
8365
+ if (this.bundleCalendarApplies() && !this.intlLocalizesEffectiveLocale()) {
8366
+ const months = this.i18n.messages().datePicker.months;
8367
+ return `${val.getDate()} ${months[val.getMonth()]} ${val.getFullYear()}`;
8368
+ }
7972
8369
  return new Intl.DateTimeFormat(this.effectiveLocale(), this.formatOptions()).format(val);
7973
8370
  }, ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
7974
8371
  monthYearLabel = computed(() => {
7975
- const date = new Date(this.viewYear(), this.viewMonth(), 1);
8372
+ const year = this.viewYear();
8373
+ const month = this.viewMonth();
8374
+ // Defer to the bundle only when Intl can't localize this locale: the
8375
+ // month/year heading carries locale-specific patterns (element order, era
8376
+ // markers, connective words) that Intl composes and a plain join cannot.
8377
+ if (this.bundleCalendarApplies() && !this.intlLocalizesEffectiveLocale()) {
8378
+ return `${this.i18n.messages().datePicker.months[month]} ${year}`;
8379
+ }
7976
8380
  return new Intl.DateTimeFormat(this.effectiveLocale(), {
7977
8381
  month: 'long',
7978
8382
  year: 'numeric',
7979
- }).format(date);
8383
+ }).format(new Date(year, month, 1));
7980
8384
  }, ...(ngDevMode ? [{ debugName: "monthYearLabel" }] : /* istanbul ignore next */ []));
7981
8385
  weekdayLabels = computed(() => {
7982
8386
  const start = this.weekStartsOn();
8387
+ // Weekday indices in display order; bundle names are Sunday-first (index 0)
8388
+ const order = Array.from({ length: 7 }, (_, i) => (i + start) % 7);
8389
+ if (this.bundleCalendarApplies()) {
8390
+ const short = this.i18n.messages().datePicker.weekdaysShort;
8391
+ return order.map(index => short[index]);
8392
+ }
8393
+ // A known Sunday (2024-01-07) anchors the offset into locale weekday names
8394
+ const base = new Date(2024, 0, 7);
7983
8395
  const formatter = new Intl.DateTimeFormat(this.effectiveLocale(), {
7984
8396
  weekday: 'short',
7985
8397
  });
7986
- const labels = [];
7987
- // Use a known Sunday (2024-01-07) as anchor so we can offset for locale
7988
- const base = new Date(2024, 0, 7);
7989
- for (let i = 0; i < 7; i++) {
7990
- const d = new Date(base);
7991
- d.setDate(base.getDate() + ((i + start) % 7));
7992
- labels.push(formatter.format(d));
7993
- }
7994
- return labels;
8398
+ return order.map(index => {
8399
+ const date = new Date(base);
8400
+ date.setDate(base.getDate() + index);
8401
+ return formatter.format(date);
8402
+ });
7995
8403
  }, ...(ngDevMode ? [{ debugName: "weekdayLabels" }] : /* istanbul ignore next */ []));
7996
8404
  weeks = computed(() => {
7997
8405
  const year = this.viewYear();
@@ -8286,7 +8694,7 @@ class DatePickerComponent {
8286
8694
  useExisting: forwardRef(() => DatePickerComponent),
8287
8695
  multi: true,
8288
8696
  },
8289
- ], viewQueries: [{ propertyName: "triggerEl", first: true, predicate: ["triggerEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ea-date-picker-field\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [forId]=\"id()\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-date-picker\">\n <div\n class=\"ea-date-picker__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-date-picker__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\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)=\"handleTriggerKeydown($event)\">\n <ea-icon-calendar\n class=\"ea-date-picker__trigger-icon\"\n aria-hidden=\"true\" />\n <span\n class=\"ea-date-picker__trigger-value\"\n [class.ea-date-picker__trigger-value--placeholder]=\"!displayValue()\">\n <bdi>{{ displayValue() || resolvedPlaceholder() }}</bdi>\n </span>\n </button>\n @if (value() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"ea-date-picker__clear\"\n [attr.aria-label]=\"i18n.messages().datePicker.clear\"\n (click)=\"clear($event)\">\n <ea-icon-x\n class=\"ea-date-picker__clear-icon\"\n aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n role=\"dialog\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"close\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-date-picker__popover\"\n [attr.aria-labelledby]=\"id() + '-label'\"\n (keydown)=\"handleGridKeydown($event)\">\n <div class=\"ea-date-picker__header\">\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.previousYear\"\n (click)=\"goToPrevYear()\">\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.previousMonth\"\n (click)=\"goToPrevMonth()\">\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <span\n class=\"ea-date-picker__month-label\"\n [id]=\"id() + '-label'\"\n aria-live=\"polite\">\n {{ monthYearLabel() }}\n </span>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.nextMonth\"\n (click)=\"goToNextMonth()\">\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.nextYear\"\n (click)=\"goToNextYear()\">\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n class=\"ea-date-picker__grid\"\n role=\"grid\">\n <div\n class=\"ea-date-picker__weekday-row\"\n role=\"row\">\n @for (label of weekdayLabels(); track label) {\n <div\n class=\"ea-date-picker__weekday\"\n role=\"columnheader\">\n {{ label }}\n </div>\n }\n </div>\n @for (week of weeks(); track $index) {\n <div\n class=\"ea-date-picker__week\"\n role=\"row\">\n @for (day of week; track day.date.getTime()) {\n <button\n type=\"button\"\n class=\"ea-date-picker__day\"\n role=\"gridcell\"\n [class.ea-date-picker__day--outside]=\"!day.isCurrentMonth\"\n [class.ea-date-picker__day--today]=\"day.isToday\"\n [class.ea-date-picker__day--selected]=\"day.isSelected\"\n [class.ea-date-picker__day--focused]=\"day.isFocused\"\n [class.ea-date-picker__day--disabled]=\"day.isDisabled\"\n [disabled]=\"day.isDisabled\"\n [attr.aria-selected]=\"day.isSelected\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.tabindex]=\"day.isFocused ? 0 : -1\"\n (click)=\"selectDay(day)\">\n {{ day.day }}\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"ea-date-picker__footer\">\n <button\n type=\"button\"\n class=\"ea-date-picker__today-btn\"\n (click)=\"goToToday()\">\n {{ i18n.messages().datePicker.today }}\n </button>\n </div>\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", styles: [".ea-date-picker-field{display:flex;flex-direction:column;gap:var(--space-1-5)}.ea-date-picker,.ea-date-picker__trigger-wrapper{position:relative}.ea-date-picker__trigger-wrapper--xs{font-size:var(--font-size-xs)}.ea-date-picker__trigger-wrapper--sm{font-size:var(--font-size-sm)}.ea-date-picker__trigger-wrapper--md{font-size:var(--font-size-md)}.ea-date-picker__trigger-wrapper--lg{font-size:var(--font-size-lg)}.ea-date-picker__trigger-wrapper--xl{font-size:var(--font-size-xl)}.ea-date-picker__trigger{display:flex;align-items:center;gap:.5em;width:100%;min-height:2.5em;padding:.5em .75em;font-family:var(--font-family-sans);text-align:start;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-date-picker__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--xs{font-size:var(--font-size-xs)}.ea-date-picker__trigger--sm{font-size:var(--font-size-sm)}.ea-date-picker__trigger--md{font-size:var(--font-size-md)}.ea-date-picker__trigger--lg{font-size:var(--font-size-lg)}.ea-date-picker__trigger--xl{font-size:var(--font-size-xl)}.ea-date-picker__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--error{border-color:var(--color-error-default)}.ea-date-picker__trigger--error.ea-date-picker__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-date-picker__trigger--error.ea-date-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:not-allowed}.ea-date-picker__trigger-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary)}.ea-date-picker__trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-date-picker__trigger-value--placeholder{color:var(--color-text-tertiary)}.ea-date-picker__clear{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-date-picker__clear>*{font-size:1.25em}.ea-date-picker__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-date-picker__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__clear:disabled{cursor:not-allowed;opacity:.5}.ea-date-picker__clear{z-index:1;position:absolute;top:50%;inset-inline-end:var(--space-2);transform:translateY(-50%)}.ea-date-picker__clear-icon{width:1em;height:1em}.ea-date-picker__popover{display:flex;flex-direction:column;gap:var(--space-2);min-width:17.5rem;padding:var(--space-3);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-date-picker-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-date-picker__popover{border:1px solid CanvasText}}.ea-date-picker__header{display:flex;align-items:center;gap:var(--space-1)}.ea-date-picker__nav-btn{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-date-picker__nav-btn>*{font-size:1.25em}.ea-date-picker__nav-btn:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-date-picker__nav-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__nav-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__nav-btn:disabled{cursor:not-allowed;opacity:.5}.ea-date-picker__nav-btn ea-icon-chevron-left,.ea-date-picker__nav-btn ea-icon-chevron-right{width:1em;height:1em}.ea-date-picker__nav-btn ea-icon-chevron-left+ea-icon-chevron-left,.ea-date-picker__nav-btn ea-icon-chevron-right+ea-icon-chevron-right{margin-inline-start:-.375em}.ea-date-picker__month-label{flex:1;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);text-align:center;color:var(--color-text-primary)}.ea-date-picker__grid{display:flex;flex-direction:column;gap:var(--space-1)}.ea-date-picker__weekday-row,.ea-date-picker__week{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--space-1)}.ea-date-picker__weekday{display:flex;align-items:center;justify-content:center;height:1.5rem;font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);text-transform:uppercase;color:var(--color-text-tertiary)}.ea-date-picker__day{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:none;border-radius:var(--radius-sm);background:none;font-family:var(--font-family-sans);font-size:var(--font-size-sm);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-date-picker__day:hover:not(:disabled){background-color:var(--color-state-hover)}.ea-date-picker__day:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__day:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__day--outside{color:var(--color-text-tertiary)}.ea-date-picker__day--today{font-weight:var(--font-weight-semibold);color:var(--color-brand-text)}.ea-date-picker__day--focused:not(.ea-date-picker__day--selected){background-color:var(--color-state-active)}.ea-date-picker__day--selected{background-color:var(--color-brand-default);color:var(--color-text-inverse);font-weight:var(--font-weight-medium)}.ea-date-picker__day--selected:hover{background-color:var(--color-brand-hover)}@media(forced-colors:active){.ea-date-picker__day--selected{background-color:Highlight;border-color:Highlight;color:HighlightText}}.ea-date-picker__day--disabled{color:var(--color-text-disabled);cursor:not-allowed}.ea-date-picker__day--disabled:hover{background-color:transparent}.ea-date-picker__footer{display:flex;justify-content:flex-end;padding-top:var(--space-2);border-top:var(--border-width-thin) solid var(--color-border-default)}.ea-date-picker__today-btn{padding:var(--space-1) var(--space-2);border:none;border-radius:var(--radius-sm);background:none;font-family:var(--font-family-sans);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-brand-text);cursor:pointer;transition:var(--transition-colors)}.ea-date-picker__today-btn:hover{background-color:var(--color-brand-subtle)}.ea-date-picker__today-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__today-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}\n"], dependencies: [{ kind: "component", type: CalendarIconComponent, selector: "ea-icon-calendar" }, { kind: "component", type: ChevronLeftIconComponent, selector: "ea-icon-chevron-left" }, { kind: "component", type: ChevronRightIconComponent, selector: "ea-icon-chevron-right" }, { kind: "component", type: FieldLabelComponent, selector: "ea-field-label", inputs: ["text", "forId", "required", "labelId"] }, { kind: "component", type: FieldMessagesComponent, selector: "ea-field-messages", inputs: ["id", "error", "hint"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PopoverComponent, selector: "ea-popover", inputs: ["anchor", "open", "placement", "role", "aria-label", "surfaceId", "offset", "flip", "clamp", "matchAnchorWidth", "closeOnOutsideClick", "closeOnEscape", "scrollBehavior"], outputs: ["closeRequested"] }, { kind: "component", type: XIconComponent, selector: "ea-icon-x" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8697
+ ], viewQueries: [{ propertyName: "triggerEl", first: true, predicate: ["triggerEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ea-date-picker-field\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [forId]=\"id()\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-date-picker\">\n <div\n class=\"ea-date-picker__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-date-picker__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\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)=\"handleTriggerKeydown($event)\">\n <ea-icon-calendar\n class=\"ea-date-picker__trigger-icon\"\n aria-hidden=\"true\" />\n <span\n class=\"ea-date-picker__trigger-value\"\n [class.ea-date-picker__trigger-value--placeholder]=\"!displayValue()\">\n <bdi>{{ displayValue() || resolvedPlaceholder() }}</bdi>\n </span>\n </button>\n @if (value() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"ea-date-picker__clear\"\n [attr.aria-label]=\"i18n.messages().datePicker.clear\"\n (click)=\"clear($event)\">\n <ea-icon-x\n class=\"ea-date-picker__clear-icon\"\n aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n role=\"dialog\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"close\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-date-picker__popover\"\n [ngClass]=\"popoverClasses()\"\n [attr.aria-labelledby]=\"id() + '-label'\"\n (keydown)=\"handleGridKeydown($event)\">\n <div class=\"ea-date-picker__header\">\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.previousYear\"\n (click)=\"goToPrevYear()\">\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.previousMonth\"\n (click)=\"goToPrevMonth()\">\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <span\n class=\"ea-date-picker__month-label\"\n [id]=\"id() + '-label'\"\n aria-live=\"polite\">\n {{ monthYearLabel() }}\n </span>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.nextMonth\"\n (click)=\"goToNextMonth()\">\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.nextYear\"\n (click)=\"goToNextYear()\">\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n class=\"ea-date-picker__grid\"\n role=\"grid\">\n <div\n class=\"ea-date-picker__weekday-row\"\n role=\"row\">\n @for (label of weekdayLabels(); track label) {\n <div\n class=\"ea-date-picker__weekday\"\n role=\"columnheader\">\n {{ label }}\n </div>\n }\n </div>\n @for (week of weeks(); track $index) {\n <div\n class=\"ea-date-picker__week\"\n role=\"row\">\n @for (day of week; track day.date.getTime()) {\n <button\n type=\"button\"\n class=\"ea-date-picker__day\"\n role=\"gridcell\"\n [class.ea-date-picker__day--outside]=\"!day.isCurrentMonth\"\n [class.ea-date-picker__day--today]=\"day.isToday\"\n [class.ea-date-picker__day--selected]=\"day.isSelected\"\n [class.ea-date-picker__day--focused]=\"day.isFocused\"\n [class.ea-date-picker__day--disabled]=\"day.isDisabled\"\n [disabled]=\"day.isDisabled\"\n [attr.aria-selected]=\"day.isSelected\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.tabindex]=\"day.isFocused ? 0 : -1\"\n (click)=\"selectDay(day)\">\n {{ day.day }}\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"ea-date-picker__footer\">\n <button\n type=\"button\"\n class=\"ea-date-picker__today-btn\"\n (click)=\"goToToday()\">\n {{ i18n.messages().datePicker.today }}\n </button>\n </div>\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", styles: [".ea-date-picker-field{display:flex;flex-direction:column;gap:var(--space-1-5)}.ea-date-picker,.ea-date-picker__trigger-wrapper{position:relative}.ea-date-picker__trigger-wrapper--xs{font-size:var(--font-size-xs)}.ea-date-picker__trigger-wrapper--sm{font-size:var(--font-size-sm)}.ea-date-picker__trigger-wrapper--md{font-size:var(--font-size-md)}.ea-date-picker__trigger-wrapper--lg{font-size:var(--font-size-lg)}.ea-date-picker__trigger-wrapper--xl{font-size:var(--font-size-xl)}.ea-date-picker__trigger{display:flex;align-items:center;gap:.5em;width:100%;min-height:2.5em;padding:.5em .75em;padding-inline-end:calc(var(--ea-icon-button-size) + var(--space-2) * 2);font-family:var(--font-family-sans);text-align:start;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-date-picker__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--xs{font-size:var(--font-size-xs)}.ea-date-picker__trigger--sm{font-size:var(--font-size-sm)}.ea-date-picker__trigger--md{font-size:var(--font-size-md)}.ea-date-picker__trigger--lg{font-size:var(--font-size-lg)}.ea-date-picker__trigger--xl{font-size:var(--font-size-xl)}.ea-date-picker__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--error{border-color:var(--color-error-default)}.ea-date-picker__trigger--error.ea-date-picker__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-date-picker__trigger--error.ea-date-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:not-allowed}.ea-date-picker__trigger-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary)}.ea-date-picker__trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-date-picker__trigger-value--placeholder{color:var(--color-text-tertiary)}.ea-date-picker__clear{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-date-picker__clear>*{font-size:1.25em}.ea-date-picker__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-date-picker__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__clear:disabled{cursor:not-allowed;opacity:.5}.ea-date-picker__clear{z-index:1;position:absolute;top:50%;inset-inline-end:var(--space-2);transform:translateY(-50%)}.ea-date-picker__clear-icon{width:1em;height:1em}.ea-date-picker__popover{display:flex;flex-direction:column;gap:.5em;min-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-date-picker-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-date-picker__popover{border:1px solid CanvasText}}.ea-date-picker__popover--xs{font-size:var(--font-size-xs)}.ea-date-picker__popover--sm{font-size:var(--font-size-sm)}.ea-date-picker__popover--md{font-size:var(--font-size-md)}.ea-date-picker__popover--lg{font-size:var(--font-size-lg)}.ea-date-picker__popover--xl{font-size:var(--font-size-xl)}.ea-date-picker__header{display:flex;align-items:center;gap:.25em}.ea-date-picker__nav-btn{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-date-picker__nav-btn>*{font-size:1.25em}.ea-date-picker__nav-btn:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-date-picker__nav-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__nav-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__nav-btn:disabled{cursor:not-allowed;opacity:.5}.ea-date-picker__nav-btn ea-icon-chevron-left,.ea-date-picker__nav-btn ea-icon-chevron-right{width:1em;height:1em}.ea-date-picker__nav-btn ea-icon-chevron-left+ea-icon-chevron-left,.ea-date-picker__nav-btn ea-icon-chevron-right+ea-icon-chevron-right{margin-inline-start:-.375em}.ea-date-picker__month-label{flex:1;font-size:.875em;font-weight:var(--font-weight-medium);text-align:center;color:var(--color-text-primary)}.ea-date-picker__grid{display:flex;flex-direction:column;gap:.25em}.ea-date-picker__weekday-row,.ea-date-picker__week{display:grid;grid-template-columns:repeat(7,1fr);gap:.25em}.ea-date-picker__weekday{display:flex;align-items:center;justify-content:center;height:2em;font-size:.75em;font-weight:var(--font-weight-medium);text-transform:uppercase;color:var(--color-text-tertiary)}.ea-date-picker__day{display:flex;align-items:center;justify-content:center;width:2.25em;height:2.25em;padding:0;border:none;border-radius:var(--radius-sm);background:none;font-family:var(--font-family-sans);font-size:.875em;color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-date-picker__day:hover:not(:disabled){background-color:var(--color-state-hover)}.ea-date-picker__day:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__day:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__day--outside{color:var(--color-text-tertiary)}.ea-date-picker__day--today{font-weight:var(--font-weight-semibold);color:var(--color-brand-text)}.ea-date-picker__day--focused:not(.ea-date-picker__day--selected){background-color:var(--color-state-active)}.ea-date-picker__day--selected{background-color:var(--color-brand-default);color:var(--color-text-inverse);font-weight:var(--font-weight-medium)}.ea-date-picker__day--selected:hover{background-color:var(--color-brand-hover)}@media(forced-colors:active){.ea-date-picker__day--selected{background-color:Highlight;border-color:Highlight;color:HighlightText}}.ea-date-picker__day--disabled{color:var(--color-text-disabled);cursor:not-allowed}.ea-date-picker__day--disabled:hover{background-color:transparent}.ea-date-picker__footer{display:flex;justify-content:flex-end;padding-top:.5em;border-top:var(--border-width-thin) solid var(--color-border-default)}.ea-date-picker__today-btn{padding:.25em .5em;border:none;border-radius:var(--radius-sm);background:none;font-family:var(--font-family-sans);font-size:.875em;font-weight:var(--font-weight-medium);color:var(--color-brand-text);cursor:pointer;transition:var(--transition-colors)}.ea-date-picker__today-btn:hover{background-color:var(--color-brand-subtle)}.ea-date-picker__today-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__today-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}\n"], dependencies: [{ kind: "component", type: CalendarIconComponent, selector: "ea-icon-calendar" }, { kind: "component", type: ChevronLeftIconComponent, selector: "ea-icon-chevron-left" }, { kind: "component", type: ChevronRightIconComponent, selector: "ea-icon-chevron-right" }, { kind: "component", type: FieldLabelComponent, selector: "ea-field-label", inputs: ["text", "forId", "required", "labelId"] }, { kind: "component", type: FieldMessagesComponent, selector: "ea-field-messages", inputs: ["id", "error", "hint"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PopoverComponent, selector: "ea-popover", inputs: ["anchor", "open", "placement", "role", "aria-label", "surfaceId", "offset", "flip", "clamp", "matchAnchorWidth", "closeOnOutsideClick", "closeOnEscape", "scrollBehavior"], outputs: ["closeRequested"] }, { kind: "component", type: XIconComponent, selector: "ea-icon-x" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8290
8698
  }
8291
8699
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: DatePickerComponent, decorators: [{
8292
8700
  type: Component,
@@ -8305,7 +8713,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8305
8713
  useExisting: forwardRef(() => DatePickerComponent),
8306
8714
  multi: true,
8307
8715
  },
8308
- ], template: "<div class=\"ea-date-picker-field\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [forId]=\"id()\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-date-picker\">\n <div\n class=\"ea-date-picker__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-date-picker__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\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)=\"handleTriggerKeydown($event)\">\n <ea-icon-calendar\n class=\"ea-date-picker__trigger-icon\"\n aria-hidden=\"true\" />\n <span\n class=\"ea-date-picker__trigger-value\"\n [class.ea-date-picker__trigger-value--placeholder]=\"!displayValue()\">\n <bdi>{{ displayValue() || resolvedPlaceholder() }}</bdi>\n </span>\n </button>\n @if (value() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"ea-date-picker__clear\"\n [attr.aria-label]=\"i18n.messages().datePicker.clear\"\n (click)=\"clear($event)\">\n <ea-icon-x\n class=\"ea-date-picker__clear-icon\"\n aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n role=\"dialog\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"close\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-date-picker__popover\"\n [attr.aria-labelledby]=\"id() + '-label'\"\n (keydown)=\"handleGridKeydown($event)\">\n <div class=\"ea-date-picker__header\">\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.previousYear\"\n (click)=\"goToPrevYear()\">\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.previousMonth\"\n (click)=\"goToPrevMonth()\">\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <span\n class=\"ea-date-picker__month-label\"\n [id]=\"id() + '-label'\"\n aria-live=\"polite\">\n {{ monthYearLabel() }}\n </span>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.nextMonth\"\n (click)=\"goToNextMonth()\">\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.nextYear\"\n (click)=\"goToNextYear()\">\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n class=\"ea-date-picker__grid\"\n role=\"grid\">\n <div\n class=\"ea-date-picker__weekday-row\"\n role=\"row\">\n @for (label of weekdayLabels(); track label) {\n <div\n class=\"ea-date-picker__weekday\"\n role=\"columnheader\">\n {{ label }}\n </div>\n }\n </div>\n @for (week of weeks(); track $index) {\n <div\n class=\"ea-date-picker__week\"\n role=\"row\">\n @for (day of week; track day.date.getTime()) {\n <button\n type=\"button\"\n class=\"ea-date-picker__day\"\n role=\"gridcell\"\n [class.ea-date-picker__day--outside]=\"!day.isCurrentMonth\"\n [class.ea-date-picker__day--today]=\"day.isToday\"\n [class.ea-date-picker__day--selected]=\"day.isSelected\"\n [class.ea-date-picker__day--focused]=\"day.isFocused\"\n [class.ea-date-picker__day--disabled]=\"day.isDisabled\"\n [disabled]=\"day.isDisabled\"\n [attr.aria-selected]=\"day.isSelected\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.tabindex]=\"day.isFocused ? 0 : -1\"\n (click)=\"selectDay(day)\">\n {{ day.day }}\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"ea-date-picker__footer\">\n <button\n type=\"button\"\n class=\"ea-date-picker__today-btn\"\n (click)=\"goToToday()\">\n {{ i18n.messages().datePicker.today }}\n </button>\n </div>\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", styles: [".ea-date-picker-field{display:flex;flex-direction:column;gap:var(--space-1-5)}.ea-date-picker,.ea-date-picker__trigger-wrapper{position:relative}.ea-date-picker__trigger-wrapper--xs{font-size:var(--font-size-xs)}.ea-date-picker__trigger-wrapper--sm{font-size:var(--font-size-sm)}.ea-date-picker__trigger-wrapper--md{font-size:var(--font-size-md)}.ea-date-picker__trigger-wrapper--lg{font-size:var(--font-size-lg)}.ea-date-picker__trigger-wrapper--xl{font-size:var(--font-size-xl)}.ea-date-picker__trigger{display:flex;align-items:center;gap:.5em;width:100%;min-height:2.5em;padding:.5em .75em;font-family:var(--font-family-sans);text-align:start;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-date-picker__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--xs{font-size:var(--font-size-xs)}.ea-date-picker__trigger--sm{font-size:var(--font-size-sm)}.ea-date-picker__trigger--md{font-size:var(--font-size-md)}.ea-date-picker__trigger--lg{font-size:var(--font-size-lg)}.ea-date-picker__trigger--xl{font-size:var(--font-size-xl)}.ea-date-picker__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--error{border-color:var(--color-error-default)}.ea-date-picker__trigger--error.ea-date-picker__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-date-picker__trigger--error.ea-date-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:not-allowed}.ea-date-picker__trigger-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary)}.ea-date-picker__trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-date-picker__trigger-value--placeholder{color:var(--color-text-tertiary)}.ea-date-picker__clear{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-date-picker__clear>*{font-size:1.25em}.ea-date-picker__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-date-picker__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__clear:disabled{cursor:not-allowed;opacity:.5}.ea-date-picker__clear{z-index:1;position:absolute;top:50%;inset-inline-end:var(--space-2);transform:translateY(-50%)}.ea-date-picker__clear-icon{width:1em;height:1em}.ea-date-picker__popover{display:flex;flex-direction:column;gap:var(--space-2);min-width:17.5rem;padding:var(--space-3);border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-date-picker-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-date-picker__popover{border:1px solid CanvasText}}.ea-date-picker__header{display:flex;align-items:center;gap:var(--space-1)}.ea-date-picker__nav-btn{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-date-picker__nav-btn>*{font-size:1.25em}.ea-date-picker__nav-btn:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-date-picker__nav-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__nav-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__nav-btn:disabled{cursor:not-allowed;opacity:.5}.ea-date-picker__nav-btn ea-icon-chevron-left,.ea-date-picker__nav-btn ea-icon-chevron-right{width:1em;height:1em}.ea-date-picker__nav-btn ea-icon-chevron-left+ea-icon-chevron-left,.ea-date-picker__nav-btn ea-icon-chevron-right+ea-icon-chevron-right{margin-inline-start:-.375em}.ea-date-picker__month-label{flex:1;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);text-align:center;color:var(--color-text-primary)}.ea-date-picker__grid{display:flex;flex-direction:column;gap:var(--space-1)}.ea-date-picker__weekday-row,.ea-date-picker__week{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--space-1)}.ea-date-picker__weekday{display:flex;align-items:center;justify-content:center;height:1.5rem;font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);text-transform:uppercase;color:var(--color-text-tertiary)}.ea-date-picker__day{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:none;border-radius:var(--radius-sm);background:none;font-family:var(--font-family-sans);font-size:var(--font-size-sm);color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-date-picker__day:hover:not(:disabled){background-color:var(--color-state-hover)}.ea-date-picker__day:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__day:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__day--outside{color:var(--color-text-tertiary)}.ea-date-picker__day--today{font-weight:var(--font-weight-semibold);color:var(--color-brand-text)}.ea-date-picker__day--focused:not(.ea-date-picker__day--selected){background-color:var(--color-state-active)}.ea-date-picker__day--selected{background-color:var(--color-brand-default);color:var(--color-text-inverse);font-weight:var(--font-weight-medium)}.ea-date-picker__day--selected:hover{background-color:var(--color-brand-hover)}@media(forced-colors:active){.ea-date-picker__day--selected{background-color:Highlight;border-color:Highlight;color:HighlightText}}.ea-date-picker__day--disabled{color:var(--color-text-disabled);cursor:not-allowed}.ea-date-picker__day--disabled:hover{background-color:transparent}.ea-date-picker__footer{display:flex;justify-content:flex-end;padding-top:var(--space-2);border-top:var(--border-width-thin) solid var(--color-border-default)}.ea-date-picker__today-btn{padding:var(--space-1) var(--space-2);border:none;border-radius:var(--radius-sm);background:none;font-family:var(--font-family-sans);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-brand-text);cursor:pointer;transition:var(--transition-colors)}.ea-date-picker__today-btn:hover{background-color:var(--color-brand-subtle)}.ea-date-picker__today-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__today-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}\n"] }]
8716
+ ], template: "<div class=\"ea-date-picker-field\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [forId]=\"id()\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-date-picker\">\n <div\n class=\"ea-date-picker__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"ea-date-picker__trigger\"\n [ngClass]=\"triggerClasses()\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\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)=\"handleTriggerKeydown($event)\">\n <ea-icon-calendar\n class=\"ea-date-picker__trigger-icon\"\n aria-hidden=\"true\" />\n <span\n class=\"ea-date-picker__trigger-value\"\n [class.ea-date-picker__trigger-value--placeholder]=\"!displayValue()\">\n <bdi>{{ displayValue() || resolvedPlaceholder() }}</bdi>\n </span>\n </button>\n @if (value() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"ea-date-picker__clear\"\n [attr.aria-label]=\"i18n.messages().datePicker.clear\"\n (click)=\"clear($event)\">\n <ea-icon-x\n class=\"ea-date-picker__clear-icon\"\n aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n role=\"dialog\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"close\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-date-picker__popover\"\n [ngClass]=\"popoverClasses()\"\n [attr.aria-labelledby]=\"id() + '-label'\"\n (keydown)=\"handleGridKeydown($event)\">\n <div class=\"ea-date-picker__header\">\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.previousYear\"\n (click)=\"goToPrevYear()\">\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.previousMonth\"\n (click)=\"goToPrevMonth()\">\n <ea-icon-chevron-left\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <span\n class=\"ea-date-picker__month-label\"\n [id]=\"id() + '-label'\"\n aria-live=\"polite\">\n {{ monthYearLabel() }}\n </span>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.nextMonth\"\n (click)=\"goToNextMonth()\">\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"ea-date-picker__nav-btn\"\n [attr.aria-label]=\"i18n.messages().datePicker.nextYear\"\n (click)=\"goToNextYear()\">\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n <ea-icon-chevron-right\n class=\"ea-rtl-flip\"\n aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n class=\"ea-date-picker__grid\"\n role=\"grid\">\n <div\n class=\"ea-date-picker__weekday-row\"\n role=\"row\">\n @for (label of weekdayLabels(); track label) {\n <div\n class=\"ea-date-picker__weekday\"\n role=\"columnheader\">\n {{ label }}\n </div>\n }\n </div>\n @for (week of weeks(); track $index) {\n <div\n class=\"ea-date-picker__week\"\n role=\"row\">\n @for (day of week; track day.date.getTime()) {\n <button\n type=\"button\"\n class=\"ea-date-picker__day\"\n role=\"gridcell\"\n [class.ea-date-picker__day--outside]=\"!day.isCurrentMonth\"\n [class.ea-date-picker__day--today]=\"day.isToday\"\n [class.ea-date-picker__day--selected]=\"day.isSelected\"\n [class.ea-date-picker__day--focused]=\"day.isFocused\"\n [class.ea-date-picker__day--disabled]=\"day.isDisabled\"\n [disabled]=\"day.isDisabled\"\n [attr.aria-selected]=\"day.isSelected\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.tabindex]=\"day.isFocused ? 0 : -1\"\n (click)=\"selectDay(day)\">\n {{ day.day }}\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"ea-date-picker__footer\">\n <button\n type=\"button\"\n class=\"ea-date-picker__today-btn\"\n (click)=\"goToToday()\">\n {{ i18n.messages().datePicker.today }}\n </button>\n </div>\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", styles: [".ea-date-picker-field{display:flex;flex-direction:column;gap:var(--space-1-5)}.ea-date-picker,.ea-date-picker__trigger-wrapper{position:relative}.ea-date-picker__trigger-wrapper--xs{font-size:var(--font-size-xs)}.ea-date-picker__trigger-wrapper--sm{font-size:var(--font-size-sm)}.ea-date-picker__trigger-wrapper--md{font-size:var(--font-size-md)}.ea-date-picker__trigger-wrapper--lg{font-size:var(--font-size-lg)}.ea-date-picker__trigger-wrapper--xl{font-size:var(--font-size-xl)}.ea-date-picker__trigger{display:flex;align-items:center;gap:.5em;width:100%;min-height:2.5em;padding:.5em .75em;padding-inline-end:calc(var(--ea-icon-button-size) + var(--space-2) * 2);font-family:var(--font-family-sans);text-align:start;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-date-picker__trigger:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__trigger:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--xs{font-size:var(--font-size-xs)}.ea-date-picker__trigger--sm{font-size:var(--font-size-sm)}.ea-date-picker__trigger--md{font-size:var(--font-size-md)}.ea-date-picker__trigger--lg{font-size:var(--font-size-lg)}.ea-date-picker__trigger--xl{font-size:var(--font-size-xl)}.ea-date-picker__trigger--open{border-color:var(--color-border-focus);box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--error{border-color:var(--color-error-default)}.ea-date-picker__trigger--error.ea-date-picker__trigger--open{box-shadow:var(--shadow-focus-ring-error)}@media(forced-colors:active){.ea-date-picker__trigger--error.ea-date-picker__trigger--open{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__trigger--disabled{background-color:var(--color-bg-muted);opacity:.6;cursor:not-allowed}.ea-date-picker__trigger-icon{flex-shrink:0;width:1em;height:1em;color:var(--color-text-secondary)}.ea-date-picker__trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-date-picker__trigger-value--placeholder{color:var(--color-text-tertiary)}.ea-date-picker__clear{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-date-picker__clear>*{font-size:1.25em}.ea-date-picker__clear:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-date-picker__clear:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__clear:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__clear:disabled{cursor:not-allowed;opacity:.5}.ea-date-picker__clear{z-index:1;position:absolute;top:50%;inset-inline-end:var(--space-2);transform:translateY(-50%)}.ea-date-picker__clear-icon{width:1em;height:1em}.ea-date-picker__popover{display:flex;flex-direction:column;gap:.5em;min-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-date-picker-popover-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-date-picker__popover{border:1px solid CanvasText}}.ea-date-picker__popover--xs{font-size:var(--font-size-xs)}.ea-date-picker__popover--sm{font-size:var(--font-size-sm)}.ea-date-picker__popover--md{font-size:var(--font-size-md)}.ea-date-picker__popover--lg{font-size:var(--font-size-lg)}.ea-date-picker__popover--xl{font-size:var(--font-size-xl)}.ea-date-picker__header{display:flex;align-items:center;gap:.25em}.ea-date-picker__nav-btn{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-date-picker__nav-btn>*{font-size:1.25em}.ea-date-picker__nav-btn:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-date-picker__nav-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__nav-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__nav-btn:disabled{cursor:not-allowed;opacity:.5}.ea-date-picker__nav-btn ea-icon-chevron-left,.ea-date-picker__nav-btn ea-icon-chevron-right{width:1em;height:1em}.ea-date-picker__nav-btn ea-icon-chevron-left+ea-icon-chevron-left,.ea-date-picker__nav-btn ea-icon-chevron-right+ea-icon-chevron-right{margin-inline-start:-.375em}.ea-date-picker__month-label{flex:1;font-size:.875em;font-weight:var(--font-weight-medium);text-align:center;color:var(--color-text-primary)}.ea-date-picker__grid{display:flex;flex-direction:column;gap:.25em}.ea-date-picker__weekday-row,.ea-date-picker__week{display:grid;grid-template-columns:repeat(7,1fr);gap:.25em}.ea-date-picker__weekday{display:flex;align-items:center;justify-content:center;height:2em;font-size:.75em;font-weight:var(--font-weight-medium);text-transform:uppercase;color:var(--color-text-tertiary)}.ea-date-picker__day{display:flex;align-items:center;justify-content:center;width:2.25em;height:2.25em;padding:0;border:none;border-radius:var(--radius-sm);background:none;font-family:var(--font-family-sans);font-size:.875em;color:var(--color-text-primary);cursor:pointer;transition:var(--transition-colors)}.ea-date-picker__day:hover:not(:disabled){background-color:var(--color-state-hover)}.ea-date-picker__day:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__day:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-date-picker__day--outside{color:var(--color-text-tertiary)}.ea-date-picker__day--today{font-weight:var(--font-weight-semibold);color:var(--color-brand-text)}.ea-date-picker__day--focused:not(.ea-date-picker__day--selected){background-color:var(--color-state-active)}.ea-date-picker__day--selected{background-color:var(--color-brand-default);color:var(--color-text-inverse);font-weight:var(--font-weight-medium)}.ea-date-picker__day--selected:hover{background-color:var(--color-brand-hover)}@media(forced-colors:active){.ea-date-picker__day--selected{background-color:Highlight;border-color:Highlight;color:HighlightText}}.ea-date-picker__day--disabled{color:var(--color-text-disabled);cursor:not-allowed}.ea-date-picker__day--disabled:hover{background-color:transparent}.ea-date-picker__footer{display:flex;justify-content:flex-end;padding-top:.5em;border-top:var(--border-width-thin) solid var(--color-border-default)}.ea-date-picker__today-btn{padding:.25em .5em;border:none;border-radius:var(--radius-sm);background:none;font-family:var(--font-family-sans);font-size:.875em;font-weight:var(--font-weight-medium);color:var(--color-brand-text);cursor:pointer;transition:var(--transition-colors)}.ea-date-picker__today-btn:hover{background-color:var(--color-brand-subtle)}.ea-date-picker__today-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-date-picker__today-btn:focus-visible{outline:2px solid Highlight;outline-offset:2px}}\n"] }]
8309
8717
  }], propDecorators: { triggerEl: [{ type: i0.ViewChild, args: ['triggerEl', { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], errorMsg: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMsg", required: false }] }], errorMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessages", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], weekStartsOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "weekStartsOn", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
8310
8718
 
8311
8719
  /**
@@ -8386,64 +8794,381 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8386
8794
  args: [{ selector: 'ea-dialog', imports: [NgClass, XIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<dialog\n #dialogEl\n class=\"ea-dialog\"\n [id]=\"id()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"!ariaLabel() ? id() + '-header' : null\"\n (click)=\"handleBackdropClick($event)\"\n (cancel)=\"handleCancel($event)\">\n <div\n class=\"ea-dialog__panel\"\n [ngClass]=\"panelClasses()\">\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"ea-dialog__close\"\n [attr.aria-label]=\"i18n.messages().dialog.close\"\n (click)=\"handleClose()\">\n <ea-icon-x />\n </button>\n }\n\n <div\n class=\"ea-dialog__header\"\n [id]=\"id() + '-header'\">\n <ng-content select=\"[slot=header]\" />\n </div>\n\n <div class=\"ea-dialog__body\">\n <ng-content />\n </div>\n\n <div class=\"ea-dialog__footer\">\n <ng-content select=\"[slot=footer]\" />\n </div>\n </div>\n</dialog>\n", styles: [".ea-dialog{border:none;background:transparent;padding:0;margin:auto;max-width:none;max-height:none;overflow:visible}.ea-dialog::backdrop{background-color:var(--color-bg-overlay)}.ea-dialog__panel{position:relative;display:flex;flex-direction:column;background-color:var(--ea-dialog-panel-background-color, var(--color-bg-elevated));border-radius:var(--radius-xl);box-shadow:var(--shadow-2xl);max-height:85vh;overflow:hidden}@media(forced-colors:active){.ea-dialog__panel{border:1px solid CanvasText}}.ea-dialog__panel--xs{width:20rem}.ea-dialog__panel--sm{width:24rem}.ea-dialog__panel--md{width:32rem}.ea-dialog__panel--lg{width:42rem}.ea-dialog__panel--xl{width:52rem}.ea-dialog__panel--full{width:calc(100vw - 2rem);height:calc(100vh - 2rem);max-height:calc(100vh - 2rem)}.ea-dialog__close{z-index:1;position:absolute;top:var(--space-3);inset-inline-end:var(--space-3);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-dialog__close>*{font-size:1.25em}.ea-dialog__close:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-dialog__close:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-dialog__close:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-dialog__close:disabled{cursor:not-allowed;opacity:.5}.ea-dialog__close svg{width:1em;height:1em}.ea-dialog__header{padding:var(--space-5) var(--space-6) var(--space-3);font-size:var(--text-h4-size);font-weight:var(--text-h4-weight);line-height:var(--text-h4-lh);color:var(--color-text-primary)}.ea-dialog__header:empty{display:none}.ea-dialog__body{flex:1;padding:var(--space-3) var(--space-6);overflow-y:auto;font-size:var(--font-size-sm);line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-dialog__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3);padding:var(--space-3) var(--space-6) var(--space-5)}.ea-dialog__footer>*{display:flex;align-items:center;gap:var(--space-3)}.ea-dialog__footer:empty{display:none}\n"] }]
8387
8795
  }], ctorParameters: () => [], propDecorators: { dialogEl: [{ type: i0.ViewChild, args: ['dialogEl', { isSignal: true }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], closeOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdrop", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], showClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClose", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
8388
8796
 
8797
+ // The padding side, per position, applied to the push target so its content
8798
+ // reflows away from the drawer's edge. `start`/`end` are direction-aware.
8799
+ const PUSH_PROPERTY = {
8800
+ right: 'padding-right',
8801
+ left: 'padding-left',
8802
+ start: 'padding-inline-start',
8803
+ end: 'padding-inline-end',
8804
+ top: 'padding-top',
8805
+ bottom: 'padding-bottom',
8806
+ };
8807
+ // Every padding side push can set. All are cleared before applying the current
8808
+ // one so a position change never leaves a stale offset that shifts content off.
8809
+ const PUSH_PROPERTIES = [
8810
+ 'padding-left',
8811
+ 'padding-right',
8812
+ 'padding-top',
8813
+ 'padding-bottom',
8814
+ 'padding-inline-start',
8815
+ 'padding-inline-end',
8816
+ ];
8389
8817
  /**
8390
8818
  * Side panel backed by the native `<dialog>` element for browser-managed
8391
8819
  * focus trapping. Slides in from a configurable edge, supports backdrop and
8392
8820
  * Escape dismissal, and exposes `header`, default, and `footer` content
8393
- * slots. The `open` state is a two-way `model()` binding.
8821
+ * slots. The `open` state is a two-way `model()` binding. In `push` mode it
8822
+ * opens non-modally and reflows the page content aside instead of overlaying it.
8394
8823
  */
8395
8824
  class DrawerComponent {
8396
8825
  drawerEl = viewChild('drawerEl', ...(ngDevMode ? [{ debugName: "drawerEl" }] : /* istanbul ignore next */ []));
8826
+ panelEl = viewChild('panelEl', ...(ngDevMode ? [{ debugName: "panelEl" }] : /* istanbul ignore next */ []));
8397
8827
  previouslyFocused = null;
8828
+ pushedTarget = null;
8829
+ pushedProperty = null;
8830
+ pushCleanupTimer = null;
8831
+ // Which modality the open dialog was shown with, so a `mode` change while it
8832
+ // is open can reopen it in the matching modality. `null` means it is closed.
8833
+ shownAsModal = null;
8834
+ reopening = false;
8835
+ isLeaving = false;
8836
+ pushRaf = null;
8837
+ leaveTimer = null;
8838
+ leaveOnEnd = null;
8839
+ documentPointerListener = null;
8398
8840
  i18n = inject(EagamiI18nService);
8399
8841
  isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
8400
8842
  position = input('right', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
8401
- width = input('md', ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
8843
+ /**
8844
+ * Extent of the panel along its main axis (width for side drawers, height for
8845
+ * top/bottom drawers).
8846
+ */
8847
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
8848
+ /**
8849
+ * `overlay` (default) opens the drawer as a modal over a dimmed page; `push`
8850
+ * opens it non-modally and reflows the page content aside.
8851
+ */
8852
+ mode = input('overlay', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
8853
+ /**
8854
+ * Element whose content is pushed aside in `push` mode, as a CSS selector or
8855
+ * element reference. Defaults to `document.body`.
8856
+ */
8857
+ pushTarget = input(null, ...(ngDevMode ? [{ debugName: "pushTarget" }] : /* istanbul ignore next */ []));
8402
8858
  closeOnBackdrop = input(true, ...(ngDevMode ? [{ debugName: "closeOnBackdrop" }] : /* istanbul ignore next */ []));
8403
8859
  closeOnEscape = input(true, ...(ngDevMode ? [{ debugName: "closeOnEscape" }] : /* istanbul ignore next */ []));
8404
- /** Slide the panel in from its edge when the drawer opens. */
8405
- animated = input(false, ...(ngDevMode ? [{ debugName: "animated" }] : /* istanbul ignore next */ []));
8860
+ /** Slide animation used as the panel opens and closes. */
8861
+ animation = input('eased', ...(ngDevMode ? [{ debugName: "animation" }] : /* istanbul ignore next */ []));
8406
8862
  showClose = input(true, ...(ngDevMode ? [{ debugName: "showClose" }] : /* istanbul ignore next */ []));
8407
8863
  ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
8408
8864
  id = input(uniqueId('ea-drawer'), ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
8409
8865
  open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
8410
- /** Fires once the drawer has been shown via `showModal()`. */
8866
+ /** Fires once the drawer has been shown. */
8411
8867
  opened = output();
8412
8868
  /** Fires when the drawer closes (via close button, backdrop, or Escape). */
8413
8869
  closed = output();
8414
8870
  panelClasses = computed(() => ({
8415
8871
  [`ea-drawer__panel--${this.position()}`]: true,
8416
- [`ea-drawer__panel--${this.width()}`]: true,
8872
+ [`ea-drawer__panel--${this.size()}`]: true,
8417
8873
  }), ...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
8418
8874
  constructor() {
8419
8875
  effect(() => {
8420
8876
  const drawerRef = this.drawerEl()?.nativeElement;
8421
8877
  const open = this.open();
8878
+ const mode = this.mode();
8879
+ // Re-run the push measurement if size, position, or target change while open.
8880
+ this.size();
8881
+ this.position();
8882
+ this.pushTarget();
8422
8883
  // `<dialog>` APIs and focus management are browser-only, but the effect
8423
8884
  // still runs during SSR, so skip the DOM work on the server.
8424
8885
  if (!drawerRef || !this.isBrowser) {
8425
8886
  return;
8426
8887
  }
8888
+ // Push mode stays non-modal so the page behind it remains interactive.
8889
+ const wantModal = mode !== 'push';
8427
8890
  if (open) {
8428
8891
  if (!drawerRef.open) {
8429
8892
  this.previouslyFocused = document.activeElement;
8430
- drawerRef.showModal();
8893
+ this.showDialog(drawerRef, wantModal);
8894
+ this.enter(true);
8431
8895
  this.opened.emit();
8432
8896
  }
8897
+ else if (this.isLeaving) {
8898
+ // Reopened mid-exit: cancel the pending close and slide back in.
8899
+ this.enter(true);
8900
+ }
8901
+ else if (this.shownAsModal !== wantModal) {
8902
+ // A modality change while open can only be honoured by reopening: the
8903
+ // native dialog fixes its modality at show()/showModal() time. The
8904
+ // panel is already on screen, so re-enter without re-sliding it.
8905
+ this.reopening = true;
8906
+ drawerRef.close();
8907
+ this.showDialog(drawerRef, wantModal);
8908
+ this.enter(false);
8909
+ this.reopening = false;
8910
+ }
8911
+ if (mode === 'push') {
8912
+ this.applyPush();
8913
+ this.addPushDismiss();
8914
+ }
8915
+ else {
8916
+ this.clearPush();
8917
+ this.removePushDismiss();
8918
+ }
8433
8919
  }
8434
8920
  else {
8435
8921
  if (drawerRef.open) {
8436
- drawerRef.close();
8437
- this.previouslyFocused?.focus?.();
8438
- this.previouslyFocused = null;
8922
+ this.leave(drawerRef);
8439
8923
  }
8924
+ this.clearPush();
8925
+ this.removePushDismiss();
8440
8926
  }
8441
8927
  });
8928
+ inject(DestroyRef).onDestroy(() => {
8929
+ this.teardownPush();
8930
+ this.removePushDismiss();
8931
+ this.cancelLeave();
8932
+ });
8933
+ }
8934
+ showDialog(drawerRef, modal) {
8935
+ if (modal) {
8936
+ drawerRef.showModal();
8937
+ }
8938
+ else {
8939
+ drawerRef.show();
8940
+ }
8941
+ this.shownAsModal = modal;
8942
+ }
8943
+ // Slides the panel in by toggling the `--entered` state. The panel rests off
8944
+ // its positioned edge until `--entered` is added. Driving this from a class
8945
+ // (rather than @starting-style / allow-discrete) keeps the enter and exit
8946
+ // deterministic across browsers. `animate` is false when the panel is already
8947
+ // on screen (a modality reopen), so it snaps into place.
8948
+ enter(animate) {
8949
+ const dialog = this.drawerEl()?.nativeElement;
8950
+ if (!dialog) {
8951
+ return;
8952
+ }
8953
+ this.cancelLeave();
8954
+ if (!animate || this.animation() === 'none') {
8955
+ dialog.classList.add('ea-drawer--entered');
8956
+ return;
8957
+ }
8958
+ // The dialog has just switched from display:none, so a bare reflow is not
8959
+ // enough to seed the transition. Paint the off-edge state, then add
8960
+ // `--entered` two frames later so the browser animates the slide in.
8961
+ dialog.classList.remove('ea-drawer--entered');
8962
+ requestAnimationFrame(() => {
8963
+ requestAnimationFrame(() => {
8964
+ if (this.open() && dialog.open) {
8965
+ dialog.classList.add('ea-drawer--entered');
8966
+ }
8967
+ });
8968
+ });
8969
+ }
8970
+ // Slides the panel back off its edge, then closes the dialog once the panel's
8971
+ // transform transition ends. Collapses to a synchronous close when nothing
8972
+ // animates (no animation, reduced motion, or no measurable duration).
8973
+ leave(dialog) {
8974
+ if (this.isLeaving) {
8975
+ return;
8976
+ }
8977
+ const panel = this.panelEl()?.nativeElement;
8978
+ dialog.classList.remove('ea-drawer--entered');
8979
+ const duration = panel ? this.transitionMs(panel) : 0;
8980
+ if (this.animation() === 'none' || duration <= 0 || !panel) {
8981
+ this.finishClose(dialog);
8982
+ return;
8983
+ }
8984
+ this.isLeaving = true;
8985
+ const settle = () => {
8986
+ if (!this.isLeaving) {
8987
+ return;
8988
+ }
8989
+ this.cancelLeave();
8990
+ this.finishClose(dialog);
8991
+ };
8992
+ this.leaveOnEnd = (event) => {
8993
+ if (event.target === panel && event.propertyName === 'transform') {
8994
+ settle();
8995
+ }
8996
+ };
8997
+ panel.addEventListener('transitionend', this.leaveOnEnd);
8998
+ this.leaveTimer = setTimeout(settle, duration + 50);
8999
+ }
9000
+ // Cancels a pending exit (its transitionend listener and fallback timer) so a
9001
+ // reopen mid-exit does not later close the drawer.
9002
+ cancelLeave() {
9003
+ this.isLeaving = false;
9004
+ if (this.leaveTimer !== null) {
9005
+ clearTimeout(this.leaveTimer);
9006
+ this.leaveTimer = null;
9007
+ }
9008
+ if (this.leaveOnEnd) {
9009
+ this.panelEl()?.nativeElement.removeEventListener('transitionend', this.leaveOnEnd);
9010
+ this.leaveOnEnd = null;
9011
+ }
9012
+ }
9013
+ finishClose(dialog) {
9014
+ // A reopen during the exit animation supersedes the close.
9015
+ if (this.open()) {
9016
+ return;
9017
+ }
9018
+ if (dialog.open) {
9019
+ dialog.close();
9020
+ }
9021
+ dialog.classList.remove('ea-drawer--entered');
9022
+ this.previouslyFocused?.focus?.();
9023
+ this.previouslyFocused = null;
9024
+ this.shownAsModal = null;
9025
+ }
9026
+ transitionMs(el) {
9027
+ const raw = getComputedStyle(el).transitionDuration.split(',')[0].trim();
9028
+ const value = parseFloat(raw);
9029
+ if (!Number.isFinite(value)) {
9030
+ return 0;
9031
+ }
9032
+ return raw.endsWith('ms') ? value : value * 1000;
8442
9033
  }
8443
9034
  handleClose() {
8444
9035
  this.open.set(false);
8445
9036
  this.closed.emit();
8446
9037
  }
9038
+ // Non-modal push drawers do not emit `cancel`, so Escape is handled here.
9039
+ handleKeydown(event) {
9040
+ if (this.mode() === 'push' && this.closeOnEscape() && event.key === 'Escape') {
9041
+ this.handleClose();
9042
+ }
9043
+ }
9044
+ resolvePushTarget() {
9045
+ const target = this.pushTarget();
9046
+ if (target instanceof HTMLElement) {
9047
+ return target;
9048
+ }
9049
+ if (typeof target === 'string' && target.length > 0) {
9050
+ return document.querySelector(target);
9051
+ }
9052
+ return document.body;
9053
+ }
9054
+ applyPush() {
9055
+ const target = this.resolvePushTarget();
9056
+ if (!target) {
9057
+ return;
9058
+ }
9059
+ if (this.pushRaf !== null) {
9060
+ cancelAnimationFrame(this.pushRaf);
9061
+ }
9062
+ if (this.pushCleanupTimer !== null) {
9063
+ clearTimeout(this.pushCleanupTimer);
9064
+ this.pushCleanupTimer = null;
9065
+ }
9066
+ // Measure on the next frame, once the view reflects the current position and
9067
+ // size. Measuring synchronously reads the panel's previous dimensions, so a
9068
+ // `height:100%` side panel switched to `top` would push content down by the
9069
+ // full viewport height and shove it off screen.
9070
+ this.pushRaf = requestAnimationFrame(() => {
9071
+ this.pushRaf = null;
9072
+ const panel = this.panelEl()?.nativeElement;
9073
+ if (!panel || !this.open() || this.mode() !== 'push') {
9074
+ return;
9075
+ }
9076
+ const position = this.position();
9077
+ const size = position === 'top' || position === 'bottom'
9078
+ ? panel.offsetHeight
9079
+ : panel.offsetWidth;
9080
+ // Match the content reflow to the panel's slide. The tokens resolve from
9081
+ // :root, so the duration still honours reduced motion (collapses to 0ms).
9082
+ const animation = this.animation();
9083
+ if (animation === 'none') {
9084
+ target.style.removeProperty('transition');
9085
+ }
9086
+ else {
9087
+ const ease = animation === 'linear' ? 'var(--ease-linear)' : 'var(--ease-out)';
9088
+ target.style.transition = `padding var(--duration-slower) ${ease}`;
9089
+ }
9090
+ // Clear every side first so a position change never stacks two offsets.
9091
+ this.clearPushProperties(target);
9092
+ target.style.setProperty(PUSH_PROPERTY[position], `${size}px`);
9093
+ this.pushedTarget = target;
9094
+ this.pushedProperty = PUSH_PROPERTY[position];
9095
+ });
9096
+ }
9097
+ clearPush() {
9098
+ if (this.pushRaf !== null) {
9099
+ cancelAnimationFrame(this.pushRaf);
9100
+ this.pushRaf = null;
9101
+ }
9102
+ const target = this.pushedTarget;
9103
+ this.pushedTarget = null;
9104
+ this.pushedProperty = null;
9105
+ if (!target) {
9106
+ return;
9107
+ }
9108
+ // Reflow the content back, then strip the leftover transition once it
9109
+ // settles. A timer (rather than `transitionend`) keeps cleanup deterministic
9110
+ // when no transition fires, e.g. under reduced motion.
9111
+ this.clearPushProperties(target);
9112
+ if (this.pushCleanupTimer !== null) {
9113
+ clearTimeout(this.pushCleanupTimer);
9114
+ }
9115
+ this.pushCleanupTimer = setTimeout(() => {
9116
+ target.style.removeProperty('transition');
9117
+ this.pushCleanupTimer = null;
9118
+ }, this.transitionMs(target));
9119
+ }
9120
+ clearPushProperties(target) {
9121
+ for (const property of PUSH_PROPERTIES) {
9122
+ target.style.removeProperty(property);
9123
+ }
9124
+ }
9125
+ // Push mode has no modal backdrop, so an outside-click dismissal is wired to
9126
+ // the document. Deferred a tick so the click that opened the drawer does not
9127
+ // immediately close it.
9128
+ addPushDismiss() {
9129
+ if (this.documentPointerListener || !this.isBrowser) {
9130
+ return;
9131
+ }
9132
+ const listener = (event) => {
9133
+ if (!this.closeOnBackdrop()) {
9134
+ return;
9135
+ }
9136
+ const panel = this.panelEl()?.nativeElement;
9137
+ if (panel && !panel.contains(event.target)) {
9138
+ this.handleClose();
9139
+ }
9140
+ };
9141
+ this.documentPointerListener = listener;
9142
+ setTimeout(() => {
9143
+ if (this.documentPointerListener === listener) {
9144
+ document.addEventListener('pointerdown', listener);
9145
+ }
9146
+ });
9147
+ }
9148
+ removePushDismiss() {
9149
+ if (this.documentPointerListener) {
9150
+ document.removeEventListener('pointerdown', this.documentPointerListener);
9151
+ this.documentPointerListener = null;
9152
+ }
9153
+ }
9154
+ // Removes the push styles immediately, for teardown where no animation is wanted.
9155
+ teardownPush() {
9156
+ if (this.pushRaf !== null) {
9157
+ cancelAnimationFrame(this.pushRaf);
9158
+ this.pushRaf = null;
9159
+ }
9160
+ if (this.pushCleanupTimer !== null) {
9161
+ clearTimeout(this.pushCleanupTimer);
9162
+ this.pushCleanupTimer = null;
9163
+ }
9164
+ const target = this.pushedTarget;
9165
+ this.pushedTarget = null;
9166
+ this.pushedProperty = null;
9167
+ if (target) {
9168
+ this.clearPushProperties(target);
9169
+ target.style.removeProperty('transition');
9170
+ }
9171
+ }
8447
9172
  handleBackdropClick(event) {
8448
9173
  if (!this.closeOnBackdrop()) {
8449
9174
  return;
@@ -8454,35 +9179,38 @@ class DrawerComponent {
8454
9179
  }
8455
9180
  }
8456
9181
  handleCancel(event) {
8457
- if (!this.closeOnEscape()) {
8458
- event.preventDefault();
8459
- return;
9182
+ // Always cancel the native instant-close so the exit can animate; then drive
9183
+ // the close ourselves, or keep the drawer open when Escape is disabled.
9184
+ event.preventDefault();
9185
+ if (this.closeOnEscape()) {
9186
+ this.handleClose();
8460
9187
  }
8461
- this.handleClose();
8462
9188
  }
8463
9189
  // The native <dialog> can close on its own (e.g. Escape), so reconcile the open
8464
9190
  // model here. When closeOnEscape is off, Chrome's repeated-Escape abuse
8465
9191
  // mitigation can force the close past cancel's preventDefault, so re-show to
8466
9192
  // keep the drawer open; otherwise mirror the close back into the model.
8467
9193
  onDialogClose() {
8468
- if (!this.open()) {
9194
+ const drawerRef = this.drawerEl()?.nativeElement;
9195
+ // Ignore the stale close event fired while reopening to switch modality.
9196
+ if (this.reopening || !this.open() || drawerRef?.open) {
8469
9197
  return;
8470
9198
  }
8471
9199
  if (this.closeOnEscape()) {
8472
9200
  this.open.set(false);
8473
9201
  this.closed.emit();
8474
9202
  }
8475
- else {
8476
- this.drawerEl()?.nativeElement.showModal();
9203
+ else if (drawerRef) {
9204
+ this.showDialog(drawerRef, this.mode() !== 'push');
8477
9205
  }
8478
9206
  }
8479
9207
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: DrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8480
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: DrawerComponent, isStandalone: true, selector: "ea-drawer", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null }, showClose: { classPropertyName: "showClose", publicName: "showClose", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", opened: "opened", closed: "closed" }, viewQueries: [{ propertyName: "drawerEl", first: true, predicate: ["drawerEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<dialog\n #drawerEl\n class=\"ea-drawer\"\n [class.ea-drawer--animated]=\"animated()\"\n [id]=\"id()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"!ariaLabel() ? id() + '-header' : null\"\n (click)=\"handleBackdropClick($event)\"\n (cancel)=\"handleCancel($event)\"\n (close)=\"onDialogClose()\">\n <div\n class=\"ea-drawer__panel\"\n [ngClass]=\"panelClasses()\">\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"ea-drawer__close\"\n [attr.aria-label]=\"i18n.messages().drawer.close\"\n (click)=\"handleClose()\">\n <ea-icon-x />\n </button>\n }\n\n <div\n class=\"ea-drawer__header\"\n [id]=\"id() + '-header'\">\n <ng-content select=\"[slot=header]\" />\n </div>\n\n <div class=\"ea-drawer__body\">\n <ng-content />\n </div>\n\n <div class=\"ea-drawer__footer\">\n <ng-content select=\"[slot=footer]\" />\n </div>\n </div>\n</dialog>\n", styles: [".ea-drawer{position:fixed;top:0;inset-inline-end:0;bottom:0;inset-inline-start:0;width:100vw;max-width:none;height:100vh;max-height:none;padding:0;margin:0;border:none;background:transparent;overflow:hidden}.ea-drawer::backdrop{background-color:var(--color-bg-overlay)}.ea-drawer--animated[open]::backdrop{animation:ea-drawer-backdrop-in var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--right{animation:ea-drawer-slide-right var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--left{animation:ea-drawer-slide-left var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--start{animation:ea-drawer-slide-start var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--end{animation:ea-drawer-slide-end var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--top{animation:ea-drawer-slide-top var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--bottom{animation:ea-drawer-slide-bottom var(--duration-slow) var(--ease-out)}.ea-drawer__panel{position:absolute;display:flex;flex-direction:column;background-color:var(--ea-drawer-panel-background-color, var(--color-bg-elevated));box-shadow:var(--shadow-2xl);overflow:hidden}@media(forced-colors:active){.ea-drawer__panel{border:1px solid CanvasText}}.ea-drawer__panel--right{top:0;right:0;bottom:0;height:100%}.ea-drawer__panel--left{top:0;left:0;bottom:0;height:100%}.ea-drawer__panel--start{top:0;inset-inline-start:0;bottom:0;height:100%}.ea-drawer__panel--end{top:0;inset-inline-end:0;bottom:0;height:100%}.ea-drawer__panel--right.ea-drawer__panel--xs,.ea-drawer__panel--left.ea-drawer__panel--xs,.ea-drawer__panel--start.ea-drawer__panel--xs,.ea-drawer__panel--end.ea-drawer__panel--xs{width:16rem}.ea-drawer__panel--right.ea-drawer__panel--sm,.ea-drawer__panel--left.ea-drawer__panel--sm,.ea-drawer__panel--start.ea-drawer__panel--sm,.ea-drawer__panel--end.ea-drawer__panel--sm{width:20rem}.ea-drawer__panel--right.ea-drawer__panel--md,.ea-drawer__panel--left.ea-drawer__panel--md,.ea-drawer__panel--start.ea-drawer__panel--md,.ea-drawer__panel--end.ea-drawer__panel--md{width:28rem}.ea-drawer__panel--right.ea-drawer__panel--lg,.ea-drawer__panel--left.ea-drawer__panel--lg,.ea-drawer__panel--start.ea-drawer__panel--lg,.ea-drawer__panel--end.ea-drawer__panel--lg{width:36rem}.ea-drawer__panel--right.ea-drawer__panel--xl,.ea-drawer__panel--left.ea-drawer__panel--xl,.ea-drawer__panel--start.ea-drawer__panel--xl,.ea-drawer__panel--end.ea-drawer__panel--xl{width:44rem}.ea-drawer__panel--right.ea-drawer__panel--full,.ea-drawer__panel--left.ea-drawer__panel--full,.ea-drawer__panel--start.ea-drawer__panel--full,.ea-drawer__panel--end.ea-drawer__panel--full{width:calc(100vw - 3rem)}.ea-drawer__panel--top{top:0;inset-inline-start:0;inset-inline-end:0;width:100%}.ea-drawer__panel--top.ea-drawer__panel--xs{height:8rem}.ea-drawer__panel--top.ea-drawer__panel--sm{height:12rem}.ea-drawer__panel--top.ea-drawer__panel--md{height:20rem}.ea-drawer__panel--top.ea-drawer__panel--lg{height:28rem}.ea-drawer__panel--top.ea-drawer__panel--xl{height:36rem}.ea-drawer__panel--top.ea-drawer__panel--full{height:calc(100vh - 3rem)}.ea-drawer__panel--bottom{bottom:0;inset-inline-start:0;inset-inline-end:0;width:100%}.ea-drawer__panel--bottom.ea-drawer__panel--xs{height:8rem}.ea-drawer__panel--bottom.ea-drawer__panel--sm{height:12rem}.ea-drawer__panel--bottom.ea-drawer__panel--md{height:20rem}.ea-drawer__panel--bottom.ea-drawer__panel--lg{height:28rem}.ea-drawer__panel--bottom.ea-drawer__panel--xl{height:36rem}.ea-drawer__panel--bottom.ea-drawer__panel--full{height:calc(100vh - 3rem)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__header,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__header{padding-top:var(--space-3)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__body,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__body{padding-block:var(--space-2)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__footer,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__footer{padding-bottom:var(--space-3)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__header,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__header{padding-top:var(--space-2);padding-bottom:var(--space-1)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__body,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__body{padding-block:var(--space-1)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__footer,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__footer{padding-top:var(--space-1);padding-bottom:var(--space-2)}.ea-drawer__close{z-index:1;position:absolute;top:var(--space-3);inset-inline-end:var(--space-3);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-drawer__close>*{font-size:1.25em}.ea-drawer__close:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-drawer__close:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-drawer__close:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-drawer__close:disabled{cursor:not-allowed;opacity:.5}.ea-drawer__close svg{width:1em;height:1em}.ea-drawer__header{padding:var(--space-5) var(--space-6) var(--space-3);font-size:var(--text-h4-size);font-weight:var(--text-h4-weight);line-height:var(--text-h4-lh);color:var(--color-text-primary)}.ea-drawer__header:empty{display:none}.ea-drawer__body{flex:1;padding:var(--space-3) var(--space-6);overflow-y:auto;font-size:var(--font-size-sm);line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-drawer__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3);padding:var(--space-3) var(--space-6) var(--space-5)}.ea-drawer__footer>*{display:flex;align-items:center;gap:var(--space-3)}.ea-drawer__footer:empty{display:none}@keyframes ea-drawer-slide-right{0%{transform:translate(100%)}}@keyframes ea-drawer-slide-left{0%{transform:translate(-100%)}}@keyframes ea-drawer-slide-start{0%{transform:translate(calc(-100% * var(--ea-rtl-sign)))}}@keyframes ea-drawer-slide-end{0%{transform:translate(calc(100% * var(--ea-rtl-sign)))}}@keyframes ea-drawer-slide-top{0%{transform:translateY(-100%)}}@keyframes ea-drawer-slide-bottom{0%{transform:translateY(100%)}}@keyframes ea-drawer-backdrop-in{0%{opacity:0}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: XIconComponent, selector: "ea-icon-x" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
9208
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: DrawerComponent, isStandalone: true, selector: "ea-drawer", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, pushTarget: { classPropertyName: "pushTarget", publicName: "pushTarget", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, animation: { classPropertyName: "animation", publicName: "animation", isSignal: true, isRequired: false, transformFunction: null }, showClose: { classPropertyName: "showClose", publicName: "showClose", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", opened: "opened", closed: "closed" }, viewQueries: [{ propertyName: "drawerEl", first: true, predicate: ["drawerEl"], descendants: true, isSignal: true }, { propertyName: "panelEl", first: true, predicate: ["panelEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<dialog\n #drawerEl\n class=\"ea-drawer\"\n [class.ea-drawer--animated]=\"animation() !== 'none'\"\n [class.ea-drawer--linear]=\"animation() === 'linear'\"\n [class.ea-drawer--push]=\"mode() === 'push'\"\n [id]=\"id()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"!ariaLabel() ? id() + '-header' : null\"\n (click)=\"handleBackdropClick($event)\"\n (cancel)=\"handleCancel($event)\"\n (keydown)=\"handleKeydown($event)\"\n (close)=\"onDialogClose()\">\n <div\n #panelEl\n class=\"ea-drawer__panel\"\n [ngClass]=\"panelClasses()\">\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"ea-drawer__close\"\n [attr.aria-label]=\"i18n.messages().drawer.close\"\n (click)=\"handleClose()\">\n <ea-icon-x />\n </button>\n }\n\n <div\n class=\"ea-drawer__header\"\n [id]=\"id() + '-header'\">\n <ng-content select=\"[slot=header]\" />\n </div>\n\n <div class=\"ea-drawer__body\">\n <ng-content />\n </div>\n\n <div class=\"ea-drawer__footer\">\n <ng-content select=\"[slot=footer]\" />\n </div>\n </div>\n</dialog>\n", styles: [".ea-drawer{position:fixed;top:0;inset-inline-end:0;bottom:0;inset-inline-start:0;width:100vw;max-width:none;height:100vh;max-height:none;padding:0;margin:0;border:none;background:transparent;overflow:hidden}.ea-drawer::backdrop{background-color:var(--color-bg-overlay)}.ea-drawer--push{z-index:var(--z-index-modal);pointer-events:none}.ea-drawer--push::backdrop{display:none}.ea-drawer--push .ea-drawer__panel{pointer-events:auto}.ea-drawer--push .ea-drawer__panel--left,.ea-drawer--push .ea-drawer__panel--right,.ea-drawer--push .ea-drawer__panel--start,.ea-drawer--push .ea-drawer__panel--end{max-inline-size:calc(100vw - var(--ea-drawer-push-min, 8rem))}.ea-drawer--push .ea-drawer__panel--top,.ea-drawer--push .ea-drawer__panel--bottom{max-block-size:calc(100vh - var(--ea-drawer-push-min, 8rem))}.ea-drawer--linear{--ea-drawer-ease: var(--ease-linear)}.ea-drawer--animated::backdrop{opacity:0;transition:opacity var(--duration-slower) var(--ea-drawer-ease, var(--ease-out))}.ea-drawer--animated .ea-drawer__panel{transition:transform var(--duration-slower) var(--ea-drawer-ease, var(--ease-out))}.ea-drawer .ea-drawer__panel--right{transform:translate(100%)}.ea-drawer .ea-drawer__panel--left{transform:translate(-100%)}.ea-drawer .ea-drawer__panel--start{transform:translate(calc(-100% * var(--ea-rtl-sign)))}.ea-drawer .ea-drawer__panel--end{transform:translate(calc(100% * var(--ea-rtl-sign)))}.ea-drawer .ea-drawer__panel--top{transform:translateY(-100%)}.ea-drawer .ea-drawer__panel--bottom{transform:translateY(100%)}.ea-drawer--entered::backdrop{opacity:1}.ea-drawer--entered .ea-drawer__panel{transform:none}.ea-drawer__panel{position:absolute;display:flex;flex-direction:column;background-color:var(--ea-drawer-panel-background-color, var(--color-bg-elevated));box-shadow:var(--shadow-2xl);overflow:hidden}@media(forced-colors:active){.ea-drawer__panel{border:1px solid CanvasText}}.ea-drawer__panel--right{top:0;right:0;bottom:0;height:100%}.ea-drawer__panel--left{top:0;left:0;bottom:0;height:100%}.ea-drawer__panel--start{top:0;inset-inline-start:0;bottom:0;height:100%}.ea-drawer__panel--end{top:0;inset-inline-end:0;bottom:0;height:100%}.ea-drawer__panel--right.ea-drawer__panel--xs,.ea-drawer__panel--left.ea-drawer__panel--xs,.ea-drawer__panel--start.ea-drawer__panel--xs,.ea-drawer__panel--end.ea-drawer__panel--xs{width:16rem}.ea-drawer__panel--right.ea-drawer__panel--sm,.ea-drawer__panel--left.ea-drawer__panel--sm,.ea-drawer__panel--start.ea-drawer__panel--sm,.ea-drawer__panel--end.ea-drawer__panel--sm{width:20rem}.ea-drawer__panel--right.ea-drawer__panel--md,.ea-drawer__panel--left.ea-drawer__panel--md,.ea-drawer__panel--start.ea-drawer__panel--md,.ea-drawer__panel--end.ea-drawer__panel--md{width:28rem}.ea-drawer__panel--right.ea-drawer__panel--lg,.ea-drawer__panel--left.ea-drawer__panel--lg,.ea-drawer__panel--start.ea-drawer__panel--lg,.ea-drawer__panel--end.ea-drawer__panel--lg{width:36rem}.ea-drawer__panel--right.ea-drawer__panel--xl,.ea-drawer__panel--left.ea-drawer__panel--xl,.ea-drawer__panel--start.ea-drawer__panel--xl,.ea-drawer__panel--end.ea-drawer__panel--xl{width:44rem}.ea-drawer__panel--right.ea-drawer__panel--full,.ea-drawer__panel--left.ea-drawer__panel--full,.ea-drawer__panel--start.ea-drawer__panel--full,.ea-drawer__panel--end.ea-drawer__panel--full{width:calc(100vw - 3rem)}.ea-drawer__panel--top{top:0;inset-inline-start:0;inset-inline-end:0;width:100%}.ea-drawer__panel--top.ea-drawer__panel--xs{height:8rem}.ea-drawer__panel--top.ea-drawer__panel--sm{height:12rem}.ea-drawer__panel--top.ea-drawer__panel--md{height:20rem}.ea-drawer__panel--top.ea-drawer__panel--lg{height:28rem}.ea-drawer__panel--top.ea-drawer__panel--xl{height:36rem}.ea-drawer__panel--top.ea-drawer__panel--full{height:calc(100vh - 3rem)}.ea-drawer__panel--bottom{bottom:0;inset-inline-start:0;inset-inline-end:0;width:100%}.ea-drawer__panel--bottom.ea-drawer__panel--xs{height:8rem}.ea-drawer__panel--bottom.ea-drawer__panel--sm{height:12rem}.ea-drawer__panel--bottom.ea-drawer__panel--md{height:20rem}.ea-drawer__panel--bottom.ea-drawer__panel--lg{height:28rem}.ea-drawer__panel--bottom.ea-drawer__panel--xl{height:36rem}.ea-drawer__panel--bottom.ea-drawer__panel--full{height:calc(100vh - 3rem)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__header,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__header{padding-top:var(--space-3)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__body,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__body{padding-block:var(--space-2)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__footer,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__footer{padding-bottom:var(--space-3)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__header,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__header{padding-top:var(--space-2);padding-bottom:var(--space-1)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__body,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__body{padding-block:var(--space-1)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__footer,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__footer{padding-top:var(--space-1);padding-bottom:var(--space-2)}.ea-drawer__close{z-index:1;position:absolute;top:var(--space-3);inset-inline-end:var(--space-3);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-drawer__close>*{font-size:1.25em}.ea-drawer__close:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-drawer__close:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-drawer__close:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-drawer__close:disabled{cursor:not-allowed;opacity:.5}.ea-drawer__close svg{width:1em;height:1em}.ea-drawer__header{padding:var(--space-5) var(--space-6) var(--space-3);font-size:var(--text-h4-size);font-weight:var(--text-h4-weight);line-height:var(--text-h4-lh);color:var(--color-text-primary)}.ea-drawer__header:empty{display:none}.ea-drawer__body{flex:1;padding:var(--space-3) var(--space-6);overflow-y:auto;font-size:var(--font-size-sm);line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-drawer__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3);padding:var(--space-3) var(--space-6) var(--space-5)}.ea-drawer__footer>*{display:flex;align-items:center;gap:var(--space-3)}.ea-drawer__footer:empty{display:none}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: XIconComponent, selector: "ea-icon-x" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
8481
9209
  }
8482
9210
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: DrawerComponent, decorators: [{
8483
9211
  type: Component,
8484
- args: [{ selector: 'ea-drawer', imports: [NgClass, XIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<dialog\n #drawerEl\n class=\"ea-drawer\"\n [class.ea-drawer--animated]=\"animated()\"\n [id]=\"id()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"!ariaLabel() ? id() + '-header' : null\"\n (click)=\"handleBackdropClick($event)\"\n (cancel)=\"handleCancel($event)\"\n (close)=\"onDialogClose()\">\n <div\n class=\"ea-drawer__panel\"\n [ngClass]=\"panelClasses()\">\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"ea-drawer__close\"\n [attr.aria-label]=\"i18n.messages().drawer.close\"\n (click)=\"handleClose()\">\n <ea-icon-x />\n </button>\n }\n\n <div\n class=\"ea-drawer__header\"\n [id]=\"id() + '-header'\">\n <ng-content select=\"[slot=header]\" />\n </div>\n\n <div class=\"ea-drawer__body\">\n <ng-content />\n </div>\n\n <div class=\"ea-drawer__footer\">\n <ng-content select=\"[slot=footer]\" />\n </div>\n </div>\n</dialog>\n", styles: [".ea-drawer{position:fixed;top:0;inset-inline-end:0;bottom:0;inset-inline-start:0;width:100vw;max-width:none;height:100vh;max-height:none;padding:0;margin:0;border:none;background:transparent;overflow:hidden}.ea-drawer::backdrop{background-color:var(--color-bg-overlay)}.ea-drawer--animated[open]::backdrop{animation:ea-drawer-backdrop-in var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--right{animation:ea-drawer-slide-right var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--left{animation:ea-drawer-slide-left var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--start{animation:ea-drawer-slide-start var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--end{animation:ea-drawer-slide-end var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--top{animation:ea-drawer-slide-top var(--duration-slow) var(--ease-out)}.ea-drawer--animated[open] .ea-drawer__panel--bottom{animation:ea-drawer-slide-bottom var(--duration-slow) var(--ease-out)}.ea-drawer__panel{position:absolute;display:flex;flex-direction:column;background-color:var(--ea-drawer-panel-background-color, var(--color-bg-elevated));box-shadow:var(--shadow-2xl);overflow:hidden}@media(forced-colors:active){.ea-drawer__panel{border:1px solid CanvasText}}.ea-drawer__panel--right{top:0;right:0;bottom:0;height:100%}.ea-drawer__panel--left{top:0;left:0;bottom:0;height:100%}.ea-drawer__panel--start{top:0;inset-inline-start:0;bottom:0;height:100%}.ea-drawer__panel--end{top:0;inset-inline-end:0;bottom:0;height:100%}.ea-drawer__panel--right.ea-drawer__panel--xs,.ea-drawer__panel--left.ea-drawer__panel--xs,.ea-drawer__panel--start.ea-drawer__panel--xs,.ea-drawer__panel--end.ea-drawer__panel--xs{width:16rem}.ea-drawer__panel--right.ea-drawer__panel--sm,.ea-drawer__panel--left.ea-drawer__panel--sm,.ea-drawer__panel--start.ea-drawer__panel--sm,.ea-drawer__panel--end.ea-drawer__panel--sm{width:20rem}.ea-drawer__panel--right.ea-drawer__panel--md,.ea-drawer__panel--left.ea-drawer__panel--md,.ea-drawer__panel--start.ea-drawer__panel--md,.ea-drawer__panel--end.ea-drawer__panel--md{width:28rem}.ea-drawer__panel--right.ea-drawer__panel--lg,.ea-drawer__panel--left.ea-drawer__panel--lg,.ea-drawer__panel--start.ea-drawer__panel--lg,.ea-drawer__panel--end.ea-drawer__panel--lg{width:36rem}.ea-drawer__panel--right.ea-drawer__panel--xl,.ea-drawer__panel--left.ea-drawer__panel--xl,.ea-drawer__panel--start.ea-drawer__panel--xl,.ea-drawer__panel--end.ea-drawer__panel--xl{width:44rem}.ea-drawer__panel--right.ea-drawer__panel--full,.ea-drawer__panel--left.ea-drawer__panel--full,.ea-drawer__panel--start.ea-drawer__panel--full,.ea-drawer__panel--end.ea-drawer__panel--full{width:calc(100vw - 3rem)}.ea-drawer__panel--top{top:0;inset-inline-start:0;inset-inline-end:0;width:100%}.ea-drawer__panel--top.ea-drawer__panel--xs{height:8rem}.ea-drawer__panel--top.ea-drawer__panel--sm{height:12rem}.ea-drawer__panel--top.ea-drawer__panel--md{height:20rem}.ea-drawer__panel--top.ea-drawer__panel--lg{height:28rem}.ea-drawer__panel--top.ea-drawer__panel--xl{height:36rem}.ea-drawer__panel--top.ea-drawer__panel--full{height:calc(100vh - 3rem)}.ea-drawer__panel--bottom{bottom:0;inset-inline-start:0;inset-inline-end:0;width:100%}.ea-drawer__panel--bottom.ea-drawer__panel--xs{height:8rem}.ea-drawer__panel--bottom.ea-drawer__panel--sm{height:12rem}.ea-drawer__panel--bottom.ea-drawer__panel--md{height:20rem}.ea-drawer__panel--bottom.ea-drawer__panel--lg{height:28rem}.ea-drawer__panel--bottom.ea-drawer__panel--xl{height:36rem}.ea-drawer__panel--bottom.ea-drawer__panel--full{height:calc(100vh - 3rem)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__header,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__header{padding-top:var(--space-3)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__body,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__body{padding-block:var(--space-2)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__footer,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__footer{padding-bottom:var(--space-3)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__header,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__header{padding-top:var(--space-2);padding-bottom:var(--space-1)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__body,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__body{padding-block:var(--space-1)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__footer,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__footer{padding-top:var(--space-1);padding-bottom:var(--space-2)}.ea-drawer__close{z-index:1;position:absolute;top:var(--space-3);inset-inline-end:var(--space-3);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-drawer__close>*{font-size:1.25em}.ea-drawer__close:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-drawer__close:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-drawer__close:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-drawer__close:disabled{cursor:not-allowed;opacity:.5}.ea-drawer__close svg{width:1em;height:1em}.ea-drawer__header{padding:var(--space-5) var(--space-6) var(--space-3);font-size:var(--text-h4-size);font-weight:var(--text-h4-weight);line-height:var(--text-h4-lh);color:var(--color-text-primary)}.ea-drawer__header:empty{display:none}.ea-drawer__body{flex:1;padding:var(--space-3) var(--space-6);overflow-y:auto;font-size:var(--font-size-sm);line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-drawer__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3);padding:var(--space-3) var(--space-6) var(--space-5)}.ea-drawer__footer>*{display:flex;align-items:center;gap:var(--space-3)}.ea-drawer__footer:empty{display:none}@keyframes ea-drawer-slide-right{0%{transform:translate(100%)}}@keyframes ea-drawer-slide-left{0%{transform:translate(-100%)}}@keyframes ea-drawer-slide-start{0%{transform:translate(calc(-100% * var(--ea-rtl-sign)))}}@keyframes ea-drawer-slide-end{0%{transform:translate(calc(100% * var(--ea-rtl-sign)))}}@keyframes ea-drawer-slide-top{0%{transform:translateY(-100%)}}@keyframes ea-drawer-slide-bottom{0%{transform:translateY(100%)}}@keyframes ea-drawer-backdrop-in{0%{opacity:0}}\n"] }]
8485
- }], ctorParameters: () => [], propDecorators: { drawerEl: [{ type: i0.ViewChild, args: ['drawerEl', { isSignal: true }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], closeOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdrop", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], animated: [{ type: i0.Input, args: [{ isSignal: true, alias: "animated", required: false }] }], showClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClose", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
9212
+ args: [{ selector: 'ea-drawer', imports: [NgClass, XIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<dialog\n #drawerEl\n class=\"ea-drawer\"\n [class.ea-drawer--animated]=\"animation() !== 'none'\"\n [class.ea-drawer--linear]=\"animation() === 'linear'\"\n [class.ea-drawer--push]=\"mode() === 'push'\"\n [id]=\"id()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"!ariaLabel() ? id() + '-header' : null\"\n (click)=\"handleBackdropClick($event)\"\n (cancel)=\"handleCancel($event)\"\n (keydown)=\"handleKeydown($event)\"\n (close)=\"onDialogClose()\">\n <div\n #panelEl\n class=\"ea-drawer__panel\"\n [ngClass]=\"panelClasses()\">\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"ea-drawer__close\"\n [attr.aria-label]=\"i18n.messages().drawer.close\"\n (click)=\"handleClose()\">\n <ea-icon-x />\n </button>\n }\n\n <div\n class=\"ea-drawer__header\"\n [id]=\"id() + '-header'\">\n <ng-content select=\"[slot=header]\" />\n </div>\n\n <div class=\"ea-drawer__body\">\n <ng-content />\n </div>\n\n <div class=\"ea-drawer__footer\">\n <ng-content select=\"[slot=footer]\" />\n </div>\n </div>\n</dialog>\n", styles: [".ea-drawer{position:fixed;top:0;inset-inline-end:0;bottom:0;inset-inline-start:0;width:100vw;max-width:none;height:100vh;max-height:none;padding:0;margin:0;border:none;background:transparent;overflow:hidden}.ea-drawer::backdrop{background-color:var(--color-bg-overlay)}.ea-drawer--push{z-index:var(--z-index-modal);pointer-events:none}.ea-drawer--push::backdrop{display:none}.ea-drawer--push .ea-drawer__panel{pointer-events:auto}.ea-drawer--push .ea-drawer__panel--left,.ea-drawer--push .ea-drawer__panel--right,.ea-drawer--push .ea-drawer__panel--start,.ea-drawer--push .ea-drawer__panel--end{max-inline-size:calc(100vw - var(--ea-drawer-push-min, 8rem))}.ea-drawer--push .ea-drawer__panel--top,.ea-drawer--push .ea-drawer__panel--bottom{max-block-size:calc(100vh - var(--ea-drawer-push-min, 8rem))}.ea-drawer--linear{--ea-drawer-ease: var(--ease-linear)}.ea-drawer--animated::backdrop{opacity:0;transition:opacity var(--duration-slower) var(--ea-drawer-ease, var(--ease-out))}.ea-drawer--animated .ea-drawer__panel{transition:transform var(--duration-slower) var(--ea-drawer-ease, var(--ease-out))}.ea-drawer .ea-drawer__panel--right{transform:translate(100%)}.ea-drawer .ea-drawer__panel--left{transform:translate(-100%)}.ea-drawer .ea-drawer__panel--start{transform:translate(calc(-100% * var(--ea-rtl-sign)))}.ea-drawer .ea-drawer__panel--end{transform:translate(calc(100% * var(--ea-rtl-sign)))}.ea-drawer .ea-drawer__panel--top{transform:translateY(-100%)}.ea-drawer .ea-drawer__panel--bottom{transform:translateY(100%)}.ea-drawer--entered::backdrop{opacity:1}.ea-drawer--entered .ea-drawer__panel{transform:none}.ea-drawer__panel{position:absolute;display:flex;flex-direction:column;background-color:var(--ea-drawer-panel-background-color, var(--color-bg-elevated));box-shadow:var(--shadow-2xl);overflow:hidden}@media(forced-colors:active){.ea-drawer__panel{border:1px solid CanvasText}}.ea-drawer__panel--right{top:0;right:0;bottom:0;height:100%}.ea-drawer__panel--left{top:0;left:0;bottom:0;height:100%}.ea-drawer__panel--start{top:0;inset-inline-start:0;bottom:0;height:100%}.ea-drawer__panel--end{top:0;inset-inline-end:0;bottom:0;height:100%}.ea-drawer__panel--right.ea-drawer__panel--xs,.ea-drawer__panel--left.ea-drawer__panel--xs,.ea-drawer__panel--start.ea-drawer__panel--xs,.ea-drawer__panel--end.ea-drawer__panel--xs{width:16rem}.ea-drawer__panel--right.ea-drawer__panel--sm,.ea-drawer__panel--left.ea-drawer__panel--sm,.ea-drawer__panel--start.ea-drawer__panel--sm,.ea-drawer__panel--end.ea-drawer__panel--sm{width:20rem}.ea-drawer__panel--right.ea-drawer__panel--md,.ea-drawer__panel--left.ea-drawer__panel--md,.ea-drawer__panel--start.ea-drawer__panel--md,.ea-drawer__panel--end.ea-drawer__panel--md{width:28rem}.ea-drawer__panel--right.ea-drawer__panel--lg,.ea-drawer__panel--left.ea-drawer__panel--lg,.ea-drawer__panel--start.ea-drawer__panel--lg,.ea-drawer__panel--end.ea-drawer__panel--lg{width:36rem}.ea-drawer__panel--right.ea-drawer__panel--xl,.ea-drawer__panel--left.ea-drawer__panel--xl,.ea-drawer__panel--start.ea-drawer__panel--xl,.ea-drawer__panel--end.ea-drawer__panel--xl{width:44rem}.ea-drawer__panel--right.ea-drawer__panel--full,.ea-drawer__panel--left.ea-drawer__panel--full,.ea-drawer__panel--start.ea-drawer__panel--full,.ea-drawer__panel--end.ea-drawer__panel--full{width:calc(100vw - 3rem)}.ea-drawer__panel--top{top:0;inset-inline-start:0;inset-inline-end:0;width:100%}.ea-drawer__panel--top.ea-drawer__panel--xs{height:8rem}.ea-drawer__panel--top.ea-drawer__panel--sm{height:12rem}.ea-drawer__panel--top.ea-drawer__panel--md{height:20rem}.ea-drawer__panel--top.ea-drawer__panel--lg{height:28rem}.ea-drawer__panel--top.ea-drawer__panel--xl{height:36rem}.ea-drawer__panel--top.ea-drawer__panel--full{height:calc(100vh - 3rem)}.ea-drawer__panel--bottom{bottom:0;inset-inline-start:0;inset-inline-end:0;width:100%}.ea-drawer__panel--bottom.ea-drawer__panel--xs{height:8rem}.ea-drawer__panel--bottom.ea-drawer__panel--sm{height:12rem}.ea-drawer__panel--bottom.ea-drawer__panel--md{height:20rem}.ea-drawer__panel--bottom.ea-drawer__panel--lg{height:28rem}.ea-drawer__panel--bottom.ea-drawer__panel--xl{height:36rem}.ea-drawer__panel--bottom.ea-drawer__panel--full{height:calc(100vh - 3rem)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__header,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__header{padding-top:var(--space-3)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__body,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__body{padding-block:var(--space-2)}.ea-drawer__panel--top.ea-drawer__panel--sm .ea-drawer__footer,.ea-drawer__panel--bottom.ea-drawer__panel--sm .ea-drawer__footer{padding-bottom:var(--space-3)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__header,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__header{padding-top:var(--space-2);padding-bottom:var(--space-1)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__body,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__body{padding-block:var(--space-1)}.ea-drawer__panel--top.ea-drawer__panel--xs .ea-drawer__footer,.ea-drawer__panel--bottom.ea-drawer__panel--xs .ea-drawer__footer{padding-top:var(--space-1);padding-bottom:var(--space-2)}.ea-drawer__close{z-index:1;position:absolute;top:var(--space-3);inset-inline-end:var(--space-3);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-drawer__close>*{font-size:1.25em}.ea-drawer__close:hover{background-color:var(--color-state-hover);color:var(--color-text-primary)}.ea-drawer__close:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-drawer__close:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-drawer__close:disabled{cursor:not-allowed;opacity:.5}.ea-drawer__close svg{width:1em;height:1em}.ea-drawer__header{padding:var(--space-5) var(--space-6) var(--space-3);font-size:var(--text-h4-size);font-weight:var(--text-h4-weight);line-height:var(--text-h4-lh);color:var(--color-text-primary)}.ea-drawer__header:empty{display:none}.ea-drawer__body{flex:1;padding:var(--space-3) var(--space-6);overflow-y:auto;font-size:var(--font-size-sm);line-height:var(--line-height-normal);color:var(--color-text-secondary)}.ea-drawer__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3);padding:var(--space-3) var(--space-6) var(--space-5)}.ea-drawer__footer>*{display:flex;align-items:center;gap:var(--space-3)}.ea-drawer__footer:empty{display:none}\n"] }]
9213
+ }], ctorParameters: () => [], propDecorators: { drawerEl: [{ type: i0.ViewChild, args: ['drawerEl', { isSignal: true }] }], panelEl: [{ type: i0.ViewChild, args: ['panelEl', { isSignal: true }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], pushTarget: [{ type: i0.Input, args: [{ isSignal: true, alias: "pushTarget", required: false }] }], closeOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdrop", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], animation: [{ type: i0.Input, args: [{ isSignal: true, alias: "animation", required: false }] }], showClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClose", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
8486
9214
 
8487
9215
  /**
8488
9216
  * Single-select dropdown with a custom popup list. Supports keyboard
@@ -10994,6 +11722,59 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10994
11722
  ], template: "<div class=\"ea-multi-select-field\">\n @if (label(); as labelText) {\n <ea-field-label\n [text]=\"labelText\"\n [forId]=\"id()\"\n [labelId]=\"id() + '-label'\"\n [required]=\"required()\" />\n }\n\n <div class=\"ea-multi-select\">\n <div\n class=\"ea-multi-select__trigger-wrapper\"\n [ngClass]=\"wrapperClasses()\">\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-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\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 (click)=\"toggle()\"\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 [removable]=\"!isDisabled() && !readonly()\"\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 (click)=\"toggle()\" />\n </div>\n\n <ea-popover\n [anchor]=\"triggerEl\"\n [open]=\"isOpen()\"\n placement=\"bottom-start\"\n role=\"listbox\"\n [matchAnchorWidth]=\"true\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"reposition\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n class=\"ea-multi-select__popover\"\n [ngClass]=\"menuClasses()\">\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 (input)=\"onSearchInput($event)\"\n (keydown)=\"handlePopoverKeydown($event)\" />\n </div>\n }\n\n @if (selectAll() && filteredOptions().length > 0) {\n <div\n class=\"ea-multi-select__option ea-multi-select__option--select-all\"\n (click)=\"toggleSelectAll()\">\n <ea-checkbox\n size=\"sm\"\n [checked]=\"selectAllState() === 'all'\"\n [indeterminate]=\"selectAllState() === 'some'\"\n [ariaLabel]=\"i18n.messages().multiSelect.selectAll\" />\n <span class=\"ea-multi-select__option-label\">\n {{ i18n.messages().multiSelect.selectAll }}\n </span>\n </div>\n }\n\n <ul\n class=\"ea-multi-select__list\"\n role=\"presentation\">\n @for (opt of filteredOptions(); track opt.value; let i = $index) {\n <li\n class=\"ea-multi-select__option\"\n [class.ea-multi-select__option--focused]=\"focusedIndex() === i\"\n [class.ea-multi-select__option--disabled]=\"opt.disabled\"\n role=\"option\"\n tabindex=\"-1\"\n [attr.aria-selected]=\"selectedSet().has(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled || null\"\n (click)=\"toggleOption(opt)\"\n (keydown)=\"handlePopoverKeydown($event)\">\n <ea-checkbox\n size=\"sm\"\n [checked]=\"selectedSet().has(opt.value)\"\n [disabled]=\"!!opt.disabled\"\n [ariaLabel]=\"opt.label\" />\n <span class=\"ea-multi-select__option-label\">\n {{ opt.label }}\n </span>\n </li>\n } @empty {\n <li class=\"ea-multi-select__empty\">\n {{ i18n.messages().multiSelect.searchEmpty }}\n </li>\n }\n </ul>\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", styles: [".ea-multi-select-field{display:flex;flex-direction:column;gap:var(--space-1-5)}.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);transition:var(--transition-colors),var(--transition-shadow)}.ea-multi-select__trigger-wrapper--xs{font-size:var(--font-size-xs)}.ea-multi-select__trigger-wrapper--sm{font-size:var(--font-size-sm)}.ea-multi-select__trigger-wrapper--md{font-size:var(--font-size-md)}.ea-multi-select__trigger-wrapper--lg{font-size:var(--font-size-lg)}.ea-multi-select__trigger-wrapper--xl{font-size:var(--font-size-xl)}.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:not-allowed}.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{cursor:not-allowed}.ea-multi-select__trigger-content{display:flex;flex-wrap:nowrap;align-items:center;gap:var(--space-1);flex:1;min-width:0;overflow-x:auto;scrollbar-width:thin}.ea-multi-select__trigger-content ea-tag{flex-shrink: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);cursor:pointer;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 var(--space-1-5);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{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: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:not-allowed;opacity:.5}.ea-multi-select__clear{flex-shrink:0}.ea-multi-select__clear-icon{width:1em;height:1em}.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--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:var(--space-2);flex-shrink:0;padding:var(--space-2) var(--space-3);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:var(--space-1) 0;list-style:none}.ea-multi-select__option{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-1-5) var(--space-3);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:not-allowed}@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: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__option-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ea-multi-select__empty{padding:var(--space-3);font-size:inherit;text-align:center;color:var(--color-text-tertiary);list-style:none}\n"] }]
10995
11723
  }], propDecorators: { triggerEl: [{ type: i0.ViewChild, args: ['triggerEl', { isSignal: true }] }], searchEl: [{ type: i0.ViewChild, args: ['searchEl', { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], errorMsg: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMsg", required: false }] }], errorMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessages", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], maxVisibleChips: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleChips", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
10996
11724
 
11725
+ /** Whether the runtime's `Intl` actually has number data for `locale` rather
11726
+ * than silently negotiating down to a default (as reduced-ICU builds do). */
11727
+ function intlLocalizes(locale) {
11728
+ try {
11729
+ const resolved = new Intl.NumberFormat(locale).resolvedOptions().locale;
11730
+ return resolved.split('-')[0] === locale.split('-')[0];
11731
+ }
11732
+ catch {
11733
+ return false;
11734
+ }
11735
+ }
11736
+ function groupInteger(digits, sep, grouping) {
11737
+ const primary = grouping[0] ?? 3;
11738
+ const secondary = grouping[1] ?? primary;
11739
+ if (digits.length <= primary) {
11740
+ return digits;
11741
+ }
11742
+ let result = digits.slice(digits.length - primary);
11743
+ let rest = digits.slice(0, digits.length - primary);
11744
+ while (rest.length > 0) {
11745
+ const take = Math.min(secondary, rest.length);
11746
+ result = `${rest.slice(rest.length - take)}${sep}${result}`;
11747
+ rest = rest.slice(0, rest.length - take);
11748
+ }
11749
+ return result;
11750
+ }
11751
+ /**
11752
+ * Group-formats a number for the active locale. Uses the runtime's `Intl` when
11753
+ * it actually has data for `locale`; otherwise formats from the locale bundle's
11754
+ * numeric rules so grouping stays correct on browsers whose ICU lacks the
11755
+ * locale (some Chrome builds drop long-tail locales, e.g. Icelandic). The
11756
+ * manual fallback honours the locale's separators and grouping pattern, not
11757
+ * `Intl` rounding options, which is sufficient for the values these components
11758
+ * display.
11759
+ */
11760
+ function formatGroupedNumber(value, locale, format, options) {
11761
+ if (intlLocalizes(locale)) {
11762
+ return value.toLocaleString(locale, options);
11763
+ }
11764
+ if (!isFinite(value)) {
11765
+ return String(value);
11766
+ }
11767
+ const magnitude = Math.abs(value).toString();
11768
+ // Scientific notation can't be digit-grouped meaningfully; leave it as-is
11769
+ if (magnitude.includes('e') || magnitude.includes('E')) {
11770
+ return value.toString();
11771
+ }
11772
+ const [intPart, fracPart] = magnitude.split('.');
11773
+ const grouped = groupInteger(intPart, format.group, format.grouping);
11774
+ const body = fracPart != null ? `${grouped}${format.decimal}${fracPart}` : grouped;
11775
+ return value < 0 ? `-${body}` : body;
11776
+ }
11777
+
10997
11778
  /**
10998
11779
  * Page navigation control with previous/next buttons, numbered page jumps,
10999
11780
  * an optional page-size selector, and a range label. Exposes `page` and
@@ -11020,9 +11801,11 @@ class PaginatorComponent {
11020
11801
  rangeEnd = computed(() => Math.min(this.page() * this.pageSize(), this.totalItems()), ...(ngDevMode ? [{ debugName: "rangeEnd" }] : /* istanbul ignore next */ []));
11021
11802
  canGoPrev = computed(() => this.page() > 1, ...(ngDevMode ? [{ debugName: "canGoPrev" }] : /* istanbul ignore next */ []));
11022
11803
  canGoNext = computed(() => this.page() < this.totalPages(), ...(ngDevMode ? [{ debugName: "canGoNext" }] : /* istanbul ignore next */ []));
11023
- /** Formats a number for display, grouping thousands with commas when enabled. */
11804
+ /** Formats a number for display, grouping thousands per the active locale when enabled. */
11024
11805
  formatNumber(value) {
11025
- return this.groupThousands() ? value.toLocaleString('en-US') : `${value}`;
11806
+ return this.groupThousands()
11807
+ ? formatGroupedNumber(value, this.i18n.locale(), this.i18n.messages().numberFormat)
11808
+ : `${value}`;
11026
11809
  }
11027
11810
  visiblePages = computed(() => {
11028
11811
  const total = this.totalPages();
@@ -11258,6 +12041,7 @@ const FORMAT_PLAIN$1 = (value) => `${value}`;
11258
12041
  * keeping the moving thumb on its side and the other thumb pinned.
11259
12042
  */
11260
12043
  class RangeSliderComponent {
12044
+ i18n = inject(EagamiI18nService);
11261
12045
  trackEl = viewChild('trackEl', ...(ngDevMode ? [{ debugName: "trackEl" }] : /* istanbul ignore next */ []));
11262
12046
  label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
11263
12047
  hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
@@ -11306,7 +12090,9 @@ class RangeSliderComponent {
11306
12090
  return formatter(value);
11307
12091
  }
11308
12092
  return this.groupThousands()
11309
- ? value.toLocaleString('en-US', { maximumFractionDigits: 20 })
12093
+ ? formatGroupedNumber(value, this.i18n.locale(), this.i18n.messages().numberFormat, {
12094
+ maximumFractionDigits: 20,
12095
+ })
11310
12096
  : `${value}`;
11311
12097
  }
11312
12098
  errorState = injectControlErrorState({
@@ -12021,6 +12807,7 @@ const FORMAT_PLAIN = (value) => `${value}`;
12021
12807
  * Angular forms via `ControlValueAccessor`.
12022
12808
  */
12023
12809
  class SliderComponent {
12810
+ i18n = inject(EagamiI18nService);
12024
12811
  trackEl = viewChild('trackEl', ...(ngDevMode ? [{ debugName: "trackEl" }] : /* istanbul ignore next */ []));
12025
12812
  label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
12026
12813
  hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
@@ -12070,7 +12857,9 @@ class SliderComponent {
12070
12857
  return formatter(value);
12071
12858
  }
12072
12859
  return this.groupThousands()
12073
- ? value.toLocaleString('en-US', { maximumFractionDigits: 20 })
12860
+ ? formatGroupedNumber(value, this.i18n.locale(), this.i18n.messages().numberFormat, {
12861
+ maximumFractionDigits: 20,
12862
+ })
12074
12863
  : `${value}`;
12075
12864
  }
12076
12865
  errorState = injectControlErrorState({
@@ -13943,6 +14732,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
13943
14732
  * them against the shared signals.
13944
14733
  */
13945
14734
  class TreeNodeComponent {
14735
+ i18n = inject(EagamiI18nService);
13946
14736
  node = input.required(...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
13947
14737
  /** Depth from the tree root (0-indexed). Drives indentation and `aria-level`. */
13948
14738
  level = input.required(...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
@@ -13958,10 +14748,12 @@ class TreeNodeComponent {
13958
14748
  expandedIds = input.required(...(ngDevMode ? [{ debugName: "expandedIds" }] : /* istanbul ignore next */ []));
13959
14749
  /** Whole-tree disabled state. */
13960
14750
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
13961
- /** Localized aria-label for the expand chevron. */
13962
- expandLabel = input('Expand', ...(ngDevMode ? [{ debugName: "expandLabel" }] : /* istanbul ignore next */ []));
13963
- /** Localized aria-label for the collapse chevron. */
13964
- collapseLabel = input('Collapse', ...(ngDevMode ? [{ debugName: "collapseLabel" }] : /* istanbul ignore next */ []));
14751
+ /** aria-label for the expand chevron; falls back to the active locale's default. */
14752
+ expandLabel = input(undefined, ...(ngDevMode ? [{ debugName: "expandLabel" }] : /* istanbul ignore next */ []));
14753
+ /** aria-label for the collapse chevron; falls back to the active locale's default. */
14754
+ collapseLabel = input(undefined, ...(ngDevMode ? [{ debugName: "collapseLabel" }] : /* istanbul ignore next */ []));
14755
+ resolvedExpandLabel = computed(() => this.expandLabel() ?? this.i18n.messages().tree.expand, ...(ngDevMode ? [{ debugName: "resolvedExpandLabel" }] : /* istanbul ignore next */ []));
14756
+ resolvedCollapseLabel = computed(() => this.collapseLabel() ?? this.i18n.messages().tree.collapse, ...(ngDevMode ? [{ debugName: "resolvedCollapseLabel" }] : /* istanbul ignore next */ []));
13965
14757
  toggle = output();
13966
14758
  select = output();
13967
14759
  hasChildren = computed(() => (this.node().children?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasChildren" }] : /* istanbul ignore next */ []));
@@ -13991,13 +14783,13 @@ class TreeNodeComponent {
13991
14783
  this.toggle.emit(this.node().id);
13992
14784
  }
13993
14785
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: TreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13994
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: TreeNodeComponent, isStandalone: true, selector: "ea-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: true, transformFunction: null }, posInSet: { classPropertyName: "posInSet", publicName: "posInSet", isSignal: true, isRequired: true, transformFunction: null }, setSize: { classPropertyName: "setSize", publicName: "setSize", isSignal: true, isRequired: true, transformFunction: null }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", isSignal: true, isRequired: false, transformFunction: null }, focusedId: { classPropertyName: "focusedId", publicName: "focusedId", isSignal: true, isRequired: false, transformFunction: null }, expandedIds: { classPropertyName: "expandedIds", publicName: "expandedIds", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, expandLabel: { classPropertyName: "expandLabel", publicName: "expandLabel", isSignal: true, isRequired: false, transformFunction: null }, collapseLabel: { classPropertyName: "collapseLabel", publicName: "collapseLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggle: "toggle", select: "select" }, host: { attributes: { "role": "none" } }, ngImport: i0, template: "<li\n class=\"ea-tree-node\"\n role=\"treeitem\"\n [attr.id]=\"'ea-tree-item-' + node().id\"\n [attr.data-treeitem-id]=\"node().id\"\n [attr.aria-level]=\"level() + 1\"\n [attr.aria-posinset]=\"posInSet()\"\n [attr.aria-setsize]=\"setSize()\"\n [attr.aria-selected]=\"isSelected()\"\n [attr.aria-expanded]=\"hasChildren() ? isExpanded() : null\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.tabindex]=\"isFocused() ? 0 : -1\"\n [class.ea-tree-node--selected]=\"isSelected()\"\n [class.ea-tree-node--disabled]=\"isDisabled()\"\n [class.ea-tree-node--leaf]=\"!hasChildren()\"\n [style]=\"indentStyle()\">\n <div\n class=\"ea-tree-node__row\"\n (click)=\"onRowClick()\">\n @if (hasChildren()) {\n <span\n class=\"ea-tree-node__chevron\"\n [class.ea-tree-node__chevron--open]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? collapseLabel() : expandLabel()\"\n role=\"button\"\n (click)=\"onChevronClick($event)\">\n <ea-icon-chevron-right />\n </span>\n } @else {\n <span\n class=\"ea-tree-node__chevron-spacer\"\n aria-hidden=\"true\">\n </span>\n }\n\n @if (node().icon; as iconClass) {\n <span\n class=\"ea-tree-node__icon\"\n aria-hidden=\"true\">\n <ng-container *ngComponentOutlet=\"iconClass\" />\n </span>\n }\n\n <span class=\"ea-tree-node__label\">\n {{ node().label }}\n </span>\n </div>\n\n @if (hasChildren() && isExpanded()) {\n <ul\n class=\"ea-tree-node__children\"\n role=\"group\">\n @for (child of node().children; track child.id; let i = $index) {\n <ea-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [posInSet]=\"i + 1\"\n [setSize]=\"node().children!.length\"\n [selectedId]=\"selectedId()\"\n [focusedId]=\"focusedId()\"\n [expandedIds]=\"expandedIds()\"\n [disabled]=\"disabled()\"\n [expandLabel]=\"expandLabel()\"\n [collapseLabel]=\"collapseLabel()\"\n (toggle)=\"toggle.emit($event)\"\n (select)=\"select.emit($event)\" />\n }\n </ul>\n }\n</li>\n", styles: [":host{display:block}.ea-tree-node{display:block;outline:none;list-style:none}.ea-tree-node__row{display:flex;align-items:center;gap:var(--space-2);padding:var(--ea-tree-row-padding-block, var(--space-1)) var(--ea-tree-row-padding-inline, var(--space-2));padding-inline-start:calc(var(--ea-tree-row-padding-inline, var(--space-2)) + var(--ea-tree-node-level) * var(--ea-tree-indent, var(--space-4)));border-radius:var(--radius-sm);background-color:transparent;color:var(--color-text-primary);cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--transition-colors)}.ea-tree-node:focus-visible>.ea-tree-node__row{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-tree-node:focus-visible>.ea-tree-node__row{outline:2px solid Highlight;outline-offset:2px}}.ea-tree-node__row:hover{background-color:var(--color-state-hover)}.ea-tree-node--selected>.ea-tree-node__row{background-color:var(--color-bg-selected, var(--color-brand-subtle));color:var(--color-text-on-selected, var(--color-text-primary))}@media(forced-colors:active){.ea-tree-node--selected>.ea-tree-node__row{background-color:Highlight;color:HighlightText}}.ea-tree-node--disabled>.ea-tree-node__row{opacity:.6;cursor:not-allowed}.ea-tree-node--disabled>.ea-tree-node__row:hover{background-color:transparent}.ea-tree-node__chevron,.ea-tree-node__chevron-spacer{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;flex-shrink:0;color:var(--color-text-secondary)}.ea-tree-node__chevron{cursor:pointer;transition:transform var(--motion-duration-fast) var(--motion-easing-standard)}.ea-tree-node__chevron--open{transform:rotate(90deg)}.ea-tree-node__icon{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;flex-shrink:0;color:var(--color-text-secondary)}.ea-tree-node__label{font-size:inherit;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;min-width:0;flex:1}.ea-tree-node__children{display:block;padding:0;margin:0;list-style:none}\n"], dependencies: [{ kind: "component", type: TreeNodeComponent, selector: "ea-tree-node", inputs: ["node", "level", "posInSet", "setSize", "selectedId", "focusedId", "expandedIds", "disabled", "expandLabel", "collapseLabel"], outputs: ["toggle", "select"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: ChevronRightIconComponent, selector: "ea-icon-chevron-right" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14786
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: TreeNodeComponent, isStandalone: true, selector: "ea-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: true, transformFunction: null }, posInSet: { classPropertyName: "posInSet", publicName: "posInSet", isSignal: true, isRequired: true, transformFunction: null }, setSize: { classPropertyName: "setSize", publicName: "setSize", isSignal: true, isRequired: true, transformFunction: null }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", isSignal: true, isRequired: false, transformFunction: null }, focusedId: { classPropertyName: "focusedId", publicName: "focusedId", isSignal: true, isRequired: false, transformFunction: null }, expandedIds: { classPropertyName: "expandedIds", publicName: "expandedIds", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, expandLabel: { classPropertyName: "expandLabel", publicName: "expandLabel", isSignal: true, isRequired: false, transformFunction: null }, collapseLabel: { classPropertyName: "collapseLabel", publicName: "collapseLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggle: "toggle", select: "select" }, host: { attributes: { "role": "none" } }, ngImport: i0, template: "<li\n class=\"ea-tree-node\"\n role=\"treeitem\"\n [attr.id]=\"'ea-tree-item-' + node().id\"\n [attr.data-treeitem-id]=\"node().id\"\n [attr.aria-level]=\"level() + 1\"\n [attr.aria-posinset]=\"posInSet()\"\n [attr.aria-setsize]=\"setSize()\"\n [attr.aria-selected]=\"isSelected()\"\n [attr.aria-expanded]=\"hasChildren() ? isExpanded() : null\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.tabindex]=\"isFocused() ? 0 : -1\"\n [class.ea-tree-node--selected]=\"isSelected()\"\n [class.ea-tree-node--disabled]=\"isDisabled()\"\n [class.ea-tree-node--leaf]=\"!hasChildren()\"\n [style]=\"indentStyle()\">\n <div\n class=\"ea-tree-node__row\"\n (click)=\"onRowClick()\">\n @if (hasChildren()) {\n <span\n class=\"ea-tree-node__chevron\"\n [class.ea-tree-node__chevron--open]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? resolvedCollapseLabel() : resolvedExpandLabel()\"\n role=\"button\"\n (click)=\"onChevronClick($event)\">\n <ea-icon-chevron-right />\n </span>\n } @else {\n <span\n class=\"ea-tree-node__chevron-spacer\"\n aria-hidden=\"true\">\n </span>\n }\n\n @if (node().icon; as iconClass) {\n <span\n class=\"ea-tree-node__icon\"\n aria-hidden=\"true\">\n <ng-container *ngComponentOutlet=\"iconClass\" />\n </span>\n }\n\n <span class=\"ea-tree-node__label\">\n {{ node().label }}\n </span>\n </div>\n\n @if (hasChildren() && isExpanded()) {\n <ul\n class=\"ea-tree-node__children\"\n role=\"group\">\n @for (child of node().children; track child.id; let i = $index) {\n <ea-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [posInSet]=\"i + 1\"\n [setSize]=\"node().children!.length\"\n [selectedId]=\"selectedId()\"\n [focusedId]=\"focusedId()\"\n [expandedIds]=\"expandedIds()\"\n [disabled]=\"disabled()\"\n [expandLabel]=\"expandLabel()\"\n [collapseLabel]=\"collapseLabel()\"\n (toggle)=\"toggle.emit($event)\"\n (select)=\"select.emit($event)\" />\n }\n </ul>\n }\n</li>\n", styles: [":host{display:block}.ea-tree-node{display:block;outline:none;list-style:none}.ea-tree-node__row{display:flex;align-items:center;gap:var(--space-2);padding:var(--ea-tree-row-padding-block, var(--space-1)) var(--ea-tree-row-padding-inline, var(--space-2));padding-inline-start:calc(var(--ea-tree-row-padding-inline, var(--space-2)) + var(--ea-tree-node-level) * var(--ea-tree-indent, var(--space-4)));border-radius:var(--radius-sm);background-color:transparent;color:var(--color-text-primary);cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--transition-colors)}.ea-tree-node:focus-visible>.ea-tree-node__row{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-tree-node:focus-visible>.ea-tree-node__row{outline:2px solid Highlight;outline-offset:2px}}.ea-tree-node__row:hover{background-color:var(--color-state-hover)}.ea-tree-node--selected>.ea-tree-node__row{background-color:var(--color-bg-selected, var(--color-brand-subtle));color:var(--color-text-on-selected, var(--color-text-primary))}@media(forced-colors:active){.ea-tree-node--selected>.ea-tree-node__row{background-color:Highlight;color:HighlightText}}.ea-tree-node--disabled>.ea-tree-node__row{opacity:.6;cursor:not-allowed}.ea-tree-node--disabled>.ea-tree-node__row:hover{background-color:transparent}.ea-tree-node__chevron,.ea-tree-node__chevron-spacer{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;flex-shrink:0;color:var(--color-text-secondary)}.ea-tree-node__chevron{cursor:pointer;transition:transform var(--motion-duration-fast) var(--motion-easing-standard)}.ea-tree-node__chevron--open{transform:rotate(90deg)}.ea-tree-node__icon{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;flex-shrink:0;color:var(--color-text-secondary)}.ea-tree-node__label{font-size:inherit;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;min-width:0;flex:1}.ea-tree-node__children{display:block;padding:0;margin:0;list-style:none}\n"], dependencies: [{ kind: "component", type: TreeNodeComponent, selector: "ea-tree-node", inputs: ["node", "level", "posInSet", "setSize", "selectedId", "focusedId", "expandedIds", "disabled", "expandLabel", "collapseLabel"], outputs: ["toggle", "select"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: ChevronRightIconComponent, selector: "ea-icon-chevron-right" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13995
14787
  }
13996
14788
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: TreeNodeComponent, decorators: [{
13997
14789
  type: Component,
13998
14790
  args: [{ selector: 'ea-tree-node', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgComponentOutlet, ChevronRightIconComponent], host: {
13999
14791
  role: 'none',
14000
- }, template: "<li\n class=\"ea-tree-node\"\n role=\"treeitem\"\n [attr.id]=\"'ea-tree-item-' + node().id\"\n [attr.data-treeitem-id]=\"node().id\"\n [attr.aria-level]=\"level() + 1\"\n [attr.aria-posinset]=\"posInSet()\"\n [attr.aria-setsize]=\"setSize()\"\n [attr.aria-selected]=\"isSelected()\"\n [attr.aria-expanded]=\"hasChildren() ? isExpanded() : null\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.tabindex]=\"isFocused() ? 0 : -1\"\n [class.ea-tree-node--selected]=\"isSelected()\"\n [class.ea-tree-node--disabled]=\"isDisabled()\"\n [class.ea-tree-node--leaf]=\"!hasChildren()\"\n [style]=\"indentStyle()\">\n <div\n class=\"ea-tree-node__row\"\n (click)=\"onRowClick()\">\n @if (hasChildren()) {\n <span\n class=\"ea-tree-node__chevron\"\n [class.ea-tree-node__chevron--open]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? collapseLabel() : expandLabel()\"\n role=\"button\"\n (click)=\"onChevronClick($event)\">\n <ea-icon-chevron-right />\n </span>\n } @else {\n <span\n class=\"ea-tree-node__chevron-spacer\"\n aria-hidden=\"true\">\n </span>\n }\n\n @if (node().icon; as iconClass) {\n <span\n class=\"ea-tree-node__icon\"\n aria-hidden=\"true\">\n <ng-container *ngComponentOutlet=\"iconClass\" />\n </span>\n }\n\n <span class=\"ea-tree-node__label\">\n {{ node().label }}\n </span>\n </div>\n\n @if (hasChildren() && isExpanded()) {\n <ul\n class=\"ea-tree-node__children\"\n role=\"group\">\n @for (child of node().children; track child.id; let i = $index) {\n <ea-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [posInSet]=\"i + 1\"\n [setSize]=\"node().children!.length\"\n [selectedId]=\"selectedId()\"\n [focusedId]=\"focusedId()\"\n [expandedIds]=\"expandedIds()\"\n [disabled]=\"disabled()\"\n [expandLabel]=\"expandLabel()\"\n [collapseLabel]=\"collapseLabel()\"\n (toggle)=\"toggle.emit($event)\"\n (select)=\"select.emit($event)\" />\n }\n </ul>\n }\n</li>\n", styles: [":host{display:block}.ea-tree-node{display:block;outline:none;list-style:none}.ea-tree-node__row{display:flex;align-items:center;gap:var(--space-2);padding:var(--ea-tree-row-padding-block, var(--space-1)) var(--ea-tree-row-padding-inline, var(--space-2));padding-inline-start:calc(var(--ea-tree-row-padding-inline, var(--space-2)) + var(--ea-tree-node-level) * var(--ea-tree-indent, var(--space-4)));border-radius:var(--radius-sm);background-color:transparent;color:var(--color-text-primary);cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--transition-colors)}.ea-tree-node:focus-visible>.ea-tree-node__row{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-tree-node:focus-visible>.ea-tree-node__row{outline:2px solid Highlight;outline-offset:2px}}.ea-tree-node__row:hover{background-color:var(--color-state-hover)}.ea-tree-node--selected>.ea-tree-node__row{background-color:var(--color-bg-selected, var(--color-brand-subtle));color:var(--color-text-on-selected, var(--color-text-primary))}@media(forced-colors:active){.ea-tree-node--selected>.ea-tree-node__row{background-color:Highlight;color:HighlightText}}.ea-tree-node--disabled>.ea-tree-node__row{opacity:.6;cursor:not-allowed}.ea-tree-node--disabled>.ea-tree-node__row:hover{background-color:transparent}.ea-tree-node__chevron,.ea-tree-node__chevron-spacer{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;flex-shrink:0;color:var(--color-text-secondary)}.ea-tree-node__chevron{cursor:pointer;transition:transform var(--motion-duration-fast) var(--motion-easing-standard)}.ea-tree-node__chevron--open{transform:rotate(90deg)}.ea-tree-node__icon{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;flex-shrink:0;color:var(--color-text-secondary)}.ea-tree-node__label{font-size:inherit;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;min-width:0;flex:1}.ea-tree-node__children{display:block;padding:0;margin:0;list-style:none}\n"] }]
14792
+ }, template: "<li\n class=\"ea-tree-node\"\n role=\"treeitem\"\n [attr.id]=\"'ea-tree-item-' + node().id\"\n [attr.data-treeitem-id]=\"node().id\"\n [attr.aria-level]=\"level() + 1\"\n [attr.aria-posinset]=\"posInSet()\"\n [attr.aria-setsize]=\"setSize()\"\n [attr.aria-selected]=\"isSelected()\"\n [attr.aria-expanded]=\"hasChildren() ? isExpanded() : null\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.tabindex]=\"isFocused() ? 0 : -1\"\n [class.ea-tree-node--selected]=\"isSelected()\"\n [class.ea-tree-node--disabled]=\"isDisabled()\"\n [class.ea-tree-node--leaf]=\"!hasChildren()\"\n [style]=\"indentStyle()\">\n <div\n class=\"ea-tree-node__row\"\n (click)=\"onRowClick()\">\n @if (hasChildren()) {\n <span\n class=\"ea-tree-node__chevron\"\n [class.ea-tree-node__chevron--open]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? resolvedCollapseLabel() : resolvedExpandLabel()\"\n role=\"button\"\n (click)=\"onChevronClick($event)\">\n <ea-icon-chevron-right />\n </span>\n } @else {\n <span\n class=\"ea-tree-node__chevron-spacer\"\n aria-hidden=\"true\">\n </span>\n }\n\n @if (node().icon; as iconClass) {\n <span\n class=\"ea-tree-node__icon\"\n aria-hidden=\"true\">\n <ng-container *ngComponentOutlet=\"iconClass\" />\n </span>\n }\n\n <span class=\"ea-tree-node__label\">\n {{ node().label }}\n </span>\n </div>\n\n @if (hasChildren() && isExpanded()) {\n <ul\n class=\"ea-tree-node__children\"\n role=\"group\">\n @for (child of node().children; track child.id; let i = $index) {\n <ea-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [posInSet]=\"i + 1\"\n [setSize]=\"node().children!.length\"\n [selectedId]=\"selectedId()\"\n [focusedId]=\"focusedId()\"\n [expandedIds]=\"expandedIds()\"\n [disabled]=\"disabled()\"\n [expandLabel]=\"expandLabel()\"\n [collapseLabel]=\"collapseLabel()\"\n (toggle)=\"toggle.emit($event)\"\n (select)=\"select.emit($event)\" />\n }\n </ul>\n }\n</li>\n", styles: [":host{display:block}.ea-tree-node{display:block;outline:none;list-style:none}.ea-tree-node__row{display:flex;align-items:center;gap:var(--space-2);padding:var(--ea-tree-row-padding-block, var(--space-1)) var(--ea-tree-row-padding-inline, var(--space-2));padding-inline-start:calc(var(--ea-tree-row-padding-inline, var(--space-2)) + var(--ea-tree-node-level) * var(--ea-tree-indent, var(--space-4)));border-radius:var(--radius-sm);background-color:transparent;color:var(--color-text-primary);cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--transition-colors)}.ea-tree-node:focus-visible>.ea-tree-node__row{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-tree-node:focus-visible>.ea-tree-node__row{outline:2px solid Highlight;outline-offset:2px}}.ea-tree-node__row:hover{background-color:var(--color-state-hover)}.ea-tree-node--selected>.ea-tree-node__row{background-color:var(--color-bg-selected, var(--color-brand-subtle));color:var(--color-text-on-selected, var(--color-text-primary))}@media(forced-colors:active){.ea-tree-node--selected>.ea-tree-node__row{background-color:Highlight;color:HighlightText}}.ea-tree-node--disabled>.ea-tree-node__row{opacity:.6;cursor:not-allowed}.ea-tree-node--disabled>.ea-tree-node__row:hover{background-color:transparent}.ea-tree-node__chevron,.ea-tree-node__chevron-spacer{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;flex-shrink:0;color:var(--color-text-secondary)}.ea-tree-node__chevron{cursor:pointer;transition:transform var(--motion-duration-fast) var(--motion-easing-standard)}.ea-tree-node__chevron--open{transform:rotate(90deg)}.ea-tree-node__icon{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;flex-shrink:0;color:var(--color-text-secondary)}.ea-tree-node__label{font-size:inherit;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;min-width:0;flex:1}.ea-tree-node__children{display:block;padding:0;margin:0;list-style:none}\n"] }]
14001
14793
  }], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: true }] }], posInSet: [{ type: i0.Input, args: [{ isSignal: true, alias: "posInSet", required: true }] }], setSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "setSize", required: true }] }], selectedId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedId", required: false }] }], focusedId: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusedId", required: false }] }], expandedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedIds", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], expandLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandLabel", required: false }] }], collapseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseLabel", required: false }] }], toggle: [{ type: i0.Output, args: ["toggle"] }], select: [{ type: i0.Output, args: ["select"] }] } });
14002
14794
 
14003
14795
  /**