@keepkit/ui 0.18.0 → 0.19.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.
package/dist/index.js CHANGED
@@ -107,6 +107,13 @@ var DE_LABELS = {
107
107
  allTags: "Alle",
108
108
  tags: "Tags",
109
109
  filterTags: "Gespeicherte Elemente nach Tag filtern",
110
+ activeFilters: "Aktive Filter",
111
+ clearFilters: "Filter l\xF6schen",
112
+ clearAllFilters: "Alle Filter l\xF6schen",
113
+ removeFilter: "entfernen",
114
+ noFilteredItems: "Keine passenden Elemente gefunden.",
115
+ noFilteredItemsDescription: "Passe die Suche an oder entferne einen Tag-Filter.",
116
+ emptyStorageDescription: "Speichere ein Element, damit es hier angezeigt wird.",
110
117
  note: "Notiz",
111
118
  saveNote: "Notiz speichern",
112
119
  noItems: "Keine gespeicherten Elemente.",
@@ -186,6 +193,13 @@ var EN_LABELS = {
186
193
  allTags: "All",
187
194
  tags: "Tags",
188
195
  filterTags: "Filter saved items by tag",
196
+ activeFilters: "Active filters",
197
+ clearFilters: "Clear filters",
198
+ clearAllFilters: "Clear all filters",
199
+ removeFilter: "Remove",
200
+ noFilteredItems: "No matching items found.",
201
+ noFilteredItemsDescription: "Try adjusting your search or removing a tag filter.",
202
+ emptyStorageDescription: "Save an item to see it here.",
189
203
  note: "Note",
190
204
  saveNote: "Save note",
191
205
  noItems: "No saved items.",
@@ -265,6 +279,13 @@ var ES_LABELS = {
265
279
  allTags: "Todos",
266
280
  tags: "Etiquetas",
267
281
  filterTags: "Filtrar elementos guardados por etiqueta",
282
+ activeFilters: "Filtros activos",
283
+ clearFilters: "Borrar filtros",
284
+ clearAllFilters: "Borrar todos los filtros",
285
+ removeFilter: "quitar",
286
+ noFilteredItems: "No se encontraron elementos coincidentes.",
287
+ noFilteredItemsDescription: "Ajusta la b\xFAsqueda o quita un filtro de etiqueta.",
288
+ emptyStorageDescription: "Guarda un elemento para verlo aqu\xED.",
268
289
  note: "Nota",
269
290
  saveNote: "Guardar nota",
270
291
  noItems: "No hay elementos guardados.",
@@ -344,6 +365,13 @@ var FIL_LABELS = {
344
365
  allTags: "Lahat",
345
366
  tags: "Mga tag",
346
367
  filterTags: "I-filter ang mga naka-save na item ayon sa tag",
368
+ activeFilters: "Mga aktibong filter",
369
+ clearFilters: "I-clear ang mga filter",
370
+ clearAllFilters: "I-clear ang lahat ng filter",
371
+ removeFilter: "alisin",
372
+ noFilteredItems: "Walang nakitang tumutugmang item.",
373
+ noFilteredItemsDescription: "Baguhin ang paghahanap o alisin ang filter ng tag.",
374
+ emptyStorageDescription: "Mag-save ng item para makita ito rito.",
347
375
  note: "Tala",
348
376
  saveNote: "I-save ang tala",
349
377
  noItems: "Walang naka-save na item.",
@@ -423,6 +451,13 @@ var FR_LABELS = {
423
451
  allTags: "Tous",
424
452
  tags: "\xC9tiquettes",
425
453
  filterTags: "Filtrer les \xE9l\xE9ments enregistr\xE9s par \xE9tiquette",
454
+ activeFilters: "Filtres actifs",
455
+ clearFilters: "Effacer les filtres",
456
+ clearAllFilters: "Effacer tous les filtres",
457
+ removeFilter: "supprimer",
458
+ noFilteredItems: "Aucun \xE9l\xE9ment correspondant trouv\xE9.",
459
+ noFilteredItemsDescription: "Modifiez votre recherche ou supprimez un filtre de tag.",
460
+ emptyStorageDescription: "Enregistrez un \xE9l\xE9ment pour le voir ici.",
426
461
  note: "Note",
427
462
  saveNote: "Enregistrer la note",
428
463
  noItems: "Aucun \xE9l\xE9ment enregistr\xE9.",
@@ -502,6 +537,13 @@ var ID_LABELS = {
502
537
  allTags: "Semua",
503
538
  tags: "Tag",
504
539
  filterTags: "Filter item tersimpan berdasarkan tag",
540
+ activeFilters: "Filter aktif",
541
+ clearFilters: "Hapus filter",
542
+ clearAllFilters: "Hapus semua filter",
543
+ removeFilter: "hapus",
544
+ noFilteredItems: "Tidak ada item yang cocok.",
545
+ noFilteredItemsDescription: "Ubah pencarian atau hapus filter tag.",
546
+ emptyStorageDescription: "Simpan item untuk melihatnya di sini.",
505
547
  note: "Catatan",
506
548
  saveNote: "Simpan catatan",
507
549
  noItems: "Belum ada item tersimpan.",
@@ -581,6 +623,13 @@ var IT_LABELS = {
581
623
  allTags: "Tutti",
582
624
  tags: "Tag",
583
625
  filterTags: "Filtra gli elementi salvati per tag",
626
+ activeFilters: "Filtri attivi",
627
+ clearFilters: "Cancella filtri",
628
+ clearAllFilters: "Cancella tutti i filtri",
629
+ removeFilter: "rimuovi",
630
+ noFilteredItems: "Nessun elemento corrispondente trovato.",
631
+ noFilteredItemsDescription: "Modifica la ricerca o rimuovi un filtro tag.",
632
+ emptyStorageDescription: "Salva un elemento per visualizzarlo qui.",
584
633
  note: "Nota",
585
634
  saveNote: "Salva nota",
586
635
  noItems: "Nessun elemento salvato.",
@@ -660,6 +709,13 @@ var JA_LABELS = {
660
709
  allTags: "\u3059\u3079\u3066",
661
710
  tags: "\u30BF\u30B0",
662
711
  filterTags: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u30BF\u30B0\u3067\u7D5E\u308A\u8FBC\u3080",
712
+ activeFilters: "\u9069\u7528\u4E2D\u306E\u6761\u4EF6",
713
+ clearFilters: "\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u30AF\u30EA\u30A2",
714
+ clearAllFilters: "\u3059\u3079\u3066\u306E\u6761\u4EF6\u3092\u30AF\u30EA\u30A2",
715
+ removeFilter: "\u3092\u89E3\u9664",
716
+ noFilteredItems: "\u4E00\u81F4\u3059\u308B\u30A2\u30A4\u30C6\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F",
717
+ noFilteredItemsDescription: "\u691C\u7D22\u8A9E\u3092\u5909\u66F4\u3059\u308B\u304B\u3001\u30BF\u30B0\u306E\u7D5E\u308A\u8FBC\u307F\u3092\u89E3\u9664\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
718
+ emptyStorageDescription: "\u30A2\u30A4\u30C6\u30E0\u3092\u4FDD\u5B58\u3059\u308B\u3068\u3001\u3053\u3053\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002",
663
719
  note: "\u30E1\u30E2",
664
720
  saveNote: "\u30E1\u30E2\u3092\u4FDD\u5B58",
665
721
  noItems: "\u4FDD\u5B58\u3055\u308C\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u3042\u308A\u307E\u305B\u3093\u3002",
@@ -739,6 +795,13 @@ var KO_LABELS = {
739
795
  allTags: "\uBAA8\uB450",
740
796
  tags: "\uD0DC\uADF8",
741
797
  filterTags: "\uD0DC\uADF8\uB85C \uC800\uC7A5 \uD56D\uBAA9 \uD544\uD130\uB9C1",
798
+ activeFilters: "\uD65C\uC131 \uD544\uD130",
799
+ clearFilters: "\uD544\uD130 \uC9C0\uC6B0\uAE30",
800
+ clearAllFilters: "\uBAA8\uB4E0 \uD544\uD130 \uC9C0\uC6B0\uAE30",
801
+ removeFilter: "\uC81C\uAC70",
802
+ noFilteredItems: "\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
803
+ noFilteredItemsDescription: "\uAC80\uC0C9\uC5B4\uB97C \uBC14\uAFB8\uAC70\uB098 \uD0DC\uADF8 \uD544\uD130\uB97C \uC81C\uAC70\uD574 \uBCF4\uC138\uC694.",
804
+ emptyStorageDescription: "\uD56D\uBAA9\uC744 \uC800\uC7A5\uD558\uBA74 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.",
742
805
  note: "\uBA54\uBAA8",
743
806
  saveNote: "\uBA54\uBAA8 \uC800\uC7A5",
744
807
  noItems: "\uC800\uC7A5\uB41C \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
@@ -818,6 +881,13 @@ var MS_LABELS = {
818
881
  allTags: "Semua",
819
882
  tags: "Tag",
820
883
  filterTags: "Tapis item yang disimpan mengikut tag",
884
+ activeFilters: "Penapis aktif",
885
+ clearFilters: "Kosongkan penapis",
886
+ clearAllFilters: "Kosongkan semua penapis",
887
+ removeFilter: "alih keluar",
888
+ noFilteredItems: "Tiada item yang sepadan ditemui.",
889
+ noFilteredItemsDescription: "Laraskan carian atau alih keluar penapis tag.",
890
+ emptyStorageDescription: "Simpan item untuk melihatnya di sini.",
821
891
  note: "Nota",
822
892
  saveNote: "Simpan nota",
823
893
  noItems: "Tiada item disimpan.",
@@ -897,6 +967,13 @@ var PT_BR_LABELS = {
897
967
  allTags: "Todos",
898
968
  tags: "Tags",
899
969
  filterTags: "Filtrar itens salvos por tag",
970
+ activeFilters: "Filtros ativos",
971
+ clearFilters: "Limpar filtros",
972
+ clearAllFilters: "Limpar todos os filtros",
973
+ removeFilter: "remover",
974
+ noFilteredItems: "Nenhum item correspondente encontrado.",
975
+ noFilteredItemsDescription: "Ajuste sua busca ou remova um filtro de tag.",
976
+ emptyStorageDescription: "Salve um item para v\xEA-lo aqui.",
900
977
  note: "Nota",
901
978
  saveNote: "Salvar nota",
902
979
  noItems: "Nenhum item salvo.",
@@ -976,6 +1053,13 @@ var RU_LABELS = {
976
1053
  allTags: "\u0412\u0441\u0435",
977
1054
  tags: "\u0422\u0435\u0433\u0438",
978
1055
  filterTags: "\u0424\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043F\u043E \u0442\u0435\u0433\u0443",
1056
+ activeFilters: "\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0435 \u0444\u0438\u043B\u044C\u0442\u0440\u044B",
1057
+ clearFilters: "\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440\u044B",
1058
+ clearAllFilters: "\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0432\u0441\u0435 \u0444\u0438\u043B\u044C\u0442\u0440\u044B",
1059
+ removeFilter: "\u0443\u0434\u0430\u043B\u0438\u0442\u044C",
1060
+ noFilteredItems: "\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B.",
1061
+ noFilteredItemsDescription: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u0435 \u043F\u043E\u0438\u0441\u043A \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0438\u0442\u0435 \u0444\u0438\u043B\u044C\u0442\u0440 \u0442\u0435\u0433\u0430.",
1062
+ emptyStorageDescription: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u0447\u0442\u043E\u0431\u044B \u0443\u0432\u0438\u0434\u0435\u0442\u044C \u0435\u0433\u043E \u0437\u0434\u0435\u0441\u044C.",
979
1063
  note: "\u0417\u0430\u043C\u0435\u0442\u043A\u0430",
980
1064
  saveNote: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443",
981
1065
  noItems: "\u041D\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432.",
@@ -1055,6 +1139,13 @@ var TH_LABELS = {
1055
1139
  allTags: "\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14",
1056
1140
  tags: "\u0E41\u0E17\u0E47\u0E01",
1057
1141
  filterTags: "\u0E01\u0E23\u0E2D\u0E07\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E14\u0E49\u0E27\u0E22\u0E41\u0E17\u0E47\u0E01",
1142
+ activeFilters: "\u0E15\u0E31\u0E27\u0E01\u0E23\u0E2D\u0E07\u0E17\u0E35\u0E48\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19\u0E2D\u0E22\u0E39\u0E48",
1143
+ clearFilters: "\u0E25\u0E49\u0E32\u0E07\u0E15\u0E31\u0E27\u0E01\u0E23\u0E2D\u0E07",
1144
+ clearAllFilters: "\u0E25\u0E49\u0E32\u0E07\u0E15\u0E31\u0E27\u0E01\u0E23\u0E2D\u0E07\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14",
1145
+ removeFilter: "\u0E19\u0E33\u0E2D\u0E2D\u0E01",
1146
+ noFilteredItems: "\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E15\u0E23\u0E07\u0E01\u0E31\u0E19",
1147
+ noFilteredItemsDescription: "\u0E25\u0E2D\u0E07\u0E1B\u0E23\u0E31\u0E1A\u0E01\u0E32\u0E23\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E2B\u0E23\u0E37\u0E2D\u0E19\u0E33\u0E15\u0E31\u0E27\u0E01\u0E23\u0E2D\u0E07\u0E41\u0E17\u0E47\u0E01\u0E2D\u0E2D\u0E01",
1148
+ emptyStorageDescription: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E14\u0E39\u0E17\u0E35\u0E48\u0E19\u0E35\u0E48",
1058
1149
  note: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E22\u0E48\u0E2D",
1059
1150
  saveNote: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E22\u0E48\u0E2D",
1060
1151
  noItems: "\u0E44\u0E21\u0E48\u0E21\u0E35\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E44\u0E27\u0E49",
@@ -1134,6 +1225,13 @@ var VI_LABELS = {
1134
1225
  allTags: "T\u1EA5t c\u1EA3",
1135
1226
  tags: "Th\u1EBB",
1136
1227
  filterTags: "L\u1ECDc m\u1EE5c \u0111\xE3 l\u01B0u theo th\u1EBB",
1228
+ activeFilters: "B\u1ED9 l\u1ECDc \u0111ang d\xF9ng",
1229
+ clearFilters: "X\xF3a b\u1ED9 l\u1ECDc",
1230
+ clearAllFilters: "X\xF3a t\u1EA5t c\u1EA3 b\u1ED9 l\u1ECDc",
1231
+ removeFilter: "x\xF3a",
1232
+ noFilteredItems: "Kh\xF4ng t\xECm th\u1EA5y m\u1EE5c ph\xF9 h\u1EE3p.",
1233
+ noFilteredItemsDescription: "H\xE3y \u0111i\u1EC1u ch\u1EC9nh t\xECm ki\u1EBFm ho\u1EB7c x\xF3a b\u1ED9 l\u1ECDc th\u1EBB.",
1234
+ emptyStorageDescription: "L\u01B0u m\u1ED9t m\u1EE5c \u0111\u1EC3 xem m\u1EE5c \u0111\xF3 t\u1EA1i \u0111\xE2y.",
1137
1235
  note: "Ghi ch\xFA",
1138
1236
  saveNote: "L\u01B0u ghi ch\xFA",
1139
1237
  noItems: "Ch\u01B0a c\xF3 m\u1EE5c n\xE0o \u0111\u01B0\u1EE3c l\u01B0u.",
@@ -1213,6 +1311,13 @@ var ZH_HANS_LABELS = {
1213
1311
  allTags: "\u5168\u90E8",
1214
1312
  tags: "\u6807\u7B7E",
1215
1313
  filterTags: "\u6309\u6807\u7B7E\u7B5B\u9009\u5DF2\u4FDD\u5B58\u9879\u76EE",
1314
+ activeFilters: "\u5F53\u524D\u7B5B\u9009\u6761\u4EF6",
1315
+ clearFilters: "\u6E05\u9664\u7B5B\u9009",
1316
+ clearAllFilters: "\u6E05\u9664\u6240\u6709\u7B5B\u9009\u6761\u4EF6",
1317
+ removeFilter: "\u79FB\u9664",
1318
+ noFilteredItems: "\u672A\u627E\u5230\u5339\u914D\u9879\u76EE\u3002",
1319
+ noFilteredItemsDescription: "\u8BF7\u8C03\u6574\u641C\u7D22\u6761\u4EF6\u6216\u79FB\u9664\u6807\u7B7E\u7B5B\u9009\u3002",
1320
+ emptyStorageDescription: "\u4FDD\u5B58\u9879\u76EE\u540E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002",
1216
1321
  note: "\u5907\u6CE8",
1217
1322
  saveNote: "\u4FDD\u5B58\u5907\u6CE8",
1218
1323
  noItems: "\u6CA1\u6709\u5DF2\u4FDD\u5B58\u7684\u9879\u76EE\u3002",
@@ -1292,6 +1397,13 @@ var ZH_HANT_LABELS = {
1292
1397
  allTags: "\u5168\u90E8",
1293
1398
  tags: "\u6A19\u7C64",
1294
1399
  filterTags: "\u4F9D\u6A19\u7C64\u7BE9\u9078\u5DF2\u5132\u5B58\u9805\u76EE",
1400
+ activeFilters: "\u76EE\u524D\u7BE9\u9078\u689D\u4EF6",
1401
+ clearFilters: "\u6E05\u9664\u7BE9\u9078",
1402
+ clearAllFilters: "\u6E05\u9664\u6240\u6709\u7BE9\u9078\u689D\u4EF6",
1403
+ removeFilter: "\u79FB\u9664",
1404
+ noFilteredItems: "\u627E\u4E0D\u5230\u76F8\u7B26\u9805\u76EE\u3002",
1405
+ noFilteredItemsDescription: "\u8ACB\u8ABF\u6574\u641C\u5C0B\u689D\u4EF6\u6216\u79FB\u9664\u6A19\u7C64\u7BE9\u9078\u3002",
1406
+ emptyStorageDescription: "\u5132\u5B58\u9805\u76EE\u5F8C\u6703\u986F\u793A\u5728\u9019\u88E1\u3002",
1295
1407
  note: "\u5099\u8A3B",
1296
1408
  saveNote: "\u5132\u5B58\u5099\u8A3B",
1297
1409
  noItems: "\u6C92\u6709\u5DF2\u5132\u5B58\u7684\u9805\u76EE\u3002",
@@ -1664,10 +1776,62 @@ function sortToValue(sort) {
1664
1776
  function resolveContent(content, state) {
1665
1777
  return typeof content === "function" ? content(state) : content;
1666
1778
  }
1779
+ function chainedFunction(childHandler, parentHandler) {
1780
+ if (!childHandler) return parentHandler;
1781
+ if (!parentHandler) return childHandler;
1782
+ return ((...args) => {
1783
+ childHandler(...args);
1784
+ parentHandler(...args);
1785
+ });
1786
+ }
1787
+ function mergeProps(childProps, parentProps) {
1788
+ const merged = { ...parentProps, ...childProps };
1789
+ const className = mergeClassNames(childProps.className, parentProps.className);
1790
+ if (className) merged.className = className;
1791
+ const style = mergeStyles(childProps.style, parentProps.style);
1792
+ if (style) merged.style = style;
1793
+ for (const key of Object.keys(parentProps)) {
1794
+ if (!isEventProp(key)) continue;
1795
+ const chained = chainedFunction(getHandler(childProps[key]), getHandler(parentProps[key]));
1796
+ if (chained) merged[key] = chained;
1797
+ }
1798
+ for (const [key, value] of Object.entries(merged)) {
1799
+ if (value === void 0 && key.startsWith("aria-") && childProps[key] !== void 0) {
1800
+ merged[key] = childProps[key];
1801
+ }
1802
+ }
1803
+ return merged;
1804
+ }
1805
+ function getHandler(value) {
1806
+ return typeof value === "function" ? value : void 0;
1807
+ }
1808
+ function isEventProp(key) {
1809
+ return key.startsWith("on") && key.length > 2 && key[2] === key[2]?.toUpperCase();
1810
+ }
1811
+ function mergeClassNames(childClassName, parentClassName) {
1812
+ const values = [childClassName, parentClassName].filter(
1813
+ (value) => typeof value === "string" && Boolean(value)
1814
+ );
1815
+ return values.length > 0 ? values.join(" ") : void 0;
1816
+ }
1817
+ function mergeStyles(childStyle, parentStyle) {
1818
+ if (!childStyle && !parentStyle) return void 0;
1819
+ return {
1820
+ ...isObject(childStyle) ? childStyle : {},
1821
+ ...isObject(parentStyle) ? parentStyle : {}
1822
+ };
1823
+ }
1824
+ function isObject(value) {
1825
+ return typeof value === "object" && value !== null;
1826
+ }
1827
+ function createSlot(child, props, body) {
1828
+ const nextProps = body === void 0 ? props : { ...props, children: body };
1829
+ return cloneElement(child, mergeProps(child.props, nextProps));
1830
+ }
1667
1831
  function renderRoot(asChild, child, props, body, componentName) {
1668
1832
  if (asChild) {
1669
1833
  if (!isValidElement(child)) throw new Error(`${componentName} with asChild requires a single React element child.`);
1670
- return cloneElement(child, { ...props, children: body });
1834
+ return createSlot(child, props, body);
1671
1835
  }
1672
1836
  return /* @__PURE__ */ jsx3("div", { ...props, children: body });
1673
1837
  }
@@ -2087,8 +2251,93 @@ function KeepUndo({ children, label, ...props }) {
2087
2251
  // src/features/collection/KeepCollection.tsx
2088
2252
  import { KeepErrorBoundary as KeepErrorBoundary2 } from "@keepkit/core/react";
2089
2253
 
2090
- // src/features/query/KeepTagFilter.tsx
2254
+ // src/features/query/KeepActiveFiltersSummary.tsx
2091
2255
  import { isValidElement as isValidElement2 } from "react";
2256
+ import { Fragment as Fragment4, jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
2257
+ function KeepActiveFiltersSummary({
2258
+ query,
2259
+ search: providedSearch,
2260
+ tags: providedTags,
2261
+ onSearchChange,
2262
+ onTagChange,
2263
+ onClear,
2264
+ children,
2265
+ asChild = false,
2266
+ className,
2267
+ ...rootProps
2268
+ }) {
2269
+ const search = (providedSearch ?? query?.search?.query ?? "").trim();
2270
+ const tags = normalizeTags(providedTags ?? query?.tags ?? []);
2271
+ const hasFilters = Boolean(search) || tags.length > 0;
2272
+ const activeFiltersLabel = useUiLabel("activeFilters");
2273
+ const clearAllLabel = useUiLabel("clearAllFilters");
2274
+ const clearLabel = useUiLabel("clearFilters");
2275
+ const removeLabel = useUiLabel("removeFilter");
2276
+ const state = {
2277
+ search,
2278
+ tags,
2279
+ hasFilters,
2280
+ clear: () => onClear?.(),
2281
+ removeSearch: () => onSearchChange?.(""),
2282
+ removeTag: (tag) => onTagChange?.(tag)
2283
+ };
2284
+ const contentChildren = asChild && isElement(children) ? void 0 : children;
2285
+ const body = typeof contentChildren === "function" ? contentChildren(state) : contentChildren ?? (hasFilters ? /* @__PURE__ */ jsxs5(Fragment4, { children: [
2286
+ /* @__PURE__ */ jsx8("span", { "data-active-filters-label": "true", children: activeFiltersLabel }),
2287
+ /* @__PURE__ */ jsxs5("ul", { "data-active-filters-list": "true", children: [
2288
+ search ? /* @__PURE__ */ jsxs5("li", { "data-filter-kind": "search", children: [
2289
+ /* @__PURE__ */ jsx8("span", { "data-filter-value": "true", children: search }),
2290
+ /* @__PURE__ */ jsx8(
2291
+ "button",
2292
+ {
2293
+ type: "button",
2294
+ "data-keep-action": "remove-search-filter",
2295
+ "aria-label": `${search} ${removeLabel}`,
2296
+ onClick: state.removeSearch,
2297
+ children: "\xD7"
2298
+ }
2299
+ )
2300
+ ] }) : null,
2301
+ tags.map((tag) => /* @__PURE__ */ jsxs5("li", { "data-filter-kind": "tag", children: [
2302
+ /* @__PURE__ */ jsx8("span", { "data-filter-value": "true", children: tag }),
2303
+ /* @__PURE__ */ jsx8(
2304
+ "button",
2305
+ {
2306
+ type: "button",
2307
+ "data-keep-action": "remove-tag-filter",
2308
+ "aria-label": `${tag} ${removeLabel}`,
2309
+ onClick: () => state.removeTag(tag),
2310
+ children: "\xD7"
2311
+ }
2312
+ )
2313
+ ] }, tag))
2314
+ ] }),
2315
+ /* @__PURE__ */ jsx8("button", { type: "button", "data-keep-action": "clear-filters", onClick: state.clear, children: clearAllLabel || clearLabel })
2316
+ ] }) : null);
2317
+ if (!hasFilters && !asChild && contentChildren === void 0) return null;
2318
+ return renderRoot(
2319
+ asChild,
2320
+ isElement(children) ? children : void 0,
2321
+ {
2322
+ ...rootProps,
2323
+ className,
2324
+ "data-keepkit": "active-filters",
2325
+ "data-state": hasFilters ? "active" : "idle",
2326
+ "aria-label": rootProps["aria-label"] ?? activeFiltersLabel
2327
+ },
2328
+ body,
2329
+ "KeepActiveFiltersSummary"
2330
+ );
2331
+ }
2332
+ function normalizeTags(tags) {
2333
+ return [...new Set(tags.map((tag) => tag.trim()).filter(Boolean))];
2334
+ }
2335
+ function isElement(value) {
2336
+ return isValidElement2(value);
2337
+ }
2338
+
2339
+ // src/features/query/KeepTagFilter.tsx
2340
+ import { isValidElement as isValidElement3 } from "react";
2092
2341
 
2093
2342
  // src/features/query/hooks/useKeepTagFilter.ts
2094
2343
  import { useKeepList as useKeepList2 } from "@keepkit/core/react";
@@ -2121,7 +2370,7 @@ function useKeepTagFilter(options) {
2121
2370
  }
2122
2371
 
2123
2372
  // src/features/query/KeepTagFilter.tsx
2124
- import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
2373
+ import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
2125
2374
  function KeepTagFilter({
2126
2375
  query,
2127
2376
  value: controlledValue,
@@ -2138,10 +2387,10 @@ function KeepTagFilter({
2138
2387
  ...rootProps
2139
2388
  }) {
2140
2389
  const view = useKeepTagFilter({ query, controlledValue, defaultValue, onChange, onValueChange });
2141
- const contentChildren = asChild && isValidElement2(children) ? void 0 : children;
2142
- const body = render ? render(view.state) : typeof contentChildren === "function" ? contentChildren(view.state) : contentChildren ?? /* @__PURE__ */ jsxs5("fieldset", { children: [
2143
- /* @__PURE__ */ jsx8("legend", { children: ariaLabel ?? view.labels.aria }),
2144
- /* @__PURE__ */ jsx8(
2390
+ const contentChildren = asChild && isValidElement3(children) ? void 0 : children;
2391
+ const body = render ? render(view.state) : typeof contentChildren === "function" ? contentChildren(view.state) : contentChildren ?? /* @__PURE__ */ jsxs6("fieldset", { children: [
2392
+ /* @__PURE__ */ jsx9("legend", { children: ariaLabel ?? view.labels.aria }),
2393
+ /* @__PURE__ */ jsx9(
2145
2394
  "button",
2146
2395
  {
2147
2396
  type: "button",
@@ -2151,7 +2400,7 @@ function KeepTagFilter({
2151
2400
  children: allLabel ?? view.labels.all
2152
2401
  }
2153
2402
  ),
2154
- view.state.tags.map((tag) => /* @__PURE__ */ jsxs5(
2403
+ view.state.tags.map((tag) => /* @__PURE__ */ jsxs6(
2155
2404
  "button",
2156
2405
  {
2157
2406
  type: "button",
@@ -2160,7 +2409,7 @@ function KeepTagFilter({
2160
2409
  onClick: () => view.state.select(tag),
2161
2410
  children: [
2162
2411
  renderTag ? renderTag(tag, view.state.tagCounts[tag] ?? 0, view.state.value === tag) : tag,
2163
- /* @__PURE__ */ jsxs5("span", { children: [
2412
+ /* @__PURE__ */ jsxs6("span", { children: [
2164
2413
  " (",
2165
2414
  view.state.tagCounts[tag] ?? 0,
2166
2415
  ")"
@@ -2172,7 +2421,7 @@ function KeepTagFilter({
2172
2421
  ] });
2173
2422
  return renderRoot(
2174
2423
  asChild,
2175
- isValidElement2(children) ? children : void 0,
2424
+ isValidElement3(children) ? children : void 0,
2176
2425
  {
2177
2426
  ...rootProps,
2178
2427
  className,
@@ -2258,7 +2507,7 @@ function getVisiblePages(currentPage, pageCount, maxPageButtons) {
2258
2507
  }
2259
2508
 
2260
2509
  // src/features/query/query-controls.tsx
2261
- import { Fragment as Fragment4, jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
2510
+ import { Fragment as Fragment5, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
2262
2511
  function KeepSearchInput({
2263
2512
  value: controlledValue,
2264
2513
  defaultValue = "",
@@ -2269,7 +2518,7 @@ function KeepSearchInput({
2269
2518
  ...props
2270
2519
  }) {
2271
2520
  const view = useKeepSearchInput({ controlledValue, defaultValue, debounceMs, onValueChange });
2272
- return /* @__PURE__ */ jsx9(
2521
+ return /* @__PURE__ */ jsx10(
2273
2522
  "input",
2274
2523
  {
2275
2524
  ...props,
@@ -2294,13 +2543,13 @@ function KeepSortSelect({
2294
2543
  ...props
2295
2544
  }) {
2296
2545
  const view = useKeepSortSelect({ controlledValue, defaultValue, onValueChange });
2297
- const options = children ?? /* @__PURE__ */ jsxs6(Fragment4, { children: [
2298
- /* @__PURE__ */ jsx9("option", { value: "updatedAt:desc", children: view.labels.updatedNewest }),
2299
- /* @__PURE__ */ jsx9("option", { value: "updatedAt:asc", children: view.labels.updatedOldest }),
2300
- /* @__PURE__ */ jsx9("option", { value: "savedAt:desc", children: view.labels.savedNewest }),
2301
- /* @__PURE__ */ jsx9("option", { value: "savedAt:asc", children: view.labels.savedOldest })
2546
+ const options = children ?? /* @__PURE__ */ jsxs7(Fragment5, { children: [
2547
+ /* @__PURE__ */ jsx10("option", { value: "updatedAt:desc", children: view.labels.updatedNewest }),
2548
+ /* @__PURE__ */ jsx10("option", { value: "updatedAt:asc", children: view.labels.updatedOldest }),
2549
+ /* @__PURE__ */ jsx10("option", { value: "savedAt:desc", children: view.labels.savedNewest }),
2550
+ /* @__PURE__ */ jsx10("option", { value: "savedAt:asc", children: view.labels.savedOldest })
2302
2551
  ] });
2303
- return /* @__PURE__ */ jsx9(
2552
+ return /* @__PURE__ */ jsx10(
2304
2553
  "select",
2305
2554
  {
2306
2555
  ...props,
@@ -2332,9 +2581,9 @@ function KeepPagination({
2332
2581
  "data-state": view.pageCount > 1 ? "active" : "idle"
2333
2582
  };
2334
2583
  if (render)
2335
- return /* @__PURE__ */ jsx9("nav", { ...navProps, children: render({ page: view.currentPage, pageCount: view.pageCount, goToPage: view.goToPage }) });
2336
- return /* @__PURE__ */ jsxs6("nav", { ...navProps, children: [
2337
- /* @__PURE__ */ jsx9(
2584
+ return /* @__PURE__ */ jsx10("nav", { ...navProps, children: render({ page: view.currentPage, pageCount: view.pageCount, goToPage: view.goToPage }) });
2585
+ return /* @__PURE__ */ jsxs7("nav", { ...navProps, children: [
2586
+ /* @__PURE__ */ jsx10(
2338
2587
  "button",
2339
2588
  {
2340
2589
  type: "button",
@@ -2344,7 +2593,7 @@ function KeepPagination({
2344
2593
  children: view.labels.previous
2345
2594
  }
2346
2595
  ),
2347
- view.visiblePages.map((nextPage) => /* @__PURE__ */ jsx9(
2596
+ view.visiblePages.map((nextPage) => /* @__PURE__ */ jsx10(
2348
2597
  "button",
2349
2598
  {
2350
2599
  type: "button",
@@ -2356,7 +2605,7 @@ function KeepPagination({
2356
2605
  },
2357
2606
  nextPage
2358
2607
  )),
2359
- /* @__PURE__ */ jsx9(
2608
+ /* @__PURE__ */ jsx10(
2360
2609
  "button",
2361
2610
  {
2362
2611
  type: "button",
@@ -2389,7 +2638,7 @@ function useKeepCollection({
2389
2638
  };
2390
2639
  const [searchValue, setSearchValue] = useState6(query.search?.query ?? "");
2391
2640
  const [sort, setSort] = useState6(query.sort ?? { by: "updatedAt", direction: "desc" });
2392
- const [tag, setTag] = useState6(query.tags?.[0]);
2641
+ const [activeTags, setActiveTags] = useState6(query.tags ?? []);
2393
2642
  const [page, setPage] = useState6(query.pagination?.page ?? 1);
2394
2643
  const resolvedPageSize = query.pagination?.pageSize ?? pageSize;
2395
2644
  const resolvedQuery = useMemo3(
@@ -2397,10 +2646,10 @@ function useKeepCollection({
2397
2646
  ...query,
2398
2647
  search: enabled.search ? { ...query.search, query: searchValue } : query.search,
2399
2648
  sort: enabled.sort ? sort : query.sort,
2400
- tags: tag ? [.../* @__PURE__ */ new Set([...query.tags ?? [], tag])] : query.tags,
2649
+ tags: activeTags.length > 0 ? activeTags : void 0,
2401
2650
  pagination: enabled.pagination ? { ...query.pagination, page, pageSize: resolvedPageSize } : query.pagination
2402
2651
  }),
2403
- [enabled.pagination, enabled.search, enabled.sort, page, query, resolvedPageSize, searchValue, sort, tag]
2652
+ [activeTags, enabled.pagination, enabled.search, enabled.sort, page, query, resolvedPageSize, searchValue, sort]
2404
2653
  );
2405
2654
  useKeepUrlSync({
2406
2655
  enabled: Boolean(urlSync),
@@ -2409,21 +2658,23 @@ function useKeepCollection({
2409
2658
  const next = typeof nextOrUpdater === "function" ? nextOrUpdater(resolvedQuery) : nextOrUpdater;
2410
2659
  setSearchValue(next.search?.query ?? "");
2411
2660
  setSort(next.sort ?? { by: "updatedAt", direction: "desc" });
2412
- setTag(next.tags?.[0]);
2661
+ setActiveTags(next.tags ?? []);
2413
2662
  setPage(next.pagination?.page ?? 1);
2414
2663
  },
2415
2664
  options: typeof urlSync === "object" ? urlSync : {},
2416
2665
  adapter: urlAdapter
2417
2666
  });
2418
2667
  const list = useKeepList3(resolvedQuery);
2668
+ const allState = useKeepList3({});
2419
2669
  return {
2420
2670
  enabled,
2421
2671
  searchValue,
2422
2672
  sortValue: sortToValue(sort),
2423
- tag,
2673
+ activeTags,
2424
2674
  resolvedPageSize,
2425
2675
  resolvedQuery,
2426
2676
  list,
2677
+ allState,
2427
2678
  setSearchValue: (value) => {
2428
2679
  setSearchValue(value);
2429
2680
  setPage(1);
@@ -2433,7 +2684,16 @@ function useKeepCollection({
2433
2684
  setPage(1);
2434
2685
  },
2435
2686
  setTag: (value) => {
2436
- setTag(value);
2687
+ setActiveTags(value ? [value] : []);
2688
+ setPage(1);
2689
+ },
2690
+ removeTag: (tagToRemove) => {
2691
+ setActiveTags((current) => current.filter((tag) => tag !== tagToRemove));
2692
+ setPage(1);
2693
+ },
2694
+ clearFilters: () => {
2695
+ setSearchValue("");
2696
+ setActiveTags([]);
2437
2697
  setPage(1);
2438
2698
  },
2439
2699
  setPage
@@ -2442,13 +2702,13 @@ function useKeepCollection({
2442
2702
 
2443
2703
  // src/features/collection/KeepList.tsx
2444
2704
  import { KeepErrorBoundary } from "@keepkit/core/react";
2445
- import { isValidElement as isValidElement4 } from "react";
2705
+ import { isValidElement as isValidElement6 } from "react";
2446
2706
 
2447
2707
  // src/features/item/KeepItemCard.tsx
2448
2708
  import {
2449
2709
  createContext as createContext3,
2450
2710
  createElement as createElement2,
2451
- isValidElement as isValidElement3,
2711
+ isValidElement as isValidElement4,
2452
2712
  useContext as useContext3,
2453
2713
  useEffect as useEffect5,
2454
2714
  useState as useState8
@@ -2494,10 +2754,10 @@ function getDisplayStatus(status) {
2494
2754
  }
2495
2755
 
2496
2756
  // src/features/item/KeepItemStatusBadge.tsx
2497
- import { Fragment as Fragment5, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
2757
+ import { Fragment as Fragment6, jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
2498
2758
  function KeepItemStatusBadge({ status = "available", label, className, ...props }) {
2499
2759
  const view = useKeepItemStatusBadge(status);
2500
- return /* @__PURE__ */ jsxs7(
2760
+ return /* @__PURE__ */ jsxs8(
2501
2761
  "span",
2502
2762
  {
2503
2763
  ...props,
@@ -2508,14 +2768,14 @@ function KeepItemStatusBadge({ status = "available", label, className, ...props
2508
2768
  "data-status": status,
2509
2769
  "data-item-status": view.resolvedStatus,
2510
2770
  children: [
2511
- /* @__PURE__ */ jsx10(StatusIcon, { name: view.icon }),
2512
- /* @__PURE__ */ jsx10("span", { "data-status-label": "true", children: label ?? view.statusLabel })
2771
+ /* @__PURE__ */ jsx11(StatusIcon, { name: view.icon }),
2772
+ /* @__PURE__ */ jsx11("span", { "data-status-label": "true", children: label ?? view.statusLabel })
2513
2773
  ]
2514
2774
  }
2515
2775
  );
2516
2776
  }
2517
2777
  function StatusIcon({ name }) {
2518
- return /* @__PURE__ */ jsxs7(
2778
+ return /* @__PURE__ */ jsxs8(
2519
2779
  "svg",
2520
2780
  {
2521
2781
  "data-status-icon": name,
@@ -2530,18 +2790,18 @@ function StatusIcon({ name }) {
2530
2790
  "aria-hidden": "true",
2531
2791
  focusable: "false",
2532
2792
  children: [
2533
- name === "check" ? /* @__PURE__ */ jsx10("path", { d: "m5 12 4 4L19 6" }) : null,
2534
- name === "clock" ? /* @__PURE__ */ jsxs7(Fragment5, { children: [
2535
- /* @__PURE__ */ jsx10("circle", { cx: "12", cy: "12", r: "8" }),
2536
- /* @__PURE__ */ jsx10("path", { d: "M12 7v5l3 2" })
2793
+ name === "check" ? /* @__PURE__ */ jsx11("path", { d: "m5 12 4 4L19 6" }) : null,
2794
+ name === "clock" ? /* @__PURE__ */ jsxs8(Fragment6, { children: [
2795
+ /* @__PURE__ */ jsx11("circle", { cx: "12", cy: "12", r: "8" }),
2796
+ /* @__PURE__ */ jsx11("path", { d: "M12 7v5l3 2" })
2537
2797
  ] }) : null,
2538
- name === "ban" ? /* @__PURE__ */ jsxs7(Fragment5, { children: [
2539
- /* @__PURE__ */ jsx10("circle", { cx: "12", cy: "12", r: "8" }),
2540
- /* @__PURE__ */ jsx10("path", { d: "m6.5 6.5 11 11" })
2798
+ name === "ban" ? /* @__PURE__ */ jsxs8(Fragment6, { children: [
2799
+ /* @__PURE__ */ jsx11("circle", { cx: "12", cy: "12", r: "8" }),
2800
+ /* @__PURE__ */ jsx11("path", { d: "m6.5 6.5 11 11" })
2541
2801
  ] }) : null,
2542
- name === "lock" ? /* @__PURE__ */ jsxs7(Fragment5, { children: [
2543
- /* @__PURE__ */ jsx10("rect", { x: "5", y: "10", width: "14", height: "10", rx: "2" }),
2544
- /* @__PURE__ */ jsx10("path", { d: "M8 10V7a4 4 0 0 1 8 0v3" })
2802
+ name === "lock" ? /* @__PURE__ */ jsxs8(Fragment6, { children: [
2803
+ /* @__PURE__ */ jsx11("rect", { x: "5", y: "10", width: "14", height: "10", rx: "2" }),
2804
+ /* @__PURE__ */ jsx11("path", { d: "M8 10V7a4 4 0 0 1 8 0v3" })
2545
2805
  ] }) : null
2546
2806
  ]
2547
2807
  }
@@ -2638,7 +2898,7 @@ function useKeepPruneStale({ statuses, onPruned }) {
2638
2898
  }
2639
2899
 
2640
2900
  // src/features/status/KeepStaleNotice.tsx
2641
- import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
2901
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
2642
2902
  function KeepStaleNotice({
2643
2903
  item,
2644
2904
  onRetry,
@@ -2650,11 +2910,11 @@ function KeepStaleNotice({
2650
2910
  ...props
2651
2911
  }) {
2652
2912
  const view = useKeepStaleNotice({ item, onRetry, onRemoved });
2653
- return /* @__PURE__ */ jsxs8("aside", { ...props, className, "data-keepkit": "stale-notice", "data-state": view.error ? "error" : "stale", children: [
2654
- /* @__PURE__ */ jsx11(KeepItemStatusBadge, { status: view.status }),
2655
- children ?? (item.statusReason ? /* @__PURE__ */ jsx11("p", { children: item.statusReason }) : null),
2656
- /* @__PURE__ */ jsxs8("div", { children: [
2657
- /* @__PURE__ */ jsx11(
2913
+ return /* @__PURE__ */ jsxs9("aside", { ...props, className, "data-keepkit": "stale-notice", "data-state": view.error ? "error" : "stale", children: [
2914
+ /* @__PURE__ */ jsx12(KeepItemStatusBadge, { status: view.status }),
2915
+ children ?? (item.statusReason ? /* @__PURE__ */ jsx12("p", { children: item.statusReason }) : null),
2916
+ /* @__PURE__ */ jsxs9("div", { children: [
2917
+ /* @__PURE__ */ jsx12(
2658
2918
  "button",
2659
2919
  {
2660
2920
  type: "button",
@@ -2664,7 +2924,7 @@ function KeepStaleNotice({
2664
2924
  children: retryLabel ?? view.labels.retry
2665
2925
  }
2666
2926
  ),
2667
- /* @__PURE__ */ jsx11(
2927
+ /* @__PURE__ */ jsx12(
2668
2928
  "button",
2669
2929
  {
2670
2930
  type: "button",
@@ -2675,7 +2935,7 @@ function KeepStaleNotice({
2675
2935
  }
2676
2936
  )
2677
2937
  ] }),
2678
- view.error ? /* @__PURE__ */ jsx11("p", { role: "alert", children: view.error instanceof Error ? view.error.message : view.labels.error }) : null
2938
+ view.error ? /* @__PURE__ */ jsx12("p", { role: "alert", children: view.error instanceof Error ? view.error.message : view.labels.error }) : null
2679
2939
  ] });
2680
2940
  }
2681
2941
  function KeepPruneStaleButton({
@@ -2687,7 +2947,7 @@ function KeepPruneStaleButton({
2687
2947
  ...props
2688
2948
  }) {
2689
2949
  const view = useKeepPruneStale({ statuses, onPruned });
2690
- return /* @__PURE__ */ jsx11(
2950
+ return /* @__PURE__ */ jsx12(
2691
2951
  "button",
2692
2952
  {
2693
2953
  ...props,
@@ -2800,7 +3060,7 @@ function getDisplayStatus2(status) {
2800
3060
  }
2801
3061
 
2802
3062
  // src/features/item/KeepItemCard.tsx
2803
- import { Fragment as Fragment6, jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
3063
+ import { Fragment as Fragment7, jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
2804
3064
  var KeepItemCardContext = createContext3(null);
2805
3065
  function useKeepItemCardCompound(part) {
2806
3066
  const context = useContext3(KeepItemCardContext);
@@ -2850,7 +3110,7 @@ function KeepItemCardRoot({
2850
3110
  });
2851
3111
  const contextQuery = useKeepSearchQuery();
2852
3112
  const searchQuery = highlightQuery ?? contextQuery;
2853
- const contentChildren = asChild && isValidElement3(children) ? void 0 : children;
3113
+ const contentChildren = asChild && isValidElement4(children) ? void 0 : children;
2854
3114
  function renderLink(content) {
2855
3115
  if (!view.href || !view.isAvailable) return content;
2856
3116
  const linkProps = {
@@ -2860,12 +3120,12 @@ function KeepItemCardRoot({
2860
3120
  onClick: (event) => onOpen?.(item, event),
2861
3121
  children: content
2862
3122
  };
2863
- return LinkComponent ? /* @__PURE__ */ jsx12(LinkComponent, { ...linkProps }) : /* @__PURE__ */ jsx12("a", { ...linkProps });
3123
+ return LinkComponent ? /* @__PURE__ */ jsx13(LinkComponent, { ...linkProps }) : /* @__PURE__ */ jsx13("a", { ...linkProps });
2864
3124
  }
2865
3125
  function renderTitle(content) {
2866
3126
  if (linkTarget !== "title") return content;
2867
3127
  if (view.isAvailable) return renderLink(content);
2868
- return view.href ? /* @__PURE__ */ jsx12("span", { "aria-disabled": "true", "data-link-disabled": "true", children: content }) : content;
3128
+ return view.href ? /* @__PURE__ */ jsx13("span", { "aria-disabled": "true", "data-link-disabled": "true", children: content }) : content;
2869
3129
  }
2870
3130
  const resolvedImageProps = view.imageProps ? { ...view.imageProps, alt: imageAlt ?? view.imageProps.alt } : void 0;
2871
3131
  const imageSource = resolvedImageProps?.src;
@@ -2888,21 +3148,21 @@ function KeepItemCardRoot({
2888
3148
  setImageStatus("error");
2889
3149
  }
2890
3150
  };
2891
- image = renderImage?.(imagePropsWithHandlers, item) ?? (ImageComponent ? /* @__PURE__ */ jsx12(ImageComponent, { ...imagePropsWithHandlers }) : /* @__PURE__ */ jsx12("img", { ...imagePropsWithHandlers, alt: imagePropsWithHandlers.alt }));
3151
+ image = renderImage?.(imagePropsWithHandlers, item) ?? (ImageComponent ? /* @__PURE__ */ jsx13(ImageComponent, { ...imagePropsWithHandlers }) : /* @__PURE__ */ jsx13("img", { ...imagePropsWithHandlers, alt: imagePropsWithHandlers.alt }));
2892
3152
  }
2893
3153
  const tags = showTags ? item.tags ?? [] : [];
2894
3154
  const renderedTags = showTags && tags.length > 0 ? renderTags?.(tags, item) ?? null : null;
2895
- const meta = showSavedAt ? /* @__PURE__ */ jsxs9("div", { "data-card-meta": true, children: [
2896
- /* @__PURE__ */ jsxs9("span", { children: [
3155
+ const meta = showSavedAt ? /* @__PURE__ */ jsxs10("div", { "data-card-meta": true, children: [
3156
+ /* @__PURE__ */ jsxs10("span", { children: [
2897
3157
  view.labels.savedAt,
2898
3158
  ":"
2899
3159
  ] }),
2900
3160
  " ",
2901
- /* @__PURE__ */ jsx12("time", { dateTime: new Date(item.savedAt).toISOString(), children: formatSavedAt(item.savedAt) })
3161
+ /* @__PURE__ */ jsx13("time", { dateTime: new Date(item.savedAt).toISOString(), children: formatSavedAt(item.savedAt) })
2902
3162
  ] }) : null;
2903
- const error = view.itemState.error ? /* @__PURE__ */ jsx12("p", { role: "alert", children: getErrorMessage2(view.itemState.error, view.labels.error) }) : null;
2904
- const actions = view.statusLabel ? /* @__PURE__ */ jsx12(KeepStaleNotice, { item, onRetry, onRemoved }) : /* @__PURE__ */ jsxs9(Fragment6, { children: [
2905
- showSaveButton ? /* @__PURE__ */ jsx12(
3163
+ const error = view.itemState.error ? /* @__PURE__ */ jsx13("p", { role: "alert", children: getErrorMessage2(view.itemState.error, view.labels.error) }) : null;
3164
+ const actions = view.statusLabel ? /* @__PURE__ */ jsx13(KeepStaleNotice, { item, onRetry, onRemoved }) : /* @__PURE__ */ jsxs10(Fragment7, { children: [
3165
+ showSaveButton ? /* @__PURE__ */ jsx13(
2906
3166
  KeepButton,
2907
3167
  {
2908
3168
  item: toKeepButtonItem(item),
@@ -2910,7 +3170,7 @@ function KeepItemCardRoot({
2910
3170
  getAriaLabel: (buttonState) => `${buttonState.isSaved ? view.labels.remove : view.labels.save} ${String(view.resolvedTitle)}`
2911
3171
  }
2912
3172
  ) : null,
2913
- /* @__PURE__ */ jsx12(
3173
+ /* @__PURE__ */ jsx13(
2914
3174
  "button",
2915
3175
  {
2916
3176
  type: "button",
@@ -2933,18 +3193,18 @@ function KeepItemCardRoot({
2933
3193
  meta,
2934
3194
  error,
2935
3195
  actions,
2936
- renderText: (content) => /* @__PURE__ */ jsx12(KeepHighlight, { query: searchQuery, children: content })
3196
+ renderText: (content) => /* @__PURE__ */ jsx13(KeepHighlight, { query: searchQuery, children: content })
2937
3197
  };
2938
- const defaultBody = /* @__PURE__ */ jsxs9(Fragment6, { children: [
2939
- /* @__PURE__ */ jsx12(KeepItemCardMedia, {}),
2940
- /* @__PURE__ */ jsx12(KeepItemCardContent, {}),
2941
- /* @__PURE__ */ jsx12(KeepItemCardActions, {})
3198
+ const defaultBody = /* @__PURE__ */ jsxs10(Fragment7, { children: [
3199
+ /* @__PURE__ */ jsx13(KeepItemCardMedia, {}),
3200
+ /* @__PURE__ */ jsx13(KeepItemCardContent, {}),
3201
+ /* @__PURE__ */ jsx13(KeepItemCardActions, {})
2942
3202
  ] });
2943
3203
  const body = render ? render(view.state) : typeof contentChildren === "function" ? contentChildren(view.state) : contentChildren ?? defaultBody;
2944
3204
  const linkedBody = linkTarget === "card" && view.isAvailable ? renderLink(body) : body;
2945
3205
  const root = renderRoot(
2946
3206
  asChild,
2947
- isValidElement3(children) ? children : void 0,
3207
+ isValidElement4(children) ? children : void 0,
2948
3208
  {
2949
3209
  ...rootProps,
2950
3210
  className,
@@ -2959,18 +3219,18 @@ function KeepItemCardRoot({
2959
3219
  linkedBody,
2960
3220
  "KeepItemCard"
2961
3221
  );
2962
- return /* @__PURE__ */ jsx12(KeepItemCardContext.Provider, { value: compoundValue, children: root });
3222
+ return /* @__PURE__ */ jsx13(KeepItemCardContext.Provider, { value: compoundValue, children: root });
2963
3223
  }
2964
3224
  function KeepItemCardMedia({ children, fallback, ...props }) {
2965
3225
  const context = useKeepItemCardCompound("Media");
2966
- return /* @__PURE__ */ jsx12("div", { ...props, "data-keep-card-part": "media", "data-media-status": context.imageStatus, "data-aspect-ratio": "1/1", children: children ?? context.image ?? /* @__PURE__ */ jsx12("span", { role: "img", "aria-label": context.fallbackLabel, "data-keep-card-fallback": "true", children: fallback ?? /* @__PURE__ */ jsx12(KeepMediaPlaceholderIcon, {}) }) });
3226
+ return /* @__PURE__ */ jsx13("div", { ...props, "data-keep-card-part": "media", "data-media-status": context.imageStatus, "data-aspect-ratio": "1/1", children: children ?? context.image ?? /* @__PURE__ */ jsx13("span", { role: "img", "aria-label": context.fallbackLabel, "data-keep-card-fallback": "true", children: fallback ?? /* @__PURE__ */ jsx13(KeepMediaPlaceholderIcon, {}) }) });
2967
3227
  }
2968
3228
  function KeepItemCardContent({ children, ...props }) {
2969
3229
  const context = useKeepItemCardCompound("Content");
2970
- return /* @__PURE__ */ jsx12("div", { ...props, "data-keep-card-part": "content", children: children === void 0 ? /* @__PURE__ */ jsxs9(Fragment6, { children: [
2971
- /* @__PURE__ */ jsx12(KeepItemCardTitle, {}),
3230
+ return /* @__PURE__ */ jsx13("div", { ...props, "data-keep-card-part": "content", children: children === void 0 ? /* @__PURE__ */ jsxs10(Fragment7, { children: [
3231
+ /* @__PURE__ */ jsx13(KeepItemCardTitle, {}),
2972
3232
  context.meta,
2973
- /* @__PURE__ */ jsx12(KeepItemCardTags, {}),
3233
+ /* @__PURE__ */ jsx13(KeepItemCardTags, {}),
2974
3234
  context.error
2975
3235
  ] }) : context.renderText(children) });
2976
3236
  }
@@ -2983,8 +3243,8 @@ function KeepItemCardTitle({ as = "h3", children, ...props }) {
2983
3243
  );
2984
3244
  }
2985
3245
  function KeepMediaPlaceholderIcon() {
2986
- return /* @__PURE__ */ jsxs9("svg", { "data-media-fallback-icon": "true", viewBox: "0 0 24 24", "aria-hidden": "true", children: [
2987
- /* @__PURE__ */ jsx12(
3246
+ return /* @__PURE__ */ jsxs10("svg", { "data-media-fallback-icon": "true", viewBox: "0 0 24 24", "aria-hidden": "true", children: [
3247
+ /* @__PURE__ */ jsx13(
2988
3248
  "path",
2989
3249
  {
2990
3250
  d: "M4 5.5A1.5 1.5 0 0 1 5.5 4h13A1.5 1.5 0 0 1 20 5.5v13a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 4 18.5v-13Z",
@@ -2992,19 +3252,19 @@ function KeepMediaPlaceholderIcon() {
2992
3252
  stroke: "currentColor"
2993
3253
  }
2994
3254
  ),
2995
- /* @__PURE__ */ jsx12("circle", { cx: "9", cy: "9", r: "1.5", fill: "currentColor" }),
2996
- /* @__PURE__ */ jsx12("path", { d: "m5.5 18 4.5-4.5 3 3 2-2L19 18", fill: "none", stroke: "currentColor" })
3255
+ /* @__PURE__ */ jsx13("circle", { cx: "9", cy: "9", r: "1.5", fill: "currentColor" }),
3256
+ /* @__PURE__ */ jsx13("path", { d: "m5.5 18 4.5-4.5 3 3 2-2L19 18", fill: "none", stroke: "currentColor" })
2997
3257
  ] });
2998
3258
  }
2999
3259
  function KeepItemCardTags({ children, ...props }) {
3000
3260
  const context = useKeepItemCardCompound("Tags");
3001
3261
  if (children === void 0 && context.renderedTags) return context.renderedTags;
3002
3262
  if (children === void 0 && context.tags.length === 0) return null;
3003
- return /* @__PURE__ */ jsx12("ul", { ...props, "aria-label": props["aria-label"] ?? context.tagsLabel, "data-keep-card-part": "tags", children: children ?? context.tags.map((tag) => /* @__PURE__ */ jsx12("li", { children: tag }, tag)) });
3263
+ return /* @__PURE__ */ jsx13("ul", { ...props, "aria-label": props["aria-label"] ?? context.tagsLabel, "data-keep-card-part": "tags", children: children ?? context.tags.map((tag) => /* @__PURE__ */ jsx13("li", { children: tag }, tag)) });
3004
3264
  }
3005
3265
  function KeepItemCardActions({ children, ...props }) {
3006
3266
  const context = useKeepItemCardCompound("Actions");
3007
- return /* @__PURE__ */ jsx12("div", { ...props, "data-keep-card-part": "actions", children: children ?? context.actions });
3267
+ return /* @__PURE__ */ jsx13("div", { ...props, "data-keep-card-part": "actions", children: children ?? context.actions });
3008
3268
  }
3009
3269
  var KeepItemCard = Object.assign(KeepItemCardRoot, {
3010
3270
  Media: KeepItemCardMedia,
@@ -3014,12 +3274,12 @@ var KeepItemCard = Object.assign(KeepItemCardRoot, {
3014
3274
  Actions: KeepItemCardActions
3015
3275
  });
3016
3276
  function KeepItemCardSkeleton({ layout = "list", ...props }) {
3017
- return /* @__PURE__ */ jsxs9("article", { ...props, "aria-hidden": "true", "data-keepkit": "card-skeleton", "data-layout": layout, "data-state": "loading", children: [
3018
- /* @__PURE__ */ jsx12("span", { "data-skeleton-part": "media" }),
3019
- /* @__PURE__ */ jsx12("span", { "data-skeleton-part": "title" }),
3020
- /* @__PURE__ */ jsx12("span", { "data-skeleton-part": "meta" }),
3021
- /* @__PURE__ */ jsx12("span", { "data-skeleton-part": "tag" }),
3022
- /* @__PURE__ */ jsx12("span", { "data-skeleton-part": "tag" })
3277
+ return /* @__PURE__ */ jsxs10("article", { ...props, "aria-hidden": "true", "data-keepkit": "card-skeleton", "data-layout": layout, "data-state": "loading", children: [
3278
+ /* @__PURE__ */ jsx13("span", { "data-skeleton-part": "media" }),
3279
+ /* @__PURE__ */ jsx13("span", { "data-skeleton-part": "title" }),
3280
+ /* @__PURE__ */ jsx13("span", { "data-skeleton-part": "meta" }),
3281
+ /* @__PURE__ */ jsx13("span", { "data-skeleton-part": "tag" }),
3282
+ /* @__PURE__ */ jsx13("span", { "data-skeleton-part": "tag" })
3023
3283
  ] });
3024
3284
  }
3025
3285
  function formatSavedAt(timestamp) {
@@ -3029,11 +3289,47 @@ function getErrorMessage2(error, fallback) {
3029
3289
  return error instanceof Error ? error.message : fallback;
3030
3290
  }
3031
3291
 
3292
+ // src/features/status/KeepEmptyState.tsx
3293
+ import { isValidElement as isValidElement5 } from "react";
3294
+ import { Fragment as Fragment8, jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
3295
+ function KeepEmptyState({
3296
+ title,
3297
+ description,
3298
+ action,
3299
+ children,
3300
+ variant,
3301
+ onClearFilters,
3302
+ asChild = false,
3303
+ className,
3304
+ ...rootProps
3305
+ }) {
3306
+ const resolvedVariant = variant ?? "empty-storage";
3307
+ const defaultTitle = useUiLabel(resolvedVariant === "empty-filtered" ? "noFilteredItems" : "noItems");
3308
+ const defaultDescription = useUiLabel(
3309
+ resolvedVariant === "empty-filtered" ? "noFilteredItemsDescription" : "emptyStorageDescription"
3310
+ );
3311
+ const clearLabel = useUiLabel("clearFilters");
3312
+ const contentChildren = asChild && isValidElement5(children) ? void 0 : children;
3313
+ const body = contentChildren ?? /* @__PURE__ */ jsxs11(Fragment8, { children: [
3314
+ /* @__PURE__ */ jsx14("h2", { children: title ?? defaultTitle }),
3315
+ description ?? /* @__PURE__ */ jsx14("p", { children: defaultDescription }),
3316
+ action ?? (resolvedVariant === "empty-filtered" && onClearFilters ? /* @__PURE__ */ jsx14("button", { type: "button", "data-keep-action": "clear-filters", onClick: onClearFilters, children: clearLabel }) : null)
3317
+ ] });
3318
+ return renderRoot(
3319
+ asChild,
3320
+ children,
3321
+ { ...rootProps, className, "data-keepkit": "empty-state", "data-state": variant ?? "empty" },
3322
+ body,
3323
+ "KeepEmptyState"
3324
+ );
3325
+ }
3326
+
3032
3327
  // src/features/collection/hooks/useKeepListView.ts
3033
3328
  import { useKeepList as useKeepList4 } from "@keepkit/core/react";
3034
3329
  function useKeepListView(query) {
3035
3330
  return {
3036
3331
  state: useKeepList4(query),
3332
+ allState: useKeepList4({}),
3037
3333
  labels: {
3038
3334
  loading: useUiLabel("loadingItems"),
3039
3335
  empty: useUiLabel("noItems"),
@@ -3108,12 +3404,12 @@ function useRovingTabIndex() {
3108
3404
  }
3109
3405
 
3110
3406
  // src/features/collection/KeepList.tsx
3111
- import { Fragment as Fragment7, jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
3407
+ import { Fragment as Fragment9, jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
3112
3408
  function KeepList(props) {
3113
3409
  const { fallback, onBoundaryError, boundaryResetKey, ...listProps } = props;
3114
- const content = /* @__PURE__ */ jsx13(KeepListContent, { ...listProps });
3410
+ const content = /* @__PURE__ */ jsx15(KeepListContent, { ...listProps });
3115
3411
  if (fallback === void 0 && onBoundaryError === void 0) return content;
3116
- return /* @__PURE__ */ jsx13(KeepErrorBoundary, { fallback, onError: onBoundaryError, resetKey: boundaryResetKey, children: content });
3412
+ return /* @__PURE__ */ jsx15(KeepErrorBoundary, { fallback, onError: onBoundaryError, resetKey: boundaryResetKey, children: content });
3117
3413
  }
3118
3414
  function KeepListContent({
3119
3415
  query,
@@ -3124,6 +3420,7 @@ function KeepListContent({
3124
3420
  loadingCount = 6,
3125
3421
  empty,
3126
3422
  error: errorContent,
3423
+ onClearFilters,
3127
3424
  itemCardProps,
3128
3425
  layout = "list",
3129
3426
  asChild = false,
@@ -3141,14 +3438,17 @@ function KeepListContent({
3141
3438
  loading: renderLoading !== void 0 ? renderLoading : loading,
3142
3439
  loadingCount,
3143
3440
  loadingLabel: view.labels.loading,
3144
- empty: empty ?? view.labels.empty,
3441
+ empty,
3145
3442
  error: errorContent ?? view.labels.error,
3443
+ onClearFilters,
3444
+ allItemCount: view.allState.totalCount,
3445
+ query,
3146
3446
  itemCardProps,
3147
3447
  layout
3148
3448
  });
3149
3449
  return renderRoot(
3150
3450
  asChild,
3151
- asChild && isValidElement4(children) ? children : void 0,
3451
+ asChild && isValidElement6(children) ? children : void 0,
3152
3452
  {
3153
3453
  ...rootProps,
3154
3454
  className,
@@ -3169,7 +3469,7 @@ function KeepListContent({
3169
3469
  if (!event.defaultPrevented) roving.onFocusCapture(event);
3170
3470
  }
3171
3471
  },
3172
- /* @__PURE__ */ jsx13(KeepSearchQueryProvider, { query: query?.search?.query, children: body }),
3472
+ /* @__PURE__ */ jsx15(KeepSearchQueryProvider, { query: query?.search?.query, children: body }),
3173
3473
  "KeepList"
3174
3474
  );
3175
3475
  }
@@ -3184,29 +3484,44 @@ function getListBody(state, options) {
3184
3484
  if (state.isLoading && !state.isHydrated) {
3185
3485
  if (options.loading !== void 0) return resolveContent(options.loading, state);
3186
3486
  const count = Number.isFinite(options.loadingCount) ? Math.max(0, Math.floor(options.loadingCount)) : 6;
3187
- return /* @__PURE__ */ jsxs10(Fragment7, { children: [
3188
- /* @__PURE__ */ jsx13("span", { role: "status", "data-keepkit": "loading-label", children: options.loadingLabel }),
3189
- /* @__PURE__ */ jsx13("ul", { "data-keepkit": "skeleton-list", "data-layout": options.layout, children: Array.from({ length: count }, (_, index) => (
3487
+ return /* @__PURE__ */ jsxs12(Fragment9, { children: [
3488
+ /* @__PURE__ */ jsx15("span", { role: "status", "data-keepkit": "loading-label", children: options.loadingLabel }),
3489
+ /* @__PURE__ */ jsx15("ul", { "data-keepkit": "skeleton-list", "data-layout": options.layout, children: Array.from({ length: count }, (_, index) => (
3190
3490
  // biome-ignore lint/suspicious/noArrayIndexKey: Static loading placeholders never reorder.
3191
- /* @__PURE__ */ jsx13("li", { children: /* @__PURE__ */ jsx13(KeepItemCardSkeleton, { layout: options.layout }) }, index)
3491
+ /* @__PURE__ */ jsx15("li", { children: /* @__PURE__ */ jsx15(KeepItemCardSkeleton, { layout: options.layout }) }, index)
3192
3492
  )) })
3193
3493
  ] });
3194
3494
  }
3195
- if (state.isHydrated && state.items.length === 0) return resolveContent(options.empty, state);
3495
+ if (state.isHydrated && state.items.length === 0) {
3496
+ if (options.empty !== void 0) return resolveContent(options.empty, state);
3497
+ return /* @__PURE__ */ jsx15(
3498
+ KeepEmptyState,
3499
+ {
3500
+ variant: options.allItemCount > 0 && hasActiveQueryFilters(options.query) ? "empty-filtered" : "empty-storage",
3501
+ onClearFilters: options.onClearFilters
3502
+ }
3503
+ );
3504
+ }
3196
3505
  if (typeof options.children === "function") return options.children(state);
3197
- if (options.children !== void 0 && !isValidElement4(options.children)) return options.children;
3198
- return /* @__PURE__ */ jsx13("ul", { "data-layout": options.layout, children: state.items.map(
3199
- (item) => options.renderItem ? options.renderItem(item, state) : /* @__PURE__ */ jsx13("li", { children: /* @__PURE__ */ jsx13(KeepItemCard, { item, ...options.itemCardProps }) }, item.id)
3506
+ if (options.children !== void 0 && !isValidElement6(options.children)) return options.children;
3507
+ return /* @__PURE__ */ jsx15("ul", { "data-layout": options.layout, children: state.items.map(
3508
+ (item) => options.renderItem ? options.renderItem(item, state) : /* @__PURE__ */ jsx15("li", { children: /* @__PURE__ */ jsx15(KeepItemCard, { item, ...options.itemCardProps }) }, item.id)
3200
3509
  ) });
3201
3510
  }
3511
+ function hasActiveQueryFilters(query) {
3512
+ if (!query) return false;
3513
+ return Boolean(
3514
+ query.search?.query?.trim() || query.tags?.some((tag) => tag.trim()) || query.targetType || query.savedBetween || query.filter
3515
+ );
3516
+ }
3202
3517
 
3203
3518
  // src/features/collection/KeepCollection.tsx
3204
- import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
3519
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
3205
3520
  function KeepCollection(props) {
3206
3521
  const { fallback, onBoundaryError, boundaryResetKey, ...collectionProps } = props;
3207
- const content = /* @__PURE__ */ jsx14(KeepCollectionContent, { ...collectionProps });
3522
+ const content = /* @__PURE__ */ jsx16(KeepCollectionContent, { ...collectionProps });
3208
3523
  if (fallback === void 0 && onBoundaryError === void 0) return content;
3209
- return /* @__PURE__ */ jsx14(KeepErrorBoundary2, { fallback, onError: onBoundaryError, resetKey: boundaryResetKey, children: content });
3524
+ return /* @__PURE__ */ jsx16(KeepErrorBoundary2, { fallback, onError: onBoundaryError, resetKey: boundaryResetKey, children: content });
3210
3525
  }
3211
3526
  function KeepCollectionContent({
3212
3527
  query = {},
@@ -3220,13 +3535,14 @@ function KeepCollectionContent({
3220
3535
  loading,
3221
3536
  renderLoading,
3222
3537
  loadingCount,
3538
+ activeFilters,
3223
3539
  empty,
3224
3540
  error,
3225
3541
  className,
3226
3542
  ...rootProps
3227
3543
  }) {
3228
3544
  const view = useKeepCollection({ query, pageSize, urlSync, urlAdapter, features });
3229
- return /* @__PURE__ */ jsxs11(
3545
+ return /* @__PURE__ */ jsxs13(
3230
3546
  "section",
3231
3547
  {
3232
3548
  ...rootProps,
@@ -3237,12 +3553,22 @@ function KeepCollectionContent({
3237
3553
  "data-state": getCollectionState(view.list),
3238
3554
  "data-loading": view.list.isLoading || view.list.isMutating ? "true" : void 0,
3239
3555
  children: [
3240
- /* @__PURE__ */ jsxs11("div", { children: [
3241
- view.enabled.search ? /* @__PURE__ */ jsx14(KeepSearchInput, { value: view.searchValue, onValueChange: view.setSearchValue }) : null,
3242
- view.enabled.sort ? /* @__PURE__ */ jsx14(KeepSortSelect, { value: view.sortValue, onValueChange: view.setSortValue }) : null,
3243
- view.enabled.tagFilter ? /* @__PURE__ */ jsx14(KeepTagFilter, { query, value: view.tag, onValueChange: view.setTag }) : null
3556
+ /* @__PURE__ */ jsxs13("div", { children: [
3557
+ view.enabled.search ? /* @__PURE__ */ jsx16(KeepSearchInput, { value: view.searchValue, onValueChange: view.setSearchValue }) : null,
3558
+ view.enabled.sort ? /* @__PURE__ */ jsx16(KeepSortSelect, { value: view.sortValue, onValueChange: view.setSortValue }) : null,
3559
+ view.enabled.tagFilter ? /* @__PURE__ */ jsx16(KeepTagFilter, { query, value: view.activeTags[0], onValueChange: view.setTag }) : null
3244
3560
  ] }),
3245
- /* @__PURE__ */ jsx14(
3561
+ activeFilters === void 0 ? /* @__PURE__ */ jsx16(
3562
+ KeepActiveFiltersSummary,
3563
+ {
3564
+ search: view.searchValue,
3565
+ tags: view.activeTags,
3566
+ onSearchChange: view.setSearchValue,
3567
+ onTagChange: view.removeTag,
3568
+ onClear: view.clearFilters
3569
+ }
3570
+ ) : resolveContent(activeFilters, view.list),
3571
+ /* @__PURE__ */ jsx16(
3246
3572
  KeepList,
3247
3573
  {
3248
3574
  query: view.resolvedQuery,
@@ -3252,11 +3578,12 @@ function KeepCollectionContent({
3252
3578
  loading,
3253
3579
  renderLoading,
3254
3580
  loadingCount,
3255
- empty,
3581
+ onClearFilters: view.clearFilters,
3582
+ empty: view.list.totalCount === 0 && view.allState.totalCount > 0 ? void 0 : empty,
3256
3583
  error
3257
3584
  }
3258
3585
  ),
3259
- view.enabled.pagination ? /* @__PURE__ */ jsx14(
3586
+ view.enabled.pagination ? /* @__PURE__ */ jsx16(
3260
3587
  KeepPagination,
3261
3588
  {
3262
3589
  totalCount: view.list.totalCount,
@@ -3265,7 +3592,7 @@ function KeepCollectionContent({
3265
3592
  onPageChange: view.setPage
3266
3593
  }
3267
3594
  ) : null,
3268
- view.enabled.bulkActions ? /* @__PURE__ */ jsx14(KeepBulkActions, { query: view.resolvedQuery }) : null
3595
+ view.enabled.bulkActions ? /* @__PURE__ */ jsx16(KeepBulkActions, { query: view.resolvedQuery }) : null
3269
3596
  ]
3270
3597
  }
3271
3598
  );
@@ -3278,12 +3605,12 @@ function getCollectionState(list) {
3278
3605
  }
3279
3606
 
3280
3607
  // src/features/collection/KeepLayout.tsx
3281
- import { jsx as jsx15 } from "react/jsx-runtime";
3608
+ import { jsx as jsx17 } from "react/jsx-runtime";
3282
3609
  function KeepLayout({ layout = "list", children, onKeyDown, onFocusCapture, ...props }) {
3283
3610
  const roving = useRovingTabIndex();
3284
3611
  return (
3285
3612
  // biome-ignore lint/a11y/noStaticElementInteractions: The group manages keyboard focus for descendant cards.
3286
- /* @__PURE__ */ jsx15(
3613
+ /* @__PURE__ */ jsx17(
3287
3614
  "div",
3288
3615
  {
3289
3616
  ...props,
@@ -3308,7 +3635,7 @@ function KeepLayout({ layout = "list", children, onKeyDown, onFocusCapture, ...p
3308
3635
 
3309
3636
  // src/features/collection/KeepReorderableList.tsx
3310
3637
  import { useState as useState9 } from "react";
3311
- import { jsx as jsx16 } from "react/jsx-runtime";
3638
+ import { jsx as jsx18 } from "react/jsx-runtime";
3312
3639
  function KeepReorderableList({
3313
3640
  items,
3314
3641
  onReorder,
@@ -3342,7 +3669,7 @@ function KeepReorderableList({
3342
3669
  if (next[index] === id) return;
3343
3670
  commit(next);
3344
3671
  }
3345
- return /* @__PURE__ */ jsx16("ul", { ...props, "data-keepkit": "reorderable-list", children: items.map((item, index) => {
3672
+ return /* @__PURE__ */ jsx18("ul", { ...props, "data-keepkit": "reorderable-list", children: items.map((item, index) => {
3346
3673
  const moveUp = () => move(index, index - 1);
3347
3674
  const moveDown = () => move(index, index + 1);
3348
3675
  const onHandleKeyDown = (event) => {
@@ -3377,7 +3704,7 @@ function KeepReorderableList({
3377
3704
  onKeyDown: onHandleKeyDown
3378
3705
  }
3379
3706
  };
3380
- return /* @__PURE__ */ jsx16(
3707
+ return /* @__PURE__ */ jsx18(
3381
3708
  "li",
3382
3709
  {
3383
3710
  "data-reorder-index": index,
@@ -3409,7 +3736,23 @@ function KeepReorderableList({
3409
3736
  }
3410
3737
 
3411
3738
  // src/features/editor/KeepNoteEditor.tsx
3412
- import { isValidElement as isValidElement5 } from "react";
3739
+ import { isValidElement as isValidElement7 } from "react";
3740
+
3741
+ // src/features/navigation/KeepShortcutHint.tsx
3742
+ import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
3743
+ function KeepShortcutHint({ shortcut, separator = "+", ...props }) {
3744
+ const keys = typeof shortcut === "string" ? shortcut.split("+") : [...shortcut];
3745
+ const occurrences = /* @__PURE__ */ new Map();
3746
+ const keyedKeys = keys.map((key) => {
3747
+ const occurrence = occurrences.get(key) ?? 0;
3748
+ occurrences.set(key, occurrence + 1);
3749
+ return { id: `${key}-${occurrence}`, value: key };
3750
+ });
3751
+ return /* @__PURE__ */ jsx19("span", { ...props, "data-keepkit": "shortcut-hint", "aria-hidden": props["aria-hidden"] ?? true, children: keyedKeys.map((key, index) => /* @__PURE__ */ jsxs14("span", { children: [
3752
+ index > 0 ? /* @__PURE__ */ jsx19("span", { "data-shortcut-separator": "true", children: separator }) : null,
3753
+ /* @__PURE__ */ jsx19("kbd", { children: key.value.trim() })
3754
+ ] }, key.id)) });
3755
+ }
3413
3756
 
3414
3757
  // src/features/editor/hooks/useKeepNoteEditor.ts
3415
3758
  import { useKeepItem as useKeepItem3 } from "@keepkit/core/react";
@@ -3468,13 +3811,14 @@ function useKeepNoteEditor({ item, debounceMs, onSaved, onSaveError }) {
3468
3811
  }
3469
3812
 
3470
3813
  // src/features/editor/KeepNoteEditor.tsx
3471
- import { Fragment as Fragment8, jsx as jsx17, jsxs as jsxs12 } from "react/jsx-runtime";
3814
+ import { Fragment as Fragment10, jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
3472
3815
  function KeepNoteEditor({
3473
3816
  item,
3474
3817
  label,
3475
3818
  saveLabel,
3476
3819
  placeholder,
3477
3820
  debounceMs = 300,
3821
+ showShortcutHint = false,
3478
3822
  onSaved,
3479
3823
  onSaveError,
3480
3824
  render,
@@ -3485,11 +3829,11 @@ function KeepNoteEditor({
3485
3829
  }) {
3486
3830
  const view = useKeepNoteEditor({ item, debounceMs, onSaved, onSaveError });
3487
3831
  const { error, isDirty, isSaving, note, setNote } = view.state;
3488
- const contentChildren = asChild && isValidElement5(children) ? void 0 : children;
3489
- const body = render ? render(view.state) : typeof contentChildren === "function" ? contentChildren(view.state) : contentChildren ?? /* @__PURE__ */ jsxs12(Fragment8, { children: [
3490
- /* @__PURE__ */ jsxs12("label", { children: [
3832
+ const contentChildren = asChild && isValidElement7(children) ? void 0 : children;
3833
+ const body = render ? render(view.state) : typeof contentChildren === "function" ? contentChildren(view.state) : contentChildren ?? /* @__PURE__ */ jsxs15(Fragment10, { children: [
3834
+ /* @__PURE__ */ jsxs15("label", { children: [
3491
3835
  label ?? view.labels.note,
3492
- /* @__PURE__ */ jsx17(
3836
+ /* @__PURE__ */ jsx20(
3493
3837
  "textarea",
3494
3838
  {
3495
3839
  "data-keep-action": "edit-note",
@@ -3501,10 +3845,13 @@ function KeepNoteEditor({
3501
3845
  }
3502
3846
  )
3503
3847
  ] }),
3504
- /* @__PURE__ */ jsx17("button", { type: "submit", "data-keep-action": "save-note", disabled: isSaving, "aria-busy": isSaving, children: saveLabel ?? view.labels.save })
3848
+ /* @__PURE__ */ jsxs15("button", { type: "submit", "data-keep-action": "save-note", disabled: isSaving, "aria-busy": isSaving, children: [
3849
+ saveLabel ?? view.labels.save,
3850
+ showShortcutHint ? /* @__PURE__ */ jsx20(KeepShortcutHint, { shortcut: "Ctrl+Enter" }) : null
3851
+ ] })
3505
3852
  ] });
3506
3853
  if (!asChild) {
3507
- return /* @__PURE__ */ jsxs12(
3854
+ return /* @__PURE__ */ jsxs15(
3508
3855
  "form",
3509
3856
  {
3510
3857
  ...formProps,
@@ -3517,14 +3864,14 @@ function KeepNoteEditor({
3517
3864
  "data-disabled": isSaving ? "true" : void 0,
3518
3865
  children: [
3519
3866
  body,
3520
- error ? /* @__PURE__ */ jsx17("p", { role: "alert", children: getErrorMessage3(error, view.labels.error) }) : null
3867
+ error ? /* @__PURE__ */ jsx20("p", { role: "alert", children: getErrorMessage3(error, view.labels.error) }) : null
3521
3868
  ]
3522
3869
  }
3523
3870
  );
3524
3871
  }
3525
3872
  return renderRoot(
3526
3873
  true,
3527
- isValidElement5(children) ? children : void 0,
3874
+ isValidElement7(children) ? children : void 0,
3528
3875
  {
3529
3876
  ...formProps,
3530
3877
  className,
@@ -3597,7 +3944,7 @@ function useKeepTagEditor({ item, onSaved, onSaveError }) {
3597
3944
  }
3598
3945
 
3599
3946
  // src/features/editor/KeepTagEditor.tsx
3600
- import { Fragment as Fragment9, jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
3947
+ import { Fragment as Fragment11, jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
3601
3948
  function KeepTagEditor({
3602
3949
  item,
3603
3950
  availableTags = [],
@@ -3608,10 +3955,10 @@ function KeepTagEditor({
3608
3955
  }) {
3609
3956
  const view = useKeepTagEditor({ item, onSaved, onSaveError });
3610
3957
  const { isSaving, tags } = view.state;
3611
- const body = render ? render(view.state) : /* @__PURE__ */ jsxs13(Fragment9, { children: [
3612
- /* @__PURE__ */ jsxs13("label", { children: [
3958
+ const body = render ? render(view.state) : /* @__PURE__ */ jsxs16(Fragment11, { children: [
3959
+ /* @__PURE__ */ jsxs16("label", { children: [
3613
3960
  view.labels.tags,
3614
- /* @__PURE__ */ jsx18(
3961
+ /* @__PURE__ */ jsx21(
3615
3962
  "input",
3616
3963
  {
3617
3964
  "data-keep-action": "edit-tags",
@@ -3622,14 +3969,14 @@ function KeepTagEditor({
3622
3969
  }
3623
3970
  )
3624
3971
  ] }),
3625
- availableTags.length > 0 ? /* @__PURE__ */ jsx18("datalist", { id: `keep-tags-${item.id}`, children: availableTags.map((tag) => /* @__PURE__ */ jsx18("option", { value: tag }, tag)) }) : null,
3626
- /* @__PURE__ */ jsx18("ul", { "aria-label": view.labels.tags, children: tags.map((tag) => /* @__PURE__ */ jsxs13("li", { children: [
3972
+ availableTags.length > 0 ? /* @__PURE__ */ jsx21("datalist", { id: `keep-tags-${item.id}`, children: availableTags.map((tag) => /* @__PURE__ */ jsx21("option", { value: tag }, tag)) }) : null,
3973
+ /* @__PURE__ */ jsx21("ul", { "aria-label": view.labels.tags, children: tags.map((tag) => /* @__PURE__ */ jsxs16("li", { children: [
3627
3974
  tag,
3628
- /* @__PURE__ */ jsx18("button", { type: "button", "data-keep-action": "remove-tag", onClick: () => view.removeTag(tag), children: view.labels.remove })
3975
+ /* @__PURE__ */ jsx21("button", { type: "button", "data-keep-action": "remove-tag", onClick: () => view.removeTag(tag), children: view.labels.remove })
3629
3976
  ] }, tag)) }),
3630
- /* @__PURE__ */ jsx18("button", { type: "submit", "data-keep-action": "apply-tags", disabled: isSaving, "aria-busy": isSaving, children: view.labels.apply })
3977
+ /* @__PURE__ */ jsx21("button", { type: "submit", "data-keep-action": "apply-tags", disabled: isSaving, "aria-busy": isSaving, children: view.labels.apply })
3631
3978
  ] });
3632
- return /* @__PURE__ */ jsxs13(
3979
+ return /* @__PURE__ */ jsxs16(
3633
3980
  "form",
3634
3981
  {
3635
3982
  ...props,
@@ -3641,7 +3988,7 @@ function KeepTagEditor({
3641
3988
  "data-disabled": isSaving ? "true" : void 0,
3642
3989
  children: [
3643
3990
  body,
3644
- view.error ? /* @__PURE__ */ jsx18("p", { role: "alert", children: getErrorMessage4(view.error, view.labels.error) }) : null
3991
+ view.error ? /* @__PURE__ */ jsx21("p", { role: "alert", children: getErrorMessage4(view.error, view.labels.error) }) : null
3645
3992
  ]
3646
3993
  }
3647
3994
  );
@@ -3707,7 +4054,7 @@ function isEditableTarget(target) {
3707
4054
  }
3708
4055
 
3709
4056
  // src/features/navigation/KeepTourBar.tsx
3710
- import { Fragment as Fragment10, jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
4057
+ import { Fragment as Fragment12, jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
3711
4058
  function KeepTourBar({
3712
4059
  navigation: providedNavigation,
3713
4060
  currentId,
@@ -3723,9 +4070,12 @@ function KeepTourBar({
3723
4070
  nextLabel,
3724
4071
  backLabel,
3725
4072
  keyboardShortcuts = false,
4073
+ showShortcutHint = false,
3726
4074
  shortcutOptions,
3727
4075
  progress,
3728
4076
  getItemTitle = (item) => getMetaTitle(item.meta) ?? item.id,
4077
+ children,
4078
+ asChild = false,
3729
4079
  ...props
3730
4080
  }) {
3731
4081
  const ownNavigation = useKeepNavigator({ currentId, initialIndex });
@@ -3746,16 +4096,17 @@ function KeepTourBar({
3746
4096
  return resolvedPrev();
3747
4097
  }
3748
4098
  });
3749
- return /* @__PURE__ */ jsxs14("nav", { ...props, "data-keepkit": "tour-bar", "aria-label": props["aria-label"] ?? labels.pagination, children: [
3750
- showProgress ? /* @__PURE__ */ jsx19("span", { "data-keepkit": "tour-progress", "aria-live": "polite", children: progress ?? `${navigation.currentPosition ?? 0} / ${navigation.items.length}` }) : null,
3751
- /* @__PURE__ */ jsx19(
4099
+ const body = /* @__PURE__ */ jsxs17(Fragment12, { children: [
4100
+ showProgress ? /* @__PURE__ */ jsx22("span", { "data-keepkit": "tour-progress", "aria-live": "polite", children: progress ?? `${navigation.currentPosition ?? 0} / ${navigation.items.length}` }) : null,
4101
+ /* @__PURE__ */ jsx22(
3752
4102
  TourAction,
3753
4103
  {
3754
4104
  href: prevHref,
3755
4105
  disabled: !navigation.hasPrev,
3756
4106
  onClick: prevHref ? onPrev : resolvedPrev,
3757
4107
  "data-keep-action": "tour-prev",
3758
- preview: navigation.prevItem ? /* @__PURE__ */ jsxs14(Fragment10, { children: [
4108
+ shortcut: showShortcutHint ? shortcutOptions?.prevKeys?.[0] ?? "K" : void 0,
4109
+ preview: navigation.prevItem ? /* @__PURE__ */ jsxs17(Fragment12, { children: [
3759
4110
  previousLabel,
3760
4111
  ": ",
3761
4112
  getItemTitle(navigation.prevItem)
@@ -3763,14 +4114,15 @@ function KeepTourBar({
3763
4114
  children: previousLabel
3764
4115
  }
3765
4116
  ),
3766
- /* @__PURE__ */ jsx19(
4117
+ /* @__PURE__ */ jsx22(
3767
4118
  TourAction,
3768
4119
  {
3769
4120
  href: nextHref,
3770
4121
  disabled: !navigation.hasNext,
3771
4122
  onClick: nextHref ? onNext : resolvedNext,
3772
4123
  "data-keep-action": "tour-next",
3773
- preview: navigation.nextItem ? /* @__PURE__ */ jsxs14(Fragment10, { children: [
4124
+ shortcut: showShortcutHint ? shortcutOptions?.nextKeys?.[0] ?? "J" : void 0,
4125
+ preview: navigation.nextItem ? /* @__PURE__ */ jsxs17(Fragment12, { children: [
3774
4126
  nextItemLabel,
3775
4127
  ": ",
3776
4128
  getItemTitle(navigation.nextItem)
@@ -3778,17 +4130,25 @@ function KeepTourBar({
3778
4130
  children: nextItemLabel
3779
4131
  }
3780
4132
  ),
3781
- backHref || onBack ? /* @__PURE__ */ jsx19(TourAction, { href: backHref, onClick: onBack, "data-keep-action": "tour-back", children: listLabel }) : null
4133
+ backHref || onBack ? /* @__PURE__ */ jsx22(TourAction, { href: backHref, onClick: onBack, "data-keep-action": "tour-back", children: listLabel }) : null
3782
4134
  ] });
4135
+ return renderRoot(
4136
+ asChild,
4137
+ children,
4138
+ { ...props, "data-keepkit": "tour-bar", "aria-label": props["aria-label"] ?? labels.pagination },
4139
+ body,
4140
+ "KeepTourBar"
4141
+ );
3783
4142
  }
3784
- function TourAction({ href, disabled = false, onClick, children, preview, ...props }) {
4143
+ function TourAction({ href, disabled = false, onClick, children, preview, shortcut, ...props }) {
3785
4144
  const previewId = useId();
3786
- const content = /* @__PURE__ */ jsxs14(Fragment10, { children: [
3787
- /* @__PURE__ */ jsx19("span", { "data-tour-label": "true", children }),
3788
- preview ? /* @__PURE__ */ jsx19("small", { id: previewId, "data-tour-preview": "true", children: preview }) : null
4145
+ const content = /* @__PURE__ */ jsxs17(Fragment12, { children: [
4146
+ /* @__PURE__ */ jsx22("span", { "data-tour-label": "true", children }),
4147
+ shortcut ? /* @__PURE__ */ jsx22(KeepShortcutHint, { shortcut }) : null,
4148
+ preview ? /* @__PURE__ */ jsx22("small", { id: previewId, "data-tour-preview": "true", children: preview }) : null
3789
4149
  ] });
3790
4150
  if (href && !disabled) {
3791
- return /* @__PURE__ */ jsx19(
4151
+ return /* @__PURE__ */ jsx22(
3792
4152
  "a",
3793
4153
  {
3794
4154
  ...props,
@@ -3800,7 +4160,7 @@ function TourAction({ href, disabled = false, onClick, children, preview, ...pro
3800
4160
  }
3801
4161
  );
3802
4162
  }
3803
- return /* @__PURE__ */ jsx19(
4163
+ return /* @__PURE__ */ jsx22(
3804
4164
  "button",
3805
4165
  {
3806
4166
  ...props,
@@ -3820,14 +4180,11 @@ function navigateTo(item, href) {
3820
4180
  }
3821
4181
 
3822
4182
  // src/features/status/status.tsx
3823
- import { isValidElement as isValidElement6 } from "react";
4183
+ import { isValidElement as isValidElement8 } from "react";
3824
4184
 
3825
4185
  // src/features/status/hooks/useStatusViews.ts
3826
4186
  import { useKeepContext as useKeepContext4 } from "@keepkit/core/react";
3827
4187
  import { useEffect as useEffect10, useRef as useRef6, useState as useState12 } from "react";
3828
- function useKeepEmptyState() {
3829
- return useUiLabel("noItems").replace(/\.$/, "");
3830
- }
3831
4188
  function useKeepStatus(status) {
3832
4189
  const context = useKeepContext4();
3833
4190
  const resolvedStatus = status ?? getDerivedStatus(context);
@@ -3874,31 +4231,7 @@ function getStatusLabelKey3(status) {
3874
4231
  }
3875
4232
 
3876
4233
  // src/features/status/status.tsx
3877
- import { Fragment as Fragment11, jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
3878
- function KeepEmptyState({
3879
- title,
3880
- description,
3881
- action,
3882
- children,
3883
- asChild = false,
3884
- className,
3885
- ...rootProps
3886
- }) {
3887
- const defaultTitle = useKeepEmptyState();
3888
- const contentChildren = asChild && isValidElement6(children) ? void 0 : children;
3889
- const body = contentChildren ?? /* @__PURE__ */ jsxs15(Fragment11, { children: [
3890
- /* @__PURE__ */ jsx20("h2", { children: title ?? defaultTitle }),
3891
- description ? /* @__PURE__ */ jsx20("p", { children: description }) : null,
3892
- action
3893
- ] });
3894
- return renderRoot(
3895
- asChild,
3896
- children,
3897
- { ...rootProps, className, "data-keepkit": "empty-state", "data-state": "empty" },
3898
- body,
3899
- "KeepEmptyState"
3900
- );
3901
- }
4234
+ import { jsx as jsx23 } from "react/jsx-runtime";
3902
4235
  function KeepStatus({
3903
4236
  status,
3904
4237
  labels,
@@ -3909,12 +4242,12 @@ function KeepStatus({
3909
4242
  ...rootProps
3910
4243
  }) {
3911
4244
  const view = useKeepStatus(status);
3912
- const contentChildren = asChild && isValidElement6(children) ? void 0 : children;
4245
+ const contentChildren = asChild && isValidElement8(children) ? void 0 : children;
3913
4246
  const body = render ? render(view.state) : typeof contentChildren === "function" ? contentChildren(view.state) : contentChildren ?? labels?.[view.state.status] ?? view.defaultLabel;
3914
4247
  const role = rootProps.role ?? (view.state.status === "error" ? "alert" : "status");
3915
4248
  return renderRoot(
3916
4249
  asChild,
3917
- isValidElement6(children) ? children : void 0,
4250
+ isValidElement8(children) ? children : void 0,
3918
4251
  {
3919
4252
  ...rootProps,
3920
4253
  className,
@@ -3930,7 +4263,7 @@ function KeepStatus({
3930
4263
  }
3931
4264
  function KeepAnnouncements({ messages, ...props }) {
3932
4265
  const message = useKeepAnnouncements(messages);
3933
- return /* @__PURE__ */ jsx20(
4266
+ return /* @__PURE__ */ jsx23(
3934
4267
  "div",
3935
4268
  {
3936
4269
  ...props,
@@ -4029,7 +4362,7 @@ function useKeepSyncRecoveryDialog(options) {
4029
4362
  }
4030
4363
 
4031
4364
  // src/features/sync/KeepSyncRecoveryDialog.tsx
4032
- import { jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
4365
+ import { jsx as jsx24, jsxs as jsxs18 } from "react/jsx-runtime";
4033
4366
  function KeepSyncRecoveryDialog({
4034
4367
  open,
4035
4368
  onOpenChange,
@@ -4044,7 +4377,7 @@ function KeepSyncRecoveryDialog({
4044
4377
  }) {
4045
4378
  const view = useKeepSyncRecoveryDialog({ open, onOpenChange, conflicts, onManualMerge });
4046
4379
  if (!view.isOpen) return null;
4047
- return /* @__PURE__ */ jsxs16(
4380
+ return /* @__PURE__ */ jsxs18(
4048
4381
  "section",
4049
4382
  {
4050
4383
  ...props,
@@ -4058,17 +4391,17 @@ function KeepSyncRecoveryDialog({
4058
4391
  "data-state": view.conflictList.length > 0 ? "conflict" : "error",
4059
4392
  "data-loading": view.busyId !== void 0 ? "true" : void 0,
4060
4393
  children: [
4061
- /* @__PURE__ */ jsxs16("header", { children: [
4062
- /* @__PURE__ */ jsx21("h2", { id: "keepkit-sync-recovery-title", children: title ?? view.labels.title }),
4063
- /* @__PURE__ */ jsx21("button", { type: "button", "data-keep-action": "close-dialog", onClick: view.close, "aria-label": view.labels.close, children: view.labels.close })
4394
+ /* @__PURE__ */ jsxs18("header", { children: [
4395
+ /* @__PURE__ */ jsx24("h2", { id: "keepkit-sync-recovery-title", children: title ?? view.labels.title }),
4396
+ /* @__PURE__ */ jsx24("button", { type: "button", "data-keep-action": "close-dialog", onClick: view.close, "aria-label": view.labels.close, children: view.labels.close })
4064
4397
  ] }),
4065
4398
  children,
4066
- view.conflictList.length > 0 ? /* @__PURE__ */ jsxs16("div", { children: [
4067
- /* @__PURE__ */ jsx21("p", { children: view.labels.conflict }),
4068
- view.conflictList.map((conflict) => /* @__PURE__ */ jsxs16("article", { "data-conflict-id": conflict.id, children: [
4069
- /* @__PURE__ */ jsx21("h3", { children: getMetaTitle(conflict.operation.item?.meta) ?? conflict.id }),
4070
- /* @__PURE__ */ jsxs16("div", { "data-conflict-preview": true, children: [
4071
- /* @__PURE__ */ jsx21(
4399
+ view.conflictList.length > 0 ? /* @__PURE__ */ jsxs18("div", { children: [
4400
+ /* @__PURE__ */ jsx24("p", { children: view.labels.conflict }),
4401
+ view.conflictList.map((conflict) => /* @__PURE__ */ jsxs18("article", { "data-conflict-id": conflict.id, children: [
4402
+ /* @__PURE__ */ jsx24("h3", { children: getMetaTitle(conflict.operation.item?.meta) ?? conflict.id }),
4403
+ /* @__PURE__ */ jsxs18("div", { "data-conflict-preview": true, children: [
4404
+ /* @__PURE__ */ jsx24(
4072
4405
  ConflictPreview,
4073
4406
  {
4074
4407
  item: conflict.operation.item,
@@ -4078,7 +4411,7 @@ function KeepSyncRecoveryDialog({
4078
4411
  side: "local"
4079
4412
  }
4080
4413
  ),
4081
- /* @__PURE__ */ jsx21(
4414
+ /* @__PURE__ */ jsx24(
4082
4415
  ConflictPreview,
4083
4416
  {
4084
4417
  item: conflict.remote,
@@ -4089,8 +4422,8 @@ function KeepSyncRecoveryDialog({
4089
4422
  }
4090
4423
  )
4091
4424
  ] }),
4092
- /* @__PURE__ */ jsxs16("div", { children: [
4093
- /* @__PURE__ */ jsx21(
4425
+ /* @__PURE__ */ jsxs18("div", { children: [
4426
+ /* @__PURE__ */ jsx24(
4094
4427
  "button",
4095
4428
  {
4096
4429
  type: "button",
@@ -4100,7 +4433,7 @@ function KeepSyncRecoveryDialog({
4100
4433
  children: view.labels.keepLocal
4101
4434
  }
4102
4435
  ),
4103
- /* @__PURE__ */ jsx21(
4436
+ /* @__PURE__ */ jsx24(
4104
4437
  "button",
4105
4438
  {
4106
4439
  type: "button",
@@ -4110,7 +4443,7 @@ function KeepSyncRecoveryDialog({
4110
4443
  children: view.labels.useServer
4111
4444
  }
4112
4445
  ),
4113
- /* @__PURE__ */ jsx21(
4446
+ /* @__PURE__ */ jsx24(
4114
4447
  "button",
4115
4448
  {
4116
4449
  type: "button",
@@ -4123,12 +4456,12 @@ function KeepSyncRecoveryDialog({
4123
4456
  ] })
4124
4457
  ] }, conflict.id))
4125
4458
  ] }) : null,
4126
- view.showBackupRecovery ? /* @__PURE__ */ jsxs16("section", { "data-recovery": "backup", children: [
4127
- /* @__PURE__ */ jsx21("h3", { children: view.labels.backupRecovery }),
4128
- /* @__PURE__ */ jsx21("p", { children: view.labels.backupRecoveryDescription }),
4129
- backup ?? (showBackupControls ? /* @__PURE__ */ jsx21(KeepBackup, {}) : null)
4459
+ view.showBackupRecovery ? /* @__PURE__ */ jsxs18("section", { "data-recovery": "backup", children: [
4460
+ /* @__PURE__ */ jsx24("h3", { children: view.labels.backupRecovery }),
4461
+ /* @__PURE__ */ jsx24("p", { children: view.labels.backupRecoveryDescription }),
4462
+ backup ?? (showBackupControls ? /* @__PURE__ */ jsx24(KeepBackup, {}) : null)
4130
4463
  ] }) : null,
4131
- view.error ? /* @__PURE__ */ jsx21("p", { id: "keepkit-sync-recovery-error", role: "alert", "aria-live": "assertive", children: view.error instanceof Error ? view.error.message : view.labels.error }) : null
4464
+ view.error ? /* @__PURE__ */ jsx24("p", { id: "keepkit-sync-recovery-error", role: "alert", "aria-live": "assertive", children: view.error instanceof Error ? view.error.message : view.labels.error }) : null
4132
4465
  ]
4133
4466
  }
4134
4467
  );
@@ -4140,16 +4473,16 @@ function ConflictPreview({
4140
4473
  noteLabel,
4141
4474
  side
4142
4475
  }) {
4143
- return /* @__PURE__ */ jsxs16("article", { "data-conflict-version": side, "aria-label": heading, children: [
4144
- /* @__PURE__ */ jsx21("h4", { children: heading }),
4145
- /* @__PURE__ */ jsxs16("dl", { children: [
4146
- /* @__PURE__ */ jsxs16("div", { children: [
4147
- /* @__PURE__ */ jsx21("dt", { children: updatedAtLabel }),
4148
- /* @__PURE__ */ jsx21("dd", { children: item ? /* @__PURE__ */ jsx21("time", { dateTime: new Date(item.updatedAt).toISOString(), children: formatConflictDate(item.updatedAt) }) : "\u2014" })
4476
+ return /* @__PURE__ */ jsxs18("article", { "data-conflict-version": side, "aria-label": heading, children: [
4477
+ /* @__PURE__ */ jsx24("h4", { children: heading }),
4478
+ /* @__PURE__ */ jsxs18("dl", { children: [
4479
+ /* @__PURE__ */ jsxs18("div", { children: [
4480
+ /* @__PURE__ */ jsx24("dt", { children: updatedAtLabel }),
4481
+ /* @__PURE__ */ jsx24("dd", { children: item ? /* @__PURE__ */ jsx24("time", { dateTime: new Date(item.updatedAt).toISOString(), children: formatConflictDate(item.updatedAt) }) : "\u2014" })
4149
4482
  ] }),
4150
- /* @__PURE__ */ jsxs16("div", { children: [
4151
- /* @__PURE__ */ jsx21("dt", { children: noteLabel }),
4152
- /* @__PURE__ */ jsx21("dd", { children: item?.note || "\u2014" })
4483
+ /* @__PURE__ */ jsxs18("div", { children: [
4484
+ /* @__PURE__ */ jsx24("dt", { children: noteLabel }),
4485
+ /* @__PURE__ */ jsx24("dd", { children: item?.note || "\u2014" })
4153
4486
  ] })
4154
4487
  ] })
4155
4488
  ] });
@@ -4193,7 +4526,7 @@ function getErrorMessage5(error) {
4193
4526
  }
4194
4527
 
4195
4528
  // src/features/sync/KeepSyncStatusBanner.tsx
4196
- import { jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
4529
+ import { jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
4197
4530
  function KeepSyncStatusBanner({
4198
4531
  onRetry,
4199
4532
  onResolveConflicts,
@@ -4203,7 +4536,7 @@ function KeepSyncStatusBanner({
4203
4536
  }) {
4204
4537
  const view = useKeepSyncStatusBanner({ onRetry, children });
4205
4538
  if (view.status === "idle" && !view.hasConflicts) return null;
4206
- return /* @__PURE__ */ jsxs17(
4539
+ return /* @__PURE__ */ jsxs19(
4207
4540
  "aside",
4208
4541
  {
4209
4542
  ...props,
@@ -4213,8 +4546,8 @@ function KeepSyncStatusBanner({
4213
4546
  "data-keepkit": "sync-status",
4214
4547
  "data-state": view.status,
4215
4548
  children: [
4216
- /* @__PURE__ */ jsx22("p", { children: view.message }),
4217
- view.showRetry ? /* @__PURE__ */ jsx22(
4549
+ /* @__PURE__ */ jsx25("p", { children: view.message }),
4550
+ view.showRetry ? /* @__PURE__ */ jsx25(
4218
4551
  "button",
4219
4552
  {
4220
4553
  type: "button",
@@ -4224,7 +4557,7 @@ function KeepSyncStatusBanner({
4224
4557
  children: view.retryLabel
4225
4558
  }
4226
4559
  ) : null,
4227
- view.hasConflicts ? /* @__PURE__ */ jsx22(
4560
+ view.hasConflicts ? /* @__PURE__ */ jsx25(
4228
4561
  "button",
4229
4562
  {
4230
4563
  type: "button",
@@ -4240,8 +4573,8 @@ function KeepSyncStatusBanner({
4240
4573
  }
4241
4574
 
4242
4575
  // src/foundation/theme.tsx
4243
- import { cloneElement as cloneElement2, isValidElement as isValidElement7 } from "react";
4244
- import { jsx as jsx23 } from "react/jsx-runtime";
4576
+ import { isValidElement as isValidElement9 } from "react";
4577
+ import { jsx as jsx26 } from "react/jsx-runtime";
4245
4578
  var keepThemeNames = [
4246
4579
  "default",
4247
4580
  "ocean",
@@ -4296,11 +4629,11 @@ function KeepThemeProvider({
4296
4629
  "data-reduced-motion": reducedMotion ? "true" : void 0
4297
4630
  };
4298
4631
  if (asChild) {
4299
- if (!isValidElement7(children))
4632
+ if (!isValidElement9(children))
4300
4633
  throw new Error("KeepThemeProvider with asChild requires a single React element child.");
4301
- return cloneElement2(children, rootProps);
4634
+ return createSlot(children, rootProps);
4302
4635
  }
4303
- return /* @__PURE__ */ jsx23("div", { ...rootProps, children });
4636
+ return /* @__PURE__ */ jsx26("div", { ...rootProps, children });
4304
4637
  }
4305
4638
 
4306
4639
  // src/index.tsx
@@ -4324,7 +4657,7 @@ import {
4324
4657
  LocalStorageSyncQueueAdapter,
4325
4658
  SyncStorageAdapter
4326
4659
  } from "@keepkit/core/storage";
4327
- import { jsx as jsx24, jsxs as jsxs18 } from "react/jsx-runtime";
4660
+ import { jsx as jsx27, jsxs as jsxs20 } from "react/jsx-runtime";
4328
4661
  function KeepKitProvider({
4329
4662
  labels,
4330
4663
  locale,
@@ -4344,7 +4677,7 @@ function KeepKitProvider({
4344
4677
  children,
4345
4678
  ...providerProps
4346
4679
  }) {
4347
- return /* @__PURE__ */ jsx24(KeepUiProvider, { labels, locale, labelResolver, onFeedback, children: /* @__PURE__ */ jsx24(
4680
+ return /* @__PURE__ */ jsx27(KeepUiProvider, { labels, locale, labelResolver, onFeedback, children: /* @__PURE__ */ jsx27(
4348
4681
  KeepThemeProvider,
4349
4682
  {
4350
4683
  theme,
@@ -4358,10 +4691,10 @@ function KeepKitProvider({
4358
4691
  className: themeClassName,
4359
4692
  style: themeStyle,
4360
4693
  asChild: themeAsChild,
4361
- children: /* @__PURE__ */ jsxs18(CoreKeepProvider, { ...providerProps, children: [
4362
- /* @__PURE__ */ jsx24(KeepSyncFeedbackObserver, {}),
4694
+ children: /* @__PURE__ */ jsxs20(CoreKeepProvider, { ...providerProps, children: [
4695
+ /* @__PURE__ */ jsx27(KeepSyncFeedbackObserver, {}),
4363
4696
  children,
4364
- /* @__PURE__ */ jsx24(KeepAnnouncements, {})
4697
+ /* @__PURE__ */ jsx27(KeepAnnouncements, {})
4365
4698
  ] })
4366
4699
  }
4367
4700
  ) });
@@ -4388,7 +4721,7 @@ function createKeepKit(options = {}) {
4388
4721
  } = options;
4389
4722
  const coreKit = createCoreKeepKit(coreOptions);
4390
4723
  return {
4391
- Provider: (props) => /* @__PURE__ */ jsx24(
4724
+ Provider: (props) => /* @__PURE__ */ jsx27(
4392
4725
  KeepKitProvider,
4393
4726
  {
4394
4727
  ...coreOptions,
@@ -4409,9 +4742,9 @@ function createKeepKit(options = {}) {
4409
4742
  ...props
4410
4743
  }
4411
4744
  ),
4412
- Button: (props) => /* @__PURE__ */ jsx24(KeepButton, { ...props }),
4413
- Backup: (props) => /* @__PURE__ */ jsx24(KeepBackup, { ...props }),
4414
- Collection: (props) => /* @__PURE__ */ jsx24(
4745
+ Button: (props) => /* @__PURE__ */ jsx27(KeepButton, { ...props }),
4746
+ Backup: (props) => /* @__PURE__ */ jsx27(KeepBackup, { ...props }),
4747
+ Collection: (props) => /* @__PURE__ */ jsx27(
4415
4748
  KeepCollection,
4416
4749
  {
4417
4750
  ...props,
@@ -4433,6 +4766,7 @@ export {
4433
4766
  FallbackStorageAdapter,
4434
4767
  IndexedDBAdapter,
4435
4768
  IndexedDBSyncQueueAdapter,
4769
+ KeepActiveFiltersSummary,
4436
4770
  KeepAnnouncements,
4437
4771
  KeepAnnouncer,
4438
4772
  KeepBackup,
@@ -4456,6 +4790,7 @@ export {
4456
4790
  KeepPruneStaleButton,
4457
4791
  KeepReorderableList,
4458
4792
  KeepSearchInput,
4793
+ KeepShortcutHint,
4459
4794
  KeepSortSelect,
4460
4795
  KeepStaleNotice,
4461
4796
  KeepStatus,
@@ -4470,15 +4805,18 @@ export {
4470
4805
  LocalStorageAdapter,
4471
4806
  LocalStorageSyncQueueAdapter,
4472
4807
  SyncStorageAdapter,
4808
+ chainedFunction,
4473
4809
  createAuthenticatedSyncKit,
4474
4810
  createBrowserStorageAdapter,
4475
4811
  createKeepKit,
4476
4812
  createNextPagesRouterAdapter,
4813
+ createSlot,
4477
4814
  createStorageAdapter,
4478
4815
  getKeepLocaleLabels,
4479
4816
  highlightText,
4480
4817
  isAllSelected,
4481
4818
  keepThemeNames,
4819
+ mergeProps,
4482
4820
  toggleSelectAll,
4483
4821
  useKeepContext8 as useKeepContext,
4484
4822
  useKeepItem5 as useKeepItem,