klun-ui 0.5.0 → 0.7.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.
@@ -199,7 +199,7 @@ var enUS = {
199
199
  banner: { dismiss: "Dismiss" },
200
200
  toast: { dismiss: "Dismiss" },
201
201
  fileUpload: { clickToUpload: "Click to upload", orDragAndDrop: "or drag and drop" },
202
- imageUpload: { label: "Upload image", remove: "Remove" },
202
+ imageUpload: { label: "Upload image", remove: "Remove", hint: "PNG or JPG, up to 5MB" },
203
203
  passwordStrength: { weak: "Weak", fair: "Fair", good: "Good", strong: "Strong" },
204
204
  commandMenu: {
205
205
  placeholder: "Type a command or search\u2026",
@@ -267,7 +267,14 @@ var enUS = {
267
267
  perPage: "{size} / page",
268
268
  selectRow: "Select row",
269
269
  selectAll: "Select all rows"
270
- }
270
+ },
271
+ wizard: { back: "\u4E0A\u4E00\u6B65", next: "\u4E0B\u4E00\u6B65", finish: "\u5B8C\u6210" },
272
+ a11y: { zoomIn: "Zoom in", zoomOut: "Zoom out", rotate: "Rotate", collapseStart: "Collapse start panel", collapseEnd: "Collapse end panel", bulkActions: "Bulk actions", clearSelection: "Clear selection", back: "Back" },
273
+ richEditor: { placeholder: "Write something\u2026", editorLabel: "Rich text editor" },
274
+ copy: { label: "Copy" },
275
+ emojiPicker: { searchPlaceholder: "Search emoji", emptyText: "No emoji found", addReaction: "Add reaction" },
276
+ sidebar: { searchPlaceholder: "Search", primary: "Primary" },
277
+ imageViewer: { reset: "Reset", download: "Download" }
271
278
  };
272
279
  var zhCN = {
273
280
  locale: "zh-CN",
@@ -297,7 +304,7 @@ var zhCN = {
297
304
  banner: { dismiss: "\u5173\u95ED" },
298
305
  toast: { dismiss: "\u5173\u95ED" },
299
306
  fileUpload: { clickToUpload: "\u70B9\u51FB\u4E0A\u4F20", orDragAndDrop: "\u6216\u62D6\u62FD\u5230\u6B64\u5904" },
300
- imageUpload: { label: "\u4E0A\u4F20\u56FE\u7247", remove: "\u79FB\u9664" },
307
+ imageUpload: { label: "\u4E0A\u4F20\u56FE\u7247", remove: "\u79FB\u9664", hint: "\u652F\u6301 PNG \u6216 JPG\uFF0C\u6700\u5927 5MB" },
301
308
  passwordStrength: { weak: "\u5F31", fair: "\u4E00\u822C", good: "\u826F\u597D", strong: "\u5F3A" },
302
309
  commandMenu: {
303
310
  placeholder: "\u8F93\u5165\u547D\u4EE4\u6216\u641C\u7D22\u2026",
@@ -365,7 +372,14 @@ var zhCN = {
365
372
  perPage: "{size} / \u9875",
366
373
  selectRow: "\u9009\u62E9\u672C\u884C",
367
374
  selectAll: "\u5168\u9009"
368
- }
375
+ },
376
+ wizard: { back: "\u4E0A\u4E00\u6B65", next: "\u4E0B\u4E00\u6B65", finish: "\u5B8C\u6210" },
377
+ a11y: { zoomIn: "\u653E\u5927", zoomOut: "\u7F29\u5C0F", rotate: "\u65CB\u8F6C", collapseStart: "\u6536\u8D77\u8D77\u59CB\u9762\u677F", collapseEnd: "\u6536\u8D77\u7ED3\u675F\u9762\u677F", bulkActions: "\u6279\u91CF\u64CD\u4F5C", clearSelection: "\u6E05\u9664\u9009\u62E9", back: "\u8FD4\u56DE" },
378
+ richEditor: { placeholder: "\u8BF7\u8F93\u5165\u5185\u5BB9\u2026", editorLabel: "\u5BCC\u6587\u672C\u7F16\u8F91\u5668" },
379
+ copy: { label: "\u590D\u5236" },
380
+ emojiPicker: { searchPlaceholder: "\u641C\u7D22\u8868\u60C5", emptyText: "\u6CA1\u6709\u627E\u5230\u8868\u60C5", addReaction: "\u6DFB\u52A0\u8868\u60C5" },
381
+ sidebar: { searchPlaceholder: "\u641C\u7D22", primary: "\u4E3B\u5BFC\u822A" },
382
+ imageViewer: { reset: "\u91CD\u7F6E", download: "\u4E0B\u8F7D" }
369
383
  };
370
384
  var zhTW = {
371
385
  locale: "zh-TW",
@@ -389,13 +403,13 @@ var zhTW = {
389
403
  },
390
404
  timePicker: { am: "\u4E0A\u5348", pm: "\u4E0B\u5348" },
391
405
  pagination: { previous: "\u4E0A\u4E00\u9801", next: "\u4E0B\u4E00\u9801" },
392
- modal: { close: "\u95DC\u9589" },
406
+ modal: { close: "\u95DC\u9589", maximize: "\u6700\u5927\u5316", restore: "\u9084\u539F" },
393
407
  drawer: { close: "\u95DC\u9589" },
394
408
  alert: { dismiss: "\u95DC\u9589" },
395
409
  banner: { dismiss: "\u95DC\u9589" },
396
410
  toast: { dismiss: "\u95DC\u9589" },
397
411
  fileUpload: { clickToUpload: "\u9EDE\u64CA\u4E0A\u50B3", orDragAndDrop: "\u6216\u62D6\u66F3\u5230\u6B64\u8655" },
398
- imageUpload: { label: "\u4E0A\u50B3\u5716\u7247", remove: "\u79FB\u9664" },
412
+ imageUpload: { label: "\u4E0A\u50B3\u5716\u7247", remove: "\u79FB\u9664", hint: "\u652F\u63F4 PNG \u6216 JPG\uFF0C\u6700\u5927 5MB" },
399
413
  passwordStrength: { weak: "\u5F31", fair: "\u4E00\u822C", good: "\u826F\u597D", strong: "\u5F37" },
400
414
  commandMenu: {
401
415
  placeholder: "\u8F38\u5165\u547D\u4EE4\u6216\u641C\u5C0B\u2026",
@@ -463,7 +477,14 @@ var zhTW = {
463
477
  perPage: "{size} / \u9801",
464
478
  selectRow: "\u9078\u64C7\u672C\u884C",
465
479
  selectAll: "\u5168\u9078"
466
- }
480
+ },
481
+ wizard: { back: "\u623B\u308B", next: "\u6B21\u3078", finish: "\u5B8C\u4E86" },
482
+ a11y: { zoomIn: "\u653E\u5927", zoomOut: "\u7E2E\u5C0F", rotate: "\u65CB\u8F49", collapseStart: "\u6536\u5408\u8D77\u59CB\u9762\u677F", collapseEnd: "\u6536\u5408\u7D50\u675F\u9762\u677F", bulkActions: "\u6279\u6B21\u64CD\u4F5C", clearSelection: "\u6E05\u9664\u9078\u53D6", back: "\u8FD4\u56DE" },
483
+ richEditor: { placeholder: "\u8ACB\u8F38\u5165\u5167\u5BB9\u2026", editorLabel: "\u5BCC\u6587\u5B57\u7DE8\u8F2F\u5668" },
484
+ copy: { label: "\u8907\u88FD" },
485
+ emojiPicker: { searchPlaceholder: "\u641C\u5C0B\u8868\u60C5", emptyText: "\u627E\u4E0D\u5230\u8868\u60C5", addReaction: "\u65B0\u589E\u8868\u60C5" },
486
+ sidebar: { searchPlaceholder: "\u641C\u5C0B", primary: "\u4E3B\u5C0E\u89BD" },
487
+ imageViewer: { reset: "\u91CD\u8A2D", download: "\u4E0B\u8F09" }
467
488
  };
468
489
  var jaJP = {
469
490
  locale: "ja-JP",
@@ -487,13 +508,15 @@ var jaJP = {
487
508
  },
488
509
  timePicker: { am: "\u5348\u524D", pm: "\u5348\u5F8C" },
489
510
  pagination: { previous: "\u524D\u3078", next: "\u6B21\u3078" },
490
- modal: { close: "\u9589\u3058\u308B" },
511
+ modal: { close: "\u9589\u3058\u308B", maximize: "\u6700\u5927\u5316", restore: "\u5143\u306B\u623B\u3059" },
512
+ select: { placeholder: "\u9078\u629E" },
513
+ counterInput: { decrease: "\u6E1B\u3089\u3059", increase: "\u5897\u3084\u3059" },
491
514
  drawer: { close: "\u9589\u3058\u308B" },
492
515
  alert: { dismiss: "\u9589\u3058\u308B" },
493
516
  banner: { dismiss: "\u9589\u3058\u308B" },
494
517
  toast: { dismiss: "\u9589\u3058\u308B" },
495
518
  fileUpload: { clickToUpload: "\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9", orDragAndDrop: "\u307E\u305F\u306F\u30C9\u30E9\u30C3\u30B0\uFF06\u30C9\u30ED\u30C3\u30D7" },
496
- imageUpload: { label: "\u753B\u50CF\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9", remove: "\u524A\u9664" },
519
+ imageUpload: { label: "\u753B\u50CF\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9", remove: "\u524A\u9664", hint: "PNG \u307E\u305F\u306F JPG\u3001\u6700\u5927 5MB" },
497
520
  passwordStrength: { weak: "\u5F31\u3044", fair: "\u666E\u901A", good: "\u826F\u3044", strong: "\u5F37\u3044" },
498
521
  commandMenu: {
499
522
  placeholder: "\u30B3\u30DE\u30F3\u30C9\u3092\u5165\u529B\u307E\u305F\u306F\u691C\u7D22\u2026",
@@ -556,8 +579,17 @@ var jaJP = {
556
579
  previous: "\u524D\u3078",
557
580
  next: "\u6B21\u3078",
558
581
  pageRange: "{total} \u4EF6\u4E2D {from}\u2013{to}",
559
- perPage: "{size} \u4EF6 / \u30DA\u30FC\u30B8"
560
- }
582
+ perPage: "{size} \u4EF6 / \u30DA\u30FC\u30B8",
583
+ selectRow: "\u884C\u3092\u9078\u629E",
584
+ selectAll: "\u3059\u3079\u3066\u9078\u629E"
585
+ },
586
+ wizard: { back: "\uC774\uC804", next: "\uB2E4\uC74C", finish: "\uC644\uB8CC" },
587
+ a11y: { zoomIn: "\u62E1\u5927", zoomOut: "\u7E2E\u5C0F", rotate: "\u56DE\u8EE2", collapseStart: "\u958B\u59CB\u30D1\u30CD\u30EB\u3092\u6298\u308A\u305F\u305F\u3080", collapseEnd: "\u7D42\u4E86\u30D1\u30CD\u30EB\u3092\u6298\u308A\u305F\u305F\u3080", bulkActions: "\u4E00\u62EC\u64CD\u4F5C", clearSelection: "\u9078\u629E\u3092\u89E3\u9664", back: "\u623B\u308B" },
588
+ richEditor: { placeholder: "\u5185\u5BB9\u3092\u5165\u529B\u2026", editorLabel: "\u30EA\u30C3\u30C1\u30C6\u30AD\u30B9\u30C8\u30A8\u30C7\u30A3\u30BF\u30FC" },
589
+ copy: { label: "\u30B3\u30D4\u30FC" },
590
+ emojiPicker: { searchPlaceholder: "\u7D75\u6587\u5B57\u3092\u691C\u7D22", emptyText: "\u7D75\u6587\u5B57\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093", addReaction: "\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0" },
591
+ sidebar: { searchPlaceholder: "\u691C\u7D22", primary: "\u30E1\u30A4\u30F3\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3" },
592
+ imageViewer: { reset: "\u30EA\u30BB\u30C3\u30C8", download: "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9" }
561
593
  };
562
594
  var koKR = {
563
595
  locale: "ko-KR",
@@ -581,13 +613,15 @@ var koKR = {
581
613
  },
582
614
  timePicker: { am: "\uC624\uC804", pm: "\uC624\uD6C4" },
583
615
  pagination: { previous: "\uC774\uC804", next: "\uB2E4\uC74C" },
584
- modal: { close: "\uB2EB\uAE30" },
616
+ modal: { close: "\uB2EB\uAE30", maximize: "\uCD5C\uB300\uD654", restore: "\uBCF5\uC6D0" },
617
+ select: { placeholder: "\uC120\uD0DD" },
618
+ counterInput: { decrease: "\uAC10\uC18C", increase: "\uC99D\uAC00" },
585
619
  drawer: { close: "\uB2EB\uAE30" },
586
620
  alert: { dismiss: "\uB2EB\uAE30" },
587
621
  banner: { dismiss: "\uB2EB\uAE30" },
588
622
  toast: { dismiss: "\uB2EB\uAE30" },
589
623
  fileUpload: { clickToUpload: "\uD074\uB9AD\uD558\uC5EC \uC5C5\uB85C\uB4DC", orDragAndDrop: "\uB610\uB294 \uB4DC\uB798\uADF8 \uC564 \uB4DC\uB86D" },
590
- imageUpload: { label: "\uC774\uBBF8\uC9C0 \uC5C5\uB85C\uB4DC", remove: "\uC81C\uAC70" },
624
+ imageUpload: { label: "\uC774\uBBF8\uC9C0 \uC5C5\uB85C\uB4DC", remove: "\uC81C\uAC70", hint: "PNG \uB610\uB294 JPG, \uCD5C\uB300 5MB" },
591
625
  passwordStrength: { weak: "\uC57D\uD568", fair: "\uBCF4\uD1B5", good: "\uC591\uD638", strong: "\uAC15\uD568" },
592
626
  commandMenu: {
593
627
  placeholder: "\uBA85\uB839\uC5B4 \uC785\uB825 \uB610\uB294 \uAC80\uC0C9\u2026",
@@ -650,8 +684,17 @@ var koKR = {
650
684
  previous: "\uC774\uC804",
651
685
  next: "\uB2E4\uC74C",
652
686
  pageRange: "{total}\uAC1C \uC911 {from}\u2013{to}",
653
- perPage: "{size}\uAC1C / \uD398\uC774\uC9C0"
654
- }
687
+ perPage: "{size}\uAC1C / \uD398\uC774\uC9C0",
688
+ selectRow: "\uD589 \uC120\uD0DD",
689
+ selectAll: "\uC804\uCCB4 \uC120\uD0DD"
690
+ },
691
+ wizard: { back: "Retour", next: "Suivant", finish: "Terminer" },
692
+ a11y: { zoomIn: "\uD655\uB300", zoomOut: "\uCD95\uC18C", rotate: "\uD68C\uC804", collapseStart: "\uC2DC\uC791 \uD328\uB110 \uC811\uAE30", collapseEnd: "\uB05D \uD328\uB110 \uC811\uAE30", bulkActions: "\uC77C\uAD04 \uC791\uC5C5", clearSelection: "\uC120\uD0DD \uD574\uC81C", back: "\uB4A4\uB85C" },
693
+ richEditor: { placeholder: "\uB0B4\uC6A9\uC744 \uC785\uB825\u2026", editorLabel: "\uB9AC\uCE58 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30" },
694
+ copy: { label: "\uBCF5\uC0AC" },
695
+ emojiPicker: { searchPlaceholder: "\uC774\uBAA8\uC9C0 \uAC80\uC0C9", emptyText: "\uC774\uBAA8\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C", addReaction: "\uBC18\uC751 \uCD94\uAC00" },
696
+ sidebar: { searchPlaceholder: "\uAC80\uC0C9", primary: "\uAE30\uBCF8 \uD0D0\uC0C9" },
697
+ imageViewer: { reset: "\uC7AC\uC124\uC815", download: "\uB2E4\uC6B4\uB85C\uB4DC" }
655
698
  };
656
699
  var frFR = {
657
700
  locale: "fr-FR",
@@ -675,13 +718,15 @@ var frFR = {
675
718
  },
676
719
  timePicker: { am: "AM", pm: "PM" },
677
720
  pagination: { previous: "Pr\xE9c\xE9dent", next: "Suivant" },
678
- modal: { close: "Fermer" },
721
+ modal: { close: "Fermer", maximize: "Agrandir", restore: "Restaurer" },
722
+ select: { placeholder: "S\xE9lectionner" },
723
+ counterInput: { decrease: "Diminuer", increase: "Augmenter" },
679
724
  drawer: { close: "Fermer" },
680
725
  alert: { dismiss: "Fermer" },
681
726
  banner: { dismiss: "Fermer" },
682
727
  toast: { dismiss: "Fermer" },
683
728
  fileUpload: { clickToUpload: "Cliquez pour t\xE9l\xE9verser", orDragAndDrop: "ou glissez-d\xE9posez" },
684
- imageUpload: { label: "T\xE9l\xE9verser une image", remove: "Supprimer" },
729
+ imageUpload: { label: "T\xE9l\xE9verser une image", remove: "Supprimer", hint: "PNG ou JPG, jusqu'\xE0 5 Mo" },
685
730
  passwordStrength: { weak: "Faible", fair: "Moyen", good: "Bon", strong: "Fort" },
686
731
  commandMenu: {
687
732
  placeholder: "Tapez une commande ou recherchez\u2026",
@@ -744,8 +789,17 @@ var frFR = {
744
789
  previous: "Pr\xE9c\xE9dent",
745
790
  next: "Suivant",
746
791
  pageRange: "{from}\u2013{to} sur {total}",
747
- perPage: "{size} / page"
748
- }
792
+ perPage: "{size} / page",
793
+ selectRow: "S\xE9lectionner la ligne",
794
+ selectAll: "Tout s\xE9lectionner"
795
+ },
796
+ wizard: { back: "Zur\xFCck", next: "Weiter", finish: "Fertig" },
797
+ a11y: { zoomIn: "Zoom avant", zoomOut: "Zoom arri\xE8re", rotate: "Pivoter", collapseStart: "R\xE9duire le panneau de d\xE9but", collapseEnd: "R\xE9duire le panneau de fin", bulkActions: "Actions group\xE9es", clearSelection: "Effacer la s\xE9lection", back: "Retour" },
798
+ richEditor: { placeholder: "\xC9crivez quelque chose\u2026", editorLabel: "\xC9diteur de texte enrichi" },
799
+ copy: { label: "Copier" },
800
+ emojiPicker: { searchPlaceholder: "Rechercher un emoji", emptyText: "Aucun emoji trouv\xE9", addReaction: "Ajouter une r\xE9action" },
801
+ sidebar: { searchPlaceholder: "Rechercher", primary: "Navigation principale" },
802
+ imageViewer: { reset: "R\xE9initialiser", download: "T\xE9l\xE9charger" }
749
803
  };
750
804
  var deDE = {
751
805
  locale: "de-DE",
@@ -769,13 +823,15 @@ var deDE = {
769
823
  },
770
824
  timePicker: { am: "AM", pm: "PM" },
771
825
  pagination: { previous: "Zur\xFCck", next: "Weiter" },
772
- modal: { close: "Schlie\xDFen" },
826
+ modal: { close: "Schlie\xDFen", maximize: "Maximieren", restore: "Wiederherstellen" },
827
+ select: { placeholder: "Ausw\xE4hlen" },
828
+ counterInput: { decrease: "Verringern", increase: "Erh\xF6hen" },
773
829
  drawer: { close: "Schlie\xDFen" },
774
830
  alert: { dismiss: "Schlie\xDFen" },
775
831
  banner: { dismiss: "Schlie\xDFen" },
776
832
  toast: { dismiss: "Schlie\xDFen" },
777
833
  fileUpload: { clickToUpload: "Zum Hochladen klicken", orDragAndDrop: "oder per Drag & Drop" },
778
- imageUpload: { label: "Bild hochladen", remove: "Entfernen" },
834
+ imageUpload: { label: "Bild hochladen", remove: "Entfernen", hint: "PNG oder JPG, bis zu 5 MB" },
779
835
  passwordStrength: { weak: "Schwach", fair: "Mittel", good: "Gut", strong: "Stark" },
780
836
  commandMenu: {
781
837
  placeholder: "Befehl eingeben oder suchen\u2026",
@@ -838,8 +894,17 @@ var deDE = {
838
894
  previous: "Zur\xFCck",
839
895
  next: "Weiter",
840
896
  pageRange: "{from}\u2013{to} von {total}",
841
- perPage: "{size} / Seite"
842
- }
897
+ perPage: "{size} / Seite",
898
+ selectRow: "Zeile ausw\xE4hlen",
899
+ selectAll: "Alle ausw\xE4hlen"
900
+ },
901
+ wizard: { back: "Atr\xE1s", next: "Siguiente", finish: "Finalizar" },
902
+ a11y: { zoomIn: "Vergr\xF6\xDFern", zoomOut: "Verkleinern", rotate: "Drehen", collapseStart: "Startbereich einklappen", collapseEnd: "Endbereich einklappen", bulkActions: "Mehrfachaktionen", clearSelection: "Auswahl aufheben", back: "Zur\xFCck" },
903
+ richEditor: { placeholder: "Etwas eingeben\u2026", editorLabel: "Rich-Text-Editor" },
904
+ copy: { label: "Kopieren" },
905
+ emojiPicker: { searchPlaceholder: "Emoji suchen", emptyText: "Kein Emoji gefunden", addReaction: "Reaktion hinzuf\xFCgen" },
906
+ sidebar: { searchPlaceholder: "Suchen", primary: "Hauptnavigation" },
907
+ imageViewer: { reset: "Zur\xFCcksetzen", download: "Herunterladen" }
843
908
  };
844
909
  var esES = {
845
910
  locale: "es-ES",
@@ -863,13 +928,15 @@ var esES = {
863
928
  },
864
929
  timePicker: { am: "AM", pm: "PM" },
865
930
  pagination: { previous: "Anterior", next: "Siguiente" },
866
- modal: { close: "Cerrar" },
931
+ modal: { close: "Cerrar", maximize: "Maximizar", restore: "Restaurar" },
932
+ select: { placeholder: "Seleccionar" },
933
+ counterInput: { decrease: "Disminuir", increase: "Aumentar" },
867
934
  drawer: { close: "Cerrar" },
868
935
  alert: { dismiss: "Cerrar" },
869
936
  banner: { dismiss: "Cerrar" },
870
937
  toast: { dismiss: "Cerrar" },
871
938
  fileUpload: { clickToUpload: "Haz clic para subir", orDragAndDrop: "o arrastra y suelta" },
872
- imageUpload: { label: "Subir imagen", remove: "Eliminar" },
939
+ imageUpload: { label: "Subir imagen", remove: "Eliminar", hint: "PNG o JPG, hasta 5 MB" },
873
940
  passwordStrength: { weak: "D\xE9bil", fair: "Regular", good: "Buena", strong: "Fuerte" },
874
941
  commandMenu: {
875
942
  placeholder: "Escribe un comando o busca\u2026",
@@ -932,8 +999,17 @@ var esES = {
932
999
  previous: "Anterior",
933
1000
  next: "Siguiente",
934
1001
  pageRange: "{from}\u2013{to} de {total}",
935
- perPage: "{size} / p\xE1gina"
936
- }
1002
+ perPage: "{size} / p\xE1gina",
1003
+ selectRow: "Seleccionar fila",
1004
+ selectAll: "Seleccionar todo"
1005
+ },
1006
+ wizard: { back: "Voltar", next: "Avan\xE7ar", finish: "Concluir" },
1007
+ a11y: { zoomIn: "Acercar", zoomOut: "Alejar", rotate: "Girar", collapseStart: "Contraer panel inicial", collapseEnd: "Contraer panel final", bulkActions: "Acciones masivas", clearSelection: "Borrar selecci\xF3n", back: "Atr\xE1s" },
1008
+ richEditor: { placeholder: "Escribe algo\u2026", editorLabel: "Editor de texto enriquecido" },
1009
+ copy: { label: "Copiar" },
1010
+ emojiPicker: { searchPlaceholder: "Buscar emoji", emptyText: "No se encontraron emojis", addReaction: "A\xF1adir reacci\xF3n" },
1011
+ sidebar: { searchPlaceholder: "Buscar", primary: "Navegaci\xF3n principal" },
1012
+ imageViewer: { reset: "Restablecer", download: "Descargar" }
937
1013
  };
938
1014
  var ptBR = {
939
1015
  locale: "pt-BR",
@@ -957,13 +1033,15 @@ var ptBR = {
957
1033
  },
958
1034
  timePicker: { am: "AM", pm: "PM" },
959
1035
  pagination: { previous: "Anterior", next: "Pr\xF3ximo" },
960
- modal: { close: "Fechar" },
1036
+ modal: { close: "Fechar", maximize: "Maximizar", restore: "Restaurar" },
1037
+ select: { placeholder: "Selecionar" },
1038
+ counterInput: { decrease: "Diminuir", increase: "Aumentar" },
961
1039
  drawer: { close: "Fechar" },
962
1040
  alert: { dismiss: "Fechar" },
963
1041
  banner: { dismiss: "Fechar" },
964
1042
  toast: { dismiss: "Fechar" },
965
1043
  fileUpload: { clickToUpload: "Clique para enviar", orDragAndDrop: "ou arraste e solte" },
966
- imageUpload: { label: "Enviar imagem", remove: "Remover" },
1044
+ imageUpload: { label: "Enviar imagem", remove: "Remover", hint: "PNG ou JPG, at\xE9 5 MB" },
967
1045
  passwordStrength: { weak: "Fraca", fair: "Razo\xE1vel", good: "Boa", strong: "Forte" },
968
1046
  commandMenu: {
969
1047
  placeholder: "Digite um comando ou pesquise\u2026",
@@ -1026,8 +1104,17 @@ var ptBR = {
1026
1104
  previous: "Anterior",
1027
1105
  next: "Pr\xF3ximo",
1028
1106
  pageRange: "{from}\u2013{to} de {total}",
1029
- perPage: "{size} / p\xE1gina"
1030
- }
1107
+ perPage: "{size} / p\xE1gina",
1108
+ selectRow: "Selecionar linha",
1109
+ selectAll: "Selecionar tudo"
1110
+ },
1111
+ wizard: { back: "\u041D\u0430\u0437\u0430\u0434", next: "\u0414\u0430\u043B\u0435\u0435", finish: "\u0413\u043E\u0442\u043E\u0432\u043E" },
1112
+ a11y: { zoomIn: "Ampliar", zoomOut: "Reduzir", rotate: "Girar", collapseStart: "Recolher painel inicial", collapseEnd: "Recolher painel final", bulkActions: "A\xE7\xF5es em massa", clearSelection: "Limpar sele\xE7\xE3o", back: "Voltar" },
1113
+ richEditor: { placeholder: "Escreva algo\u2026", editorLabel: "Editor de texto rico" },
1114
+ copy: { label: "Copiar" },
1115
+ emojiPicker: { searchPlaceholder: "Pesquisar emoji", emptyText: "Nenhum emoji encontrado", addReaction: "Adicionar rea\xE7\xE3o" },
1116
+ sidebar: { searchPlaceholder: "Pesquisar", primary: "Navega\xE7\xE3o principal" },
1117
+ imageViewer: { reset: "Redefinir", download: "Baixar" }
1031
1118
  };
1032
1119
  var ruRU = {
1033
1120
  locale: "ru-RU",
@@ -1051,13 +1138,15 @@ var ruRU = {
1051
1138
  },
1052
1139
  timePicker: { am: "AM", pm: "PM" },
1053
1140
  pagination: { previous: "\u041D\u0430\u0437\u0430\u0434", next: "\u0412\u043F\u0435\u0440\u0451\u0434" },
1054
- modal: { close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C" },
1141
+ modal: { close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C", maximize: "\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C", restore: "\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C" },
1142
+ select: { placeholder: "\u0412\u044B\u0431\u0440\u0430\u0442\u044C" },
1143
+ counterInput: { decrease: "\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C", increase: "\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C" },
1055
1144
  drawer: { close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C" },
1056
1145
  alert: { dismiss: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C" },
1057
1146
  banner: { dismiss: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C" },
1058
1147
  toast: { dismiss: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C" },
1059
1148
  fileUpload: { clickToUpload: "\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438", orDragAndDrop: "\u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435" },
1060
- imageUpload: { label: "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", remove: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C" },
1149
+ imageUpload: { label: "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", remove: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C", hint: "PNG \u0438\u043B\u0438 JPG, \u0434\u043E 5 \u041C\u0411" },
1061
1150
  passwordStrength: { weak: "\u0421\u043B\u0430\u0431\u044B\u0439", fair: "\u0421\u0440\u0435\u0434\u043D\u0438\u0439", good: "\u0425\u043E\u0440\u043E\u0448\u0438\u0439", strong: "\u041D\u0430\u0434\u0451\u0436\u043D\u044B\u0439" },
1062
1151
  commandMenu: {
1063
1152
  placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0438\u043B\u0438 \u043F\u043E\u0438\u0441\u043A\u2026",
@@ -1120,8 +1209,17 @@ var ruRU = {
1120
1209
  previous: "\u041D\u0430\u0437\u0430\u0434",
1121
1210
  next: "\u0412\u043F\u0435\u0440\u0451\u0434",
1122
1211
  pageRange: "{from}\u2013{to} \u0438\u0437 {total}",
1123
- perPage: "{size} / \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430"
1124
- }
1212
+ perPage: "{size} / \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430",
1213
+ selectRow: "\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443",
1214
+ selectAll: "\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435"
1215
+ },
1216
+ wizard: { back: "\u0631\u062C\u0648\u0639", next: "\u0627\u0644\u062A\u0627\u0644\u064A", finish: "\u0625\u0646\u0647\u0627\u0621" },
1217
+ a11y: { zoomIn: "\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C", zoomOut: "\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C", rotate: "\u041F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u044C", collapseStart: "\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u043F\u0430\u043D\u0435\u043B\u044C", collapseEnd: "\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u043A\u043E\u043D\u0435\u0447\u043D\u0443\u044E \u043F\u0430\u043D\u0435\u043B\u044C", bulkActions: "\u041C\u0430\u0441\u0441\u043E\u0432\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F", clearSelection: "\u0421\u043D\u044F\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435", back: "\u041D\u0430\u0437\u0430\u0434" },
1218
+ richEditor: { placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u2026", editorLabel: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430" },
1219
+ copy: { label: "\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C" },
1220
+ emojiPicker: { searchPlaceholder: "\u041F\u043E\u0438\u0441\u043A \u044D\u043C\u043E\u0434\u0437\u0438", emptyText: "\u042D\u043C\u043E\u0434\u0437\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B", addReaction: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0435\u0430\u043A\u0446\u0438\u044E" },
1221
+ sidebar: { searchPlaceholder: "\u041F\u043E\u0438\u0441\u043A", primary: "\u041E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F" },
1222
+ imageViewer: { reset: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C", download: "\u0421\u043A\u0430\u0447\u0430\u0442\u044C" }
1125
1223
  };
1126
1224
  var arSA = {
1127
1225
  locale: "ar-SA",
@@ -1145,13 +1243,15 @@ var arSA = {
1145
1243
  },
1146
1244
  timePicker: { am: "\u0635", pm: "\u0645" },
1147
1245
  pagination: { previous: "\u0627\u0644\u0633\u0627\u0628\u0642", next: "\u0627\u0644\u062A\u0627\u0644\u064A" },
1148
- modal: { close: "\u0625\u063A\u0644\u0627\u0642" },
1246
+ modal: { close: "\u0625\u063A\u0644\u0627\u0642", maximize: "\u062A\u0643\u0628\u064A\u0631", restore: "\u0627\u0633\u062A\u0639\u0627\u062F\u0629" },
1247
+ select: { placeholder: "\u062A\u062D\u062F\u064A\u062F" },
1248
+ counterInput: { decrease: "\u062A\u0642\u0644\u064A\u0644", increase: "\u0632\u064A\u0627\u062F\u0629" },
1149
1249
  drawer: { close: "\u0625\u063A\u0644\u0627\u0642" },
1150
1250
  alert: { dismiss: "\u0625\u063A\u0644\u0627\u0642" },
1151
1251
  banner: { dismiss: "\u0625\u063A\u0644\u0627\u0642" },
1152
1252
  toast: { dismiss: "\u0625\u063A\u0644\u0627\u0642" },
1153
1253
  fileUpload: { clickToUpload: "\u0627\u0646\u0642\u0631 \u0644\u0644\u0631\u0641\u0639", orDragAndDrop: "\u0623\u0648 \u0627\u0633\u062D\u0628 \u0648\u0623\u0641\u0644\u062A" },
1154
- imageUpload: { label: "\u0631\u0641\u0639 \u0635\u0648\u0631\u0629", remove: "\u0625\u0632\u0627\u0644\u0629" },
1254
+ imageUpload: { label: "\u0631\u0641\u0639 \u0635\u0648\u0631\u0629", remove: "\u0625\u0632\u0627\u0644\u0629", hint: "PNG \u0623\u0648 JPG\u060C \u062D\u062A\u0649 5 \u0645\u064A\u062C\u0627\u0628\u0627\u064A\u062A" },
1155
1255
  passwordStrength: { weak: "\u0636\u0639\u064A\u0641", fair: "\u0645\u0642\u0628\u0648\u0644", good: "\u062C\u064A\u062F", strong: "\u0642\u0648\u064A" },
1156
1256
  commandMenu: {
1157
1257
  placeholder: "\u0627\u0643\u062A\u0628 \u0623\u0645\u0631\u064B\u0627 \u0623\u0648 \u0627\u0628\u062D\u062B\u2026",
@@ -1214,8 +1314,17 @@ var arSA = {
1214
1314
  previous: "\u0627\u0644\u0633\u0627\u0628\u0642",
1215
1315
  next: "\u0627\u0644\u062A\u0627\u0644\u064A",
1216
1316
  pageRange: "{from}\u2013{to} \u0645\u0646 {total}",
1217
- perPage: "{size} / \u0635\u0641\u062D\u0629"
1218
- }
1317
+ perPage: "{size} / \u0635\u0641\u062D\u0629",
1318
+ selectRow: "\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0635\u0641",
1319
+ selectAll: "\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0643\u0644"
1320
+ },
1321
+ wizard: { back: "Indietro", next: "Avanti", finish: "Fine" },
1322
+ a11y: { zoomIn: "\u062A\u0643\u0628\u064A\u0631", zoomOut: "\u062A\u0635\u063A\u064A\u0631", rotate: "\u062A\u062F\u0648\u064A\u0631", collapseStart: "\u0637\u064A \u0627\u0644\u0644\u0648\u062D\u0629 \u0627\u0644\u0623\u0648\u0644\u0649", collapseEnd: "\u0637\u064A \u0627\u0644\u0644\u0648\u062D\u0629 \u0627\u0644\u0623\u062E\u064A\u0631\u0629", bulkActions: "\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u062C\u0645\u0627\u0639\u064A\u0629", clearSelection: "\u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u062A\u062D\u062F\u064A\u062F", back: "\u0631\u062C\u0648\u0639" },
1323
+ richEditor: { placeholder: "\u0627\u0643\u062A\u0628 \u0634\u064A\u0626\u064B\u0627\u2026", editorLabel: "\u0645\u062D\u0631\u0631 \u0646\u0635 \u0645\u0646\u0633\u0642" },
1324
+ copy: { label: "\u0646\u0633\u062E" },
1325
+ emojiPicker: { searchPlaceholder: "\u0627\u0644\u0628\u062D\u062B \u0639\u0646 \u0631\u0645\u0632 \u062A\u0639\u0628\u064A\u0631\u064A", emptyText: "\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0631\u0645\u0648\u0632", addReaction: "\u0625\u0636\u0627\u0641\u0629 \u062A\u0641\u0627\u0639\u0644" },
1326
+ sidebar: { searchPlaceholder: "\u0628\u062D\u062B", primary: "\u0627\u0644\u062A\u0646\u0642\u0644 \u0627\u0644\u0631\u0626\u064A\u0633\u064A" },
1327
+ imageViewer: { reset: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646", download: "\u062A\u0646\u0632\u064A\u0644" }
1219
1328
  };
1220
1329
  var itIT = {
1221
1330
  locale: "it-IT",
@@ -1239,13 +1348,15 @@ var itIT = {
1239
1348
  },
1240
1349
  timePicker: { am: "AM", pm: "PM" },
1241
1350
  pagination: { previous: "Precedente", next: "Successivo" },
1242
- modal: { close: "Chiudi" },
1351
+ modal: { close: "Chiudi", maximize: "Ingrandisci", restore: "Ripristina" },
1352
+ select: { placeholder: "Seleziona" },
1353
+ counterInput: { decrease: "Diminuisci", increase: "Aumenta" },
1243
1354
  drawer: { close: "Chiudi" },
1244
1355
  alert: { dismiss: "Chiudi" },
1245
1356
  banner: { dismiss: "Chiudi" },
1246
1357
  toast: { dismiss: "Chiudi" },
1247
1358
  fileUpload: { clickToUpload: "Clicca per caricare", orDragAndDrop: "o trascina qui" },
1248
- imageUpload: { label: "Carica immagine", remove: "Rimuovi" },
1359
+ imageUpload: { label: "Carica immagine", remove: "Rimuovi", hint: "PNG o JPG, fino a 5 MB" },
1249
1360
  passwordStrength: { weak: "Debole", fair: "Discreta", good: "Buona", strong: "Forte" },
1250
1361
  commandMenu: {
1251
1362
  placeholder: "Digita un comando o cerca\u2026",
@@ -1308,8 +1419,17 @@ var itIT = {
1308
1419
  previous: "Precedente",
1309
1420
  next: "Successivo",
1310
1421
  pageRange: "{from}\u2013{to} di {total}",
1311
- perPage: "{size} / pagina"
1312
- }
1422
+ perPage: "{size} / pagina",
1423
+ selectRow: "Seleziona riga",
1424
+ selectAll: "Seleziona tutto"
1425
+ },
1426
+ wizard: { back: "Terug", next: "Volgende", finish: "Voltooien" },
1427
+ a11y: { zoomIn: "Ingrandisci", zoomOut: "Riduci", rotate: "Ruota", collapseStart: "Comprimi pannello iniziale", collapseEnd: "Comprimi pannello finale", bulkActions: "Azioni multiple", clearSelection: "Cancella selezione", back: "Indietro" },
1428
+ richEditor: { placeholder: "Scrivi qualcosa\u2026", editorLabel: "Editor di testo formattato" },
1429
+ copy: { label: "Copia" },
1430
+ emojiPicker: { searchPlaceholder: "Cerca emoji", emptyText: "Nessun emoji trovato", addReaction: "Aggiungi reazione" },
1431
+ sidebar: { searchPlaceholder: "Cerca", primary: "Navigazione principale" },
1432
+ imageViewer: { reset: "Reimposta", download: "Scarica" }
1313
1433
  };
1314
1434
  var nlNL = {
1315
1435
  locale: "nl-NL",
@@ -1333,13 +1453,15 @@ var nlNL = {
1333
1453
  },
1334
1454
  timePicker: { am: "AM", pm: "PM" },
1335
1455
  pagination: { previous: "Vorige", next: "Volgende" },
1336
- modal: { close: "Sluiten" },
1456
+ modal: { close: "Sluiten", maximize: "maximaliseren", restore: "Herstellen" },
1457
+ select: { placeholder: "Selecteren" },
1458
+ counterInput: { decrease: "Verlagen", increase: "Verhogen" },
1337
1459
  drawer: { close: "Sluiten" },
1338
1460
  alert: { dismiss: "Sluiten" },
1339
1461
  banner: { dismiss: "Sluiten" },
1340
1462
  toast: { dismiss: "Sluiten" },
1341
1463
  fileUpload: { clickToUpload: "Klik om te uploaden", orDragAndDrop: "of sleep hierheen" },
1342
- imageUpload: { label: "Afbeelding uploaden", remove: "Verwijderen" },
1464
+ imageUpload: { label: "Afbeelding uploaden", remove: "Verwijderen", hint: "PNG of JPG, max. 5 MB" },
1343
1465
  passwordStrength: { weak: "Zwak", fair: "Redelijk", good: "Goed", strong: "Sterk" },
1344
1466
  commandMenu: {
1345
1467
  placeholder: "Typ een opdracht of zoek\u2026",
@@ -1402,8 +1524,17 @@ var nlNL = {
1402
1524
  previous: "Vorige",
1403
1525
  next: "Volgende",
1404
1526
  pageRange: "{from}\u2013{to} van {total}",
1405
- perPage: "{size} / pagina"
1406
- }
1527
+ perPage: "{size} / pagina",
1528
+ selectRow: "Rij selecteren",
1529
+ selectAll: "Alles selecteren"
1530
+ },
1531
+ wizard: { back: "Wstecz", next: "Dalej", finish: "Zako\u0144cz" },
1532
+ a11y: { zoomIn: "Inzoomen", zoomOut: "Uitzoomen", rotate: "Roteren", collapseStart: "Startpaneel samenvouwen", collapseEnd: "Eindpaneel samenvouwen", bulkActions: "Bulkacties", clearSelection: "Selectie wissen", back: "Terug" },
1533
+ richEditor: { placeholder: "Schrijf iets\u2026", editorLabel: "Rich text-editor" },
1534
+ copy: { label: "Kopi\xEBren" },
1535
+ emojiPicker: { searchPlaceholder: "Emoji zoeken", emptyText: "Geen emoji gevonden", addReaction: "Reactie toevoegen" },
1536
+ sidebar: { searchPlaceholder: "Zoeken", primary: "Hoofdnavigatie" },
1537
+ imageViewer: { reset: "Herstellen", download: "Downloaden" }
1407
1538
  };
1408
1539
  var plPL = {
1409
1540
  locale: "pl-PL",
@@ -1427,13 +1558,15 @@ var plPL = {
1427
1558
  },
1428
1559
  timePicker: { am: "AM", pm: "PM" },
1429
1560
  pagination: { previous: "Poprzednia", next: "Nast\u0119pna" },
1430
- modal: { close: "Zamknij" },
1561
+ modal: { close: "Zamknij", maximize: "Maksymalizuj", restore: "Przywr\xF3\u0107" },
1562
+ select: { placeholder: "Wybierz" },
1563
+ counterInput: { decrease: "Zmniejsz", increase: "Zwi\u0119ksz" },
1431
1564
  drawer: { close: "Zamknij" },
1432
1565
  alert: { dismiss: "Zamknij" },
1433
1566
  banner: { dismiss: "Zamknij" },
1434
1567
  toast: { dismiss: "Zamknij" },
1435
1568
  fileUpload: { clickToUpload: "Kliknij, aby przes\u0142a\u0107", orDragAndDrop: "lub przeci\u0105gnij i upu\u015B\u0107" },
1436
- imageUpload: { label: "Prze\u015Blij obraz", remove: "Usu\u0144" },
1569
+ imageUpload: { label: "Prze\u015Blij obraz", remove: "Usu\u0144", hint: "PNG lub JPG, do 5 MB" },
1437
1570
  passwordStrength: { weak: "S\u0142abe", fair: "\u015Arednie", good: "Dobre", strong: "Silne" },
1438
1571
  commandMenu: {
1439
1572
  placeholder: "Wpisz polecenie lub szukaj\u2026",
@@ -1496,8 +1629,17 @@ var plPL = {
1496
1629
  previous: "Poprzednia",
1497
1630
  next: "Nast\u0119pna",
1498
1631
  pageRange: "{from}\u2013{to} z {total}",
1499
- perPage: "{size} / strona"
1500
- }
1632
+ perPage: "{size} / strona",
1633
+ selectRow: "Zaznacz wiersz",
1634
+ selectAll: "Zaznacz wszystko"
1635
+ },
1636
+ wizard: { back: "Geri", next: "\u0130leri", finish: "Bitir" },
1637
+ a11y: { zoomIn: "Powi\u0119ksz", zoomOut: "Pomniejsz", rotate: "Obr\xF3\u0107", collapseStart: "Zwi\u0144 panel pocz\u0105tkowy", collapseEnd: "Zwi\u0144 panel ko\u0144cowy", bulkActions: "Akcje zbiorcze", clearSelection: "Wyczy\u015B\u0107 zaznaczenie", back: "Wstecz" },
1638
+ richEditor: { placeholder: "Wpisz co\u015B\u2026", editorLabel: "Edytor tekstu sformatowanego" },
1639
+ copy: { label: "Kopiuj" },
1640
+ emojiPicker: { searchPlaceholder: "Szukaj emoji", emptyText: "Nie znaleziono emoji", addReaction: "Dodaj reakcj\u0119" },
1641
+ sidebar: { searchPlaceholder: "Szukaj", primary: "Nawigacja g\u0142\xF3wna" },
1642
+ imageViewer: { reset: "Resetuj", download: "Pobierz" }
1501
1643
  };
1502
1644
  var trTR = {
1503
1645
  locale: "tr-TR",
@@ -1521,13 +1663,15 @@ var trTR = {
1521
1663
  },
1522
1664
  timePicker: { am: "\xD6\xD6", pm: "\xD6S" },
1523
1665
  pagination: { previous: "\xD6nceki", next: "Sonraki" },
1524
- modal: { close: "Kapat" },
1666
+ modal: { close: "Kapat", maximize: "Ekran\u0131 kapla", restore: "Geri y\xFCkle" },
1667
+ select: { placeholder: "Se\xE7" },
1668
+ counterInput: { decrease: "Azalt", increase: "Art\u0131r" },
1525
1669
  drawer: { close: "Kapat" },
1526
1670
  alert: { dismiss: "Kapat" },
1527
1671
  banner: { dismiss: "Kapat" },
1528
1672
  toast: { dismiss: "Kapat" },
1529
1673
  fileUpload: { clickToUpload: "Y\xFCklemek i\xE7in t\u0131klay\u0131n", orDragAndDrop: "veya s\xFCr\xFCkleyip b\u0131rak\u0131n" },
1530
- imageUpload: { label: "G\xF6rsel y\xFCkle", remove: "Kald\u0131r" },
1674
+ imageUpload: { label: "G\xF6rsel y\xFCkle", remove: "Kald\u0131r", hint: "PNG veya JPG, en fazla 5 MB" },
1531
1675
  passwordStrength: { weak: "Zay\u0131f", fair: "Orta", good: "\u0130yi", strong: "G\xFC\xE7l\xFC" },
1532
1676
  commandMenu: {
1533
1677
  placeholder: "Bir komut yaz\u0131n veya aray\u0131n\u2026",
@@ -1590,8 +1734,17 @@ var trTR = {
1590
1734
  previous: "\xD6nceki",
1591
1735
  next: "Sonraki",
1592
1736
  pageRange: "{total} \xF6\u011Feden {from}\u2013{to}",
1593
- perPage: "{size} / sayfa"
1594
- }
1737
+ perPage: "{size} / sayfa",
1738
+ selectRow: "Sat\u0131r\u0131 se\xE7",
1739
+ selectAll: "T\xFCm\xFCn\xFC se\xE7"
1740
+ },
1741
+ wizard: { back: "Quay l\u1EA1i", next: "Ti\u1EBFp theo", finish: "Ho\xE0n t\u1EA5t" },
1742
+ a11y: { zoomIn: "Yak\u0131nla\u015Ft\u0131r", zoomOut: "Uzakla\u015Ft\u0131r", rotate: "D\xF6nd\xFCr", collapseStart: "Ba\u015Flang\u0131\xE7 panelini daralt", collapseEnd: "Biti\u015F panelini daralt", bulkActions: "Toplu i\u015Flemler", clearSelection: "Se\xE7imi temizle", back: "Geri" },
1743
+ richEditor: { placeholder: "Bir \u015Feyler yaz\u0131n\u2026", editorLabel: "Zengin metin d\xFCzenleyici" },
1744
+ copy: { label: "Kopyala" },
1745
+ emojiPicker: { searchPlaceholder: "Emoji ara", emptyText: "Emoji bulunamad\u0131", addReaction: "Tepki ekle" },
1746
+ sidebar: { searchPlaceholder: "Ara", primary: "Ana gezinme" },
1747
+ imageViewer: { reset: "S\u0131f\u0131rla", download: "\u0130ndir" }
1595
1748
  };
1596
1749
  var viVN = {
1597
1750
  locale: "vi-VN",
@@ -1615,13 +1768,15 @@ var viVN = {
1615
1768
  },
1616
1769
  timePicker: { am: "SA", pm: "CH" },
1617
1770
  pagination: { previous: "Tr\u01B0\u1EDBc", next: "Sau" },
1618
- modal: { close: "\u0110\xF3ng" },
1771
+ modal: { close: "\u0110\xF3ng", maximize: "Ph\xF3ng to", restore: "Kh\xF4i ph\u1EE5c" },
1772
+ select: { placeholder: "Ch\u1ECDn" },
1773
+ counterInput: { decrease: "Gi\u1EA3m", increase: "T\u0103ng" },
1619
1774
  drawer: { close: "\u0110\xF3ng" },
1620
1775
  alert: { dismiss: "\u0110\xF3ng" },
1621
1776
  banner: { dismiss: "\u0110\xF3ng" },
1622
1777
  toast: { dismiss: "\u0110\xF3ng" },
1623
1778
  fileUpload: { clickToUpload: "Nh\u1EA5p \u0111\u1EC3 t\u1EA3i l\xEAn", orDragAndDrop: "ho\u1EB7c k\xE9o v\xE0 th\u1EA3" },
1624
- imageUpload: { label: "T\u1EA3i \u1EA3nh l\xEAn", remove: "X\xF3a" },
1779
+ imageUpload: { label: "T\u1EA3i \u1EA3nh l\xEAn", remove: "X\xF3a", hint: "PNG ho\u1EB7c JPG, t\u1ED1i \u0111a 5MB" },
1625
1780
  passwordStrength: { weak: "Y\u1EBFu", fair: "Trung b\xECnh", good: "T\u1ED1t", strong: "M\u1EA1nh" },
1626
1781
  commandMenu: {
1627
1782
  placeholder: "Nh\u1EADp l\u1EC7nh ho\u1EB7c t\xECm ki\u1EBFm\u2026",
@@ -1684,8 +1839,17 @@ var viVN = {
1684
1839
  previous: "Tr\u01B0\u1EDBc",
1685
1840
  next: "Sau",
1686
1841
  pageRange: "{from}\u2013{to} trong {total}",
1687
- perPage: "{size} / trang"
1688
- }
1842
+ perPage: "{size} / trang",
1843
+ selectRow: "Ch\u1ECDn h\xE0ng",
1844
+ selectAll: "Ch\u1ECDn t\u1EA5t c\u1EA3"
1845
+ },
1846
+ wizard: { back: "Kembali", next: "Berikutnya", finish: "Selesai" },
1847
+ a11y: { zoomIn: "Ph\xF3ng to", zoomOut: "Thu nh\u1ECF", rotate: "Xoay", collapseStart: "Thu g\u1ECDn b\u1EA3ng \u0111\u1EA7u", collapseEnd: "Thu g\u1ECDn b\u1EA3ng cu\u1ED1i", bulkActions: "Thao t\xE1c h\xE0ng lo\u1EA1t", clearSelection: "B\u1ECF ch\u1ECDn", back: "Quay l\u1EA1i" },
1848
+ richEditor: { placeholder: "Vi\u1EBFt n\u1ED9i dung\u2026", editorLabel: "Tr\xECnh so\u1EA1n th\u1EA3o v\u0103n b\u1EA3n" },
1849
+ copy: { label: "Sao ch\xE9p" },
1850
+ emojiPicker: { searchPlaceholder: "T\xECm emoji", emptyText: "Kh\xF4ng t\xECm th\u1EA5y emoji", addReaction: "Th\xEAm c\u1EA3m x\xFAc" },
1851
+ sidebar: { searchPlaceholder: "T\xECm ki\u1EBFm", primary: "\u0110i\u1EC1u h\u01B0\u1EDBng ch\xEDnh" },
1852
+ imageViewer: { reset: "\u0110\u1EB7t l\u1EA1i", download: "T\u1EA3i xu\u1ED1ng" }
1689
1853
  };
1690
1854
  var idID = {
1691
1855
  locale: "id-ID",
@@ -1709,13 +1873,15 @@ var idID = {
1709
1873
  },
1710
1874
  timePicker: { am: "AM", pm: "PM" },
1711
1875
  pagination: { previous: "Sebelumnya", next: "Berikutnya" },
1712
- modal: { close: "Tutup" },
1876
+ modal: { close: "Tutup", maximize: "Maksimalkan", restore: "Pulihkan" },
1877
+ select: { placeholder: "Pilih" },
1878
+ counterInput: { decrease: "Kurangi", increase: "Tambah" },
1713
1879
  drawer: { close: "Tutup" },
1714
1880
  alert: { dismiss: "Tutup" },
1715
1881
  banner: { dismiss: "Tutup" },
1716
1882
  toast: { dismiss: "Tutup" },
1717
1883
  fileUpload: { clickToUpload: "Klik untuk mengunggah", orDragAndDrop: "atau seret dan lepas" },
1718
- imageUpload: { label: "Unggah gambar", remove: "Hapus" },
1884
+ imageUpload: { label: "Unggah gambar", remove: "Hapus", hint: "PNG atau JPG, maks. 5 MB" },
1719
1885
  passwordStrength: { weak: "Lemah", fair: "Cukup", good: "Baik", strong: "Kuat" },
1720
1886
  commandMenu: {
1721
1887
  placeholder: "Ketik perintah atau cari\u2026",
@@ -1778,8 +1944,17 @@ var idID = {
1778
1944
  previous: "Sebelumnya",
1779
1945
  next: "Berikutnya",
1780
1946
  pageRange: "{from}\u2013{to} dari {total}",
1781
- perPage: "{size} / halaman"
1782
- }
1947
+ perPage: "{size} / halaman",
1948
+ selectRow: "Pilih baris",
1949
+ selectAll: "Pilih semua"
1950
+ },
1951
+ wizard: { back: "Kembali", next: "Berikutnya", finish: "Selesai" },
1952
+ a11y: { zoomIn: "Perbesar", zoomOut: "Perkecil", rotate: "Putar", collapseStart: "Ciutkan panel awal", collapseEnd: "Ciutkan panel akhir", bulkActions: "Tindakan massal", clearSelection: "Hapus pilihan", back: "Kembali" },
1953
+ richEditor: { placeholder: "Tulis sesuatu\u2026", editorLabel: "Editor teks kaya" },
1954
+ copy: { label: "Salin" },
1955
+ emojiPicker: { searchPlaceholder: "Cari emoji", emptyText: "Emoji tidak ditemukan", addReaction: "Tambahkan reaksi" },
1956
+ sidebar: { searchPlaceholder: "Cari", primary: "Navigasi utama" },
1957
+ imageViewer: { reset: "Setel ulang", download: "Unduh" }
1783
1958
  };
1784
1959
  var locales = {
1785
1960
  enUS,
@@ -1800,6 +1975,275 @@ var locales = {
1800
1975
  viVN,
1801
1976
  idID
1802
1977
  };
1978
+
1979
+ // src/components/config/size.ts
1980
+ var SIZE_CONTRACTS = {
1981
+ /* ── 控件族:跟随全局档位,且自有档位 = 规范档位 ── */
1982
+ Button: {
1983
+ scale: ["tiny", "xsmall", "small", "medium", "large"],
1984
+ fallback: "medium",
1985
+ fromGlobal: { small: "small", medium: "medium", large: "large" },
1986
+ tiers: { xsmall: "xsmall", small: "small", medium: "medium", large: "large" },
1987
+ // 同一个文件里还有 fancy / compact / link 三种按钮刻度(KDS §2.4 的显式附属动作)
1988
+ extraScales: [
1989
+ ["small", "medium", "large"],
1990
+ ["small", "medium"]
1991
+ ]
1992
+ },
1993
+ ButtonGroup: {
1994
+ scale: ["small", "medium", "large"],
1995
+ fallback: "medium",
1996
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
1997
+ },
1998
+ Input: {
1999
+ scale: ["xsmall", "small", "medium", "large"],
2000
+ fallback: "medium",
2001
+ fromGlobal: { small: "small", medium: "medium", large: "large" },
2002
+ tiers: { xsmall: "xsmall", small: "small", medium: "medium", large: "large" }
2003
+ },
2004
+ Select: {
2005
+ scale: ["xsmall", "small", "medium", "large"],
2006
+ fallback: "medium",
2007
+ fromGlobal: { small: "small", medium: "medium", large: "large" },
2008
+ tiers: { xsmall: "xsmall", small: "small", medium: "medium", large: "large" }
2009
+ },
2010
+ Textarea: {
2011
+ scale: ["xsmall", "small", "medium", "large"],
2012
+ fallback: "medium",
2013
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2014
+ },
2015
+ AutoComplete: {
2016
+ scale: ["small", "medium", "large"],
2017
+ fallback: "medium",
2018
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2019
+ },
2020
+ Cascader: {
2021
+ scale: ["small", "medium", "large"],
2022
+ fallback: "medium",
2023
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2024
+ },
2025
+ SelectMenu: {
2026
+ scale: ["small", "medium", "large"],
2027
+ fallback: "medium",
2028
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2029
+ },
2030
+ CounterInput: {
2031
+ scale: ["small", "medium", "large"],
2032
+ fallback: "medium",
2033
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2034
+ },
2035
+ DigitInput: {
2036
+ scale: ["small", "medium", "large"],
2037
+ fallback: "medium",
2038
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2039
+ },
2040
+ CronEditor: {
2041
+ scale: ["small", "medium"],
2042
+ fallback: "medium",
2043
+ fromGlobal: { small: "small", medium: "medium", large: "medium" }
2044
+ },
2045
+ Checkbox: {
2046
+ scale: ["small", "medium", "large"],
2047
+ fallback: "medium",
2048
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2049
+ },
2050
+ Radio: {
2051
+ scale: ["small", "medium", "large"],
2052
+ fallback: "medium",
2053
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2054
+ },
2055
+ Switch: {
2056
+ scale: ["small", "medium", "large"],
2057
+ fallback: "medium",
2058
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2059
+ },
2060
+ Slider: {
2061
+ scale: ["small", "medium", "large"],
2062
+ fallback: "medium",
2063
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2064
+ },
2065
+ RangeSlider: {
2066
+ scale: ["sm", "md", "lg"],
2067
+ fallback: "md",
2068
+ fromGlobal: { small: "sm", medium: "md", large: "lg" },
2069
+ tiers: { small: "sm", medium: "md", large: "lg" }
2070
+ },
2071
+ ColorSlider: {
2072
+ scale: ["small", "medium", "large"],
2073
+ fallback: "medium",
2074
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2075
+ },
2076
+ HorizontalFilter: {
2077
+ scale: ["small", "medium"],
2078
+ fallback: "medium",
2079
+ fromGlobal: { small: "small", medium: "medium", large: "medium" }
2080
+ },
2081
+ CompactSelect: {
2082
+ scale: ["xsmall", "small", "medium"],
2083
+ fallback: "small",
2084
+ fromGlobal: { small: "small", medium: "medium", large: "medium" }
2085
+ },
2086
+ CompactSelectForInput: {
2087
+ scale: ["small", "medium", "large"],
2088
+ fallback: "small",
2089
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2090
+ },
2091
+ ColorDot: {
2092
+ scale: ["sm", "md", "lg"],
2093
+ fallback: "md",
2094
+ fromGlobal: { small: "sm", medium: "md", large: "lg" },
2095
+ tiers: { small: "sm", medium: "md", large: "lg" }
2096
+ },
2097
+ /* ── 信息/展示族:跟随全局档位,但档位刻意比控件少 ── */
2098
+ Badge: {
2099
+ scale: ["small", "medium"],
2100
+ fallback: "medium",
2101
+ fromGlobal: { small: "small", medium: "medium", large: "medium" },
2102
+ tiers: { xsmall: "small", small: "small", medium: "medium", large: "medium" }
2103
+ },
2104
+ StatusBadge: {
2105
+ scale: ["small", "medium"],
2106
+ fallback: "medium",
2107
+ fromGlobal: { small: "small", medium: "medium", large: "medium" }
2108
+ },
2109
+ ChartLegend: {
2110
+ scale: ["sm", "md"],
2111
+ fallback: "md",
2112
+ fromGlobal: { small: "sm", medium: "md", large: "md" }
2113
+ },
2114
+ ContentLabel: {
2115
+ scale: ["sm", "md"],
2116
+ fallback: "md",
2117
+ fromGlobal: { small: "sm", medium: "md", large: "md" }
2118
+ },
2119
+ GaugeBar: {
2120
+ scale: ["sm", "md", "lg"],
2121
+ fallback: "md",
2122
+ fromGlobal: { small: "sm", medium: "md", large: "lg" }
2123
+ },
2124
+ KeyIcon: {
2125
+ scale: ["xs", "sm", "md", "lg", "xl"],
2126
+ fallback: "md",
2127
+ fromGlobal: { small: "sm", medium: "md", large: "lg" }
2128
+ },
2129
+ Money: {
2130
+ scale: ["sm", "md", "lg", "big"],
2131
+ fallback: "md",
2132
+ fromGlobal: { small: "sm", medium: "md", large: "lg" }
2133
+ },
2134
+ StatusDot: {
2135
+ scale: ["xs", "sm", "md", "lg"],
2136
+ fallback: "sm",
2137
+ fromGlobal: { small: "sm", medium: "md", large: "lg" }
2138
+ },
2139
+ Item: {
2140
+ scale: ["default", "small", "xsmall"],
2141
+ fallback: "default",
2142
+ fromGlobal: { small: "small", medium: "default", large: "default" }
2143
+ },
2144
+ Toggle: {
2145
+ scale: ["small", "medium", "large"],
2146
+ fallback: "medium",
2147
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2148
+ },
2149
+ CopyButton: {
2150
+ scale: ["sm", "md", "lg"],
2151
+ fallback: "md",
2152
+ fromGlobal: { small: "sm", medium: "md", large: "lg" }
2153
+ },
2154
+ CheckboxGroup: {
2155
+ scale: ["small", "medium", "large"],
2156
+ fallback: "medium",
2157
+ fromGlobal: { small: "small", medium: "medium", large: "large" },
2158
+ inherits: "Checkbox"
2159
+ },
2160
+ Statistic: {
2161
+ scale: ["small", "medium", "large"],
2162
+ fallback: "medium",
2163
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2164
+ },
2165
+ Descriptions: {
2166
+ scale: ["small", "medium", "large"],
2167
+ fallback: "medium",
2168
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2169
+ },
2170
+ List: {
2171
+ scale: ["small", "medium", "large"],
2172
+ fallback: "medium",
2173
+ fromGlobal: { small: "small", medium: "medium", large: "large" }
2174
+ },
2175
+ /* ── 组件自有刻度:不跟随全局档位,理由必须写清 ── */
2176
+ Avatar: {
2177
+ scale: ["20", "24", "32", "40", "48", "56", "64", "72", "80"],
2178
+ fallback: "40",
2179
+ exempt: "\u5C3A\u5BF8\u5373\u50CF\u7D20\u523B\u5EA6\uFF08\u540C MUI/Ant \u7684 Avatar size:number \u53E3\u5F84\uFF09\uFF0C9 \u6863\u8986\u76D6\u5934\u50CF\u5806\u53E0\u7684\u5168\u90E8\u7528\u6CD5\uFF1B\u63A5\u5168\u5C40\u6863\u4F4D\u4F1A\u628A 40px \u5934\u50CF\u5728\u4E24\u6863\u4E4B\u95F4\u8DF3\u53D8\uFF0C\u5C5E\u7834\u574F\u6027\u89C6\u89C9\u53D8\u66F4\uFF0C\u987B\u5355\u72EC\u51B3\u8BAE\u3002"
2180
+ },
2181
+ ActorAvatar: {
2182
+ scale: ["20", "24", "32", "40", "56"],
2183
+ fallback: "24",
2184
+ exempt: "\u540C Avatar\uFF1A\u50CF\u7D20\u523B\u5EA6\uFF0C\u4E0D\u662F\u63A7\u4EF6\u6863\u4F4D\u3002"
2185
+ },
2186
+ AvatarGroup: {
2187
+ scale: ["24", "32", "40", "48"],
2188
+ fallback: "40",
2189
+ exempt: "\u540C Avatar\uFF1A\u50CF\u7D20\u523B\u5EA6\uFF08\u51B3\u5B9A\u53E0\u52A0\u5934\u50CF\u4E0E +N \u5FBD\u6807\u7684\u76F4\u5F84\uFF09\u3002"
2190
+ },
2191
+ Space: {
2192
+ scale: ["none", "xs", "sm", "md", "lg", "xl", "2xl"],
2193
+ fallback: "md",
2194
+ exempt: "\u8FD9\u662F**\u95F4\u8DDD\u523B\u5EA6**\uFF08gap\uFF09\uFF0C\u4E0D\u662F\u63A7\u4EF6\u5C3A\u5BF8\uFF1BKDS \xA71.4 \u7684\u7A7A\u95F4\u9636\u4E0E\u63A7\u4EF6\u6863\u4F4D\u662F\u4E24\u6761\u8F74\u3002"
2195
+ },
2196
+ InputGroup: {
2197
+ scale: ["xsmall", "icon-xsmall", "icon-small"],
2198
+ fallback: "xsmall",
2199
+ exempt: "\u8BE5 size \u63CF\u8FF0\u7684\u662F\u7EC4\u5185\u5D4C\u6309\u94AE\u7684\u53D8\u4F53\uFF08\u542B icon-* \u5F62\u6001\uFF09\uFF0C\u4E0D\u662F\u63A7\u4EF6\u9AD8\u5EA6\u6863\u4F4D\u3002"
2200
+ },
2201
+ Drawer: {
2202
+ scale: ["default", "large"],
2203
+ fallback: "default",
2204
+ exempt: "\u5BBD\u5EA6\u6863\u4F4D\uFF08480/640/800 \u53E3\u5F84\uFF09\uFF0C\u4E0D\u662F\u63A7\u4EF6\u5C3A\u5BF8\uFF1B\u6D6E\u5C42\u5BBD\u5EA6\u7531\u4EFB\u52A1\u51B3\u5B9A\uFF0C\u4E0D\u968F\u5168\u5C40 size \u6F02\u79FB\u3002"
2205
+ },
2206
+ CircularProgress: {
2207
+ scale: ["number"],
2208
+ fallback: "number",
2209
+ exempt: "\u6570\u503C\u76F4\u5F84\uFF08px\uFF09\uFF0C\u7531\u8C03\u7528\u65B9\u6309\u5BB9\u5668\u7ED9\u5B9A\u3002"
2210
+ },
2211
+ ImageUpload: {
2212
+ scale: ["number"],
2213
+ fallback: "number",
2214
+ exempt: "\u6570\u503C\u8FB9\u957F\uFF08px\uFF09\uFF0C\u7531\u8C03\u7528\u65B9\u6309\u5BB9\u5668\u7ED9\u5B9A\u3002"
2215
+ },
2216
+ Rating: {
2217
+ scale: ["number"],
2218
+ fallback: "number",
2219
+ exempt: "\u6570\u503C\u661F\u6807\u5B57\u53F7\uFF08px\uFF09\u3002"
2220
+ },
2221
+ Spinner: {
2222
+ scale: ["number"],
2223
+ fallback: "number",
2224
+ exempt: "\u6570\u503C\u76F4\u5F84\uFF08px\uFF09\uFF1B\u547D\u540D\u6863\u4F4D\u89C1 SpinnerSize\uFF0C\u7531\u8C03\u7528\u65B9\u6309\u5BB9\u5668\u9009\u5B9A\u3002"
2225
+ },
2226
+ Splitter: {
2227
+ scale: ["number"],
2228
+ fallback: "number",
2229
+ exempt: "\u5206\u5272\u6761\u539A\u5EA6/\u5C3A\u5BF8\uFF0C\u63A5\u53D7\u6570\u503C\u6216 CSS \u957F\u5EA6\uFF0C\u5C5E\u5E03\u5C40\u91CF\u800C\u975E\u63A7\u4EF6\u6863\u4F4D\u3002"
2230
+ }
2231
+ };
2232
+ function resolveSize(name, explicit, global) {
2233
+ const contract = SIZE_CONTRACTS[name];
2234
+ if (explicit !== void 0) return explicit;
2235
+ if (global && contract.fromGlobal) {
2236
+ const mapped = contract.fromGlobal[global];
2237
+ if (mapped !== void 0) return mapped;
2238
+ }
2239
+ return contract.fallback;
2240
+ }
2241
+ function tierOf(name, tier) {
2242
+ const contract = SIZE_CONTRACTS[name];
2243
+ if (contract.tiers?.[tier]) return contract.tiers[tier];
2244
+ const entry = Object.entries(contract.fromGlobal ?? {}).find(([g]) => g === tier);
2245
+ return entry ? entry[1] : void 0;
2246
+ }
1803
2247
  var DEFAULT_CONFIG = {
1804
2248
  locale: enUS,
1805
2249
  size: void 0,
@@ -1875,6 +2319,7 @@ function ConfigProvider({
1875
2319
  {
1876
2320
  className: "klun-config",
1877
2321
  dir: value.dir,
2322
+ lang: (value.locale ?? enUS).locale,
1878
2323
  "data-theme": value.theme,
1879
2324
  "data-mode": value.accent,
1880
2325
  "data-radius": value.radius && value.radius !== "default" ? value.radius : void 0,
@@ -1901,6 +2346,41 @@ function useMappedSize(explicit, map, fallback) {
1901
2346
  if (size !== void 0) return map[size];
1902
2347
  return fallback;
1903
2348
  }
2349
+ function useScaleSize(name, explicit) {
2350
+ const { size } = react.useContext(ConfigContext);
2351
+ return resolveSize(name, explicit, size);
2352
+ }
2353
+ function domDensity() {
2354
+ if (typeof document === "undefined") return void 0;
2355
+ const v = document.documentElement.dataset.density;
2356
+ return v === "compact" || v === "default" || v === "kk" ? v : void 0;
2357
+ }
2358
+ var densityObserver = null;
2359
+ var densityListeners = /* @__PURE__ */ new Set();
2360
+ function subscribeDensity(cb) {
2361
+ densityListeners.add(cb);
2362
+ if (!densityObserver && typeof MutationObserver !== "undefined" && typeof document !== "undefined") {
2363
+ densityObserver = new MutationObserver(() => {
2364
+ for (const l of densityListeners) l();
2365
+ });
2366
+ densityObserver.observe(document.documentElement, {
2367
+ attributes: true,
2368
+ attributeFilter: ["data-density"]
2369
+ });
2370
+ }
2371
+ return () => {
2372
+ densityListeners.delete(cb);
2373
+ if (!densityListeners.size && densityObserver) {
2374
+ densityObserver.disconnect();
2375
+ densityObserver = null;
2376
+ }
2377
+ };
2378
+ }
2379
+ function useDensity() {
2380
+ const { density } = react.useContext(ConfigContext);
2381
+ const dom = react.useSyncExternalStore(subscribeDensity, domDensity, () => void 0);
2382
+ return density ?? dom ?? "default";
2383
+ }
1904
2384
  var COMPACT_SIZE_MAP = { small: "small", medium: "medium", large: "medium" };
1905
2385
  function Spinner({ className, size }) {
1906
2386
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1955,15 +2435,14 @@ var Button = react.forwardRef(function Button2(props, ref) {
1955
2435
  size: _s2,
1956
2436
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1957
2437
  loading: _l2,
1958
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1959
- type: _t,
2438
+ type: type2 = "button",
1960
2439
  ...rest2
1961
2440
  } = props;
1962
2441
  return /* @__PURE__ */ jsxRuntime.jsxs(
1963
2442
  "button",
1964
2443
  {
1965
2444
  ref,
1966
- type: "button",
2445
+ type: type2,
1967
2446
  disabled: disabled2 || loading,
1968
2447
  "aria-busy": loading || void 0,
1969
2448
  className: chunkTPGAXYFU_cjs.cx(
@@ -2020,7 +2499,7 @@ var Button = react.forwardRef(function Button2(props, ref) {
2020
2499
  ...rest2,
2021
2500
  children: [
2022
2501
  loading ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-compact-button__icon", children: /* @__PURE__ */ jsxRuntime.jsx(Spinner, { className: "klun-compact-button__spinner" }) }) : icon2 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-compact-button__icon", children: icon2 }) : null,
2023
- loading ? null : children2
2502
+ loading ? children2 != null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-compact-button__label-sr", children: children2 }) : null : children2
2024
2503
  ]
2025
2504
  }
2026
2505
  );
@@ -2198,15 +2677,18 @@ var CopyButton = react.forwardRef(
2198
2677
  value,
2199
2678
  children,
2200
2679
  onCopied,
2201
- size = "md",
2680
+ size: sizeProp,
2202
2681
  variant = "ghost",
2203
2682
  copyIcon = "ri-file-copy-line",
2204
2683
  doneIcon = "ri-check-line",
2205
- title = "Copy",
2684
+ title: titleProp,
2206
2685
  onClick,
2207
2686
  className,
2208
2687
  ...props
2209
2688
  }, ref) {
2689
+ const size = useScaleSize("CopyButton", sizeProp);
2690
+ const { copy: localeCopy } = useLocale();
2691
+ const title = titleProp ?? localeCopy.label;
2210
2692
  const [done, setDone] = react.useState(false);
2211
2693
  const timer = react.useRef(null);
2212
2694
  react.useEffect(() => () => clearTimeout(timer.current ?? void 0), []);
@@ -2247,7 +2729,7 @@ var CopyButton = react.forwardRef(
2247
2729
  CopyButton.displayName = "CopyButton";
2248
2730
  var Toggle = react.forwardRef(function Toggle2({
2249
2731
  variant = "default",
2250
- size = "medium",
2732
+ size: sizeProp,
2251
2733
  pressed,
2252
2734
  defaultPressed = false,
2253
2735
  onPressedChange,
@@ -2256,6 +2738,7 @@ var Toggle = react.forwardRef(function Toggle2({
2256
2738
  disabled,
2257
2739
  ...props
2258
2740
  }, ref) {
2741
+ const size = useScaleSize("Toggle", sizeProp);
2259
2742
  const [internal, setInternal] = react.useState(defaultPressed);
2260
2743
  const controlled = pressed !== void 0;
2261
2744
  const isPressed = controlled ? pressed : internal;
@@ -2549,7 +3032,8 @@ var AvatarGroup = react.forwardRef(function AvatarGroup2({ avatars = [], size =
2549
3032
  );
2550
3033
  });
2551
3034
  AvatarGroup.displayName = "AvatarGroup";
2552
- var Badge = react.forwardRef(function Badge2({ color = "gray", variant = "lighter", size = "medium", leadingIcon, dot = false, className, children, ...props }, ref) {
3035
+ var Badge = react.forwardRef(function Badge2({ color = "gray", variant = "lighter", size: sizeProp, leadingIcon, dot = false, className, children, ...props }, ref) {
3036
+ const size = useScaleSize("Badge", sizeProp);
2553
3037
  return /* @__PURE__ */ jsxRuntime.jsxs(
2554
3038
  "span",
2555
3039
  {
@@ -2583,6 +3067,7 @@ var BulkActionBar = react.forwardRef(
2583
3067
  className,
2584
3068
  ...props
2585
3069
  }, ref) {
3070
+ const { a11y } = useLocale();
2586
3071
  const visible = open != null ? open : count > 0;
2587
3072
  const [mounted, setMounted] = react.useState(visible);
2588
3073
  const [show, setShow] = react.useState(visible);
@@ -2603,7 +3088,7 @@ var BulkActionBar = react.forwardRef(
2603
3088
  {
2604
3089
  ref,
2605
3090
  role: "toolbar",
2606
- "aria-label": "Bulk actions",
3091
+ "aria-label": a11y.bulkActions,
2607
3092
  "data-show": show ? "" : void 0,
2608
3093
  className: chunkTPGAXYFU_cjs.cx(
2609
3094
  "klun-bulk-action-bar",
@@ -2624,8 +3109,8 @@ var BulkActionBar = react.forwardRef(
2624
3109
  {
2625
3110
  type: "button",
2626
3111
  onClick: onClear,
2627
- "aria-label": "Clear selection",
2628
- title: "Clear selection",
3112
+ "aria-label": a11y.clearSelection,
3113
+ title: a11y.clearSelection,
2629
3114
  className: "klun-bulk-action-bar__clear",
2630
3115
  children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-close-line", "aria-hidden": true })
2631
3116
  }
@@ -2669,6 +3154,16 @@ var Carousel = react.forwardRef(function Carousel2({
2669
3154
  const { carousel } = useLocale();
2670
3155
  const slides = react.Children.toArray(children);
2671
3156
  const count = slides.length;
3157
+ const rootRef = react.useRef(null);
3158
+ const hadFocusInside = react.useRef(false);
3159
+ const attachRootRef = react.useCallback(
3160
+ (el) => {
3161
+ rootRef.current = el;
3162
+ if (typeof ref === "function") ref(el);
3163
+ else if (ref) ref.current = el;
3164
+ },
3165
+ [ref]
3166
+ );
2672
3167
  const [inner, setInner] = react.useState(defaultIndex);
2673
3168
  const cur = index !== void 0 ? index : inner;
2674
3169
  const [hover, setHover] = react.useState(false);
@@ -2687,6 +3182,12 @@ var Carousel = react.forwardRef(function Carousel2({
2687
3182
  const id = setInterval(() => go(cur + 1), interval);
2688
3183
  return () => clearInterval(id);
2689
3184
  }, [autoplay, hover, cur, interval, count, go]);
3185
+ react.useEffect(() => {
3186
+ const root = rootRef.current;
3187
+ if (!root || !hadFocusInside.current) return;
3188
+ const active = document.activeElement;
3189
+ if (active && !root.contains(active)) root.focus();
3190
+ }, [cur]);
2690
3191
  const arrowBtn = (dir) => /* @__PURE__ */ jsxRuntime.jsx(
2691
3192
  "button",
2692
3193
  {
@@ -2700,11 +3201,20 @@ var Carousel = react.forwardRef(function Carousel2({
2700
3201
  return /* @__PURE__ */ jsxRuntime.jsxs(
2701
3202
  "div",
2702
3203
  {
2703
- ref,
3204
+ ref: attachRootRef,
2704
3205
  onMouseEnter: () => setHover(true),
2705
3206
  onMouseLeave: () => setHover(false),
3207
+ onFocus: () => {
3208
+ hadFocusInside.current = true;
3209
+ },
3210
+ onBlur: (e) => {
3211
+ if (e.relatedTarget) {
3212
+ hadFocusInside.current = rootRef.current?.contains(e.relatedTarget) ?? false;
3213
+ }
3214
+ },
2706
3215
  className: chunkTPGAXYFU_cjs.cx("klun-carousel", className),
2707
3216
  style: { height, ...style },
3217
+ tabIndex: -1,
2708
3218
  ...props,
2709
3219
  children: [
2710
3220
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -2712,7 +3222,20 @@ var Carousel = react.forwardRef(function Carousel2({
2712
3222
  {
2713
3223
  className: "klun-carousel__track",
2714
3224
  style: { transform: `translateX(-${cur * 100}%)` },
2715
- children: slides.map((s, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-carousel__slide", children: s }, i))
3225
+ children: slides.map((s, i) => {
3226
+ const active = i === cur;
3227
+ return /* @__PURE__ */ jsxRuntime.jsx(
3228
+ "div",
3229
+ {
3230
+ className: "klun-carousel__slide",
3231
+ "data-active": active || void 0,
3232
+ ...!active ? { inert: "" } : {},
3233
+ "aria-hidden": !active || void 0,
3234
+ children: s
3235
+ },
3236
+ i
3237
+ );
3238
+ })
2716
3239
  }
2717
3240
  ),
2718
3241
  arrows && count > 1 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -2735,7 +3258,8 @@ var Carousel = react.forwardRef(function Carousel2({
2735
3258
  );
2736
3259
  });
2737
3260
  Carousel.displayName = "Carousel";
2738
- var ChartLegend = react.forwardRef(function ChartLegend2({ items: items2 = [], direction = "row", dot = "round", size = "md", className, ...props }, ref) {
3261
+ var ChartLegend = react.forwardRef(function ChartLegend2({ items: items2 = [], direction = "row", dot = "round", size: sizeProp, className, ...props }, ref) {
3262
+ const size = useScaleSize("ChartLegend", sizeProp);
2739
3263
  return /* @__PURE__ */ jsxRuntime.jsx(
2740
3264
  "div",
2741
3265
  {
@@ -2948,7 +3472,8 @@ var LogViewer = react.forwardRef(function LogViewer2({
2948
3472
  );
2949
3473
  });
2950
3474
  LogViewer.displayName = "LogViewer";
2951
- var ContentLabel = react.forwardRef(function ContentLabel2({ children, icon, color = "gray", size = "md", className, ...props }, ref) {
3475
+ var ContentLabel = react.forwardRef(function ContentLabel2({ children, icon, color = "gray", size: sizeProp, className, ...props }, ref) {
3476
+ const size = useScaleSize("ContentLabel", sizeProp);
2952
3477
  return /* @__PURE__ */ jsxRuntime.jsxs(
2953
3478
  "span",
2954
3479
  {
@@ -3071,11 +3596,12 @@ function StatusBadge({
3071
3596
  map,
3072
3597
  dot = true,
3073
3598
  variant = "light",
3074
- size = "medium",
3599
+ size: sizeProp,
3075
3600
  pulse = false,
3076
3601
  className,
3077
3602
  ...props
3078
3603
  }) {
3604
+ const size = useScaleSize("StatusBadge", sizeProp);
3079
3605
  const k2 = keyOf(status);
3080
3606
  const resolvedTone = tone || map && map[k2] || STATUS_TONE[k2] || "neutral";
3081
3607
  const color = TONE_COLOR[resolvedTone] || "gray";
@@ -3111,7 +3637,9 @@ function useTick(ms) {
3111
3637
  return () => clearInterval(id);
3112
3638
  }, [ms]);
3113
3639
  }
3114
- var RelativeTime = react.forwardRef(function RelativeTime2({ date, locale, live = true, every = 6e4, absolute, className, ...props }, ref) {
3640
+ var RelativeTime = react.forwardRef(function RelativeTime2({ date, locale: localeProp, live = true, every = 6e4, absolute, className, ...props }, ref) {
3641
+ const { locale: ctxLocaleName } = useLocale();
3642
+ const locale = localeProp ?? ctxLocaleName;
3115
3643
  useTick(live ? every : 0);
3116
3644
  const rel = Format.relTime(date, { locale });
3117
3645
  const title = Format.absTime(date, { locale });
@@ -3642,7 +4170,8 @@ var ItemGroup = react.forwardRef(
3642
4170
  }
3643
4171
  );
3644
4172
  ItemGroup.displayName = "ItemGroup";
3645
- var Item = react.forwardRef(function Item2({ variant = "default", size = "default", className, ...props }, ref) {
4173
+ var Item = react.forwardRef(function Item2({ variant = "default", size: sizeProp, className, ...props }, ref) {
4174
+ const size = useScaleSize("Item", sizeProp);
3646
4175
  return /* @__PURE__ */ jsxRuntime.jsx(
3647
4176
  "div",
3648
4177
  {
@@ -3908,7 +4437,8 @@ var Kbd = react.forwardRef(function Kbd2({ className, children, ...props }, ref)
3908
4437
  return /* @__PURE__ */ jsxRuntime.jsx("kbd", { ref, className: chunkTPGAXYFU_cjs.cx("klun-kbd", className), ...props, children });
3909
4438
  });
3910
4439
  Kbd.displayName = "Kbd";
3911
- var KeyIcon = react.forwardRef(function KeyIcon2({ icon, color = "blue", appearance = "light", size = "md", css, className, style, ...props }, ref) {
4440
+ var KeyIcon = react.forwardRef(function KeyIcon2({ icon, color = "blue", appearance = "light", size: sizeProp, css, className, style, ...props }, ref) {
4441
+ const size = useScaleSize("KeyIcon", sizeProp);
3912
4442
  return /* @__PURE__ */ jsxRuntime.jsx(
3913
4443
  "span",
3914
4444
  {
@@ -4325,20 +4855,23 @@ var Money = react.forwardRef(function Money2({
4325
4855
  value,
4326
4856
  cents = false,
4327
4857
  currency = "USD",
4328
- locale,
4858
+ locale: localeProp,
4329
4859
  period,
4330
4860
  periodLabels,
4331
4861
  minimumFractionDigits,
4332
4862
  maximumFractionDigits,
4333
4863
  signDisplay,
4334
4864
  tone = "default",
4335
- size = "md",
4865
+ size: sizeProp,
4336
4866
  strikethrough = false,
4337
4867
  prefix,
4338
4868
  suffix,
4339
4869
  className,
4340
4870
  ...props
4341
4871
  }, ref) {
4872
+ const size = useScaleSize("Money", sizeProp);
4873
+ const { locale: ctxLocaleName } = useLocale();
4874
+ const locale = localeProp ?? ctxLocaleName;
4342
4875
  const { text, period: periodSuffix } = Format.money(value, {
4343
4876
  currency,
4344
4877
  cents,
@@ -4386,7 +4919,9 @@ function Digit({ value }) {
4386
4919
  ) });
4387
4920
  }
4388
4921
  var NumberFlow = react.forwardRef(
4389
- function NumberFlow2({ value, locales: locales2, format, prefix, suffix, label, className, ...props }, ref) {
4922
+ function NumberFlow2({ value, locales: localesProp, format, prefix, suffix, label, className, ...props }, ref) {
4923
+ const { locale: ctxLocaleName } = useLocale();
4924
+ const locales2 = localesProp ?? ctxLocaleName;
4390
4925
  const text = new Intl.NumberFormat(locales2, {
4391
4926
  minimumFractionDigits: format?.minimumFractionDigits,
4392
4927
  maximumFractionDigits: format?.maximumFractionDigits,
@@ -4521,14 +5056,66 @@ var Rating = react.forwardRef(function Rating2({ value = 0, max = 5, onChange, r
4521
5056
  )) });
4522
5057
  });
4523
5058
  Rating.displayName = "Rating";
4524
- var Popover = react.forwardRef(function Popover2({ trigger, children, align = "left", width = 280, className, ...props }, ref) {
4525
- const [open, setOpen] = react.useState(false);
5059
+ var FOCUSABLE = [
5060
+ "a[href]",
5061
+ "button:not([disabled])",
5062
+ "input:not([disabled]):not([type='hidden'])",
5063
+ "select:not([disabled])",
5064
+ "textarea:not([disabled])",
5065
+ "[tabindex]:not([tabindex='-1'])"
5066
+ ].join(",");
5067
+ var ACTIVATABLE = [
5068
+ "button",
5069
+ "a[href]",
5070
+ "input[type='button']",
5071
+ "input[type='submit']",
5072
+ "input[type='reset']",
5073
+ "input[type='checkbox']",
5074
+ "input[type='radio']",
5075
+ "summary",
5076
+ "[role='button']",
5077
+ "[role='link']"
5078
+ ].join(",");
5079
+ var Popover = react.forwardRef(function Popover2({
5080
+ trigger,
5081
+ children,
5082
+ align = "start",
5083
+ width = 280,
5084
+ className,
5085
+ open,
5086
+ defaultOpen = false,
5087
+ onOpenChange,
5088
+ panelId,
5089
+ ...props
5090
+ }, ref) {
5091
+ const [internalOpen, setInternalOpen] = react.useState(defaultOpen);
5092
+ const controlled = open !== void 0;
5093
+ const isOpen = controlled ? Boolean(open) : internalOpen;
5094
+ const onOpenChangeRef = react.useRef(onOpenChange);
5095
+ onOpenChangeRef.current = onOpenChange;
5096
+ const setOpen = react.useCallback(
5097
+ (next) => {
5098
+ if (!controlled) setInternalOpen(next);
5099
+ onOpenChangeRef.current?.(next);
5100
+ },
5101
+ [controlled]
5102
+ );
4526
5103
  const wrapRef = react.useRef(null);
5104
+ const triggerRef = react.useRef(null);
4527
5105
  const panelRef = react.useRef(null);
4528
5106
  const portal = typeof document !== "undefined";
4529
5107
  const [pos, setPos] = react.useState(null);
5108
+ const generatedId = react.useId();
5109
+ const resolvedPanelId = panelId ?? `klun-popover-${generatedId}`;
5110
+ const [hasFocusableChild, setHasFocusableChild] = react.useState(false);
4530
5111
  react.useEffect(() => {
4531
- if (!open) return;
5112
+ const root = triggerRef.current;
5113
+ if (!root) return;
5114
+ setHasFocusableChild(root.querySelector(FOCUSABLE) != null);
5115
+ }, [trigger]);
5116
+ const openedByKeyboard = react.useRef(false);
5117
+ react.useEffect(() => {
5118
+ if (!isOpen) return;
4532
5119
  const h = (e) => {
4533
5120
  const t = e.target;
4534
5121
  if (wrapRef.current?.contains(t)) return;
@@ -4537,9 +5124,9 @@ var Popover = react.forwardRef(function Popover2({ trigger, children, align = "l
4537
5124
  };
4538
5125
  document.addEventListener("mousedown", h);
4539
5126
  return () => document.removeEventListener("mousedown", h);
4540
- }, [open]);
5127
+ }, [isOpen, setOpen]);
4541
5128
  react.useLayoutEffect(() => {
4542
- if (!open || !portal) return;
5129
+ if (!isOpen || !portal) return;
4543
5130
  const anchor = wrapRef.current;
4544
5131
  const panel2 = panelRef.current;
4545
5132
  if (!anchor || !panel2) return;
@@ -4552,7 +5139,9 @@ var Popover = react.forwardRef(function Popover2({ trigger, children, align = "l
4552
5139
  const below = window.innerHeight - a.bottom;
4553
5140
  const openUp = below < ph + gap && a.top > below;
4554
5141
  const top = openUp ? Math.max(margin, a.top - gap - ph) : Math.min(a.bottom + gap, window.innerHeight - margin - ph);
4555
- let left = align === "right" ? a.right - pw : a.left;
5142
+ const rtl = getComputedStyle(anchor).direction === "rtl";
5143
+ const side = align === "start" ? rtl ? "right" : "left" : align === "end" ? rtl ? "left" : "right" : align;
5144
+ let left = side === "right" ? a.right - pw : a.left;
4556
5145
  if (left + pw > window.innerWidth - margin) left = window.innerWidth - margin - pw;
4557
5146
  if (left < margin) left = margin;
4558
5147
  setPos({ left, top });
@@ -4564,10 +5153,58 @@ var Popover = react.forwardRef(function Popover2({ trigger, children, align = "l
4564
5153
  window.removeEventListener("scroll", place2, true);
4565
5154
  window.removeEventListener("resize", place2);
4566
5155
  };
4567
- }, [open, portal, align, width]);
5156
+ }, [isOpen, portal, align, width]);
4568
5157
  react.useEffect(() => {
4569
- if (!open) setPos(null);
4570
- }, [open]);
5158
+ if (!isOpen) setPos(null);
5159
+ }, [isOpen]);
5160
+ react.useLayoutEffect(() => {
5161
+ if (!isOpen || !openedByKeyboard.current) return;
5162
+ if (!pos) return;
5163
+ openedByKeyboard.current = false;
5164
+ const panel2 = panelRef.current;
5165
+ if (!panel2) return;
5166
+ const first = panel2.querySelector(FOCUSABLE);
5167
+ (first ?? panel2).focus?.();
5168
+ }, [isOpen, pos]);
5169
+ const focusTrigger = react.useCallback(() => {
5170
+ const root = triggerRef.current;
5171
+ if (!root) return;
5172
+ const inner = root.querySelector(FOCUSABLE);
5173
+ (inner ?? root).focus?.();
5174
+ }, []);
5175
+ const onPanelKeyDown = (e) => {
5176
+ if (e.key !== "Escape") return;
5177
+ e.stopPropagation();
5178
+ setOpen(false);
5179
+ focusTrigger();
5180
+ };
5181
+ const onTriggerKeyDown = (e) => {
5182
+ if (e.key === "Escape") {
5183
+ if (!isOpen) return;
5184
+ e.stopPropagation();
5185
+ setOpen(false);
5186
+ focusTrigger();
5187
+ return;
5188
+ }
5189
+ if (e.key === "ArrowDown") {
5190
+ e.preventDefault();
5191
+ if (!isOpen) {
5192
+ openedByKeyboard.current = true;
5193
+ setOpen(true);
5194
+ }
5195
+ return;
5196
+ }
5197
+ if (e.key === "Enter" || e.key === " ") {
5198
+ const target = e.target;
5199
+ const nativeActivation = target != null && target !== triggerRef.current && target.closest?.(ACTIVATABLE) != null;
5200
+ if (nativeActivation) return;
5201
+ if (!isOpen) {
5202
+ e.preventDefault();
5203
+ openedByKeyboard.current = true;
5204
+ setOpen(true);
5205
+ }
5206
+ }
5207
+ };
4571
5208
  const setRefs = (node) => {
4572
5209
  wrapRef.current = node;
4573
5210
  if (typeof ref === "function") ref(node);
@@ -4583,11 +5220,14 @@ var Popover = react.forwardRef(function Popover2({ trigger, children, align = "l
4583
5220
  // keep hidden until measured to avoid a flash at the top-left corner
4584
5221
  visibility: pos ? "visible" : "hidden"
4585
5222
  };
4586
- const panel = open ? /* @__PURE__ */ jsxRuntime.jsx(
5223
+ const panel = isOpen ? /* @__PURE__ */ jsxRuntime.jsx(
4587
5224
  "div",
4588
5225
  {
4589
5226
  ref: panelRef,
5227
+ id: resolvedPanelId,
4590
5228
  role: "dialog",
5229
+ tabIndex: -1,
5230
+ onKeyDown: onPanelKeyDown,
4591
5231
  className: chunkTPGAXYFU_cjs.cx(
4592
5232
  "klun-popover__panel",
4593
5233
  // in-flow fallback keeps the legacy left/right anchoring classes
@@ -4597,8 +5237,25 @@ var Popover = react.forwardRef(function Popover2({ trigger, children, align = "l
4597
5237
  children: content
4598
5238
  }
4599
5239
  ) : null;
5240
+ const triggerAria = {
5241
+ "aria-haspopup": "dialog",
5242
+ "aria-expanded": isOpen,
5243
+ ...isOpen ? { "aria-controls": resolvedPanelId } : null
5244
+ };
5245
+ const triggerNode = react.isValidElement(trigger) ? react.cloneElement(trigger, triggerAria) : trigger;
5246
+ const wrapperIsTrigger = !hasFocusableChild;
4600
5247
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { ref: setRefs, className: chunkTPGAXYFU_cjs.cx("klun-popover", className), ...props, children: [
4601
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-popover__trigger", onClick: () => setOpen((o) => !o), children: trigger }),
5248
+ /* @__PURE__ */ jsxRuntime.jsx(
5249
+ "span",
5250
+ {
5251
+ ref: triggerRef,
5252
+ className: "klun-popover__trigger",
5253
+ onClick: () => setOpen(!isOpen),
5254
+ onKeyDown: onTriggerKeyDown,
5255
+ ...wrapperIsTrigger ? { role: "button", tabIndex: 0, ...triggerAria } : !react.isValidElement(trigger) ? triggerAria : null,
5256
+ children: triggerNode
5257
+ }
5258
+ ),
4602
5259
  portal ? panel && reactDom.createPortal(panel, document.body) : panel
4603
5260
  ] });
4604
5261
  });
@@ -4961,11 +5618,14 @@ var EmojiPicker = react.forwardRef(
4961
5618
  groups = EMOJI_GROUPS,
4962
5619
  columns = 8,
4963
5620
  searchable = true,
4964
- searchPlaceholder = "Search emoji",
4965
- emptyText = "No emoji found",
5621
+ searchPlaceholder: searchPlaceholderProp,
5622
+ emptyText: emptyTextProp,
4966
5623
  className,
4967
5624
  ...props
4968
5625
  }, ref) {
5626
+ const { emojiPicker } = useLocale();
5627
+ const searchPlaceholder = searchPlaceholderProp ?? emojiPicker.searchPlaceholder;
5628
+ const emptyText = emptyTextProp ?? emojiPicker.emptyText;
4969
5629
  const [query, setQuery] = react.useState("");
4970
5630
  const q = query.trim().toLowerCase();
4971
5631
  const results = react.useMemo(() => {
@@ -5010,7 +5670,9 @@ var EmojiPicker = react.forwardRef(
5010
5670
  EmojiPicker.displayName = "EmojiPicker";
5011
5671
  var QUICK_EMOJIS = ["\u{1F44D}", "\u{1F44C}", "\u2764\uFE0F", "\u2705", "\u{1F389}", "\u{1F615}", "\u{1F680}", "\u{1F440}"];
5012
5672
  var QuickEmojiPicker = react.forwardRef(
5013
- function QuickEmojiPicker2({ onSelect, emojis = QUICK_EMOJIS, align = "left", label = "Add reaction", className }, ref) {
5673
+ function QuickEmojiPicker2({ onSelect, emojis = QUICK_EMOJIS, align = "left", label: labelProp, className }, ref) {
5674
+ const { emojiPicker } = useLocale();
5675
+ const label = labelProp ?? emojiPicker.addReaction;
5014
5676
  return /* @__PURE__ */ jsxRuntime.jsx(
5015
5677
  Popover,
5016
5678
  {
@@ -5155,6 +5817,16 @@ var Tooltip = react.forwardRef(function Tooltip2({ content, side = "top", delay
5155
5817
  transform: "none",
5156
5818
  visibility: pos ? "visible" : "hidden"
5157
5819
  };
5820
+ const tooltipId = `${react.useId()}tooltip`;
5821
+ const describedBy = open && content && !disabled ? tooltipId : void 0;
5822
+ const childProps = react.isValidElement(children) ? children.props : null;
5823
+ const triggerNode = childProps != null ? react.cloneElement(
5824
+ children,
5825
+ // 合并而非覆盖调用方已有的 aria-describedby
5826
+ {
5827
+ "aria-describedby": [childProps["aria-describedby"], describedBy].filter(Boolean).join(" ") || void 0
5828
+ }
5829
+ ) : children;
5158
5830
  return /* @__PURE__ */ jsxRuntime.jsxs(
5159
5831
  "span",
5160
5832
  {
@@ -5164,13 +5836,15 @@ var Tooltip = react.forwardRef(function Tooltip2({ content, side = "top", delay
5164
5836
  onMouseLeave: hide,
5165
5837
  onFocus: show,
5166
5838
  onBlur: hide,
5839
+ ...childProps == null ? { "aria-describedby": describedBy } : null,
5167
5840
  children: [
5168
- children,
5841
+ triggerNode,
5169
5842
  open && content && typeof document !== "undefined" ? reactDom.createPortal(
5170
5843
  /* @__PURE__ */ jsxRuntime.jsx(
5171
5844
  "span",
5172
5845
  {
5173
5846
  ref: bubbleRef,
5847
+ id: tooltipId,
5174
5848
  role: "tooltip",
5175
5849
  className: chunkTPGAXYFU_cjs.cx("klun-tooltip__bubble", `klun-tooltip__bubble--${side}`),
5176
5850
  style: bubbleStyle,
@@ -5299,7 +5973,8 @@ var Statistic = react.forwardRef(function Statistic2({ label, value, prefix, suf
5299
5973
  });
5300
5974
  Statistic.displayName = "Statistic";
5301
5975
  var SIZES2 = { xs: 6, sm: 8, md: 10, lg: 12 };
5302
- var StatusDot = react.forwardRef(function StatusDot2({ tone = "neutral", size = "sm", pulse = false, label, className, style, ...props }, ref) {
5976
+ var StatusDot = react.forwardRef(function StatusDot2({ tone = "neutral", size: sizeProp, pulse = false, label, className, style, ...props }, ref) {
5977
+ const size = useScaleSize("StatusDot", sizeProp);
5303
5978
  const sizeStyle = { ["--klun-status-dot-size"]: `${SIZES2[size] ?? SIZES2.sm}px` };
5304
5979
  const dot = /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkTPGAXYFU_cjs.cx("klun-status-dot__dot", pulse && "klun-status-dot--pulse"), style: sizeStyle });
5305
5980
  if (label == null) {
@@ -5650,7 +6325,7 @@ function TableToolbar({
5650
6325
  selectedRows,
5651
6326
  clearSelection
5652
6327
  }) {
5653
- const { table } = useLocale();
6328
+ const { table, a11y } = useLocale();
5654
6329
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5655
6330
  showToolbar ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-table__toolbar", children: [
5656
6331
  title != null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-table__title", children: title }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-table__title-spacer" }),
@@ -5673,7 +6348,7 @@ function TableToolbar({
5673
6348
  {
5674
6349
  type: "button",
5675
6350
  onClick: clearSelection,
5676
- "aria-label": "Clear selection",
6351
+ "aria-label": a11y.clearSelection,
5677
6352
  className: "klun-table__selbar-clear",
5678
6353
  children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-close-line" })
5679
6354
  }
@@ -5851,9 +6526,44 @@ function TableHead({
5851
6526
  setSort,
5852
6527
  activeFilters,
5853
6528
  setFilter,
5854
- startResize
6529
+ startResize,
6530
+ setColumnWidth
5855
6531
  }) {
5856
6532
  const { table } = useLocale();
6533
+ const [resizerW, setResizerW] = react.useState({});
6534
+ const widthForA11y = (c) => {
6535
+ const w = widthOf(c);
6536
+ if (typeof w === "number") return w;
6537
+ if (typeof c.width === "number") return c.width;
6538
+ return resizerW[c.key] ?? (c.minWidth || 64);
6539
+ };
6540
+ const onResizerKeyDown = (e, c) => {
6541
+ const min = c.minWidth || 64;
6542
+ const step = e.shiftKey ? 32 : 8;
6543
+ const current = resizerW[c.key] ?? widthForA11y(c);
6544
+ let next = null;
6545
+ switch (e.key) {
6546
+ case "ArrowLeft":
6547
+ next = current - step;
6548
+ break;
6549
+ case "ArrowRight":
6550
+ next = current + step;
6551
+ break;
6552
+ case "Home":
6553
+ next = min;
6554
+ break;
6555
+ // 这里没有真正的"最大值"(列宽不受限),因此用 Enter 代表"恢复声明宽度"
6556
+ case "Enter":
6557
+ next = typeof c.width === "number" ? c.width : current;
6558
+ break;
6559
+ default:
6560
+ return;
6561
+ }
6562
+ e.preventDefault();
6563
+ e.stopPropagation();
6564
+ const applied = setColumnWidth(c, next);
6565
+ setResizerW((m) => ({ ...m, [c.key]: applied }));
6566
+ };
5857
6567
  return /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
5858
6568
  dragCol ? /* @__PURE__ */ jsxRuntime.jsx("th", { className: "klun-table__th klun-table__th--util" }) : null,
5859
6569
  expandCol ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -5916,8 +6626,21 @@ function TableHead({
5916
6626
  justifyContent: c.align === "right" ? "flex-end" : c.align === "center" ? "center" : "flex-start"
5917
6627
  },
5918
6628
  children: [
5919
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: c.ellipsis ? "klun-table__ellipsis" : void 0, children: c.headerRender ? c.headerRender() : c.header }),
5920
- isSort ? /* @__PURE__ */ jsxRuntime.jsx(SortIcon, { dir }) : null,
6629
+ isSort ? /* @__PURE__ */ jsxRuntime.jsxs(
6630
+ "button",
6631
+ {
6632
+ type: "button",
6633
+ className: "klun-table__sort",
6634
+ onClick: (e) => {
6635
+ e.stopPropagation();
6636
+ setSort(c.key);
6637
+ },
6638
+ children: [
6639
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: c.ellipsis ? "klun-table__ellipsis" : void 0, children: c.headerRender ? c.headerRender() : c.header }),
6640
+ /* @__PURE__ */ jsxRuntime.jsx(SortIcon, { dir })
6641
+ ]
6642
+ }
6643
+ ) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: c.ellipsis ? "klun-table__ellipsis" : void 0, children: c.headerRender ? c.headerRender() : c.header }) }),
5921
6644
  hasFilter ? /* @__PURE__ */ jsxRuntime.jsx(
5922
6645
  FilterMenu,
5923
6646
  {
@@ -5935,7 +6658,19 @@ function TableHead({
5935
6658
  {
5936
6659
  role: "separator",
5937
6660
  "aria-orientation": "vertical",
6661
+ tabIndex: 0,
6662
+ "aria-label": `${table.dragToResize}: ${typeof c.header === "string" ? c.header : c.key}`,
6663
+ "aria-valuemin": c.minWidth || 64,
6664
+ "aria-valuenow": widthForA11y(c),
6665
+ "aria-valuetext": `${widthForA11y(c)}px`,
5938
6666
  title: table.dragToResize,
6667
+ onFocus: (e) => {
6668
+ const th = e.currentTarget.closest("th");
6669
+ if (!th) return;
6670
+ const measured = Math.round(th.getBoundingClientRect().width);
6671
+ if (measured > 0) setResizerW((m) => ({ ...m, [c.key]: measured }));
6672
+ },
6673
+ onKeyDown: (e) => onResizerKeyDown(e, c),
5939
6674
  onMouseDown: (e) => startResize(e, c),
5940
6675
  onClick: (e) => e.stopPropagation(),
5941
6676
  className: "klun-table__resizer",
@@ -5949,6 +6684,14 @@ function TableHead({
5949
6684
  })
5950
6685
  ] }) });
5951
6686
  }
6687
+ function isCoarsePointer() {
6688
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
6689
+ try {
6690
+ return window.matchMedia("(pointer: coarse)").matches;
6691
+ } catch {
6692
+ return false;
6693
+ }
6694
+ }
5952
6695
  function TableRow(props) {
5953
6696
  if (!props.dragCol) return /* @__PURE__ */ jsxRuntime.jsx(RowBase, { ...props });
5954
6697
  return /* @__PURE__ */ jsxRuntime.jsx(SortableRow, { ...props });
@@ -6052,7 +6795,15 @@ function RowBase({
6052
6795
  clickable && "klun-table__row--clickable",
6053
6796
  sortable?.isDragging && "klun-table__row--dragging"
6054
6797
  ),
6055
- onClick: clickable ? () => rowHref ? window.location.href = rowHref(row) : onRowClick(row) : void 0,
6798
+ onClick: clickable ? (e) => {
6799
+ if (rowHref) {
6800
+ const target = e.target;
6801
+ if (target?.closest?.("a[href]")) return;
6802
+ window.location.href = rowHref(row);
6803
+ return;
6804
+ }
6805
+ onRowClick?.(row);
6806
+ } : void 0,
6056
6807
  onContextMenu: contextMenu || copyable ? (e) => {
6057
6808
  const custom = contextMenu ? contextMenu(row, { copyRow, copyText }) : null;
6058
6809
  const items2 = custom && custom.length ? custom : [
@@ -6227,6 +6978,8 @@ function RowBase({
6227
6978
  style: { textAlign: c.align || "left" }
6228
6979
  }
6229
6980
  ) : null;
6981
+ const linkHref = rowHref && ci === 0 && !c.render && !c.editable ? rowHref(row) : null;
6982
+ const body = linkHref ? /* @__PURE__ */ jsxRuntime.jsx("a", { className: "klun-table__rowlink", href: linkHref, children: inner }) : inner;
6230
6983
  return /* @__PURE__ */ jsxRuntime.jsx(
6231
6984
  "td",
6232
6985
  {
@@ -6234,6 +6987,18 @@ function RowBase({
6234
6987
  e.stopPropagation();
6235
6988
  startEdit(id, c, row);
6236
6989
  } : void 0,
6990
+ onClick: c.editable && !isEditing && isCoarsePointer() ? (e) => {
6991
+ e.stopPropagation();
6992
+ startEdit(id, c, row);
6993
+ } : void 0,
6994
+ tabIndex: c.editable && !isEditing ? 0 : void 0,
6995
+ onKeyDown: c.editable && !isEditing ? (e) => {
6996
+ if (e.key === "Enter" || e.key === "F2") {
6997
+ e.preventDefault();
6998
+ e.stopPropagation();
6999
+ startEdit(id, c, row);
7000
+ }
7001
+ } : void 0,
6237
7002
  className: chunkTPGAXYFU_cjs.cx(
6238
7003
  "klun-table__td",
6239
7004
  tdBorder,
@@ -6281,8 +7046,8 @@ function RowBase({
6281
7046
  )
6282
7047
  }
6283
7048
  ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-table__tree-spacer" }),
6284
- inner
6285
- ] }) : inner
7049
+ body
7050
+ ] }) : body
6286
7051
  },
6287
7052
  c.key
6288
7053
  );
@@ -6376,6 +7141,11 @@ function useColumnResize(columns) {
6376
7141
  const [colW, setColW] = react.useState({});
6377
7142
  const resizeRef = react.useRef(null);
6378
7143
  const widthOf = (c) => colW[c.key] ?? (typeof c.width === "number" ? c.width : void 0);
7144
+ const setColumnWidth = (c, next) => {
7145
+ const w = Math.max(c.minWidth || 64, Math.round(next));
7146
+ setColW((m) => ({ ...m, [c.key]: w }));
7147
+ return w;
7148
+ };
6379
7149
  const startResize = (e, c) => {
6380
7150
  e.preventDefault();
6381
7151
  e.stopPropagation();
@@ -6387,7 +7157,7 @@ function useColumnResize(columns) {
6387
7157
  const r = resizeRef.current;
6388
7158
  if (!r) return;
6389
7159
  const w = Math.max(c.minWidth || 64, r.startW + (ev.clientX - r.startX));
6390
- setColW((m) => ({ ...m, [r.key]: w }));
7160
+ setColW((m) => ({ ...m, [r.key]: Math.round(w) }));
6391
7161
  };
6392
7162
  const up = () => {
6393
7163
  resizeRef.current = null;
@@ -6401,7 +7171,7 @@ function useColumnResize(columns) {
6401
7171
  document.body.style.cursor = "col-resize";
6402
7172
  document.body.style.userSelect = "none";
6403
7173
  };
6404
- return { colW, widthOf, startResize };
7174
+ return { colW, widthOf, startResize, setColumnWidth };
6405
7175
  }
6406
7176
  function useColumnVisibility(columns) {
6407
7177
  const [hiddenCols, setHiddenCols] = react.useState(
@@ -6605,7 +7375,7 @@ function Table({
6605
7375
  onFiltersChange,
6606
7376
  pagination = false,
6607
7377
  expandable,
6608
- density = "comfortable",
7378
+ density: densityProp,
6609
7379
  zebra = false,
6610
7380
  stickyHeader = false,
6611
7381
  hover = true,
@@ -6640,9 +7410,11 @@ function Table({
6640
7410
  style,
6641
7411
  ...props
6642
7412
  }) {
7413
+ const providerDensity = useDensity();
7414
+ const density = densityProp ?? (providerDensity === "compact" ? "compact" : "comfortable");
6643
7415
  const densityClass = DENSITY[density] || DENSITY.comfortable;
6644
7416
  const { menu, setMenu } = useTableContextMenu();
6645
- const { colW, widthOf, startResize } = useColumnResize();
7417
+ const { colW, widthOf, startResize, setColumnWidth } = useColumnResize();
6646
7418
  const { hiddenCols, visibleColumns, toggleColumn } = useColumnVisibility(columns);
6647
7419
  const dragCol = rowDraggable && !tree;
6648
7420
  const rowToText = (row) => columns.map((c) => {
@@ -6834,7 +7606,8 @@ function Table({
6834
7606
  setSort,
6835
7607
  activeFilters,
6836
7608
  setFilter,
6837
- startResize
7609
+ startResize,
7610
+ setColumnWidth
6838
7611
  }
6839
7612
  ),
6840
7613
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -7017,6 +7790,7 @@ var Tree = react.forwardRef(function Tree2({
7017
7790
  showLine = false,
7018
7791
  blockNode = true,
7019
7792
  className,
7793
+ onKeyDown: onKeyDownProp,
7020
7794
  ...props
7021
7795
  }, ref) {
7022
7796
  const [innerExpanded, setInnerExpanded] = react.useState(defaultExpandedKeys);
@@ -7044,14 +7818,105 @@ var Tree = react.forwardRef(function Tree2({
7044
7818
  else next = Array.from(/* @__PURE__ */ new Set([...checkedKeys, ...all]));
7045
7819
  onCheck(next);
7046
7820
  };
7821
+ const visible = rows.filter((r) => !r.hidden);
7822
+ const rootRef = react.useRef(null);
7823
+ const setRoots = (node) => {
7824
+ rootRef.current = node;
7825
+ if (typeof ref === "function") ref(node);
7826
+ else if (ref && "current" in ref) ref.current = node;
7827
+ };
7828
+ const firstEnabledKey = () => {
7829
+ const hit = visible.find((r) => !r.node.disabled) ?? visible[0];
7830
+ return hit?.node.key ?? null;
7831
+ };
7832
+ const [focusedKey, setFocusedKey] = react.useState(null);
7833
+ const rovingKey = (() => {
7834
+ if (focusedKey && visible.some((r) => r.node.key === focusedKey)) return focusedKey;
7835
+ if (selectedKey && visible.some((r) => r.node.key === selectedKey)) return selectedKey;
7836
+ return firstEnabledKey();
7837
+ })();
7838
+ const focusKey = react.useCallback((key) => {
7839
+ if (!key) return;
7840
+ setFocusedKey(key);
7841
+ const el = rootRef.current?.querySelector(`[data-tree-key="${CSS.escape(key)}"]`);
7842
+ el?.focus?.();
7843
+ }, []);
7844
+ const onKeyDown = (e) => {
7845
+ if (visible.length === 0) return;
7846
+ const activeKey = rootRef.current?.ownerDocument?.activeElement?.getAttribute?.(
7847
+ "data-tree-key"
7848
+ ) ?? null;
7849
+ const currentKey = activeKey ?? rovingKey;
7850
+ const idx = Math.max(0, visible.findIndex((r) => r.node.key === currentKey));
7851
+ const cur = visible[idx];
7852
+ if (!cur) return;
7853
+ const hasChildren2 = !!(cur.node.children && cur.node.children.length);
7854
+ const isExpanded = exp.includes(cur.node.key);
7855
+ const parentKey = (() => {
7856
+ for (let i = idx - 1; i >= 0; i--) {
7857
+ if (visible[i].level < cur.level) return visible[i].node.key;
7858
+ }
7859
+ return null;
7860
+ })();
7861
+ switch (e.key) {
7862
+ case "ArrowDown":
7863
+ e.preventDefault();
7864
+ focusKey(visible[Math.min(idx + 1, visible.length - 1)]?.node.key ?? null);
7865
+ return;
7866
+ case "ArrowUp":
7867
+ e.preventDefault();
7868
+ focusKey(visible[Math.max(idx - 1, 0)]?.node.key ?? null);
7869
+ return;
7870
+ case "Home":
7871
+ e.preventDefault();
7872
+ focusKey(visible[0]?.node.key ?? null);
7873
+ return;
7874
+ case "End":
7875
+ e.preventDefault();
7876
+ focusKey(visible[visible.length - 1]?.node.key ?? null);
7877
+ return;
7878
+ case "ArrowRight":
7879
+ e.preventDefault();
7880
+ if (cur.node.disabled) return;
7881
+ if (hasChildren2 && !isExpanded) toggle(cur.node.key);
7882
+ else if (hasChildren2 && isExpanded) focusKey(visible[idx + 1]?.node.key ?? null);
7883
+ return;
7884
+ case "ArrowLeft":
7885
+ e.preventDefault();
7886
+ if (hasChildren2 && isExpanded) toggle(cur.node.key);
7887
+ else if (parentKey) focusKey(parentKey);
7888
+ return;
7889
+ case "Enter":
7890
+ e.preventDefault();
7891
+ if (cur.node.disabled) return;
7892
+ if (checkable) onCheckNode(cur.node);
7893
+ else onSelect?.(cur.node.key, cur.node);
7894
+ return;
7895
+ case " ":
7896
+ e.preventDefault();
7897
+ if (cur.node.disabled) return;
7898
+ if (checkable) onCheckNode(cur.node);
7899
+ else onSelect?.(cur.node.key, cur.node);
7900
+ return;
7901
+ default:
7902
+ return;
7903
+ }
7904
+ };
7905
+ const onKeyDownComposed = (e) => {
7906
+ onKeyDownProp?.(e);
7907
+ if (e.defaultPrevented) return;
7908
+ onKeyDown(e);
7909
+ };
7047
7910
  return /* @__PURE__ */ jsxRuntime.jsx(
7048
7911
  "div",
7049
7912
  {
7050
- ref,
7913
+ ref: setRoots,
7051
7914
  role: "tree",
7915
+ "aria-multiselectable": checkable || void 0,
7052
7916
  className: chunkTPGAXYFU_cjs.cx("klun-tree", showLine && "klun-tree--line", className),
7917
+ onKeyDown: onKeyDownComposed,
7053
7918
  ...props,
7054
- children: rows.filter((r) => !r.hidden).map(({ node, level }) => {
7919
+ children: visible.map(({ node, level }) => {
7055
7920
  const hasChildren2 = !!(node.children && node.children.length);
7056
7921
  const isExpanded = exp.includes(node.key);
7057
7922
  const selected = selectedKey === node.key;
@@ -7060,17 +7925,24 @@ var Tree = react.forwardRef(function Tree2({
7060
7925
  "div",
7061
7926
  {
7062
7927
  role: "treeitem",
7928
+ "data-tree-key": node.key,
7929
+ tabIndex: rovingKey === node.key ? 0 : -1,
7930
+ "aria-level": level + 1,
7063
7931
  "aria-expanded": hasChildren2 ? isExpanded : void 0,
7064
7932
  "aria-selected": selected,
7933
+ "aria-disabled": node.disabled || void 0,
7934
+ "aria-checked": checkable ? cs === "all" ? true : cs === "some" ? "mixed" : false : void 0,
7065
7935
  className: chunkTPGAXYFU_cjs.cx(
7066
7936
  "klun-tree__item",
7067
7937
  selected && "klun-tree__item--selected",
7068
7938
  node.disabled && "klun-tree__item--disabled",
7069
- blockNode && "klun-tree__item--block"
7939
+ blockNode && "klun-tree__item--block",
7940
+ rovingKey === node.key && "klun-tree__item--focused"
7070
7941
  ),
7071
7942
  style: { ["--klun-tree-indent"]: `${6 + level * 20}px` },
7072
7943
  onClick: () => {
7073
7944
  if (node.disabled) return;
7945
+ setFocusedKey(node.key);
7074
7946
  if (!checkable) onSelect && onSelect(node.key, node);
7075
7947
  },
7076
7948
  children: [
@@ -7082,6 +7954,7 @@ var Tree = react.forwardRef(function Tree2({
7082
7954
  hasChildren2 && isExpanded && "klun-tree__caret--expanded"
7083
7955
  ),
7084
7956
  "data-leaf": hasChildren2 ? void 0 : "",
7957
+ "aria-hidden": "true",
7085
7958
  onClick: (e) => {
7086
7959
  e.stopPropagation();
7087
7960
  if (hasChildren2) toggle(node.key);
@@ -7093,6 +7966,7 @@ var Tree = react.forwardRef(function Tree2({
7093
7966
  "span",
7094
7967
  {
7095
7968
  className: chunkTPGAXYFU_cjs.cx("klun-tree__checkbox", `klun-tree__checkbox--${cs}`),
7969
+ "aria-hidden": "true",
7096
7970
  onClick: (e) => {
7097
7971
  e.stopPropagation();
7098
7972
  if (!node.disabled) onCheckNode(node);
@@ -7698,12 +8572,13 @@ var GaugeBar = react.forwardRef(function GaugeBar2({
7698
8572
  label,
7699
8573
  caption,
7700
8574
  color = "blue",
7701
- size = "md",
8575
+ size: sizeProp,
7702
8576
  showValue = true,
7703
8577
  className,
7704
8578
  style,
7705
8579
  ...props
7706
8580
  }, ref) {
8581
+ const size = useScaleSize("GaugeBar", sizeProp);
7707
8582
  const pct2 = Math.max(0, Math.min(100, max ? value / max * 100 : 0));
7708
8583
  const showHeader = label || showValue && caption !== false;
7709
8584
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -8335,7 +9210,14 @@ var AutoComplete = react.forwardRef(
8335
9210
  leadingIcon,
8336
9211
  emptyText: emptyTextProp,
8337
9212
  maxVisible = 6,
9213
+ error = false,
8338
9214
  className,
9215
+ inputProps,
9216
+ // 下面这些属性属于**真实输入框**,不能落在 wrapper 上:
9217
+ // 落在 wrapper 上时 `<label for={id}>` 指不到控件、`aria-label` 对输入框无效。
9218
+ // 其余属性仍然透传给根节点,保持既有行为。
9219
+ id,
9220
+ inputMode,
8339
9221
  ...props
8340
9222
  }, ref) {
8341
9223
  const size = useSize(sizeProp);
@@ -8344,6 +9226,17 @@ var AutoComplete = react.forwardRef(
8344
9226
  const [open, setOpen] = react.useState(false);
8345
9227
  const [hi, setHi] = react.useState(-1);
8346
9228
  const rootRef = react.useRef(null);
9229
+ const generatedId = react.useId();
9230
+ const listboxId = `${generatedId}listbox`;
9231
+ const optionId = (index) => `${listboxId}-option-${index}`;
9232
+ const {
9233
+ "aria-label": ariaLabel,
9234
+ "aria-labelledby": ariaLabelledBy,
9235
+ "aria-describedby": ariaDescribedBy,
9236
+ "aria-invalid": ariaInvalid,
9237
+ "aria-required": ariaRequired,
9238
+ ...rootProps
9239
+ } = props;
8347
9240
  const norm2 = options.map(
8348
9241
  (o) => typeof o === "string" ? { value: o, label: o } : o
8349
9242
  );
@@ -8388,13 +9281,14 @@ var AutoComplete = react.forwardRef(
8388
9281
  {
8389
9282
  ref: rootRef,
8390
9283
  className: chunkTPGAXYFU_cjs.cx("klun-autocomplete", `klun-autocomplete--${size}`, className),
8391
- ...props,
9284
+ ...rootProps,
8392
9285
  children: [
8393
9286
  /* @__PURE__ */ jsxRuntime.jsxs(
8394
9287
  "div",
8395
9288
  {
8396
9289
  className: chunkTPGAXYFU_cjs.cx(
8397
9290
  "klun-autocomplete__field",
9291
+ error && "klun-autocomplete__field--error",
8398
9292
  disabled && "klun-autocomplete__field--disabled"
8399
9293
  ),
8400
9294
  "data-open": open ? "" : void 0,
@@ -8403,11 +9297,25 @@ var AutoComplete = react.forwardRef(
8403
9297
  /* @__PURE__ */ jsxRuntime.jsx(
8404
9298
  "input",
8405
9299
  {
9300
+ ...inputProps,
8406
9301
  ref,
8407
- className: "klun-autocomplete__input",
9302
+ id: id ?? inputProps?.id,
9303
+ autoComplete: inputProps?.autoComplete,
9304
+ inputMode: inputMode ?? inputProps?.inputMode,
9305
+ className: chunkTPGAXYFU_cjs.cx("klun-autocomplete__input", inputProps?.className),
8408
9306
  value,
8409
9307
  disabled,
8410
9308
  placeholder,
9309
+ role: "combobox",
9310
+ "aria-expanded": open,
9311
+ "aria-controls": open ? listboxId : void 0,
9312
+ "aria-activedescendant": open && hi >= 0 ? optionId(hi) : void 0,
9313
+ "aria-autocomplete": "list",
9314
+ "aria-label": ariaLabel,
9315
+ "aria-labelledby": ariaLabelledBy,
9316
+ "aria-describedby": ariaDescribedBy,
9317
+ "aria-invalid": ariaInvalid,
9318
+ "aria-required": ariaRequired,
8411
9319
  onChange: (e) => {
8412
9320
  onChange?.(e.target.value);
8413
9321
  setOpen(true);
@@ -8420,9 +9328,10 @@ var AutoComplete = react.forwardRef(
8420
9328
  ]
8421
9329
  }
8422
9330
  ),
8423
- open ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-autocomplete__list", role: "listbox", children: shown.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-autocomplete__empty", children: emptyText }) : shown.map((o, i) => /* @__PURE__ */ jsxRuntime.jsxs(
9331
+ open ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-autocomplete__list", id: listboxId, role: "listbox", children: shown.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-autocomplete__empty", children: emptyText }) : shown.map((o, i) => /* @__PURE__ */ jsxRuntime.jsxs(
8424
9332
  "button",
8425
9333
  {
9334
+ id: optionId(i),
8426
9335
  type: "button",
8427
9336
  role: "option",
8428
9337
  "aria-selected": i === hi,
@@ -8472,6 +9381,8 @@ var Cascader = react.forwardRef(function Cascader2({
8472
9381
  const [open, setOpen] = react.useState(false);
8473
9382
  const [active, setActive] = react.useState(current);
8474
9383
  const rootRef = react.useRef(null);
9384
+ const triggerRef = react.useRef(null);
9385
+ const panelRef = react.useRef(null);
8475
9386
  react.useEffect(() => {
8476
9387
  setActive(current);
8477
9388
  }, [open]);
@@ -8481,7 +9392,11 @@ var Cascader = react.forwardRef(function Cascader2({
8481
9392
  if (rootRef.current && !rootRef.current.contains(e.target)) setOpen(false);
8482
9393
  };
8483
9394
  const k2 = (e) => {
8484
- if (e.key === "Escape") setOpen(false);
9395
+ if (e.key !== "Escape") return;
9396
+ setOpen(false);
9397
+ if (rootRef.current && rootRef.current.contains(document.activeElement)) {
9398
+ triggerRef.current?.focus();
9399
+ }
8485
9400
  };
8486
9401
  document.addEventListener("mousedown", h);
8487
9402
  document.addEventListener("keydown", k2);
@@ -8490,6 +9405,15 @@ var Cascader = react.forwardRef(function Cascader2({
8490
9405
  document.removeEventListener("keydown", k2);
8491
9406
  };
8492
9407
  }, [open]);
9408
+ react.useEffect(() => {
9409
+ if (!open) return;
9410
+ const id = requestAnimationFrame(() => {
9411
+ const cols = panelRef.current?.querySelectorAll(".klun-cascader__column");
9412
+ const last = cols && cols.length ? cols[cols.length - 1] : null;
9413
+ last?.querySelector(".klun-cascader__option:not([disabled])")?.focus();
9414
+ });
9415
+ return () => cancelAnimationFrame(id);
9416
+ }, [open]);
8493
9417
  const columns = [];
8494
9418
  let level = options;
8495
9419
  columns.push(level);
@@ -8519,6 +9443,62 @@ var Cascader = react.forwardRef(function Cascader2({
8519
9443
  if (leaf) setOpen(false);
8520
9444
  }
8521
9445
  };
9446
+ const onPanelKeyDown = (e) => {
9447
+ const target = e.target;
9448
+ const option = target.closest(".klun-cascader__option");
9449
+ if (!option) return;
9450
+ const column = option.closest(".klun-cascader__column");
9451
+ if (!column) return;
9452
+ const all = Array.from(column.querySelectorAll(".klun-cascader__option"));
9453
+ const enabled = all.filter((el) => !el.disabled);
9454
+ const i = enabled.indexOf(option);
9455
+ const colIdx = Array.from(
9456
+ panelRef.current?.querySelectorAll(".klun-cascader__column") ?? []
9457
+ ).indexOf(column);
9458
+ const focusIntoColumn = (n) => {
9459
+ const cols = panelRef.current?.querySelectorAll(".klun-cascader__column");
9460
+ cols?.[n]?.querySelector(".klun-cascader__option:not([disabled])")?.focus();
9461
+ };
9462
+ switch (e.key) {
9463
+ case "ArrowDown":
9464
+ e.preventDefault();
9465
+ enabled[(i + 1) % enabled.length]?.focus();
9466
+ break;
9467
+ case "ArrowUp":
9468
+ e.preventDefault();
9469
+ enabled[(i - 1 + enabled.length) % enabled.length]?.focus();
9470
+ break;
9471
+ case "Home":
9472
+ e.preventDefault();
9473
+ enabled[0]?.focus();
9474
+ break;
9475
+ case "End":
9476
+ e.preventDefault();
9477
+ enabled[enabled.length - 1]?.focus();
9478
+ break;
9479
+ case "ArrowRight": {
9480
+ e.preventDefault();
9481
+ const opt = columns[colIdx]?.[all.indexOf(option)];
9482
+ if (opt && opt.children && opt.children.length) {
9483
+ pick(colIdx, opt);
9484
+ requestAnimationFrame(() => focusIntoColumn(colIdx + 1));
9485
+ }
9486
+ break;
9487
+ }
9488
+ case "ArrowLeft":
9489
+ e.preventDefault();
9490
+ if (colIdx > 0) focusIntoColumn(colIdx - 1);
9491
+ break;
9492
+ case "Escape":
9493
+ e.preventDefault();
9494
+ setOpen(false);
9495
+ triggerRef.current?.focus();
9496
+ break;
9497
+ case "Tab":
9498
+ setOpen(false);
9499
+ break;
9500
+ }
9501
+ };
8522
9502
  const clear = () => {
8523
9503
  if (value === void 0) setInner([]);
8524
9504
  setActive([]);
@@ -8541,11 +9521,12 @@ var Cascader = react.forwardRef(function Cascader2({
8541
9521
  /* @__PURE__ */ jsxRuntime.jsxs(
8542
9522
  "button",
8543
9523
  {
9524
+ ref: triggerRef,
8544
9525
  type: "button",
8545
9526
  className: "klun-cascader__trigger",
8546
9527
  disabled,
8547
9528
  onClick: () => setOpen((o) => !o),
8548
- "aria-haspopup": "true",
9529
+ "aria-haspopup": "menu",
8549
9530
  "aria-expanded": open,
8550
9531
  "data-empty": labelPath.length ? void 0 : "",
8551
9532
  children: [
@@ -8591,9 +9572,11 @@ var Cascader = react.forwardRef(function Cascader2({
8591
9572
  ]
8592
9573
  }
8593
9574
  ),
8594
- open ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-cascader__panel", role: "menu", children: columns.map((col, ci) => /* @__PURE__ */ jsxRuntime.jsx(
9575
+ open ? /* @__PURE__ */ jsxRuntime.jsx("div", { ref: panelRef, className: "klun-cascader__panel", role: "menu", onKeyDown: onPanelKeyDown, children: columns.map((col, ci) => /* @__PURE__ */ jsxRuntime.jsx(
8595
9576
  "div",
8596
9577
  {
9578
+ role: "group",
9579
+ "aria-label": ci === 0 ? cascader.placeholder : String(active[ci - 1] ?? ""),
8597
9580
  className: chunkTPGAXYFU_cjs.cx(
8598
9581
  "klun-cascader__column",
8599
9582
  ci < columns.length - 1 && "klun-cascader__column--divided"
@@ -8605,11 +9588,11 @@ var Cascader = react.forwardRef(function Cascader2({
8605
9588
  "button",
8606
9589
  {
8607
9590
  type: "button",
8608
- role: "menuitem",
9591
+ role: "menuitemradio",
8609
9592
  className: "klun-cascader__option",
8610
9593
  disabled: opt.disabled,
8611
9594
  onClick: () => pick(ci, opt),
8612
- "aria-selected": selected,
9595
+ "aria-checked": selected,
8613
9596
  "data-selected": selected || void 0,
8614
9597
  children: [
8615
9598
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-cascader__option-label", children: renderOption ? renderOption(opt, ci) : opt.label }),
@@ -9114,7 +10097,9 @@ function SelectListbox({
9114
10097
  onActivate,
9115
10098
  onPick,
9116
10099
  className,
9117
- anchorRef
10100
+ anchorRef,
10101
+ id,
10102
+ optionId
9118
10103
  }) {
9119
10104
  const portal = !!anchorRef && typeof document !== "undefined";
9120
10105
  const panelRef = react.useRef(null);
@@ -9162,12 +10147,14 @@ function SelectListbox({
9162
10147
  "div",
9163
10148
  {
9164
10149
  ref: panelRef,
10150
+ id,
9165
10151
  role: "listbox",
9166
10152
  className: className ? `klun-select-listbox ${className}` : "klun-select-listbox",
9167
10153
  style: portalStyle,
9168
10154
  children: options.map((o, i) => /* @__PURE__ */ jsxRuntime.jsxs(
9169
10155
  "button",
9170
10156
  {
10157
+ id: optionId?.(i),
9171
10158
  type: "button",
9172
10159
  role: "option",
9173
10160
  "aria-selected": o.value === current,
@@ -9715,7 +10702,7 @@ var DEFAULT_FORMAT = {
9715
10702
  day: "numeric"
9716
10703
  };
9717
10704
  var Calendar = react.forwardRef(function Calendar2({ value, onPick, className, style }, ref) {
9718
- const { datePicker } = useLocale();
10705
+ const { datePicker, pagination, locale } = useLocale();
9719
10706
  const initial = value ? new Date(value) : /* @__PURE__ */ new Date();
9720
10707
  const [view, setView] = react.useState(new Date(initial.getFullYear(), initial.getMonth(), 1));
9721
10708
  const sel = value ? new Date(value) : null;
@@ -9728,34 +10715,69 @@ var Calendar = react.forwardRef(function Calendar2({ value, onPick, className, s
9728
10715
  const cells = [];
9729
10716
  for (let i = 0; i < firstDay; i++) cells.push(null);
9730
10717
  for (let d = 1; d <= daysInMonth; d++) cells.push(new Date(y, m, d));
9731
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: chunkTPGAXYFU_cjs.cx("klun-date-picker", className), style, children: [
9732
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-date-picker__header", children: [
9733
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-date-picker__nav", onClick: () => setView(new Date(y, m - 1, 1)), children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 6l-4 4 4 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }) }),
9734
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-date-picker__title", children: fmt(datePicker.title, { month: datePicker.months[m], year: y }) }),
9735
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-date-picker__nav", onClick: () => setView(new Date(y, m + 1, 1)), children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 6l4 4-4 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }) })
9736
- ] }),
9737
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-date-picker__grid", children: [
9738
- datePicker.weekdaysShort.map((d, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-date-picker__weekday", children: d }, i)),
9739
- cells.map((date, i) => {
9740
- if (!date) return /* @__PURE__ */ jsxRuntime.jsx("span", {}, i);
9741
- return /* @__PURE__ */ jsxRuntime.jsx(
9742
- "button",
9743
- {
9744
- type: "button",
9745
- className: "klun-date-picker__day",
9746
- "data-selected": same(date, sel) || void 0,
9747
- "data-today": same(date, today) || void 0,
9748
- onClick: () => onPick(date),
9749
- children: date.getDate()
9750
- },
9751
- i
9752
- );
9753
- })
9754
- ] })
9755
- ] });
10718
+ return /* @__PURE__ */ jsxRuntime.jsxs(
10719
+ "div",
10720
+ {
10721
+ ref,
10722
+ className: chunkTPGAXYFU_cjs.cx("klun-date-picker", className),
10723
+ style,
10724
+ role: "group",
10725
+ "aria-label": fmt(datePicker.title, { month: datePicker.months[m], year: y }),
10726
+ children: [
10727
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-date-picker__header", children: [
10728
+ /* @__PURE__ */ jsxRuntime.jsx(
10729
+ "button",
10730
+ {
10731
+ type: "button",
10732
+ className: "klun-date-picker__nav",
10733
+ "aria-label": pagination.previous,
10734
+ onClick: () => setView(new Date(y, m - 1, 1)),
10735
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 6l-4 4 4 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })
10736
+ }
10737
+ ),
10738
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-date-picker__title", children: fmt(datePicker.title, { month: datePicker.months[m], year: y }) }),
10739
+ /* @__PURE__ */ jsxRuntime.jsx(
10740
+ "button",
10741
+ {
10742
+ type: "button",
10743
+ className: "klun-date-picker__nav",
10744
+ "aria-label": pagination.next,
10745
+ onClick: () => setView(new Date(y, m + 1, 1)),
10746
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 6l4 4-4 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })
10747
+ }
10748
+ )
10749
+ ] }),
10750
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-date-picker__grid", children: [
10751
+ datePicker.weekdaysShort.map((d, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-date-picker__weekday", children: d }, i)),
10752
+ cells.map((date, i) => {
10753
+ if (!date) return /* @__PURE__ */ jsxRuntime.jsx("span", {}, i);
10754
+ return /* @__PURE__ */ jsxRuntime.jsx(
10755
+ "button",
10756
+ {
10757
+ type: "button",
10758
+ className: "klun-date-picker__day",
10759
+ "data-selected": same(date, sel) || void 0,
10760
+ "data-today": same(date, today) || void 0,
10761
+ "aria-label": date.toLocaleDateString(locale, {
10762
+ weekday: "long",
10763
+ year: "numeric",
10764
+ month: "long",
10765
+ day: "numeric"
10766
+ }),
10767
+ "aria-current": same(date, today) ? "date" : void 0,
10768
+ onClick: () => onPick(date),
10769
+ children: date.getDate()
10770
+ },
10771
+ i
10772
+ );
10773
+ })
10774
+ ] })
10775
+ ]
10776
+ }
10777
+ );
9756
10778
  });
9757
10779
  var DatePicker = react.forwardRef(
9758
- function DatePicker2({ value, onChange, inline: inline2, placeholder, format = DEFAULT_FORMAT, align = "left", disabled, className, style, ...props }, ref) {
10780
+ function DatePicker2({ value, onChange, inline: inline2, placeholder, format = DEFAULT_FORMAT, align = "start", disabled, className, style, ...props }, ref) {
9759
10781
  if (inline2) {
9760
10782
  return /* @__PURE__ */ jsxRuntime.jsx(Calendar, { ref, value, onPick: (d) => onChange?.(d), className, style });
9761
10783
  }
@@ -9769,6 +10791,7 @@ var DatePicker = react.forwardRef(
9769
10791
  Input,
9770
10792
  {
9771
10793
  readOnly: true,
10794
+ className: "klun-input--trigger",
9772
10795
  disabled,
9773
10796
  value: label,
9774
10797
  placeholder: placeholder ?? "Select date",
@@ -9853,7 +10876,7 @@ var RangeCalendar = react.forwardRef(function RangeCalendar2({ start, end, onPic
9853
10876
  ] });
9854
10877
  });
9855
10878
  var DateRangePicker = react.forwardRef(
9856
- function DateRangePicker2({ start, end, onChange, inline: inline2, placeholder, format = DEFAULT_FORMAT2, align = "left", disabled, className, style, ...props }, ref) {
10879
+ function DateRangePicker2({ start, end, onChange, inline: inline2, placeholder, format = DEFAULT_FORMAT2, align = "start", disabled, className, style, ...props }, ref) {
9857
10880
  if (inline2) {
9858
10881
  return /* @__PURE__ */ jsxRuntime.jsx(
9859
10882
  RangeCalendar,
@@ -9878,6 +10901,7 @@ var DateRangePicker = react.forwardRef(
9878
10901
  Input,
9879
10902
  {
9880
10903
  readOnly: true,
10904
+ className: "klun-input--trigger",
9881
10905
  disabled,
9882
10906
  value: label,
9883
10907
  placeholder: placeholder ?? "Select range",
@@ -10131,7 +11155,7 @@ function DateTimePanel({ value, onChange }) {
10131
11155
  ] });
10132
11156
  }
10133
11157
  var DateTimePicker = react.forwardRef(
10134
- function DateTimePicker2({ value, onChange, inline: inline2, placeholder, format = DEFAULT_FORMAT3, align = "left", disabled, className, style, ...props }, ref) {
11158
+ function DateTimePicker2({ value, onChange, inline: inline2, placeholder, format = DEFAULT_FORMAT3, align = "start", disabled, className, style, ...props }, ref) {
10135
11159
  const date = value ? new Date(value) : null;
10136
11160
  if (inline2) {
10137
11161
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: chunkTPGAXYFU_cjs.cx("klun-date-time-picker", className), style, ...props, children: /* @__PURE__ */ jsxRuntime.jsx(DateTimePanel, { value: date, onChange: (d) => onChange?.(d) }) });
@@ -10146,6 +11170,7 @@ var DateTimePicker = react.forwardRef(
10146
11170
  Input,
10147
11171
  {
10148
11172
  readOnly: true,
11173
+ className: "klun-input--trigger",
10149
11174
  disabled,
10150
11175
  value: label,
10151
11176
  placeholder: placeholder ?? "Select date & time",
@@ -10262,13 +11287,24 @@ var FileUpload = react.forwardRef(function FileUpload2({ onFiles, hint = "SVG, P
10262
11287
  const { fileUpload } = useLocale();
10263
11288
  const [over, setOver] = react.useState(false);
10264
11289
  const inputRef = react.useRef(null);
11290
+ const openPicker = () => inputRef.current?.click();
11291
+ const dropzoneLabel = `${fileUpload.clickToUpload} ${fileUpload.orDragAndDrop}`;
10265
11292
  return /* @__PURE__ */ jsxRuntime.jsxs(
10266
11293
  "div",
10267
11294
  {
10268
11295
  ref,
10269
11296
  className: chunkTPGAXYFU_cjs.cx("klun-file-upload", className),
11297
+ role: "button",
11298
+ tabIndex: 0,
11299
+ "aria-label": dropzoneLabel,
10270
11300
  "data-dragover": over || void 0,
10271
- onClick: () => inputRef.current?.click(),
11301
+ onClick: openPicker,
11302
+ onKeyDown: (e) => {
11303
+ if (e.key === "Enter" || e.key === " ") {
11304
+ e.preventDefault();
11305
+ openPicker();
11306
+ }
11307
+ },
10272
11308
  onDragOver: (e) => {
10273
11309
  e.preventDefault();
10274
11310
  setOver(true);
@@ -10288,6 +11324,7 @@ var FileUpload = react.forwardRef(function FileUpload2({ onFiles, hint = "SVG, P
10288
11324
  type: "file",
10289
11325
  multiple: true,
10290
11326
  hidden: true,
11327
+ tabIndex: -1,
10291
11328
  onChange: (e) => onFiles?.([...e.target.files ?? []])
10292
11329
  }
10293
11330
  ),
@@ -10385,9 +11422,6 @@ function useForm(opts = {}) {
10385
11422
  const unregisterField = react.useCallback((key) => {
10386
11423
  delete fields.current[key];
10387
11424
  }, []);
10388
- const registerRules = react.useCallback((name, rules) => {
10389
- fields.current[pathKey(name)] = { name, rules: rules || [] };
10390
- }, []);
10391
11425
  const getFieldValue = react.useCallback((name) => getIn(valuesRef.current, name), []);
10392
11426
  const getFieldsValue = react.useCallback(() => valuesRef.current, []);
10393
11427
  const validateField = react.useCallback(async (name) => {
@@ -10506,7 +11540,6 @@ function useForm(opts = {}) {
10506
11540
  setValues,
10507
11541
  getFieldValue,
10508
11542
  getFieldsValue,
10509
- registerRules,
10510
11543
  registerField,
10511
11544
  unregisterField,
10512
11545
  validate,
@@ -10579,22 +11612,35 @@ function FormItem({
10579
11612
  const error = form && key ? form.touched[key] && form.errors[key] : null;
10580
11613
  const ruleArr = typeof rules === "function" ? [] : rules || [];
10581
11614
  const isRequired = required || ruleArr.some((r) => r.required);
11615
+ const autoId = react.useId();
11616
+ const childIsElement = react.isValidElement(children);
11617
+ const childProps = childIsElement ? children.props : {};
11618
+ const controlId = childIsElement ? childProps.id ?? `${autoId}control` : void 0;
11619
+ const errorId = controlId ? `${controlId}-error` : void 0;
11620
+ const helpId = controlId ? `${controlId}-help` : void 0;
11621
+ const hasError = Boolean(error);
11622
+ const descriptionId = hasError ? errorId : help ? helpId : void 0;
10582
11623
  let control = children;
10583
- if (form && fullName != null && react.isValidElement(children)) {
10584
- const childProps = children.props;
10585
- control = react.cloneElement(children, {
10586
- value: form._getIn(form.values, fullName) ?? childProps.value ?? "",
10587
- error: !!error,
10588
- onChange: (e) => {
11624
+ if (childIsElement) {
11625
+ const merged = { id: controlId };
11626
+ if (form && fullName != null) {
11627
+ merged.value = form._getIn(form.values, fullName) ?? childProps.value ?? "";
11628
+ merged.error = hasError ? true : void 0;
11629
+ merged.onChange = (e) => {
10589
11630
  const v = e && e.target ? childProps.type === "checkbox" ? e.target.checked : e.target.value : e;
10590
11631
  form.setFieldValue(fullName, v);
10591
11632
  childProps.onChange?.(e);
10592
- },
10593
- onBlur: (e) => {
11633
+ };
11634
+ merged.onBlur = (e) => {
10594
11635
  form.setFieldTouched(fullName);
10595
11636
  childProps.onBlur?.(e);
10596
- }
10597
- });
11637
+ };
11638
+ }
11639
+ if (hasError) merged["aria-invalid"] = true;
11640
+ if (isRequired) merged["aria-required"] = true;
11641
+ const describedBy = [childProps["aria-describedby"], descriptionId].filter(Boolean).join(" ");
11642
+ if (describedBy) merged["aria-describedby"] = describedBy;
11643
+ control = react.cloneElement(children, merged);
10598
11644
  }
10599
11645
  return /* @__PURE__ */ jsxRuntime.jsxs(
10600
11646
  "div",
@@ -10603,13 +11649,13 @@ function FormItem({
10603
11649
  className: chunkTPGAXYFU_cjs.cx("klun-form-item", horizontal && "klun-form-item--horizontal", className),
10604
11650
  ...props,
10605
11651
  children: [
10606
- label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "klun-form-item__label", children: [
11652
+ label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "klun-form-item__label", htmlFor: controlId, children: [
10607
11653
  label,
10608
- isRequired ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-form-item__required", children: "*" }) : null
11654
+ isRequired ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-form-item__required", "aria-hidden": "true", children: "*" }) : null
10609
11655
  ] }) : null,
10610
11656
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-form-item__control", children: [
10611
11657
  control,
10612
- error ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-form-item__error", children: error }) : help ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "klun-form-item__help", children: help }) : null
11658
+ hasError ? /* @__PURE__ */ jsxRuntime.jsx("span", { id: errorId, className: "klun-form-item__error", children: error }) : help ? /* @__PURE__ */ jsxRuntime.jsx("span", { id: helpId, className: "klun-form-item__help", children: help }) : null
10613
11659
  ] })
10614
11660
  ]
10615
11661
  }
@@ -10670,6 +11716,241 @@ var Hint = react.forwardRef(function Hint2({ children, error = false, icon, clas
10670
11716
  );
10671
11717
  });
10672
11718
  Hint.displayName = "Hint";
11719
+
11720
+ // src/components/overlays/overlayStack.ts
11721
+ var OVERLAY_LAYER = {
11722
+ pagePopup: 100,
11723
+ modalRoot: 1e3,
11724
+ modalStep: 100,
11725
+ popupOffset: 20,
11726
+ tooltipOffset: 30
11727
+ };
11728
+ var stack = [];
11729
+ var scopeRoots = /* @__PURE__ */ new Map();
11730
+ var scrollLockCount = 0;
11731
+ var savedOverflow = null;
11732
+ var canUseDOM = () => typeof document !== "undefined";
11733
+ function pushOverlay() {
11734
+ const id = /* @__PURE__ */ Symbol("klun-overlay");
11735
+ stack.push(id);
11736
+ scopeRoots.set(id, /* @__PURE__ */ new Set());
11737
+ lockScroll();
11738
+ return id;
11739
+ }
11740
+ function popOverlay(id) {
11741
+ const i = stack.indexOf(id);
11742
+ if (i === -1) return;
11743
+ stack.splice(i, 1);
11744
+ scopeRoots.delete(id);
11745
+ unlockScroll();
11746
+ }
11747
+ function isTopOverlay(id) {
11748
+ return stack.length > 0 && stack[stack.length - 1] === id;
11749
+ }
11750
+ function overlayDepth(id) {
11751
+ return stack.indexOf(id);
11752
+ }
11753
+ function layerBaseFor(id) {
11754
+ const depth = Math.max(0, overlayDepth(id));
11755
+ return OVERLAY_LAYER.modalRoot + depth * OVERLAY_LAYER.modalStep;
11756
+ }
11757
+ function registerScopeRoot(id, el) {
11758
+ const set = scopeRoots.get(id);
11759
+ if (!set || !el) return;
11760
+ set.add(el);
11761
+ }
11762
+ function unregisterScopeRoot(id, el) {
11763
+ if (!el) return;
11764
+ scopeRoots.get(id)?.delete(el);
11765
+ }
11766
+ function getScopeRoots(id) {
11767
+ const set = scopeRoots.get(id);
11768
+ if (!set) return [];
11769
+ return [...set].filter((el) => el.isConnected);
11770
+ }
11771
+ function lockScroll() {
11772
+ if (!canUseDOM()) return;
11773
+ if (scrollLockCount === 0) {
11774
+ savedOverflow = document.body.style.overflow;
11775
+ document.body.style.overflow = "hidden";
11776
+ }
11777
+ scrollLockCount += 1;
11778
+ }
11779
+ function unlockScroll() {
11780
+ if (!canUseDOM()) return;
11781
+ scrollLockCount = Math.max(0, scrollLockCount - 1);
11782
+ if (scrollLockCount === 0) {
11783
+ document.body.style.overflow = savedOverflow ?? "";
11784
+ savedOverflow = null;
11785
+ }
11786
+ }
11787
+ var inertedByUs = /* @__PURE__ */ new WeakMap();
11788
+ function applyBackgroundInert(roots) {
11789
+ if (!canUseDOM() || roots.length === 0) return;
11790
+ for (const root of roots) {
11791
+ let node = root;
11792
+ while (node && node.parentElement) {
11793
+ const parent = node.parentElement;
11794
+ for (const sibling of Array.from(parent.children)) {
11795
+ if (sibling === node) continue;
11796
+ if (!(sibling instanceof HTMLElement)) continue;
11797
+ if (roots.some((r) => sibling.contains(r))) continue;
11798
+ if (!sibling.hasAttribute("inert") && !inertedByUs.has(sibling)) {
11799
+ sibling.setAttribute("inert", "");
11800
+ inertedByUs.set(sibling, true);
11801
+ }
11802
+ }
11803
+ node = parent;
11804
+ if (node === document.body) break;
11805
+ }
11806
+ }
11807
+ }
11808
+ function releaseBackgroundInert() {
11809
+ if (!canUseDOM()) return;
11810
+ for (const el of document.querySelectorAll("[inert]")) {
11811
+ if (inertedByUs.get(el)) {
11812
+ el.removeAttribute("inert");
11813
+ inertedByUs.delete(el);
11814
+ }
11815
+ }
11816
+ }
11817
+ function isFocusable(el) {
11818
+ if (el.hasAttribute("disabled")) return false;
11819
+ if (el.getAttribute("aria-hidden") === "true") return false;
11820
+ if (el.hasAttribute("hidden")) return false;
11821
+ if (typeof getComputedStyle === "function") {
11822
+ const cs = getComputedStyle(el);
11823
+ if (cs.display === "none" || cs.visibility === "hidden") return false;
11824
+ }
11825
+ if (el.getAttribute("tabindex") === "-1") return false;
11826
+ return true;
11827
+ }
11828
+ var FOCUSABLE_SELECTOR = [
11829
+ "a[href]",
11830
+ "button",
11831
+ "input:not([type='hidden'])",
11832
+ "select",
11833
+ "textarea",
11834
+ "[tabindex]",
11835
+ "audio[controls]",
11836
+ "video[controls]",
11837
+ "[contenteditable]:not([contenteditable='false'])"
11838
+ ].join(",");
11839
+ function focusablesIn(roots) {
11840
+ const out = [];
11841
+ for (const root of roots) {
11842
+ for (const el of Array.from(root.querySelectorAll(FOCUSABLE_SELECTOR))) {
11843
+ if (isFocusable(el)) out.push(el);
11844
+ }
11845
+ }
11846
+ return out;
11847
+ }
11848
+ function useOverlayScope({
11849
+ active,
11850
+ onEscape,
11851
+ escapeEnabled = true,
11852
+ autoFocus = true,
11853
+ restoreFocus = true,
11854
+ inertBackground = true
11855
+ }) {
11856
+ const [scopeId, setScopeId] = react.useState(null);
11857
+ const nodeRef = react.useRef(null);
11858
+ const restoreTo = react.useRef(null);
11859
+ const onEscapeRef = react.useRef(onEscape);
11860
+ onEscapeRef.current = onEscape;
11861
+ react.useEffect(() => {
11862
+ if (!active) {
11863
+ setScopeId(null);
11864
+ return;
11865
+ }
11866
+ const id = pushOverlay();
11867
+ setScopeId(id);
11868
+ return () => {
11869
+ popOverlay(id);
11870
+ };
11871
+ }, [active]);
11872
+ react.useEffect(() => {
11873
+ if (!active || !scopeId) return;
11874
+ const container = nodeRef.current;
11875
+ registerScopeRoot(scopeId, container);
11876
+ if (restoreFocus) {
11877
+ restoreTo.current = document.activeElement ?? null;
11878
+ }
11879
+ if (autoFocus) {
11880
+ const items2 = focusablesIn(getScopeRoots(scopeId));
11881
+ const target = items2[0] ?? container;
11882
+ target?.focus?.();
11883
+ }
11884
+ if (inertBackground) applyBackgroundInert(getScopeRoots(scopeId));
11885
+ return () => {
11886
+ unregisterScopeRoot(scopeId, container);
11887
+ if (inertBackground) releaseBackgroundInert();
11888
+ if (restoreFocus) {
11889
+ const to = restoreTo.current;
11890
+ restoreTo.current = null;
11891
+ if (to && to.isConnected) to.focus?.();
11892
+ }
11893
+ };
11894
+ }, [active, scopeId]);
11895
+ react.useEffect(() => {
11896
+ if (!active || !scopeId) return;
11897
+ const onKeyDown = (e) => {
11898
+ if (e.key === "Escape") {
11899
+ if (!escapeEnabled) return;
11900
+ if (!isTopOverlay(scopeId)) {
11901
+ e.stopPropagation();
11902
+ return;
11903
+ }
11904
+ onEscapeRef.current?.();
11905
+ return;
11906
+ }
11907
+ if (e.key !== "Tab") return;
11908
+ if (!isTopOverlay(scopeId)) {
11909
+ e.preventDefault();
11910
+ return;
11911
+ }
11912
+ const items2 = focusablesIn(getScopeRoots(scopeId));
11913
+ if (items2.length === 0) {
11914
+ e.preventDefault();
11915
+ nodeRef.current?.focus?.();
11916
+ return;
11917
+ }
11918
+ const first = items2[0];
11919
+ const last = items2[items2.length - 1];
11920
+ const current = document.activeElement;
11921
+ const inside = current ? items2.includes(current) : false;
11922
+ if (e.shiftKey) {
11923
+ if (!inside || current === first) {
11924
+ e.preventDefault();
11925
+ last.focus();
11926
+ }
11927
+ } else if (!inside || current === last) {
11928
+ e.preventDefault();
11929
+ first.focus();
11930
+ }
11931
+ };
11932
+ document.addEventListener("keydown", onKeyDown, true);
11933
+ return () => document.removeEventListener("keydown", onKeyDown, true);
11934
+ }, [active, scopeId, escapeEnabled]);
11935
+ const setNode = react.useCallback((el) => {
11936
+ nodeRef.current = el;
11937
+ }, []);
11938
+ return {
11939
+ ref: setNode,
11940
+ scopeId,
11941
+ layerBase: scopeId ? layerBaseFor(scopeId) : OVERLAY_LAYER.modalRoot
11942
+ };
11943
+ }
11944
+ var OverlayLayerContext = react.createContext(null);
11945
+ function OverlayLayerProvider({ layerBase, children }) {
11946
+ return /* @__PURE__ */ jsxRuntime.jsx(OverlayLayerContext.Provider, { value: { layerBase }, children });
11947
+ }
11948
+ function useOverlayLayer(kind = "popup") {
11949
+ const ctx = react.useContext(OverlayLayerContext);
11950
+ const offset = kind === "tooltip" ? OVERLAY_LAYER.tooltipOffset : OVERLAY_LAYER.popupOffset;
11951
+ if (ctx) return ctx.layerBase + offset;
11952
+ return kind === "tooltip" ? OVERLAY_LAYER.modalRoot + OVERLAY_LAYER.tooltipOffset : OVERLAY_LAYER.pagePopup;
11953
+ }
10673
11954
  var Modal = react.forwardRef(function Modal2({
10674
11955
  open,
10675
11956
  onClose,
@@ -10710,19 +11991,21 @@ var Modal = react.forwardRef(function Modal2({
10710
11991
  const [maximized, setMaximized] = react.useState(defaultMaximized);
10711
11992
  const drag = react.useRef(null);
10712
11993
  const prevOpen = react.useRef(open);
10713
- react.useEffect(() => {
10714
- if (!open) return;
10715
- const onKey = (e) => {
10716
- if (e.key === "Escape" && keyboard && closable) cancel?.();
10717
- };
10718
- document.addEventListener("keydown", onKey);
10719
- const prevOverflow = document.body.style.overflow;
10720
- document.body.style.overflow = "hidden";
10721
- return () => {
10722
- document.removeEventListener("keydown", onKey);
10723
- document.body.style.overflow = prevOverflow;
10724
- };
10725
- }, [open, keyboard, closable, cancel]);
11994
+ const scope = useOverlayScope({
11995
+ active: open,
11996
+ escapeEnabled: keyboard && closable,
11997
+ onEscape: cancel
11998
+ });
11999
+ const scopeRef = scope.ref;
12000
+ const titleId = `${react.useId()}title`;
12001
+ const attachDialogRef = react.useCallback(
12002
+ (el) => {
12003
+ scopeRef(el);
12004
+ if (typeof ref === "function") ref(el);
12005
+ else if (ref) ref.current = el;
12006
+ },
12007
+ [ref, scopeRef]
12008
+ );
10726
12009
  react.useEffect(() => {
10727
12010
  if (open) {
10728
12011
  setPos({ x: 0, y: 0 });
@@ -10773,9 +12056,11 @@ var Modal = react.forwardRef(function Modal2({
10773
12056
  children: /* @__PURE__ */ jsxRuntime.jsxs(
10774
12057
  "div",
10775
12058
  {
10776
- ref,
12059
+ ref: attachDialogRef,
10777
12060
  role: "dialog",
10778
12061
  "aria-modal": "true",
12062
+ "aria-labelledby": title ? titleId : void 0,
12063
+ tabIndex: -1,
10779
12064
  onClick: (e) => e.stopPropagation(),
10780
12065
  className: chunkTPGAXYFU_cjs.cx("klun-modal__dialog", maximized && "klun-modal__dialog--maximized", className),
10781
12066
  style: dialogStyle,
@@ -10789,7 +12074,7 @@ var Modal = react.forwardRef(function Modal2({
10789
12074
  children: [
10790
12075
  icon ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-modal__icon", children: icon }) : null,
10791
12076
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-modal__heading", children: [
10792
- title ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-modal__title", children: title }) : null,
12077
+ title ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-modal__title", id: titleId, children: title }) : null,
10793
12078
  description ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-modal__description", children: description }) : null
10794
12079
  ] }),
10795
12080
  maximizable || closable ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-modal__actions", children: [
@@ -11057,7 +12342,7 @@ var ImageUpload = react.forwardRef(function ImageUpload2({
11057
12342
  shape = "circle",
11058
12343
  size = 96,
11059
12344
  label,
11060
- hint = "PNG or JPG, up to 5MB",
12345
+ hint: hintProp,
11061
12346
  onPick,
11062
12347
  onRemove,
11063
12348
  disabled = false,
@@ -11066,6 +12351,7 @@ var ImageUpload = react.forwardRef(function ImageUpload2({
11066
12351
  ...props
11067
12352
  }, ref) {
11068
12353
  const { imageUpload } = useLocale();
12354
+ const hint = hintProp ?? imageUpload.hint;
11069
12355
  const [over, setOver] = react.useState(false);
11070
12356
  const inputRef = react.useRef(null);
11071
12357
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: chunkTPGAXYFU_cjs.cx("klun-image-upload", className), style, ...props, children: [
@@ -11673,17 +12959,20 @@ var RichEditor = react.forwardRef(function RichEditor2({
11673
12959
  value,
11674
12960
  defaultValue = "",
11675
12961
  onChange,
11676
- placeholder = "Write something\u2026",
12962
+ placeholder: placeholderProp,
11677
12963
  disabled = false,
11678
12964
  hideToolbar = false,
11679
12965
  minHeight = 160,
11680
12966
  maxHeight,
11681
12967
  allowSource = true,
11682
- editorLabel = "Rich text editor",
12968
+ editorLabel: editorLabelProp,
11683
12969
  className,
11684
12970
  style,
11685
12971
  ...props
11686
12972
  }, ref) {
12973
+ const { richEditor: localeRich } = useLocale();
12974
+ const placeholder = placeholderProp ?? localeRich.placeholder;
12975
+ const editorLabel = editorLabelProp ?? localeRich.editorLabel;
11687
12976
  const editorRef = react.useRef(null);
11688
12977
  const [active, setActive] = react.useState([]);
11689
12978
  const [source, setSource] = react.useState(false);
@@ -11804,7 +13093,10 @@ var Select = react.forwardRef(function Select2({
11804
13093
  const rootRef = react.useRef(null);
11805
13094
  const s = useSelect({ children, value, defaultValue, disabled: disabled || loading, rootRef });
11806
13095
  const { select: selectLocale } = useLocale();
11807
- const fallbackLabel = !ariaLabel && !ariaLabelledBy && !s.selected && !placeholder ? selectLocale?.placeholder ?? "Select" : void 0;
13096
+ const generatedId = react.useId();
13097
+ const listboxId = `${generatedId}listbox`;
13098
+ const optionId = (index) => `${listboxId}-option-${index}`;
13099
+ const fallbackLabel = !ariaLabel && !ariaLabelledBy ? placeholder || selectLocale?.placeholder || "Select" : void 0;
11808
13100
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: rootRef, className: chunkTPGAXYFU_cjs.cx("klun-select", `klun-select--${size}`, className), style, children: [
11809
13101
  /* @__PURE__ */ jsxRuntime.jsxs(
11810
13102
  "button",
@@ -11814,8 +13106,11 @@ var Select = react.forwardRef(function Select2({
11814
13106
  disabled,
11815
13107
  onClick: s.toggle,
11816
13108
  onKeyDown: s.triggerKeyDown,
13109
+ role: "combobox",
11817
13110
  "aria-haspopup": "listbox",
11818
13111
  "aria-expanded": s.open,
13112
+ "aria-controls": s.open ? listboxId : void 0,
13113
+ "aria-activedescendant": s.open && s.active >= 0 ? optionId(s.active) : void 0,
11819
13114
  "aria-label": ariaLabel ?? fallbackLabel,
11820
13115
  "aria-labelledby": ariaLabelledBy,
11821
13116
  "data-open": s.open || void 0,
@@ -11855,6 +13150,8 @@ var Select = react.forwardRef(function Select2({
11855
13150
  s.open ? /* @__PURE__ */ jsxRuntime.jsx(
11856
13151
  SelectListbox,
11857
13152
  {
13153
+ id: listboxId,
13154
+ optionId,
11858
13155
  anchorRef: s.triggerRef,
11859
13156
  options: s.options,
11860
13157
  current: s.current,
@@ -11876,7 +13173,7 @@ var SelectMenu = react.forwardRef(
11876
13173
  leadingIcon,
11877
13174
  error = false,
11878
13175
  disabled = false,
11879
- align = "left",
13176
+ align = "start",
11880
13177
  className,
11881
13178
  style,
11882
13179
  ...props
@@ -12556,6 +13853,7 @@ function computeSizes(panels, containerPx) {
12556
13853
  return sizes;
12557
13854
  }
12558
13855
  var SplitterRoot = react.forwardRef(function Splitter({ layout = "horizontal", onResize, onResizeEnd, className, children, ...props }, forwardedRef) {
13856
+ const { a11y } = useLocale();
12559
13857
  const containerRef = react.useRef(null);
12560
13858
  const setRefs = react.useCallback(
12561
13859
  (node) => {
@@ -12774,7 +14072,7 @@ var SplitterRoot = react.forwardRef(function Splitter({ layout = "horizontal", o
12774
14072
  {
12775
14073
  type: "button",
12776
14074
  className: "klun-splitter__collapse klun-splitter__collapse--start",
12777
- "aria-label": "Collapse start panel",
14075
+ "aria-label": a11y.collapseStart,
12778
14076
  tabIndex: -1,
12779
14077
  onPointerDown: (e) => e.stopPropagation(),
12780
14078
  onClick: () => collapseToggle(i, i),
@@ -12786,7 +14084,7 @@ var SplitterRoot = react.forwardRef(function Splitter({ layout = "horizontal", o
12786
14084
  {
12787
14085
  type: "button",
12788
14086
  className: "klun-splitter__collapse klun-splitter__collapse--end",
12789
- "aria-label": "Collapse end panel",
14087
+ "aria-label": a11y.collapseEnd,
12790
14088
  tabIndex: -1,
12791
14089
  onPointerDown: (e) => e.stopPropagation(),
12792
14090
  onClick: () => collapseToggle(i, i + 1),
@@ -13018,6 +14316,7 @@ var PageHeader = react.forwardRef(function PageHeader2({
13018
14316
  children,
13019
14317
  ...props
13020
14318
  }, ref) {
14319
+ const { a11y } = useLocale();
13021
14320
  return /* @__PURE__ */ jsxRuntime.jsxs(
13022
14321
  "header",
13023
14322
  {
@@ -13039,7 +14338,7 @@ var PageHeader = react.forwardRef(function PageHeader2({
13039
14338
  appearance: "ghost",
13040
14339
  variant: "neutral",
13041
14340
  size: "small",
13042
- "aria-label": "Back",
14341
+ "aria-label": a11y.back,
13043
14342
  className: "klun-page-header__back",
13044
14343
  icon: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-arrow-left-line", "aria-hidden": true }),
13045
14344
  onClick: onBack
@@ -13231,7 +14530,7 @@ var Sidebar = react.forwardRef(function Sidebar2({
13231
14530
  onSelect,
13232
14531
  defaultExpandedKeys = [],
13233
14532
  searchable = false,
13234
- searchPlaceholder = "Search",
14533
+ searchPlaceholder: searchPlaceholderProp,
13235
14534
  onSearch,
13236
14535
  collapsed: collapsedProp,
13237
14536
  defaultCollapsed = false,
@@ -13239,6 +14538,8 @@ var Sidebar = react.forwardRef(function Sidebar2({
13239
14538
  className,
13240
14539
  ...props
13241
14540
  }, ref) {
14541
+ const { sidebar: localeSidebar } = useLocale();
14542
+ const searchPlaceholder = searchPlaceholderProp ?? localeSidebar.searchPlaceholder;
13242
14543
  const [internalNav, setInternalNav] = react.useState(defaultNavKey);
13243
14544
  const [internalCollapsed, setInternalCollapsed] = react.useState(defaultCollapsed);
13244
14545
  const [expandedKeys, setExpandedKeys] = react.useState(
@@ -13274,7 +14575,7 @@ var Sidebar = react.forwardRef(function Sidebar2({
13274
14575
  "data-collapsed": collapsed ? "" : void 0,
13275
14576
  ...props,
13276
14577
  children: [
13277
- /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: "klun-sidebar__rail", "aria-label": "Primary", children: [
14578
+ /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: "klun-sidebar__rail", "aria-label": localeSidebar.primary, children: [
13278
14579
  brand != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-sidebar__brand", children: brand }),
13279
14580
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-sidebar__nav", children: navItems.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
13280
14581
  RailButton,
@@ -13321,6 +14622,7 @@ var Sidebar = react.forwardRef(function Sidebar2({
13321
14622
  type: "text",
13322
14623
  className: "klun-sidebar__search-input",
13323
14624
  placeholder: searchPlaceholder,
14625
+ "aria-label": searchPlaceholder,
13324
14626
  value: query,
13325
14627
  tabIndex: collapsed ? -1 : 0,
13326
14628
  onChange: (e) => {
@@ -13690,6 +14992,7 @@ var Wizard = react.forwardRef(function Wizard2({
13690
14992
  className,
13691
14993
  ...props
13692
14994
  }, ref) {
14995
+ const { wizard } = useLocale();
13693
14996
  const isControlled = current !== void 0;
13694
14997
  const [internal, setInternal] = react.useState(defaultCurrent);
13695
14998
  const idx = isControlled ? current : internal;
@@ -13734,7 +15037,7 @@ var Wizard = react.forwardRef(function Wizard2({
13734
15037
  className: "klun-wizard__nav",
13735
15038
  onClick: () => go(idx - 1),
13736
15039
  disabled: idx === 0,
13737
- children: "Back"
15040
+ children: wizard.back
13738
15041
  }
13739
15042
  ),
13740
15043
  !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -13743,7 +15046,7 @@ var Wizard = react.forwardRef(function Wizard2({
13743
15046
  type: "button",
13744
15047
  className: "klun-wizard__nav klun-wizard__nav--primary",
13745
15048
  onClick: () => go(idx + 1),
13746
- children: "Next"
15049
+ children: wizard.next
13747
15050
  }
13748
15051
  ) : /* @__PURE__ */ jsxRuntime.jsx(
13749
15052
  "button",
@@ -13751,7 +15054,7 @@ var Wizard = react.forwardRef(function Wizard2({
13751
15054
  type: "button",
13752
15055
  className: "klun-wizard__nav klun-wizard__nav--primary",
13753
15056
  onClick: () => onFinish?.(),
13754
- children: "Finish"
15057
+ children: wizard.finish
13755
15058
  }
13756
15059
  )
13757
15060
  ] })
@@ -13838,13 +15141,14 @@ var INTENT_ICON = {
13838
15141
  warning: "ri-alert-line"
13839
15142
  };
13840
15143
  function ConfirmDialog({ opts, onClose }) {
15144
+ const { popconfirm } = useLocale();
13841
15145
  const {
13842
- title = "Are you sure?",
15146
+ title = popconfirm.title,
13843
15147
  description,
13844
15148
  icon,
13845
15149
  intent = "primary",
13846
- confirmText = "Confirm",
13847
- cancelText = "Cancel",
15150
+ confirmText = popconfirm.confirm,
15151
+ cancelText = popconfirm.cancel,
13848
15152
  requireInput,
13849
15153
  onConfirm
13850
15154
  } = opts;
@@ -13984,7 +15288,11 @@ function place(w, h, opts) {
13984
15288
  let top;
13985
15289
  if (opts.rect) {
13986
15290
  const r = opts.rect;
13987
- left = r.right - 4 + w > vw - GAP3 ? r.left - w + 4 : r.right - 4;
15291
+ if (opts.rtl) {
15292
+ left = r.left - w + 4 < GAP3 ? r.right - 4 : r.left - w + 4;
15293
+ } else {
15294
+ left = r.right - 4 + w > vw - GAP3 ? r.left - w + 4 : r.right - 4;
15295
+ }
13988
15296
  top = r.top - 4;
13989
15297
  } else {
13990
15298
  const p = opts.point ?? { x: 0, y: 0 };
@@ -14006,7 +15314,9 @@ function MenuPanel({ items: items2, width, className, point, anchorEl, autoActiv
14006
15314
  const el = ref.current;
14007
15315
  const w = el?.offsetWidth ?? width;
14008
15316
  const h = el?.offsetHeight ?? 0;
14009
- setPos(place(w, h, anchorEl ? { rect: anchorEl.getBoundingClientRect() } : { point }));
15317
+ const dirHost = anchorEl ?? ref.current ?? document.body;
15318
+ const rtl = getComputedStyle(dirHost).direction === "rtl";
15319
+ setPos(place(w, h, anchorEl ? { rect: anchorEl.getBoundingClientRect(), rtl } : { point }));
14010
15320
  }, [width, point?.x, point?.y, anchorEl, items2]);
14011
15321
  const move = react.useCallback(
14012
15322
  (dir) => {
@@ -14176,7 +15486,6 @@ var Drawer = react.forwardRef(function Drawer2({
14176
15486
  onClose,
14177
15487
  title,
14178
15488
  placement,
14179
- side,
14180
15489
  width = "50%",
14181
15490
  height = "50%",
14182
15491
  size = "default",
@@ -14194,22 +15503,24 @@ var Drawer = react.forwardRef(function Drawer2({
14194
15503
  ...props
14195
15504
  }, ref) {
14196
15505
  const { drawer } = useLocale();
14197
- const place2 = placement ?? side ?? "right";
15506
+ const place2 = placement ?? "right";
14198
15507
  const horizontal = place2 === "left" || place2 === "right";
14199
15508
  const prevOpen = react.useRef(open);
14200
- react.useEffect(() => {
14201
- if (!open) return;
14202
- const onKey = (e) => {
14203
- if (e.key === "Escape" && keyboard && closable) onClose?.();
14204
- };
14205
- document.addEventListener("keydown", onKey);
14206
- const prevOverflow = document.body.style.overflow;
14207
- document.body.style.overflow = "hidden";
14208
- return () => {
14209
- document.removeEventListener("keydown", onKey);
14210
- document.body.style.overflow = prevOverflow;
14211
- };
14212
- }, [open, keyboard, closable, onClose]);
15509
+ const scope = useOverlayScope({
15510
+ active: open,
15511
+ escapeEnabled: keyboard && closable,
15512
+ onEscape: onClose
15513
+ });
15514
+ const scopeRef = scope.ref;
15515
+ const titleId = `${react.useId()}title`;
15516
+ const attachPanelRef = react.useCallback(
15517
+ (el) => {
15518
+ scopeRef(el);
15519
+ if (typeof ref === "function") ref(el);
15520
+ else if (ref) ref.current = el;
15521
+ },
15522
+ [ref, scopeRef]
15523
+ );
14213
15524
  react.useEffect(() => {
14214
15525
  if (prevOpen.current !== open) {
14215
15526
  afterOpenChange?.(open);
@@ -14228,16 +15539,18 @@ var Drawer = react.forwardRef(function Drawer2({
14228
15539
  children: /* @__PURE__ */ jsxRuntime.jsxs(
14229
15540
  "div",
14230
15541
  {
14231
- ref,
15542
+ ref: attachPanelRef,
14232
15543
  role: "dialog",
14233
15544
  "aria-modal": "true",
15545
+ "aria-labelledby": title ? titleId : void 0,
15546
+ tabIndex: -1,
14234
15547
  onClick: (e) => e.stopPropagation(),
14235
15548
  className: chunkTPGAXYFU_cjs.cx("klun-drawer__panel", className),
14236
15549
  style: panelStyle,
14237
15550
  ...props,
14238
15551
  children: [
14239
15552
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-drawer__header", children: [
14240
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-drawer__title", children: title }),
15553
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-drawer__title", id: title ? titleId : void 0, children: title }),
14241
15554
  extra ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-drawer__extra", children: extra }) : null,
14242
15555
  closable ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: onClose, "aria-label": drawer.close, className: "klun-drawer__close", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 5l10 10M15 5L5 15", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) }) }) : null
14243
15556
  ] }),
@@ -14250,7 +15563,7 @@ var Drawer = react.forwardRef(function Drawer2({
14250
15563
  );
14251
15564
  });
14252
15565
  Drawer.displayName = "Drawer";
14253
- var Dropdown = react.forwardRef(function Dropdown2({ trigger, items: items2 = [], align = "left", width = 220, className, ...props }, ref) {
15566
+ var Dropdown = react.forwardRef(function Dropdown2({ trigger, items: items2 = [], align = "start", width = 220, className, ...props }, ref) {
14254
15567
  const [open, setOpen] = react.useState(false);
14255
15568
  const innerRef = react.useRef(null);
14256
15569
  react.useEffect(() => {
@@ -14525,6 +15838,7 @@ function ImageViewer({
14525
15838
  closeOnBackdrop = true,
14526
15839
  className
14527
15840
  }) {
15841
+ const { a11y, imageViewer, modal, pagination } = useLocale();
14528
15842
  const gallery = items2 && items2.length > 0 ? items2 : src != null ? [{ src, alt }] : [];
14529
15843
  const [innerIndex, setInnerIndex] = react.useState(0);
14530
15844
  const idx = index ?? innerIndex;
@@ -14613,20 +15927,20 @@ function ImageViewer({
14613
15927
  ] }),
14614
15928
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "klun-image-viewer__tools", children: [
14615
15929
  zoomable ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14616
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": "Zoom out", onClick: () => setScale((s) => clampScale(s - 0.25)), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-zoom-out-line" }) }),
15930
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": a11y.zoomOut, onClick: () => setScale((s) => clampScale(s - 0.25)), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-zoom-out-line" }) }),
14617
15931
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "klun-image-viewer__zoom", children: [
14618
15932
  Math.round(scale * 100),
14619
15933
  "%"
14620
15934
  ] }),
14621
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": "Zoom in", onClick: () => setScale((s) => clampScale(s + 0.25)), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-zoom-in-line" }) })
15935
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": a11y.zoomIn, onClick: () => setScale((s) => clampScale(s + 0.25)), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-zoom-in-line" }) })
14622
15936
  ] }) : null,
14623
- rotatable ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": "Rotate", onClick: () => setRot((r) => (r + 90) % 360), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-anticlockwise-line" }) }) : null,
14624
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": "Reset", onClick: reset, children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-aspect-ratio-line" }) }),
14625
- onDownload ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": "Download", onClick: () => onDownload(current, safeIdx), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-download-2-line" }) }) : null,
14626
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": "Close", onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-close-line" }) })
15937
+ rotatable ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": a11y.rotate, onClick: () => setRot((r) => (r + 90) % 360), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-anticlockwise-line" }) }) : null,
15938
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": imageViewer.reset, onClick: reset, children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-aspect-ratio-line" }) }),
15939
+ onDownload ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": imageViewer.download, onClick: () => onDownload(current, safeIdx), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-download-2-line" }) }) : null,
15940
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__btn", "aria-label": modal.close, onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-close-line" }) })
14627
15941
  ] })
14628
15942
  ] }),
14629
- gallery.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__nav klun-image-viewer__nav--prev", "aria-label": "Previous", onMouseDown: (e) => e.stopPropagation(), onClick: () => goTo(safeIdx - 1), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-arrow-left-s-line" }) }) : null,
15943
+ gallery.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__nav klun-image-viewer__nav--prev", "aria-label": pagination.previous, onMouseDown: (e) => e.stopPropagation(), onClick: () => goTo(safeIdx - 1), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-arrow-left-s-line" }) }) : null,
14630
15944
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "klun-image-viewer__stage", onMouseDown: (e) => e.stopPropagation(), onWheel, children: /* @__PURE__ */ jsxRuntime.jsx(
14631
15945
  "img",
14632
15946
  {
@@ -14639,7 +15953,7 @@ function ImageViewer({
14639
15953
  style: { transform: `translate(${pan.x}px, ${pan.y}px) scale(${scale}) rotate(${rot}deg)` }
14640
15954
  }
14641
15955
  ) }),
14642
- gallery.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__nav klun-image-viewer__nav--next", "aria-label": "Next", onMouseDown: (e) => e.stopPropagation(), onClick: () => goTo(safeIdx + 1), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-arrow-right-s-line" }) }) : null
15956
+ gallery.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "klun-image-viewer__nav klun-image-viewer__nav--next", "aria-label": pagination.next, onMouseDown: (e) => e.stopPropagation(), onClick: () => goTo(safeIdx + 1), children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "ri-arrow-right-s-line" }) }) : null
14643
15957
  ]
14644
15958
  }
14645
15959
  ),
@@ -14953,6 +16267,7 @@ exports.Money = Money;
14953
16267
  exports.NavigationProgress = NavigationProgress;
14954
16268
  exports.Notification = Notification;
14955
16269
  exports.NumberFlow = NumberFlow;
16270
+ exports.OverlayLayerProvider = OverlayLayerProvider;
14956
16271
  exports.PageHeader = PageHeader;
14957
16272
  exports.Pagination = Pagination;
14958
16273
  exports.PasswordStrength = PasswordStrength;
@@ -14971,6 +16286,7 @@ exports.Result = Result;
14971
16286
  exports.RichEditor = RichEditor;
14972
16287
  exports.RichEditorToolbar = RichEditorToolbar;
14973
16288
  exports.Row = Row;
16289
+ exports.SIZE_CONTRACTS = SIZE_CONTRACTS;
14974
16290
  exports.SegmentedControl = SegmentedControl;
14975
16291
  exports.SegmentedProgress = SegmentedProgress;
14976
16292
  exports.Select = Select;
@@ -15038,23 +16354,29 @@ exports.ptBR = ptBR;
15038
16354
  exports.renderMarkdown = renderMarkdown;
15039
16355
  exports.reorderRows = reorderRows;
15040
16356
  exports.resolveMove = resolveMove;
16357
+ exports.resolveSize = resolveSize;
15041
16358
  exports.ruRU = ruRU;
15042
16359
  exports.summarizeHeatmap = summarizeHeatmap;
16360
+ exports.tierOf = tierOf;
15043
16361
  exports.toast = toast;
15044
16362
  exports.trTR = trTR;
15045
16363
  exports.useBreakpoint = useBreakpoint;
15046
16364
  exports.useConfig = useConfig;
15047
16365
  exports.useContextMenu = useContextMenu;
16366
+ exports.useDensity = useDensity;
15048
16367
  exports.useForm = useForm;
15049
16368
  exports.useLocale = useLocale;
15050
16369
  exports.useMappedSize = useMappedSize;
15051
16370
  exports.useMessage = useMessage;
15052
16371
  exports.useNotification = useNotification;
16372
+ exports.useOverlayLayer = useOverlayLayer;
16373
+ exports.useOverlayScope = useOverlayScope;
16374
+ exports.useScaleSize = useScaleSize;
15053
16375
  exports.useSize = useSize;
15054
16376
  exports.useStepItem = useStepItem;
15055
16377
  exports.useStepper = useStepper;
15056
16378
  exports.viVN = viVN;
15057
16379
  exports.zhCN = zhCN;
15058
16380
  exports.zhTW = zhTW;
15059
- //# sourceMappingURL=chunk-ODVX2AVA.cjs.map
15060
- //# sourceMappingURL=chunk-ODVX2AVA.cjs.map
16381
+ //# sourceMappingURL=chunk-DW4IUUWE.cjs.map
16382
+ //# sourceMappingURL=chunk-DW4IUUWE.cjs.map