@keepkit/ui 0.11.0 → 0.12.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
@@ -12,8 +12,82 @@ import { useRef, useState } from "react";
12
12
 
13
13
  // src/ui-context.tsx
14
14
  import { createContext, useContext, useMemo } from "react";
15
- import { jsx } from "react/jsx-runtime";
16
- var DEFAULT_LABELS = {
15
+
16
+ // src/locales/de.ts
17
+ var DE_LABELS = {
18
+ save: "Speichern",
19
+ saved: "Gespeichert",
20
+ remove: "Entfernen",
21
+ loading: "Wird geladen\u2026",
22
+ saving: "Wird gespeichert\u2026",
23
+ syncing: "Wird synchronisiert\u2026",
24
+ error: "Ein Fehler ist aufgetreten.",
25
+ allTags: "Alle",
26
+ tags: "Tags",
27
+ filterTags: "Gespeicherte Elemente nach Tag filtern",
28
+ note: "Notiz",
29
+ saveNote: "Notiz speichern",
30
+ noItems: "Keine gespeicherten Elemente.",
31
+ loadingItems: "Gespeicherte Elemente werden geladen\u2026",
32
+ errorItems: "Gespeicherte Elemente konnten nicht geladen werden.",
33
+ search: "Gespeicherte Elemente durchsuchen",
34
+ sort: "Gespeicherte Elemente sortieren",
35
+ newest: "Neueste zuerst",
36
+ oldest: "\xC4lteste zuerst",
37
+ savedNewest: "Zuletzt gespeichert zuerst",
38
+ savedOldest: "Am l\xE4ngsten gespeichert zuerst",
39
+ updatedNewest: "Zuletzt aktualisiert zuerst",
40
+ updatedOldest: "Am l\xE4ngsten nicht aktualisiert zuerst",
41
+ previousPage: "Vorherige Seite",
42
+ nextPage: "N\xE4chste Seite",
43
+ pagination: "Seitennavigation",
44
+ page: "Seite",
45
+ selectItems: "Gespeicherte Elemente ausw\xE4hlen",
46
+ selectedCount: "ausgew\xE4hlt",
47
+ deleteSelected: "Auswahl l\xF6schen",
48
+ tagsToApply: "Anzuwendende Tags",
49
+ applyTags: "Tags anwenden",
50
+ savedMessage: "Element gespeichert.",
51
+ removedMessage: "Element entfernt.",
52
+ undo: "R\xFCckg\xE4ngig",
53
+ undoAvailable: "Element entfernt. R\xFCckg\xE4ngig machen?",
54
+ selectionScope: "Auswahlbereich",
55
+ currentPage: "Aktuelle Seite",
56
+ searchResults: "Aktuelle Suchergebnisse",
57
+ allItems: "Alle gespeicherten Elemente",
58
+ statusAvailable: "Verf\xFCgbar",
59
+ noteSavedMessage: "Notiz gespeichert.",
60
+ exportData: "JSON exportieren",
61
+ importData: "JSON importieren",
62
+ importMode: "Importmodus",
63
+ merge: "Zusammenf\xFChren",
64
+ replace: "Ersetzen",
65
+ importedCount: "Elemente importiert",
66
+ failedCount: "Elemente fehlgeschlagen",
67
+ storageQuotaError: "Der Speicher ist voll. Schaffen Sie Speicherplatz und versuchen Sie es erneut.",
68
+ statusExpired: "Abgelaufen",
69
+ statusRemoved: "Entfernt",
70
+ statusDeleted: "Gel\xF6scht",
71
+ statusPrivate: "Privat",
72
+ statusUnknown: "Nicht verf\xFCgbar",
73
+ retry: "Erneut versuchen",
74
+ removeFromList: "Aus Liste entfernen",
75
+ pruneStale: "Nicht verf\xFCgbare Elemente entfernen",
76
+ retrySync: "Synchronisierung erneut versuchen",
77
+ resolveSync: "Konflikte l\xF6sen",
78
+ keepLocal: "Lokale Version behalten",
79
+ useServer: "Serverversion verwenden",
80
+ manualMerge: "Manuell zusammenf\xFChren",
81
+ close: "Schlie\xDFen",
82
+ backupRecovery: "Aus Backup wiederherstellen",
83
+ backupRecoveryDescription: "Wenn lokale Synchronisierungsdaten besch\xE4digt sind, stellen Sie ein g\xFCltiges JSON-Backup wieder her.",
84
+ syncPending: "\xC4nderungen warten auf die Synchronisierung.",
85
+ syncSynced: "Alle \xC4nderungen sind synchronisiert.",
86
+ syncConflict: "Einige \xC4nderungen ben\xF6tigen eine Konfliktl\xF6sung."
87
+ };
88
+
89
+ // src/locales/en.ts
90
+ var EN_LABELS = {
17
91
  save: "Save",
18
92
  saved: "Saved",
19
93
  remove: "Remove",
@@ -68,122 +142,1114 @@ var DEFAULT_LABELS = {
68
142
  statusRemoved: "Removed",
69
143
  statusDeleted: "Deleted",
70
144
  statusPrivate: "Private",
71
- statusUnknown: "Unavailable"
145
+ statusUnknown: "Unavailable",
146
+ retry: "Retry",
147
+ removeFromList: "Remove from list",
148
+ pruneStale: "Remove unavailable items",
149
+ retrySync: "Retry sync",
150
+ resolveSync: "Resolve conflicts",
151
+ keepLocal: "Keep local",
152
+ useServer: "Use server",
153
+ manualMerge: "Manual merge",
154
+ close: "Close",
155
+ backupRecovery: "Restore from backup",
156
+ backupRecoveryDescription: "If local sync data is damaged, restore a known-good JSON backup.",
157
+ syncPending: "Changes are waiting to sync.",
158
+ syncSynced: "All changes are synced.",
159
+ syncConflict: "Some changes need conflict resolution."
160
+ };
161
+
162
+ // src/locales/es.ts
163
+ var ES_LABELS = {
164
+ save: "Guardar",
165
+ saved: "Guardado",
166
+ remove: "Eliminar",
167
+ loading: "Cargando\u2026",
168
+ saving: "Guardando\u2026",
169
+ syncing: "Sincronizando\u2026",
170
+ error: "Se produjo un error.",
171
+ allTags: "Todos",
172
+ tags: "Etiquetas",
173
+ filterTags: "Filtrar elementos guardados por etiqueta",
174
+ note: "Nota",
175
+ saveNote: "Guardar nota",
176
+ noItems: "No hay elementos guardados.",
177
+ loadingItems: "Cargando elementos guardados\u2026",
178
+ errorItems: "No se pudieron cargar los elementos guardados.",
179
+ search: "Buscar elementos guardados",
180
+ sort: "Ordenar elementos guardados",
181
+ newest: "M\xE1s recientes primero",
182
+ oldest: "M\xE1s antiguos primero",
183
+ savedNewest: "Guardados m\xE1s recientemente primero",
184
+ savedOldest: "Guardados m\xE1s antiguos primero",
185
+ updatedNewest: "Actualizados m\xE1s recientemente primero",
186
+ updatedOldest: "Actualizados m\xE1s antiguos primero",
187
+ previousPage: "P\xE1gina anterior",
188
+ nextPage: "P\xE1gina siguiente",
189
+ pagination: "Paginaci\xF3n",
190
+ page: "P\xE1gina",
191
+ selectItems: "Seleccionar elementos guardados",
192
+ selectedCount: "seleccionados",
193
+ deleteSelected: "Eliminar seleccionados",
194
+ tagsToApply: "Etiquetas que aplicar",
195
+ applyTags: "Aplicar etiquetas",
196
+ savedMessage: "Elemento guardado.",
197
+ removedMessage: "Elemento eliminado.",
198
+ undo: "Deshacer",
199
+ undoAvailable: "Elemento eliminado. \xBFDeshacer?",
200
+ selectionScope: "\xC1mbito de selecci\xF3n",
201
+ currentPage: "P\xE1gina actual",
202
+ searchResults: "Resultados de b\xFAsqueda actuales",
203
+ allItems: "Todos los elementos guardados",
204
+ statusAvailable: "Disponible",
205
+ noteSavedMessage: "Nota guardada.",
206
+ exportData: "Exportar JSON",
207
+ importData: "Importar JSON",
208
+ importMode: "Modo de importaci\xF3n",
209
+ merge: "Combinar",
210
+ replace: "Reemplazar",
211
+ importedCount: "elementos importados",
212
+ failedCount: "elementos fallidos",
213
+ storageQuotaError: "El almacenamiento est\xE1 lleno. Libere espacio y vuelva a intentarlo.",
214
+ statusExpired: "Caducado",
215
+ statusRemoved: "Eliminado",
216
+ statusDeleted: "Borrado",
217
+ statusPrivate: "Privado",
218
+ statusUnknown: "No disponible",
219
+ retry: "Reintentar",
220
+ removeFromList: "Quitar de la lista",
221
+ pruneStale: "Quitar elementos no disponibles",
222
+ retrySync: "Reintentar sincronizaci\xF3n",
223
+ resolveSync: "Resolver conflictos",
224
+ keepLocal: "Conservar versi\xF3n local",
225
+ useServer: "Usar versi\xF3n del servidor",
226
+ manualMerge: "Combinar manualmente",
227
+ close: "Cerrar",
228
+ backupRecovery: "Restaurar desde copia de seguridad",
229
+ backupRecoveryDescription: "Si los datos locales est\xE1n da\xF1ados, restaura una copia JSON v\xE1lida.",
230
+ syncPending: "Hay cambios pendientes de sincronizaci\xF3n.",
231
+ syncSynced: "Todos los cambios est\xE1n sincronizados.",
232
+ syncConflict: "Algunos cambios necesitan resolver un conflicto."
233
+ };
234
+
235
+ // src/locales/fil.ts
236
+ var FIL_LABELS = {
237
+ save: "I-save",
238
+ saved: "Nai-save",
239
+ remove: "Alisin",
240
+ loading: "Naglo-load\u2026",
241
+ saving: "Sini-save\u2026",
242
+ syncing: "Sini-sync\u2026",
243
+ error: "May naganap na error.",
244
+ allTags: "Lahat",
245
+ tags: "Mga tag",
246
+ filterTags: "I-filter ang mga naka-save na item ayon sa tag",
247
+ note: "Tala",
248
+ saveNote: "I-save ang tala",
249
+ noItems: "Walang naka-save na item.",
250
+ loadingItems: "Nilo-load ang mga naka-save na item\u2026",
251
+ errorItems: "Hindi ma-load ang mga naka-save na item.",
252
+ search: "Maghanap ng naka-save na item",
253
+ sort: "Ayusin ang mga naka-save na item",
254
+ newest: "Pinakabago muna",
255
+ oldest: "Pinakaluma muna",
256
+ savedNewest: "Pinakabagong na-save muna",
257
+ savedOldest: "Pinakamatagal na naka-save muna",
258
+ updatedNewest: "Pinakabagong na-update muna",
259
+ updatedOldest: "Pinakamatagal na hindi na-update muna",
260
+ previousPage: "Nakaraang pahina",
261
+ nextPage: "Susunod na pahina",
262
+ pagination: "Pagpapa-pahina",
263
+ page: "Pahina",
264
+ selectItems: "Pumili ng naka-save na item",
265
+ selectedCount: "napili",
266
+ deleteSelected: "Tanggalin ang napili",
267
+ tagsToApply: "Mga tag na ilalapat",
268
+ applyTags: "Ilapat ang mga tag",
269
+ savedMessage: "Na-save ang item.",
270
+ removedMessage: "Inalis ang item.",
271
+ undo: "I-undo",
272
+ undoAvailable: "Inalis ang item. I-undo?",
273
+ selectionScope: "Saklaw ng pagpili",
274
+ currentPage: "Kasalukuyang pahina",
275
+ searchResults: "Kasalukuyang resulta ng paghahanap",
276
+ allItems: "Lahat ng naka-save na item",
277
+ statusAvailable: "Available",
278
+ noteSavedMessage: "Na-save ang tala.",
279
+ exportData: "I-export ang JSON",
280
+ importData: "I-import ang JSON",
281
+ importMode: "Mode ng pag-import",
282
+ merge: "Pagsamahin",
283
+ replace: "Palitan",
284
+ importedCount: "item ang na-import",
285
+ failedCount: "item ang nabigo",
286
+ storageQuotaError: "Puno na ang storage. Magbakante ng espasyo at subukan muli.",
287
+ statusExpired: "Nag-expire",
288
+ statusRemoved: "Inalis",
289
+ statusDeleted: "Tinanggal",
290
+ statusPrivate: "Pribado",
291
+ statusUnknown: "Hindi available",
292
+ retry: "Subukan muli",
293
+ removeFromList: "Alisin sa listahan",
294
+ pruneStale: "Alisin ang hindi available na item",
295
+ retrySync: "Subukan muli ang sync",
296
+ resolveSync: "Ayusin ang mga conflict",
297
+ keepLocal: "Panatilihin ang lokal",
298
+ useServer: "Gamitin ang server",
299
+ manualMerge: "Manwal na pagsamahin",
300
+ close: "Isara",
301
+ backupRecovery: "I-restore mula sa backup",
302
+ backupRecoveryDescription: "Kung sira ang lokal na sync data, mag-restore ng gumaganang JSON backup.",
303
+ syncPending: "May mga pagbabagong naghihintay ng sync.",
304
+ syncSynced: "Naka-sync na ang lahat ng pagbabago.",
305
+ syncConflict: "May mga pagbabagong kailangang ayusin ang conflict."
306
+ };
307
+
308
+ // src/locales/fr.ts
309
+ var FR_LABELS = {
310
+ save: "Enregistrer",
311
+ saved: "Enregistr\xE9",
312
+ remove: "Supprimer",
313
+ loading: "Chargement\u2026",
314
+ saving: "Enregistrement\u2026",
315
+ syncing: "Synchronisation\u2026",
316
+ error: "Une erreur s\u2019est produite.",
317
+ allTags: "Tous",
318
+ tags: "\xC9tiquettes",
319
+ filterTags: "Filtrer les \xE9l\xE9ments enregistr\xE9s par \xE9tiquette",
320
+ note: "Note",
321
+ saveNote: "Enregistrer la note",
322
+ noItems: "Aucun \xE9l\xE9ment enregistr\xE9.",
323
+ loadingItems: "Chargement des \xE9l\xE9ments enregistr\xE9s\u2026",
324
+ errorItems: "Impossible de charger les \xE9l\xE9ments enregistr\xE9s.",
325
+ search: "Rechercher des \xE9l\xE9ments enregistr\xE9s",
326
+ sort: "Trier les \xE9l\xE9ments enregistr\xE9s",
327
+ newest: "Plus r\xE9cent d\u2019abord",
328
+ oldest: "Plus ancien d\u2019abord",
329
+ savedNewest: "Enregistrement le plus r\xE9cent d\u2019abord",
330
+ savedOldest: "Enregistrement le plus ancien d\u2019abord",
331
+ updatedNewest: "Mise \xE0 jour la plus r\xE9cente d\u2019abord",
332
+ updatedOldest: "Mise \xE0 jour la plus ancienne d\u2019abord",
333
+ previousPage: "Page pr\xE9c\xE9dente",
334
+ nextPage: "Page suivante",
335
+ pagination: "Pagination",
336
+ page: "Page",
337
+ selectItems: "S\xE9lectionner les \xE9l\xE9ments enregistr\xE9s",
338
+ selectedCount: "s\xE9lectionn\xE9s",
339
+ deleteSelected: "Supprimer la s\xE9lection",
340
+ tagsToApply: "\xC9tiquettes \xE0 appliquer",
341
+ applyTags: "Appliquer les \xE9tiquettes",
342
+ savedMessage: "\xC9l\xE9ment enregistr\xE9.",
343
+ removedMessage: "\xC9l\xE9ment supprim\xE9.",
344
+ undo: "Annuler",
345
+ undoAvailable: "\xC9l\xE9ment supprim\xE9. Annuler ?",
346
+ selectionScope: "Port\xE9e de la s\xE9lection",
347
+ currentPage: "Page actuelle",
348
+ searchResults: "R\xE9sultats de recherche actuels",
349
+ allItems: "Tous les \xE9l\xE9ments enregistr\xE9s",
350
+ statusAvailable: "Disponible",
351
+ noteSavedMessage: "Note enregistr\xE9e.",
352
+ exportData: "Exporter JSON",
353
+ importData: "Importer JSON",
354
+ importMode: "Mode d\u2019importation",
355
+ merge: "Fusionner",
356
+ replace: "Remplacer",
357
+ importedCount: "\xE9l\xE9ments import\xE9s",
358
+ failedCount: "\xE9l\xE9ments en \xE9chec",
359
+ storageQuotaError: "Le stockage est plein. Lib\xE9rez de l\u2019espace et r\xE9essayez.",
360
+ statusExpired: "Expir\xE9",
361
+ statusRemoved: "Supprim\xE9",
362
+ statusDeleted: "Effac\xE9",
363
+ statusPrivate: "Priv\xE9",
364
+ statusUnknown: "Indisponible",
365
+ retry: "R\xE9essayer",
366
+ removeFromList: "Retirer de la liste",
367
+ pruneStale: "Retirer les \xE9l\xE9ments indisponibles",
368
+ retrySync: "R\xE9essayer la synchronisation",
369
+ resolveSync: "R\xE9soudre les conflits",
370
+ keepLocal: "Garder la version locale",
371
+ useServer: "Utiliser la version serveur",
372
+ manualMerge: "Fusion manuelle",
373
+ close: "Fermer",
374
+ backupRecovery: "Restaurer depuis une sauvegarde",
375
+ backupRecoveryDescription: "Si les donn\xE9es locales sont endommag\xE9es, restaurez une sauvegarde JSON valide.",
376
+ syncPending: "Des modifications attendent la synchronisation.",
377
+ syncSynced: "Toutes les modifications sont synchronis\xE9es.",
378
+ syncConflict: "Certaines modifications n\xE9cessitent une r\xE9solution de conflit."
379
+ };
380
+
381
+ // src/locales/id.ts
382
+ var ID_LABELS = {
383
+ save: "Simpan",
384
+ saved: "Tersimpan",
385
+ remove: "Hapus",
386
+ loading: "Memuat\u2026",
387
+ saving: "Menyimpan\u2026",
388
+ syncing: "Menyinkronkan\u2026",
389
+ error: "Terjadi kesalahan.",
390
+ allTags: "Semua",
391
+ tags: "Tag",
392
+ filterTags: "Filter item tersimpan berdasarkan tag",
393
+ note: "Catatan",
394
+ saveNote: "Simpan catatan",
395
+ noItems: "Belum ada item tersimpan.",
396
+ loadingItems: "Memuat item tersimpan\u2026",
397
+ errorItems: "Tidak dapat memuat item tersimpan.",
398
+ search: "Cari item tersimpan",
399
+ sort: "Urutkan item tersimpan",
400
+ newest: "Terbaru dahulu",
401
+ oldest: "Terlama dahulu",
402
+ savedNewest: "Paling baru disimpan dahulu",
403
+ savedOldest: "Paling lama disimpan dahulu",
404
+ updatedNewest: "Paling baru diperbarui dahulu",
405
+ updatedOldest: "Paling lama diperbarui dahulu",
406
+ previousPage: "Halaman sebelumnya",
407
+ nextPage: "Halaman berikutnya",
408
+ pagination: "Paginasi",
409
+ page: "Halaman",
410
+ selectItems: "Pilih item tersimpan",
411
+ selectedCount: "dipilih",
412
+ deleteSelected: "Hapus yang dipilih",
413
+ tagsToApply: "Tag yang akan diterapkan",
414
+ applyTags: "Terapkan tag",
415
+ savedMessage: "Item tersimpan.",
416
+ removedMessage: "Item dihapus.",
417
+ undo: "Urungkan",
418
+ undoAvailable: "Item dihapus. Urungkan?",
419
+ selectionScope: "Cakupan pilihan",
420
+ currentPage: "Halaman saat ini",
421
+ searchResults: "Hasil pencarian saat ini",
422
+ allItems: "Semua item tersimpan",
423
+ statusAvailable: "Tersedia",
424
+ noteSavedMessage: "Catatan tersimpan.",
425
+ exportData: "Ekspor JSON",
426
+ importData: "Impor JSON",
427
+ importMode: "Mode impor",
428
+ merge: "Gabungkan",
429
+ replace: "Ganti",
430
+ importedCount: "item diimpor",
431
+ failedCount: "item gagal",
432
+ storageQuotaError: "Penyimpanan penuh. Kosongkan ruang lalu coba lagi.",
433
+ statusExpired: "Kedaluwarsa",
434
+ statusRemoved: "Dihapus",
435
+ statusDeleted: "Terhapus",
436
+ statusPrivate: "Pribadi",
437
+ statusUnknown: "Tidak tersedia",
438
+ retry: "Coba lagi",
439
+ removeFromList: "Hapus dari daftar",
440
+ pruneStale: "Hapus item yang tidak tersedia",
441
+ retrySync: "Coba sinkronisasi lagi",
442
+ resolveSync: "Selesaikan konflik",
443
+ keepLocal: "Pertahankan versi lokal",
444
+ useServer: "Gunakan versi server",
445
+ manualMerge: "Gabungkan manual",
446
+ close: "Tutup",
447
+ backupRecovery: "Pulihkan dari cadangan",
448
+ backupRecoveryDescription: "Jika data sinkronisasi lokal rusak, pulihkan cadangan JSON yang valid.",
449
+ syncPending: "Ada perubahan yang menunggu sinkronisasi.",
450
+ syncSynced: "Semua perubahan telah disinkronkan.",
451
+ syncConflict: "Beberapa perubahan memerlukan penyelesaian konflik."
452
+ };
453
+
454
+ // src/locales/it.ts
455
+ var IT_LABELS = {
456
+ save: "Salva",
457
+ saved: "Salvato",
458
+ remove: "Rimuovi",
459
+ loading: "Caricamento\u2026",
460
+ saving: "Salvataggio\u2026",
461
+ syncing: "Sincronizzazione\u2026",
462
+ error: "Si \xE8 verificato un errore.",
463
+ allTags: "Tutti",
464
+ tags: "Tag",
465
+ filterTags: "Filtra gli elementi salvati per tag",
466
+ note: "Nota",
467
+ saveNote: "Salva nota",
468
+ noItems: "Nessun elemento salvato.",
469
+ loadingItems: "Caricamento degli elementi salvati\u2026",
470
+ errorItems: "Impossibile caricare gli elementi salvati.",
471
+ search: "Cerca elementi salvati",
472
+ sort: "Ordina elementi salvati",
473
+ newest: "Pi\xF9 recenti prima",
474
+ oldest: "Pi\xF9 vecchi prima",
475
+ savedNewest: "Salvati pi\xF9 di recente prima",
476
+ savedOldest: "Salvati meno di recente prima",
477
+ updatedNewest: "Aggiornati pi\xF9 di recente prima",
478
+ updatedOldest: "Aggiornati meno di recente prima",
479
+ previousPage: "Pagina precedente",
480
+ nextPage: "Pagina successiva",
481
+ pagination: "Paginazione",
482
+ page: "Pagina",
483
+ selectItems: "Seleziona elementi salvati",
484
+ selectedCount: "selezionati",
485
+ deleteSelected: "Elimina selezionati",
486
+ tagsToApply: "Tag da applicare",
487
+ applyTags: "Applica tag",
488
+ savedMessage: "Elemento salvato.",
489
+ removedMessage: "Elemento rimosso.",
490
+ undo: "Annulla",
491
+ undoAvailable: "Elemento rimosso. Annullare?",
492
+ selectionScope: "Ambito della selezione",
493
+ currentPage: "Pagina corrente",
494
+ searchResults: "Risultati di ricerca correnti",
495
+ allItems: "Tutti gli elementi salvati",
496
+ statusAvailable: "Disponibile",
497
+ noteSavedMessage: "Nota salvata.",
498
+ exportData: "Esporta JSON",
499
+ importData: "Importa JSON",
500
+ importMode: "Modalit\xE0 di importazione",
501
+ merge: "Unisci",
502
+ replace: "Sostituisci",
503
+ importedCount: "elementi importati",
504
+ failedCount: "elementi non riusciti",
505
+ storageQuotaError: "Lo spazio di archiviazione \xE8 pieno. Libera spazio e riprova.",
506
+ statusExpired: "Scaduto",
507
+ statusRemoved: "Rimosso",
508
+ statusDeleted: "Eliminato",
509
+ statusPrivate: "Privato",
510
+ statusUnknown: "Non disponibile",
511
+ retry: "Riprova",
512
+ removeFromList: "Rimuovi dall'elenco",
513
+ pruneStale: "Rimuovi elementi non disponibili",
514
+ retrySync: "Riprova sincronizzazione",
515
+ resolveSync: "Risolvi conflitti",
516
+ keepLocal: "Mantieni versione locale",
517
+ useServer: "Usa versione del server",
518
+ manualMerge: "Unione manuale",
519
+ close: "Chiudi",
520
+ backupRecovery: "Ripristina dal backup",
521
+ backupRecoveryDescription: "Se i dati locali sono danneggiati, ripristina un backup JSON valido.",
522
+ syncPending: "Ci sono modifiche in attesa di sincronizzazione.",
523
+ syncSynced: "Tutte le modifiche sono sincronizzate.",
524
+ syncConflict: "Alcune modifiche richiedono la risoluzione di un conflitto."
525
+ };
526
+
527
+ // src/locales/ja.ts
528
+ var JA_LABELS = {
529
+ save: "\u4FDD\u5B58",
530
+ saved: "\u4FDD\u5B58\u6E08\u307F",
531
+ remove: "\u524A\u9664",
532
+ loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026",
533
+ saving: "\u4FDD\u5B58\u4E2D\u2026",
534
+ syncing: "\u540C\u671F\u4E2D\u2026",
535
+ error: "\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002",
536
+ allTags: "\u3059\u3079\u3066",
537
+ tags: "\u30BF\u30B0",
538
+ filterTags: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u30BF\u30B0\u3067\u7D5E\u308A\u8FBC\u3080",
539
+ note: "\u30E1\u30E2",
540
+ saveNote: "\u30E1\u30E2\u3092\u4FDD\u5B58",
541
+ noItems: "\u4FDD\u5B58\u3055\u308C\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u3042\u308A\u307E\u305B\u3093\u3002",
542
+ loadingItems: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026",
543
+ errorItems: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002",
544
+ search: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u691C\u7D22",
545
+ sort: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u4E26\u3079\u66FF\u3048",
546
+ newest: "\u65B0\u3057\u3044\u9806",
547
+ oldest: "\u53E4\u3044\u9806",
548
+ savedNewest: "\u4FDD\u5B58\u65E5\u6642\u306E\u65B0\u3057\u3044\u9806",
549
+ savedOldest: "\u4FDD\u5B58\u65E5\u6642\u306E\u53E4\u3044\u9806",
550
+ updatedNewest: "\u66F4\u65B0\u65E5\u6642\u306E\u65B0\u3057\u3044\u9806",
551
+ updatedOldest: "\u66F4\u65B0\u65E5\u6642\u306E\u53E4\u3044\u9806",
552
+ previousPage: "\u524D\u306E\u30DA\u30FC\u30B8",
553
+ nextPage: "\u6B21\u306E\u30DA\u30FC\u30B8",
554
+ pagination: "\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3",
555
+ page: "\u30DA\u30FC\u30B8",
556
+ selectItems: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u9078\u629E",
557
+ selectedCount: "\u4EF6\u3092\u9078\u629E\u4E2D",
558
+ deleteSelected: "\u9078\u629E\u9805\u76EE\u3092\u524A\u9664",
559
+ tagsToApply: "\u9069\u7528\u3059\u308B\u30BF\u30B0",
560
+ applyTags: "\u30BF\u30B0\u3092\u9069\u7528",
561
+ savedMessage: "\u30A2\u30A4\u30C6\u30E0\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002",
562
+ removedMessage: "\u30A2\u30A4\u30C6\u30E0\u3092\u524A\u9664\u3057\u307E\u3057\u305F\u3002",
563
+ undo: "\u5143\u306B\u623B\u3059",
564
+ undoAvailable: "\u30A2\u30A4\u30C6\u30E0\u3092\u524A\u9664\u3057\u307E\u3057\u305F\u3002\u5143\u306B\u623B\u3057\u307E\u3059\u304B\uFF1F",
565
+ selectionScope: "\u9078\u629E\u7BC4\u56F2",
566
+ currentPage: "\u8868\u793A\u4E2D\u306E\u30DA\u30FC\u30B8",
567
+ searchResults: "\u73FE\u5728\u306E\u691C\u7D22\u7D50\u679C\u5168\u4F53",
568
+ allItems: "\u3059\u3079\u3066\u306E\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0",
569
+ statusAvailable: "\u5229\u7528\u53EF\u80FD",
570
+ noteSavedMessage: "\u30E1\u30E2\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002",
571
+ exportData: "JSON\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8",
572
+ importData: "JSON\u3092\u30A4\u30F3\u30DD\u30FC\u30C8",
573
+ importMode: "\u30A4\u30F3\u30DD\u30FC\u30C8\u65B9\u6CD5",
574
+ merge: "\u7D71\u5408",
575
+ replace: "\u7F6E\u304D\u63DB\u3048",
576
+ importedCount: "\u4EF6\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3057\u305F",
577
+ failedCount: "\u4EF6\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
578
+ storageQuotaError: "\u4FDD\u5B58\u5BB9\u91CF\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002\u7A7A\u304D\u5BB9\u91CF\u3092\u78BA\u4FDD\u3057\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
579
+ statusExpired: "\u671F\u9650\u5207\u308C",
580
+ statusRemoved: "\u524A\u9664\u6E08\u307F",
581
+ statusDeleted: "\u524A\u9664\u6E08\u307F",
582
+ statusPrivate: "\u975E\u516C\u958B",
583
+ statusUnknown: "\u5229\u7528\u4E0D\u53EF",
584
+ retry: "\u518D\u53D6\u5F97",
585
+ removeFromList: "\u4E00\u89A7\u304B\u3089\u524A\u9664",
586
+ pruneStale: "\u5229\u7528\u3067\u304D\u306A\u3044\u9805\u76EE\u3092\u524A\u9664",
587
+ retrySync: "\u540C\u671F\u3092\u518D\u8A66\u884C",
588
+ resolveSync: "\u7AF6\u5408\u3092\u89E3\u6C7A",
589
+ keepLocal: "\u30ED\u30FC\u30AB\u30EB\u3092\u512A\u5148",
590
+ useServer: "\u30B5\u30FC\u30D0\u30FC\u3092\u512A\u5148",
591
+ manualMerge: "\u624B\u52D5\u3067\u7D71\u5408",
592
+ close: "\u9589\u3058\u308B",
593
+ backupRecovery: "\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304B\u3089\u5FA9\u5143",
594
+ backupRecoveryDescription: "\u30ED\u30FC\u30AB\u30EB\u306E\u540C\u671F\u30C7\u30FC\u30BF\u304C\u7834\u640D\u3057\u305F\u5834\u5408\u306F\u3001\u6B63\u5E38\u306AJSON\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304B\u3089\u5FA9\u5143\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
595
+ syncPending: "\u540C\u671F\u5F85\u3061\u306E\u5909\u66F4\u304C\u3042\u308A\u307E\u3059\u3002",
596
+ syncSynced: "\u3059\u3079\u3066\u306E\u5909\u66F4\u3092\u540C\u671F\u3057\u307E\u3057\u305F\u3002",
597
+ syncConflict: "\u7AF6\u5408\u3057\u3066\u3044\u308B\u5909\u66F4\u304C\u3042\u308A\u307E\u3059\u3002\u89E3\u6C7A\u3057\u3066\u304F\u3060\u3055\u3044\u3002"
72
598
  };
599
+
600
+ // src/locales/ko.ts
601
+ var KO_LABELS = {
602
+ save: "\uC800\uC7A5",
603
+ saved: "\uC800\uC7A5\uB428",
604
+ remove: "\uC0AD\uC81C",
605
+ loading: "\uB85C\uB4DC \uC911\u2026",
606
+ saving: "\uC800\uC7A5 \uC911\u2026",
607
+ syncing: "\uB3D9\uAE30\uD654 \uC911\u2026",
608
+ error: "\uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.",
609
+ allTags: "\uBAA8\uB450",
610
+ tags: "\uD0DC\uADF8",
611
+ filterTags: "\uD0DC\uADF8\uB85C \uC800\uC7A5 \uD56D\uBAA9 \uD544\uD130\uB9C1",
612
+ note: "\uBA54\uBAA8",
613
+ saveNote: "\uBA54\uBAA8 \uC800\uC7A5",
614
+ noItems: "\uC800\uC7A5\uB41C \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
615
+ loadingItems: "\uC800\uC7A5 \uD56D\uBAA9\uC744 \uBD88\uB7EC\uC624\uB294 \uC911\u2026",
616
+ errorItems: "\uC800\uC7A5 \uD56D\uBAA9\uC744 \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
617
+ search: "\uC800\uC7A5 \uD56D\uBAA9 \uAC80\uC0C9",
618
+ sort: "\uC800\uC7A5 \uD56D\uBAA9 \uC815\uB82C",
619
+ newest: "\uCD5C\uC2E0\uC21C",
620
+ oldest: "\uC624\uB798\uB41C\uC21C",
621
+ savedNewest: "\uC800\uC7A5\uC77C \uCD5C\uC2E0\uC21C",
622
+ savedOldest: "\uC800\uC7A5\uC77C \uC624\uB798\uB41C\uC21C",
623
+ updatedNewest: "\uC218\uC815\uC77C \uCD5C\uC2E0\uC21C",
624
+ updatedOldest: "\uC218\uC815\uC77C \uC624\uB798\uB41C\uC21C",
625
+ previousPage: "\uC774\uC804 \uD398\uC774\uC9C0",
626
+ nextPage: "\uB2E4\uC74C \uD398\uC774\uC9C0",
627
+ pagination: "\uD398\uC774\uC9C0 \uB9E4\uAE40",
628
+ page: "\uD398\uC774\uC9C0",
629
+ selectItems: "\uC800\uC7A5 \uD56D\uBAA9 \uC120\uD0DD",
630
+ selectedCount: "\uAC1C \uC120\uD0DD\uB428",
631
+ deleteSelected: "\uC120\uD0DD \uD56D\uBAA9 \uC0AD\uC81C",
632
+ tagsToApply: "\uC801\uC6A9\uD560 \uD0DC\uADF8",
633
+ applyTags: "\uD0DC\uADF8 \uC801\uC6A9",
634
+ savedMessage: "\uD56D\uBAA9\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.",
635
+ removedMessage: "\uD56D\uBAA9\uC744 \uC0AD\uC81C\uD588\uC2B5\uB2C8\uB2E4.",
636
+ undo: "\uC2E4\uD589 \uCDE8\uC18C",
637
+ undoAvailable: "\uD56D\uBAA9\uC744 \uC0AD\uC81C\uD588\uC2B5\uB2C8\uB2E4. \uC2E4\uD589 \uCDE8\uC18C\uD560\uAE4C\uC694?",
638
+ selectionScope: "\uC120\uD0DD \uBC94\uC704",
639
+ currentPage: "\uD604\uC7AC \uD398\uC774\uC9C0",
640
+ searchResults: "\uD604\uC7AC \uAC80\uC0C9 \uACB0\uACFC \uC804\uCCB4",
641
+ allItems: "\uBAA8\uB4E0 \uC800\uC7A5 \uD56D\uBAA9",
642
+ statusAvailable: "\uC0AC\uC6A9 \uAC00\uB2A5",
643
+ noteSavedMessage: "\uBA54\uBAA8\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.",
644
+ exportData: "JSON \uB0B4\uBCF4\uB0B4\uAE30",
645
+ importData: "JSON \uAC00\uC838\uC624\uAE30",
646
+ importMode: "\uAC00\uC838\uC624\uAE30 \uBC29\uC2DD",
647
+ merge: "\uBCD1\uD569",
648
+ replace: "\uAD50\uCCB4",
649
+ importedCount: "\uAC1C \uAC00\uC838\uC634",
650
+ failedCount: "\uAC1C \uC2E4\uD328",
651
+ storageQuotaError: "\uC800\uC7A5 \uACF5\uAC04\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4. \uACF5\uAC04\uC744 \uD655\uBCF4\uD55C \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
652
+ statusExpired: "\uB9CC\uB8CC\uB428",
653
+ statusRemoved: "\uC81C\uAC70\uB428",
654
+ statusDeleted: "\uC0AD\uC81C\uB428",
655
+ statusPrivate: "\uBE44\uACF5\uAC1C",
656
+ statusUnknown: "\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C",
657
+ retry: "\uB2E4\uC2DC \uC2DC\uB3C4",
658
+ removeFromList: "\uBAA9\uB85D\uC5D0\uC11C \uC0AD\uC81C",
659
+ pruneStale: "\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB294 \uD56D\uBAA9 \uC0AD\uC81C",
660
+ retrySync: "\uB3D9\uAE30\uD654 \uB2E4\uC2DC \uC2DC\uB3C4",
661
+ resolveSync: "\uCDA9\uB3CC \uD574\uACB0",
662
+ keepLocal: "\uB85C\uCEEC \uBC84\uC804 \uC720\uC9C0",
663
+ useServer: "\uC11C\uBC84 \uBC84\uC804 \uC0AC\uC6A9",
664
+ manualMerge: "\uC218\uB3D9 \uBCD1\uD569",
665
+ close: "\uB2EB\uAE30",
666
+ backupRecovery: "\uBC31\uC5C5\uC5D0\uC11C \uBCF5\uC6D0",
667
+ backupRecoveryDescription: "\uB85C\uCEEC \uB3D9\uAE30\uD654 \uB370\uC774\uD130\uAC00 \uC190\uC0C1\uB41C \uACBD\uC6B0 \uC815\uC0C1\uC801\uC778 JSON \uBC31\uC5C5\uC744 \uBCF5\uC6D0\uD558\uC138\uC694.",
668
+ syncPending: "\uB3D9\uAE30\uD654 \uB300\uAE30 \uC911\uC778 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4.",
669
+ syncSynced: "\uBAA8\uB4E0 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uB3D9\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
670
+ syncConflict: "\uCDA9\uB3CC\uC744 \uD574\uACB0\uD574\uC57C \uD558\uB294 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4."
671
+ };
672
+
673
+ // src/locales/ms.ts
674
+ var MS_LABELS = {
675
+ save: "Simpan",
676
+ saved: "Disimpan",
677
+ remove: "Buang",
678
+ loading: "Memuatkan\u2026",
679
+ saving: "Menyimpan\u2026",
680
+ syncing: "Menyegerakkan\u2026",
681
+ error: "Ralat telah berlaku.",
682
+ allTags: "Semua",
683
+ tags: "Tag",
684
+ filterTags: "Tapis item yang disimpan mengikut tag",
685
+ note: "Nota",
686
+ saveNote: "Simpan nota",
687
+ noItems: "Tiada item disimpan.",
688
+ loadingItems: "Memuatkan item yang disimpan\u2026",
689
+ errorItems: "Tidak dapat memuatkan item yang disimpan.",
690
+ search: "Cari item yang disimpan",
691
+ sort: "Isih item yang disimpan",
692
+ newest: "Terbaharu dahulu",
693
+ oldest: "Terlama dahulu",
694
+ savedNewest: "Disimpan paling baharu dahulu",
695
+ savedOldest: "Disimpan paling lama dahulu",
696
+ updatedNewest: "Dikemas kini paling baharu dahulu",
697
+ updatedOldest: "Dikemas kini paling lama dahulu",
698
+ previousPage: "Halaman sebelumnya",
699
+ nextPage: "Halaman seterusnya",
700
+ pagination: "Penomboran halaman",
701
+ page: "Halaman",
702
+ selectItems: "Pilih item yang disimpan",
703
+ selectedCount: "dipilih",
704
+ deleteSelected: "Padam pilihan",
705
+ tagsToApply: "Tag untuk digunakan",
706
+ applyTags: "Gunakan tag",
707
+ savedMessage: "Item disimpan.",
708
+ removedMessage: "Item dibuang.",
709
+ undo: "Buat asal",
710
+ undoAvailable: "Item dibuang. Buat asal?",
711
+ selectionScope: "Skop pilihan",
712
+ currentPage: "Halaman semasa",
713
+ searchResults: "Hasil carian semasa",
714
+ allItems: "Semua item yang disimpan",
715
+ statusAvailable: "Tersedia",
716
+ noteSavedMessage: "Nota disimpan.",
717
+ exportData: "Eksport JSON",
718
+ importData: "Import JSON",
719
+ importMode: "Mod import",
720
+ merge: "Gabung",
721
+ replace: "Ganti",
722
+ importedCount: "item diimport",
723
+ failedCount: "item gagal",
724
+ storageQuotaError: "Storan penuh. Kosongkan ruang dan cuba lagi.",
725
+ statusExpired: "Tamat tempoh",
726
+ statusRemoved: "Dibuang",
727
+ statusDeleted: "Dipadam",
728
+ statusPrivate: "Peribadi",
729
+ statusUnknown: "Tidak tersedia",
730
+ retry: "Cuba lagi",
731
+ removeFromList: "Buang daripada senarai",
732
+ pruneStale: "Buang item yang tidak tersedia",
733
+ retrySync: "Cuba penyegerakan lagi",
734
+ resolveSync: "Selesaikan konflik",
735
+ keepLocal: "Kekalkan versi setempat",
736
+ useServer: "Gunakan versi pelayan",
737
+ manualMerge: "Gabung secara manual",
738
+ close: "Tutup",
739
+ backupRecovery: "Pulihkan daripada sandaran",
740
+ backupRecoveryDescription: "Jika data penyegerakan setempat rosak, pulihkan sandaran JSON yang sah.",
741
+ syncPending: "Terdapat perubahan yang menunggu penyegerakan.",
742
+ syncSynced: "Semua perubahan telah disegerakkan.",
743
+ syncConflict: "Sesetengah perubahan memerlukan penyelesaian konflik."
744
+ };
745
+
746
+ // src/locales/pt-BR.ts
747
+ var PT_BR_LABELS = {
748
+ save: "Salvar",
749
+ saved: "Salvo",
750
+ remove: "Remover",
751
+ loading: "Carregando\u2026",
752
+ saving: "Salvando\u2026",
753
+ syncing: "Sincronizando\u2026",
754
+ error: "Ocorreu um erro.",
755
+ allTags: "Todos",
756
+ tags: "Tags",
757
+ filterTags: "Filtrar itens salvos por tag",
758
+ note: "Nota",
759
+ saveNote: "Salvar nota",
760
+ noItems: "Nenhum item salvo.",
761
+ loadingItems: "Carregando itens salvos\u2026",
762
+ errorItems: "N\xE3o foi poss\xEDvel carregar os itens salvos.",
763
+ search: "Pesquisar itens salvos",
764
+ sort: "Ordenar itens salvos",
765
+ newest: "Mais recentes primeiro",
766
+ oldest: "Mais antigos primeiro",
767
+ savedNewest: "Salvos mais recentemente primeiro",
768
+ savedOldest: "Salvos h\xE1 mais tempo primeiro",
769
+ updatedNewest: "Atualizados mais recentemente primeiro",
770
+ updatedOldest: "Atualizados h\xE1 mais tempo primeiro",
771
+ previousPage: "P\xE1gina anterior",
772
+ nextPage: "Pr\xF3xima p\xE1gina",
773
+ pagination: "Pagina\xE7\xE3o",
774
+ page: "P\xE1gina",
775
+ selectItems: "Selecionar itens salvos",
776
+ selectedCount: "selecionados",
777
+ deleteSelected: "Excluir selecionados",
778
+ tagsToApply: "Tags a aplicar",
779
+ applyTags: "Aplicar tags",
780
+ savedMessage: "Item salvo.",
781
+ removedMessage: "Item removido.",
782
+ undo: "Desfazer",
783
+ undoAvailable: "Item removido. Desfazer?",
784
+ selectionScope: "Escopo da sele\xE7\xE3o",
785
+ currentPage: "P\xE1gina atual",
786
+ searchResults: "Resultados da pesquisa atual",
787
+ allItems: "Todos os itens salvos",
788
+ statusAvailable: "Dispon\xEDvel",
789
+ noteSavedMessage: "Nota salva.",
790
+ exportData: "Exportar JSON",
791
+ importData: "Importar JSON",
792
+ importMode: "Modo de importa\xE7\xE3o",
793
+ merge: "Mesclar",
794
+ replace: "Substituir",
795
+ importedCount: "itens importados",
796
+ failedCount: "itens com falha",
797
+ storageQuotaError: "O armazenamento est\xE1 cheio. Libere espa\xE7o e tente novamente.",
798
+ statusExpired: "Expirado",
799
+ statusRemoved: "Removido",
800
+ statusDeleted: "Exclu\xEDdo",
801
+ statusPrivate: "Privado",
802
+ statusUnknown: "Indispon\xEDvel",
803
+ retry: "Tentar novamente",
804
+ removeFromList: "Remover da lista",
805
+ pruneStale: "Remover itens indispon\xEDveis",
806
+ retrySync: "Tentar sincronizar novamente",
807
+ resolveSync: "Resolver conflitos",
808
+ keepLocal: "Manter vers\xE3o local",
809
+ useServer: "Usar vers\xE3o do servidor",
810
+ manualMerge: "Mesclagem manual",
811
+ close: "Fechar",
812
+ backupRecovery: "Restaurar do backup",
813
+ backupRecoveryDescription: "Se os dados locais estiverem corrompidos, restaure um backup JSON v\xE1lido.",
814
+ syncPending: "H\xE1 altera\xE7\xF5es aguardando sincroniza\xE7\xE3o.",
815
+ syncSynced: "Todas as altera\xE7\xF5es foram sincronizadas.",
816
+ syncConflict: "Algumas altera\xE7\xF5es precisam de resolu\xE7\xE3o de conflito."
817
+ };
818
+
819
+ // src/locales/ru.ts
820
+ var RU_LABELS = {
821
+ save: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C",
822
+ saved: "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043E",
823
+ remove: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C",
824
+ loading: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430\u2026",
825
+ saving: "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435\u2026",
826
+ syncing: "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F\u2026",
827
+ error: "\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430.",
828
+ allTags: "\u0412\u0441\u0435",
829
+ tags: "\u0422\u0435\u0433\u0438",
830
+ 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",
831
+ note: "\u0417\u0430\u043C\u0435\u0442\u043A\u0430",
832
+ saveNote: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443",
833
+ noItems: "\u041D\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432.",
834
+ loadingItems: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432\u2026",
835
+ errorItems: "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B.",
836
+ search: "\u041F\u043E\u0438\u0441\u043A \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432",
837
+ sort: "\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432",
838
+ newest: "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u043D\u043E\u0432\u044B\u0435",
839
+ oldest: "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u0442\u0430\u0440\u044B\u0435",
840
+ savedNewest: "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435",
841
+ savedOldest: "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u0430\u0432\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435",
842
+ updatedNewest: "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D\u043D\u044B\u0435",
843
+ updatedOldest: "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u0430\u0432\u043D\u043E \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D\u043D\u044B\u0435",
844
+ previousPage: "\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430",
845
+ nextPage: "\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430",
846
+ pagination: "\u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F",
847
+ page: "\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430",
848
+ selectItems: "\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B",
849
+ selectedCount: "\u0432\u044B\u0431\u0440\u0430\u043D\u043E",
850
+ deleteSelected: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0435",
851
+ tagsToApply: "\u0422\u0435\u0433\u0438 \u0434\u043B\u044F \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u044F",
852
+ applyTags: "\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0442\u0435\u0433\u0438",
853
+ savedMessage: "\u042D\u043B\u0435\u043C\u0435\u043D\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D.",
854
+ removedMessage: "\u042D\u043B\u0435\u043C\u0435\u043D\u0442 \u0443\u0434\u0430\u043B\u0451\u043D.",
855
+ undo: "\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C",
856
+ undoAvailable: "\u042D\u043B\u0435\u043C\u0435\u043D\u0442 \u0443\u0434\u0430\u043B\u0451\u043D. \u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C?",
857
+ selectionScope: "\u041E\u0431\u043B\u0430\u0441\u0442\u044C \u0432\u044B\u0431\u043E\u0440\u0430",
858
+ currentPage: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430",
859
+ searchResults: "\u0422\u0435\u043A\u0443\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043F\u043E\u0438\u0441\u043A\u0430",
860
+ allItems: "\u0412\u0441\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B",
861
+ statusAvailable: "\u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D",
862
+ noteSavedMessage: "\u0417\u0430\u043C\u0435\u0442\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430.",
863
+ exportData: "\u042D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C JSON",
864
+ importData: "\u0418\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C JSON",
865
+ importMode: "\u0420\u0435\u0436\u0438\u043C \u0438\u043C\u043F\u043E\u0440\u0442\u0430",
866
+ merge: "\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C",
867
+ replace: "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C",
868
+ importedCount: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0438\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043E",
869
+ failedCount: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0438\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
870
+ storageQuotaError: "\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043E. \u041E\u0441\u0432\u043E\u0431\u043E\u0434\u0438\u0442\u0435 \u043C\u0435\u0441\u0442\u043E \u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0443.",
871
+ statusExpired: "\u0418\u0441\u0442\u0451\u043A \u0441\u0440\u043E\u043A",
872
+ statusRemoved: "\u0423\u0434\u0430\u043B\u0451\u043D",
873
+ statusDeleted: "\u0423\u0434\u0430\u043B\u0451\u043D \u043D\u0430\u0432\u0441\u0435\u0433\u0434\u0430",
874
+ statusPrivate: "\u041F\u0440\u0438\u0432\u0430\u0442\u043D\u044B\u0439",
875
+ statusUnknown: "\u041D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D",
876
+ retry: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C",
877
+ removeFromList: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0438\u0437 \u0441\u043F\u0438\u0441\u043A\u0430",
878
+ pruneStale: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B",
879
+ retrySync: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044E",
880
+ resolveSync: "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u044B",
881
+ keepLocal: "\u041E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0443\u044E \u0432\u0435\u0440\u0441\u0438\u044E",
882
+ useServer: "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u0435\u0440\u0441\u0438\u044E \u0441\u0435\u0440\u0432\u0435\u0440\u0430",
883
+ manualMerge: "\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u0432\u0440\u0443\u0447\u043D\u0443\u044E",
884
+ close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
885
+ backupRecovery: "\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0438\u0437 \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u043E\u0439 \u043A\u043E\u043F\u0438\u0438",
886
+ backupRecoveryDescription: "\u0415\u0441\u043B\u0438 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0438 \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0435\u043D\u044B, \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 \u0440\u0430\u0431\u043E\u0447\u0443\u044E JSON-\u043A\u043E\u043F\u0438\u044E.",
887
+ syncPending: "\u0415\u0441\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F, \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0435 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0438.",
888
+ syncSynced: "\u0412\u0441\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u044B.",
889
+ syncConflict: "\u041D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0442\u0440\u0435\u0431\u0443\u044E\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430."
890
+ };
891
+
892
+ // src/locales/th.ts
893
+ var TH_LABELS = {
894
+ save: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01",
895
+ saved: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E41\u0E25\u0E49\u0E27",
896
+ remove: "\u0E25\u0E1A",
897
+ loading: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14\u2026",
898
+ saving: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u2026",
899
+ syncing: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E0B\u0E34\u0E07\u0E04\u0E4C\u2026",
900
+ error: "\u0E40\u0E01\u0E34\u0E14\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14",
901
+ allTags: "\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14",
902
+ tags: "\u0E41\u0E17\u0E47\u0E01",
903
+ 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",
904
+ note: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E22\u0E48\u0E2D",
905
+ saveNote: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E22\u0E48\u0E2D",
906
+ noItems: "\u0E44\u0E21\u0E48\u0E21\u0E35\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E44\u0E27\u0E49",
907
+ loadingItems: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u2026",
908
+ errorItems: "\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49",
909
+ search: "\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01",
910
+ sort: "\u0E40\u0E23\u0E35\u0E22\u0E07\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01",
911
+ newest: "\u0E43\u0E2B\u0E21\u0E48\u0E2A\u0E38\u0E14\u0E01\u0E48\u0E2D\u0E19",
912
+ oldest: "\u0E40\u0E01\u0E48\u0E32\u0E2A\u0E38\u0E14\u0E01\u0E48\u0E2D\u0E19",
913
+ savedNewest: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E43\u0E2B\u0E21\u0E48\u0E2A\u0E38\u0E14\u0E01\u0E48\u0E2D\u0E19",
914
+ savedOldest: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E40\u0E01\u0E48\u0E32\u0E2A\u0E38\u0E14\u0E01\u0E48\u0E2D\u0E19",
915
+ updatedNewest: "\u0E2D\u0E31\u0E1B\u0E40\u0E14\u0E15\u0E43\u0E2B\u0E21\u0E48\u0E2A\u0E38\u0E14\u0E01\u0E48\u0E2D\u0E19",
916
+ updatedOldest: "\u0E2D\u0E31\u0E1B\u0E40\u0E14\u0E15\u0E40\u0E01\u0E48\u0E32\u0E2A\u0E38\u0E14\u0E01\u0E48\u0E2D\u0E19",
917
+ previousPage: "\u0E2B\u0E19\u0E49\u0E32\u0E01\u0E48\u0E2D\u0E19\u0E2B\u0E19\u0E49\u0E32",
918
+ nextPage: "\u0E2B\u0E19\u0E49\u0E32\u0E16\u0E31\u0E14\u0E44\u0E1B",
919
+ pagination: "\u0E01\u0E32\u0E23\u0E41\u0E1A\u0E48\u0E07\u0E2B\u0E19\u0E49\u0E32",
920
+ page: "\u0E2B\u0E19\u0E49\u0E32",
921
+ selectItems: "\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01",
922
+ selectedCount: "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E40\u0E25\u0E37\u0E2D\u0E01",
923
+ deleteSelected: "\u0E25\u0E1A\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E40\u0E25\u0E37\u0E2D\u0E01",
924
+ tagsToApply: "\u0E41\u0E17\u0E47\u0E01\u0E17\u0E35\u0E48\u0E08\u0E30\u0E43\u0E0A\u0E49",
925
+ applyTags: "\u0E43\u0E0A\u0E49\u0E41\u0E17\u0E47\u0E01",
926
+ savedMessage: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E41\u0E25\u0E49\u0E27",
927
+ removedMessage: "\u0E25\u0E1A\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E41\u0E25\u0E49\u0E27",
928
+ undo: "\u0E40\u0E25\u0E34\u0E01\u0E17\u0E33",
929
+ undoAvailable: "\u0E25\u0E1A\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E41\u0E25\u0E49\u0E27 \u0E15\u0E49\u0E2D\u0E07\u0E01\u0E32\u0E23\u0E40\u0E25\u0E34\u0E01\u0E17\u0E33\u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48",
930
+ selectionScope: "\u0E02\u0E2D\u0E1A\u0E40\u0E02\u0E15\u0E01\u0E32\u0E23\u0E40\u0E25\u0E37\u0E2D\u0E01",
931
+ currentPage: "\u0E2B\u0E19\u0E49\u0E32\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19",
932
+ searchResults: "\u0E1C\u0E25\u0E01\u0E32\u0E23\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19",
933
+ allItems: "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14",
934
+ statusAvailable: "\u0E1E\u0E23\u0E49\u0E2D\u0E21\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19",
935
+ noteSavedMessage: "\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E22\u0E48\u0E2D\u0E41\u0E25\u0E49\u0E27",
936
+ exportData: "\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01 JSON",
937
+ importData: "\u0E19\u0E33\u0E40\u0E02\u0E49\u0E32 JSON",
938
+ importMode: "\u0E42\u0E2B\u0E21\u0E14\u0E19\u0E33\u0E40\u0E02\u0E49\u0E32",
939
+ merge: "\u0E23\u0E27\u0E21",
940
+ replace: "\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48",
941
+ importedCount: "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E19\u0E33\u0E40\u0E02\u0E49\u0E32\u0E41\u0E25\u0E49\u0E27",
942
+ failedCount: "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27",
943
+ storageQuotaError: "\u0E1E\u0E37\u0E49\u0E19\u0E17\u0E35\u0E48\u0E08\u0E31\u0E14\u0E40\u0E01\u0E47\u0E1A\u0E40\u0E15\u0E47\u0E21 \u0E42\u0E1B\u0E23\u0E14\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E1E\u0E37\u0E49\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27\u0E25\u0E2D\u0E07\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07",
944
+ statusExpired: "\u0E2B\u0E21\u0E14\u0E2D\u0E32\u0E22\u0E38",
945
+ statusRemoved: "\u0E19\u0E33\u0E2D\u0E2D\u0E01\u0E41\u0E25\u0E49\u0E27",
946
+ statusDeleted: "\u0E25\u0E1A\u0E41\u0E25\u0E49\u0E27",
947
+ statusPrivate: "\u0E40\u0E1B\u0E47\u0E19\u0E2A\u0E48\u0E27\u0E19\u0E15\u0E31\u0E27",
948
+ statusUnknown: "\u0E44\u0E21\u0E48\u0E1E\u0E23\u0E49\u0E2D\u0E21\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19",
949
+ retry: "\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48",
950
+ removeFromList: "\u0E25\u0E1A\u0E2D\u0E2D\u0E01\u0E08\u0E32\u0E01\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23",
951
+ pruneStale: "\u0E25\u0E1A\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49",
952
+ retrySync: "\u0E25\u0E2D\u0E07\u0E0B\u0E34\u0E07\u0E04\u0E4C\u0E43\u0E2B\u0E21\u0E48",
953
+ resolveSync: "\u0E41\u0E01\u0E49\u0E44\u0E02\u0E02\u0E49\u0E2D\u0E02\u0E31\u0E14\u0E41\u0E22\u0E49\u0E07",
954
+ keepLocal: "\u0E43\u0E0A\u0E49\u0E40\u0E27\u0E2D\u0E23\u0E4C\u0E0A\u0E31\u0E19\u0E43\u0E19\u0E40\u0E04\u0E23\u0E37\u0E48\u0E2D\u0E07",
955
+ useServer: "\u0E43\u0E0A\u0E49\u0E40\u0E27\u0E2D\u0E23\u0E4C\u0E0A\u0E31\u0E19\u0E40\u0E0B\u0E34\u0E23\u0E4C\u0E1F\u0E40\u0E27\u0E2D\u0E23\u0E4C",
956
+ manualMerge: "\u0E23\u0E27\u0E21\u0E14\u0E49\u0E27\u0E22\u0E15\u0E19\u0E40\u0E2D\u0E07",
957
+ close: "\u0E1B\u0E34\u0E14",
958
+ backupRecovery: "\u0E01\u0E39\u0E49\u0E04\u0E37\u0E19\u0E08\u0E32\u0E01\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E2A\u0E33\u0E23\u0E2D\u0E07",
959
+ backupRecoveryDescription: "\u0E2B\u0E32\u0E01\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E0B\u0E34\u0E07\u0E04\u0E4C\u0E43\u0E19\u0E40\u0E04\u0E23\u0E37\u0E48\u0E2D\u0E07\u0E40\u0E2A\u0E35\u0E22\u0E2B\u0E32\u0E22 \u0E43\u0E2B\u0E49\u0E01\u0E39\u0E49\u0E04\u0E37\u0E19\u0E08\u0E32\u0E01\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E2A\u0E33\u0E23\u0E2D\u0E07 JSON \u0E17\u0E35\u0E48\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19\u0E44\u0E14\u0E49",
960
+ syncPending: "\u0E21\u0E35\u0E01\u0E32\u0E23\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E41\u0E1B\u0E25\u0E07\u0E17\u0E35\u0E48\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E0B\u0E34\u0E07\u0E04\u0E4C",
961
+ syncSynced: "\u0E0B\u0E34\u0E07\u0E04\u0E4C\u0E01\u0E32\u0E23\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E41\u0E1B\u0E25\u0E07\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14\u0E41\u0E25\u0E49\u0E27",
962
+ syncConflict: "\u0E21\u0E35\u0E01\u0E32\u0E23\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E41\u0E1B\u0E25\u0E07\u0E17\u0E35\u0E48\u0E15\u0E49\u0E2D\u0E07\u0E41\u0E01\u0E49\u0E44\u0E02\u0E02\u0E49\u0E2D\u0E02\u0E31\u0E14\u0E41\u0E22\u0E49\u0E07"
963
+ };
964
+
965
+ // src/locales/vi.ts
966
+ var VI_LABELS = {
967
+ save: "L\u01B0u",
968
+ saved: "\u0110\xE3 l\u01B0u",
969
+ remove: "X\xF3a",
970
+ loading: "\u0110ang t\u1EA3i\u2026",
971
+ saving: "\u0110ang l\u01B0u\u2026",
972
+ syncing: "\u0110ang \u0111\u1ED3ng b\u1ED9\u2026",
973
+ error: "\u0110\xE3 x\u1EA3y ra l\u1ED7i.",
974
+ allTags: "T\u1EA5t c\u1EA3",
975
+ tags: "Th\u1EBB",
976
+ filterTags: "L\u1ECDc m\u1EE5c \u0111\xE3 l\u01B0u theo th\u1EBB",
977
+ note: "Ghi ch\xFA",
978
+ saveNote: "L\u01B0u ghi ch\xFA",
979
+ noItems: "Ch\u01B0a c\xF3 m\u1EE5c n\xE0o \u0111\u01B0\u1EE3c l\u01B0u.",
980
+ loadingItems: "\u0110ang t\u1EA3i c\xE1c m\u1EE5c \u0111\xE3 l\u01B0u\u2026",
981
+ errorItems: "Kh\xF4ng th\u1EC3 t\u1EA3i c\xE1c m\u1EE5c \u0111\xE3 l\u01B0u.",
982
+ search: "T\xECm ki\u1EBFm m\u1EE5c \u0111\xE3 l\u01B0u",
983
+ sort: "S\u1EAFp x\u1EBFp m\u1EE5c \u0111\xE3 l\u01B0u",
984
+ newest: "M\u1EDBi nh\u1EA5t tr\u01B0\u1EDBc",
985
+ oldest: "C\u0169 nh\u1EA5t tr\u01B0\u1EDBc",
986
+ savedNewest: "L\u01B0u g\u1EA7n \u0111\xE2y nh\u1EA5t tr\u01B0\u1EDBc",
987
+ savedOldest: "L\u01B0u l\xE2u nh\u1EA5t tr\u01B0\u1EDBc",
988
+ updatedNewest: "C\u1EADp nh\u1EADt g\u1EA7n \u0111\xE2y nh\u1EA5t tr\u01B0\u1EDBc",
989
+ updatedOldest: "C\u1EADp nh\u1EADt l\xE2u nh\u1EA5t tr\u01B0\u1EDBc",
990
+ previousPage: "Trang tr\u01B0\u1EDBc",
991
+ nextPage: "Trang sau",
992
+ pagination: "Ph\xE2n trang",
993
+ page: "Trang",
994
+ selectItems: "Ch\u1ECDn m\u1EE5c \u0111\xE3 l\u01B0u",
995
+ selectedCount: "\u0111\xE3 ch\u1ECDn",
996
+ deleteSelected: "X\xF3a m\u1EE5c \u0111\xE3 ch\u1ECDn",
997
+ tagsToApply: "Th\u1EBB c\u1EA7n \xE1p d\u1EE5ng",
998
+ applyTags: "\xC1p d\u1EE5ng th\u1EBB",
999
+ savedMessage: "\u0110\xE3 l\u01B0u m\u1EE5c.",
1000
+ removedMessage: "\u0110\xE3 x\xF3a m\u1EE5c.",
1001
+ undo: "Ho\xE0n t\xE1c",
1002
+ undoAvailable: "\u0110\xE3 x\xF3a m\u1EE5c. Ho\xE0n t\xE1c?",
1003
+ selectionScope: "Ph\u1EA1m vi l\u1EF1a ch\u1ECDn",
1004
+ currentPage: "Trang hi\u1EC7n t\u1EA1i",
1005
+ searchResults: "K\u1EBFt qu\u1EA3 t\xECm ki\u1EBFm hi\u1EC7n t\u1EA1i",
1006
+ allItems: "T\u1EA5t c\u1EA3 m\u1EE5c \u0111\xE3 l\u01B0u",
1007
+ statusAvailable: "Kh\u1EA3 d\u1EE5ng",
1008
+ noteSavedMessage: "\u0110\xE3 l\u01B0u ghi ch\xFA.",
1009
+ exportData: "Xu\u1EA5t JSON",
1010
+ importData: "Nh\u1EADp JSON",
1011
+ importMode: "Ch\u1EBF \u0111\u1ED9 nh\u1EADp",
1012
+ merge: "H\u1EE3p nh\u1EA5t",
1013
+ replace: "Thay th\u1EBF",
1014
+ importedCount: "m\u1EE5c \u0111\xE3 nh\u1EADp",
1015
+ failedCount: "m\u1EE5c b\u1ECB l\u1ED7i",
1016
+ storageQuotaError: "B\u1ED9 nh\u1EDB \u0111\xE3 \u0111\u1EA7y. H\xE3y gi\u1EA3i ph\xF3ng dung l\u01B0\u1EE3ng r\u1ED3i th\u1EED l\u1EA1i.",
1017
+ statusExpired: "\u0110\xE3 h\u1EBFt h\u1EA1n",
1018
+ statusRemoved: "\u0110\xE3 g\u1EE1",
1019
+ statusDeleted: "\u0110\xE3 x\xF3a",
1020
+ statusPrivate: "Ri\xEAng t\u01B0",
1021
+ statusUnknown: "Kh\xF4ng kh\u1EA3 d\u1EE5ng",
1022
+ retry: "Th\u1EED l\u1EA1i",
1023
+ removeFromList: "X\xF3a kh\u1ECFi danh s\xE1ch",
1024
+ pruneStale: "X\xF3a c\xE1c m\u1EE5c kh\xF4ng kh\u1EA3 d\u1EE5ng",
1025
+ retrySync: "Th\u1EED \u0111\u1ED3ng b\u1ED9 l\u1EA1i",
1026
+ resolveSync: "Gi\u1EA3i quy\u1EBFt xung \u0111\u1ED9t",
1027
+ keepLocal: "Gi\u1EEF b\u1EA3n c\u1EE5c b\u1ED9",
1028
+ useServer: "D\xF9ng b\u1EA3n m\xE1y ch\u1EE7",
1029
+ manualMerge: "G\u1ED9p th\u1EE7 c\xF4ng",
1030
+ close: "\u0110\xF3ng",
1031
+ backupRecovery: "Kh\xF4i ph\u1EE5c t\u1EEB b\u1EA3n sao l\u01B0u",
1032
+ backupRecoveryDescription: "N\u1EBFu d\u1EEF li\u1EC7u \u0111\u1ED3ng b\u1ED9 c\u1EE5c b\u1ED9 b\u1ECB h\u1ECFng, h\xE3y kh\xF4i ph\u1EE5c b\u1EA3n sao l\u01B0u JSON h\u1EE3p l\u1EC7.",
1033
+ syncPending: "C\xF3 thay \u0111\u1ED5i \u0111ang ch\u1EDD \u0111\u1ED3ng b\u1ED9.",
1034
+ syncSynced: "T\u1EA5t c\u1EA3 thay \u0111\u1ED5i \u0111\xE3 \u0111\u01B0\u1EE3c \u0111\u1ED3ng b\u1ED9.",
1035
+ syncConflict: "M\u1ED9t s\u1ED1 thay \u0111\u1ED5i c\u1EA7n gi\u1EA3i quy\u1EBFt xung \u0111\u1ED9t."
1036
+ };
1037
+
1038
+ // src/locales/zh-Hans.ts
1039
+ var ZH_HANS_LABELS = {
1040
+ save: "\u4FDD\u5B58",
1041
+ saved: "\u5DF2\u4FDD\u5B58",
1042
+ remove: "\u5220\u9664",
1043
+ loading: "\u52A0\u8F7D\u4E2D\u2026",
1044
+ saving: "\u4FDD\u5B58\u4E2D\u2026",
1045
+ syncing: "\u540C\u6B65\u4E2D\u2026",
1046
+ error: "\u53D1\u751F\u9519\u8BEF\u3002",
1047
+ allTags: "\u5168\u90E8",
1048
+ tags: "\u6807\u7B7E",
1049
+ filterTags: "\u6309\u6807\u7B7E\u7B5B\u9009\u5DF2\u4FDD\u5B58\u9879\u76EE",
1050
+ note: "\u5907\u6CE8",
1051
+ saveNote: "\u4FDD\u5B58\u5907\u6CE8",
1052
+ noItems: "\u6CA1\u6709\u5DF2\u4FDD\u5B58\u7684\u9879\u76EE\u3002",
1053
+ loadingItems: "\u6B63\u5728\u52A0\u8F7D\u5DF2\u4FDD\u5B58\u9879\u76EE\u2026",
1054
+ errorItems: "\u65E0\u6CD5\u52A0\u8F7D\u5DF2\u4FDD\u5B58\u9879\u76EE\u3002",
1055
+ search: "\u641C\u7D22\u5DF2\u4FDD\u5B58\u9879\u76EE",
1056
+ sort: "\u6392\u5E8F\u5DF2\u4FDD\u5B58\u9879\u76EE",
1057
+ newest: "\u6700\u65B0\u4F18\u5148",
1058
+ oldest: "\u6700\u65E9\u4F18\u5148",
1059
+ savedNewest: "\u4FDD\u5B58\u65F6\u95F4\u6700\u65B0\u4F18\u5148",
1060
+ savedOldest: "\u4FDD\u5B58\u65F6\u95F4\u6700\u65E9\u4F18\u5148",
1061
+ updatedNewest: "\u66F4\u65B0\u65F6\u95F4\u6700\u65B0\u4F18\u5148",
1062
+ updatedOldest: "\u66F4\u65B0\u65F6\u95F4\u6700\u65E9\u4F18\u5148",
1063
+ previousPage: "\u4E0A\u4E00\u9875",
1064
+ nextPage: "\u4E0B\u4E00\u9875",
1065
+ pagination: "\u5206\u9875",
1066
+ page: "\u9875",
1067
+ selectItems: "\u9009\u62E9\u5DF2\u4FDD\u5B58\u9879\u76EE",
1068
+ selectedCount: "\u9879\u5DF2\u9009\u62E9",
1069
+ deleteSelected: "\u5220\u9664\u6240\u9009\u9879\u76EE",
1070
+ tagsToApply: "\u8981\u5E94\u7528\u7684\u6807\u7B7E",
1071
+ applyTags: "\u5E94\u7528\u6807\u7B7E",
1072
+ savedMessage: "\u9879\u76EE\u5DF2\u4FDD\u5B58\u3002",
1073
+ removedMessage: "\u9879\u76EE\u5DF2\u5220\u9664\u3002",
1074
+ undo: "\u64A4\u9500",
1075
+ undoAvailable: "\u9879\u76EE\u5DF2\u5220\u9664\u3002\u8981\u64A4\u9500\u5417\uFF1F",
1076
+ selectionScope: "\u9009\u62E9\u8303\u56F4",
1077
+ currentPage: "\u5F53\u524D\u9875",
1078
+ searchResults: "\u5F53\u524D\u5168\u90E8\u641C\u7D22\u7ED3\u679C",
1079
+ allItems: "\u5168\u90E8\u5DF2\u4FDD\u5B58\u9879\u76EE",
1080
+ statusAvailable: "\u53EF\u7528",
1081
+ noteSavedMessage: "\u5907\u6CE8\u5DF2\u4FDD\u5B58\u3002",
1082
+ exportData: "\u5BFC\u51FAJSON",
1083
+ importData: "\u5BFC\u5165JSON",
1084
+ importMode: "\u5BFC\u5165\u65B9\u5F0F",
1085
+ merge: "\u5408\u5E76",
1086
+ replace: "\u66FF\u6362",
1087
+ importedCount: "\u9879\u5DF2\u5BFC\u5165",
1088
+ failedCount: "\u9879\u5931\u8D25",
1089
+ storageQuotaError: "\u5B58\u50A8\u7A7A\u95F4\u5DF2\u6EE1\u3002\u8BF7\u91CA\u653E\u7A7A\u95F4\u540E\u91CD\u8BD5\u3002",
1090
+ statusExpired: "\u5DF2\u8FC7\u671F",
1091
+ statusRemoved: "\u5DF2\u79FB\u9664",
1092
+ statusDeleted: "\u5DF2\u5220\u9664",
1093
+ statusPrivate: "\u4E0D\u516C\u5F00",
1094
+ statusUnknown: "\u4E0D\u53EF\u7528",
1095
+ retry: "\u91CD\u8BD5",
1096
+ removeFromList: "\u4ECE\u5217\u8868\u4E2D\u5220\u9664",
1097
+ pruneStale: "\u5220\u9664\u4E0D\u53EF\u7528\u9879\u76EE",
1098
+ retrySync: "\u91CD\u8BD5\u540C\u6B65",
1099
+ resolveSync: "\u89E3\u51B3\u51B2\u7A81",
1100
+ keepLocal: "\u4FDD\u7559\u672C\u5730\u7248\u672C",
1101
+ useServer: "\u4F7F\u7528\u670D\u52A1\u5668\u7248\u672C",
1102
+ manualMerge: "\u624B\u52A8\u5408\u5E76",
1103
+ close: "\u5173\u95ED",
1104
+ backupRecovery: "\u4ECE\u5907\u4EFD\u6062\u590D",
1105
+ backupRecoveryDescription: "\u5982\u679C\u672C\u5730\u540C\u6B65\u6570\u636E\u635F\u574F\uFF0C\u8BF7\u6062\u590D\u53EF\u7528\u7684 JSON \u5907\u4EFD\u3002",
1106
+ syncPending: "\u6709\u66F4\u6539\u7B49\u5F85\u540C\u6B65\u3002",
1107
+ syncSynced: "\u6240\u6709\u66F4\u6539\u5747\u5DF2\u540C\u6B65\u3002",
1108
+ syncConflict: "\u6709\u4E9B\u66F4\u6539\u9700\u8981\u89E3\u51B3\u51B2\u7A81\u3002"
1109
+ };
1110
+
1111
+ // src/locales/zh-Hant.ts
1112
+ var ZH_HANT_LABELS = {
1113
+ save: "\u5132\u5B58",
1114
+ saved: "\u5DF2\u5132\u5B58",
1115
+ remove: "\u522A\u9664",
1116
+ loading: "\u8F09\u5165\u4E2D\u2026",
1117
+ saving: "\u5132\u5B58\u4E2D\u2026",
1118
+ syncing: "\u540C\u6B65\u4E2D\u2026",
1119
+ error: "\u767C\u751F\u932F\u8AA4\u3002",
1120
+ allTags: "\u5168\u90E8",
1121
+ tags: "\u6A19\u7C64",
1122
+ filterTags: "\u4F9D\u6A19\u7C64\u7BE9\u9078\u5DF2\u5132\u5B58\u9805\u76EE",
1123
+ note: "\u5099\u8A3B",
1124
+ saveNote: "\u5132\u5B58\u5099\u8A3B",
1125
+ noItems: "\u6C92\u6709\u5DF2\u5132\u5B58\u7684\u9805\u76EE\u3002",
1126
+ loadingItems: "\u6B63\u5728\u8F09\u5165\u5DF2\u5132\u5B58\u9805\u76EE\u2026",
1127
+ errorItems: "\u7121\u6CD5\u8F09\u5165\u5DF2\u5132\u5B58\u9805\u76EE\u3002",
1128
+ search: "\u641C\u5C0B\u5DF2\u5132\u5B58\u9805\u76EE",
1129
+ sort: "\u6392\u5E8F\u5DF2\u5132\u5B58\u9805\u76EE",
1130
+ newest: "\u6700\u65B0\u512A\u5148",
1131
+ oldest: "\u6700\u65E9\u512A\u5148",
1132
+ savedNewest: "\u5132\u5B58\u6642\u9593\u6700\u65B0\u512A\u5148",
1133
+ savedOldest: "\u5132\u5B58\u6642\u9593\u6700\u65E9\u512A\u5148",
1134
+ updatedNewest: "\u66F4\u65B0\u6642\u9593\u6700\u65B0\u512A\u5148",
1135
+ updatedOldest: "\u66F4\u65B0\u6642\u9593\u6700\u65E9\u512A\u5148",
1136
+ previousPage: "\u4E0A\u4E00\u9801",
1137
+ nextPage: "\u4E0B\u4E00\u9801",
1138
+ pagination: "\u5206\u9801",
1139
+ page: "\u9801",
1140
+ selectItems: "\u9078\u53D6\u5DF2\u5132\u5B58\u9805\u76EE",
1141
+ selectedCount: "\u9805\u5DF2\u9078\u53D6",
1142
+ deleteSelected: "\u522A\u9664\u6240\u9078\u9805\u76EE",
1143
+ tagsToApply: "\u8981\u5957\u7528\u7684\u6A19\u7C64",
1144
+ applyTags: "\u5957\u7528\u6A19\u7C64",
1145
+ savedMessage: "\u9805\u76EE\u5DF2\u5132\u5B58\u3002",
1146
+ removedMessage: "\u9805\u76EE\u5DF2\u522A\u9664\u3002",
1147
+ undo: "\u5FA9\u539F",
1148
+ undoAvailable: "\u9805\u76EE\u5DF2\u522A\u9664\u3002\u8981\u5FA9\u539F\u55CE\uFF1F",
1149
+ selectionScope: "\u9078\u53D6\u7BC4\u570D",
1150
+ currentPage: "\u76EE\u524D\u9801\u9762",
1151
+ searchResults: "\u76EE\u524D\u5168\u90E8\u641C\u5C0B\u7D50\u679C",
1152
+ allItems: "\u6240\u6709\u5DF2\u5132\u5B58\u9805\u76EE",
1153
+ statusAvailable: "\u53EF\u7528",
1154
+ noteSavedMessage: "\u5099\u8A3B\u5DF2\u5132\u5B58\u3002",
1155
+ exportData: "\u532F\u51FAJSON",
1156
+ importData: "\u532F\u5165JSON",
1157
+ importMode: "\u532F\u5165\u65B9\u5F0F",
1158
+ merge: "\u5408\u4F75",
1159
+ replace: "\u53D6\u4EE3",
1160
+ importedCount: "\u9805\u5DF2\u532F\u5165",
1161
+ failedCount: "\u9805\u5931\u6557",
1162
+ storageQuotaError: "\u5132\u5B58\u7A7A\u9593\u5DF2\u6EFF\u3002\u8ACB\u91CB\u653E\u7A7A\u9593\u5F8C\u91CD\u8A66\u3002",
1163
+ statusExpired: "\u5DF2\u904E\u671F",
1164
+ statusRemoved: "\u5DF2\u79FB\u9664",
1165
+ statusDeleted: "\u5DF2\u522A\u9664",
1166
+ statusPrivate: "\u4E0D\u516C\u958B",
1167
+ statusUnknown: "\u7121\u6CD5\u4F7F\u7528",
1168
+ retry: "\u91CD\u8A66",
1169
+ removeFromList: "\u5F9E\u6E05\u55AE\u4E2D\u522A\u9664",
1170
+ pruneStale: "\u522A\u9664\u7121\u6CD5\u4F7F\u7528\u7684\u9805\u76EE",
1171
+ retrySync: "\u91CD\u8A66\u540C\u6B65",
1172
+ resolveSync: "\u89E3\u6C7A\u885D\u7A81",
1173
+ keepLocal: "\u4FDD\u7559\u672C\u6A5F\u7248\u672C",
1174
+ useServer: "\u4F7F\u7528\u4F3A\u670D\u5668\u7248\u672C",
1175
+ manualMerge: "\u624B\u52D5\u5408\u4F75",
1176
+ close: "\u95DC\u9589",
1177
+ backupRecovery: "\u5F9E\u5099\u4EFD\u9084\u539F",
1178
+ backupRecoveryDescription: "\u5982\u679C\u672C\u6A5F\u540C\u6B65\u8CC7\u6599\u640D\u6BC0\uFF0C\u8ACB\u9084\u539F\u53EF\u7528\u7684 JSON \u5099\u4EFD\u3002",
1179
+ syncPending: "\u6709\u8B8A\u66F4\u7B49\u5F85\u540C\u6B65\u3002",
1180
+ syncSynced: "\u6240\u6709\u8B8A\u66F4\u90FD\u5DF2\u540C\u6B65\u3002",
1181
+ syncConflict: "\u6709\u4E9B\u8B8A\u66F4\u9700\u8981\u89E3\u6C7A\u885D\u7A81\u3002"
1182
+ };
1183
+
1184
+ // src/locales/index.ts
1185
+ var KEEP_BUILT_IN_LOCALES = [
1186
+ "en",
1187
+ "ja",
1188
+ "ko",
1189
+ "zh-Hans",
1190
+ "zh-Hant",
1191
+ "th",
1192
+ "fr",
1193
+ "es",
1194
+ "pt-BR",
1195
+ "it",
1196
+ "de",
1197
+ "ru",
1198
+ "fil",
1199
+ "vi",
1200
+ "id",
1201
+ "ms"
1202
+ ];
73
1203
  var KEEP_LOCALE_LABELS = {
74
- ja: {
75
- save: "\u4FDD\u5B58",
76
- saved: "\u4FDD\u5B58\u6E08\u307F",
77
- remove: "\u524A\u9664",
78
- loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026",
79
- saving: "\u4FDD\u5B58\u4E2D\u2026",
80
- syncing: "\u540C\u671F\u4E2D\u2026",
81
- allTags: "\u3059\u3079\u3066",
82
- filterTags: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u30BF\u30B0\u3067\u7D5E\u308A\u8FBC\u3080",
83
- note: "\u30E1\u30E2",
84
- saveNote: "\u30E1\u30E2\u3092\u4FDD\u5B58",
85
- loadingItems: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026",
86
- errorItems: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002",
87
- noItems: "\u4FDD\u5B58\u3055\u308C\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u3042\u308A\u307E\u305B\u3093\u3002",
88
- search: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u691C\u7D22",
89
- sort: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u4E26\u3079\u66FF\u3048",
90
- newest: "\u65B0\u3057\u3044\u9806",
91
- oldest: "\u53E4\u3044\u9806",
92
- savedNewest: "\u4FDD\u5B58\u65E5\u6642\u306E\u65B0\u3057\u3044\u9806",
93
- savedOldest: "\u4FDD\u5B58\u65E5\u6642\u306E\u53E4\u3044\u9806",
94
- updatedNewest: "\u66F4\u65B0\u65E5\u6642\u306E\u65B0\u3057\u3044\u9806",
95
- updatedOldest: "\u66F4\u65B0\u65E5\u6642\u306E\u53E4\u3044\u9806",
96
- previousPage: "\u524D\u306E\u30DA\u30FC\u30B8",
97
- nextPage: "\u6B21\u306E\u30DA\u30FC\u30B8",
98
- pagination: "\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3",
99
- page: "\u30DA\u30FC\u30B8",
100
- selectItems: "\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0\u3092\u9078\u629E",
101
- selectedCount: "\u4EF6\u3092\u9078\u629E\u4E2D",
102
- deleteSelected: "\u9078\u629E\u9805\u76EE\u3092\u524A\u9664",
103
- undo: "\u5143\u306B\u623B\u3059",
104
- undoAvailable: "\u30A2\u30A4\u30C6\u30E0\u3092\u524A\u9664\u3057\u307E\u3057\u305F\u3002\u5143\u306B\u623B\u3057\u307E\u3059\u304B\uFF1F",
105
- selectionScope: "\u9078\u629E\u7BC4\u56F2",
106
- currentPage: "\u8868\u793A\u4E2D\u306E\u30DA\u30FC\u30B8",
107
- searchResults: "\u73FE\u5728\u306E\u691C\u7D22\u7D50\u679C\u5168\u4F53",
108
- allItems: "\u3059\u3079\u3066\u306E\u4FDD\u5B58\u30A2\u30A4\u30C6\u30E0",
109
- tags: "\u30BF\u30B0",
110
- statusAvailable: "\u5229\u7528\u53EF\u80FD",
111
- tagsToApply: "\u9069\u7528\u3059\u308B\u30BF\u30B0",
112
- applyTags: "\u30BF\u30B0\u3092\u9069\u7528"
113
- },
114
- ko: {
115
- save: "\uC800\uC7A5",
116
- saved: "\uC800\uC7A5\uB428",
117
- remove: "\uC0AD\uC81C",
118
- loading: "\uB85C\uB4DC \uC911\u2026",
119
- saving: "\uC800\uC7A5 \uC911\u2026",
120
- syncing: "\uB3D9\uAE30\uD654 \uC911\u2026",
121
- noItems: "\uC800\uC7A5\uB41C \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
122
- search: "\uC800\uC7A5\uB41C \uD56D\uBAA9 \uAC80\uC0C9",
123
- sort: "\uC800\uC7A5\uB41C \uD56D\uBAA9 \uC815\uB82C",
124
- previousPage: "\uC774\uC804 \uD398\uC774\uC9C0",
125
- nextPage: "\uB2E4\uC74C \uD398\uC774\uC9C0",
126
- pagination: "\uD398\uC774\uC9C0 \uB9E4\uAE40",
127
- page: "\uD398\uC774\uC9C0",
128
- undo: "\uC2E4\uD589 \uCDE8\uC18C",
129
- undoAvailable: "\uD56D\uBAA9\uC744 \uC0AD\uC81C\uD588\uC2B5\uB2C8\uB2E4. \uC2E4\uD589 \uCDE8\uC18C\uD560\uAE4C\uC694?",
130
- selectionScope: "\uC120\uD0DD \uBC94\uC704",
131
- currentPage: "\uD604\uC7AC \uD398\uC774\uC9C0",
132
- searchResults: "\uD604\uC7AC \uAC80\uC0C9 \uACB0\uACFC \uC804\uCCB4",
133
- allItems: "\uBAA8\uB4E0 \uC800\uC7A5 \uD56D\uBAA9",
134
- tags: "\uD0DC\uADF8"
135
- },
136
- "zh-CN": {
137
- save: "\u4FDD\u5B58",
138
- saved: "\u5DF2\u4FDD\u5B58",
139
- remove: "\u5220\u9664",
140
- loading: "\u52A0\u8F7D\u4E2D\u2026",
141
- saving: "\u4FDD\u5B58\u4E2D\u2026",
142
- syncing: "\u540C\u6B65\u4E2D\u2026",
143
- noItems: "\u6CA1\u6709\u5DF2\u4FDD\u5B58\u7684\u9879\u76EE\u3002",
144
- search: "\u641C\u7D22\u5DF2\u4FDD\u5B58\u9879\u76EE",
145
- sort: "\u6392\u5E8F\u5DF2\u4FDD\u5B58\u9879\u76EE",
146
- previousPage: "\u4E0A\u4E00\u9875",
147
- nextPage: "\u4E0B\u4E00\u9875",
148
- pagination: "\u5206\u9875",
149
- page: "\u9875",
150
- undo: "\u64A4\u9500",
151
- undoAvailable: "\u9879\u76EE\u5DF2\u5220\u9664\u3002\u8981\u64A4\u9500\u5417\uFF1F",
152
- selectionScope: "\u9009\u62E9\u8303\u56F4",
153
- currentPage: "\u5F53\u524D\u9875",
154
- searchResults: "\u5F53\u524D\u641C\u7D22\u7ED3\u679C",
155
- allItems: "\u5168\u90E8\u5DF2\u4FDD\u5B58\u9879\u76EE",
156
- tags: "\u6807\u7B7E"
157
- },
158
- "zh-TW": {
159
- save: "\u5132\u5B58",
160
- saved: "\u5DF2\u5132\u5B58",
161
- remove: "\u522A\u9664",
162
- loading: "\u8F09\u5165\u4E2D\u2026",
163
- saving: "\u5132\u5B58\u4E2D\u2026",
164
- syncing: "\u540C\u6B65\u4E2D\u2026",
165
- noItems: "\u6C92\u6709\u5DF2\u5132\u5B58\u7684\u9805\u76EE\u3002",
166
- search: "\u641C\u5C0B\u5DF2\u5132\u5B58\u9805\u76EE",
167
- sort: "\u6392\u5E8F\u5DF2\u5132\u5B58\u9805\u76EE",
168
- previousPage: "\u4E0A\u4E00\u9801",
169
- nextPage: "\u4E0B\u4E00\u9801",
170
- undo: "\u5FA9\u539F",
171
- undoAvailable: "\u9805\u76EE\u5DF2\u522A\u9664\u3002\u8981\u5FA9\u539F\u55CE\uFF1F",
172
- selectionScope: "\u9078\u53D6\u7BC4\u570D",
173
- currentPage: "\u76EE\u524D\u9801\u9762",
174
- searchResults: "\u76EE\u524D\u641C\u5C0B\u7D50\u679C",
175
- allItems: "\u6240\u6709\u5DF2\u5132\u5B58\u9805\u76EE",
176
- tags: "\u6A19\u7C64"
177
- }
1204
+ en: EN_LABELS,
1205
+ ja: JA_LABELS,
1206
+ ko: KO_LABELS,
1207
+ "zh-Hans": ZH_HANS_LABELS,
1208
+ "zh-Hant": ZH_HANT_LABELS,
1209
+ th: TH_LABELS,
1210
+ fr: FR_LABELS,
1211
+ es: ES_LABELS,
1212
+ "pt-BR": PT_BR_LABELS,
1213
+ it: IT_LABELS,
1214
+ de: DE_LABELS,
1215
+ ru: RU_LABELS,
1216
+ fil: FIL_LABELS,
1217
+ vi: VI_LABELS,
1218
+ id: ID_LABELS,
1219
+ ms: MS_LABELS
178
1220
  };
179
- KEEP_LOCALE_LABELS.zh = KEEP_LOCALE_LABELS["zh-CN"];
1221
+ var LOCALE_ALIASES = {
1222
+ "zh-cn": "zh-Hans",
1223
+ "zh-sg": "zh-Hans",
1224
+ zh: "zh-Hans",
1225
+ "zh-tw": "zh-Hant",
1226
+ "zh-hk": "zh-Hant",
1227
+ "zh-mo": "zh-Hant",
1228
+ "pt-pt": "pt-BR"
1229
+ };
1230
+ function normalizeKeepLocale(locale) {
1231
+ const normalized = locale?.trim().replace(/_/g, "-").toLowerCase() ?? "en";
1232
+ const exact = KEEP_BUILT_IN_LOCALES.find((candidate) => candidate.toLowerCase() === normalized);
1233
+ if (exact) return exact;
1234
+ if (LOCALE_ALIASES[normalized]) return LOCALE_ALIASES[normalized];
1235
+ const language = normalized.split("-")[0];
1236
+ const languageMatch = KEEP_BUILT_IN_LOCALES.find((candidate) => candidate.toLowerCase() === language);
1237
+ return languageMatch ?? "en";
1238
+ }
1239
+ function getKeepLocaleLabels(locale) {
1240
+ return { ...KEEP_LOCALE_LABELS[normalizeKeepLocale(locale)] };
1241
+ }
1242
+
1243
+ // src/ui-context.tsx
1244
+ import { jsx } from "react/jsx-runtime";
1245
+ var DEFAULT_LABELS = KEEP_LOCALE_LABELS.en;
180
1246
  var KeepUiLabelsContext = createContext({ labels: DEFAULT_LABELS });
181
1247
  function KeepUiProvider({ labels, locale, labelResolver, children }) {
182
1248
  const value = useMemo(() => {
183
- const localeKey = locale?.toLowerCase() ?? "en";
184
- const dictionary = KEEP_LOCALE_LABELS[localeKey] ?? KEEP_LOCALE_LABELS[localeKey.split("-")[0]] ?? {};
1249
+ const resolvedLocale = normalizeKeepLocale(locale);
1250
+ const dictionary = getKeepLocaleLabels(resolvedLocale);
185
1251
  const resolved = { ...DEFAULT_LABELS, ...dictionary, ...labels };
186
- return { locale, labels: resolved, customLabels: labels, labelResolver };
1252
+ return { locale: locale ?? resolvedLocale, labels: resolved, customLabels: labels, labelResolver };
187
1253
  }, [labelResolver, labels, locale]);
188
1254
  return /* @__PURE__ */ jsx(KeepUiLabelsContext.Provider, { value, children });
189
1255
  }
@@ -194,10 +1260,6 @@ function useUiLabel(key, override) {
194
1260
  const context = useKeepUiLabels();
195
1261
  return override ?? context.customLabels?.[key] ?? context.labelResolver?.(key, { locale: context.locale }) ?? context.labels[key];
196
1262
  }
197
- function getKeepLocaleLabels(locale) {
198
- const key = locale?.toLowerCase() ?? "en";
199
- return { ...KEEP_LOCALE_LABELS[key] ?? KEEP_LOCALE_LABELS[key.split("-")[0]] ?? {} };
200
- }
201
1263
 
202
1264
  // src/KeepBackup.tsx
203
1265
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
@@ -548,7 +1610,7 @@ function KeepButton({ labels, ...props }) {
548
1610
 
549
1611
  // src/KeepCollection.tsx
550
1612
  import { KeepErrorBoundary as KeepErrorBoundary2, useKeepList as useKeepList4 } from "@keepkit/core/react";
551
- import { useMemo as useMemo3, useState as useState5 } from "react";
1613
+ import { useMemo as useMemo3, useState as useState6 } from "react";
552
1614
 
553
1615
  // src/KeepList.tsx
554
1616
  import {
@@ -562,7 +1624,116 @@ import { useKeepItem as useKeepItem2 } from "@keepkit/core/react";
562
1624
  import {
563
1625
  isValidElement as isValidElement2
564
1626
  } from "react";
565
- import { Fragment as Fragment3, jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
1627
+
1628
+ // src/KeepStaleNotice.tsx
1629
+ import { useKeepContext as useKeepContext2 } from "@keepkit/core/react";
1630
+ import { useState as useState3 } from "react";
1631
+
1632
+ // src/KeepItemStatusBadge.tsx
1633
+ import { jsx as jsx7 } from "react/jsx-runtime";
1634
+ function KeepItemStatusBadge({ status = "available", label, className, ...props }) {
1635
+ const resolvedStatus = status === "available" ? "available" : status;
1636
+ const statusLabel = useUiLabel(getStatusLabelKey(resolvedStatus));
1637
+ return /* @__PURE__ */ jsx7("span", { ...props, className, "data-keepkit": "status-badge", "data-status": resolvedStatus, children: label ?? statusLabel });
1638
+ }
1639
+ function getStatusLabelKey(status) {
1640
+ switch (status) {
1641
+ case "available":
1642
+ return "statusAvailable";
1643
+ case "expired":
1644
+ return "statusExpired";
1645
+ case "removed":
1646
+ return "statusRemoved";
1647
+ case "deleted":
1648
+ return "statusDeleted";
1649
+ case "private":
1650
+ case "unknown":
1651
+ return status === "private" ? "statusPrivate" : "statusUnknown";
1652
+ }
1653
+ }
1654
+
1655
+ // src/KeepStaleNotice.tsx
1656
+ import { jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
1657
+ function KeepStaleNotice({
1658
+ item,
1659
+ onRetry,
1660
+ onRemoved,
1661
+ retryLabel,
1662
+ removeLabel,
1663
+ children,
1664
+ className,
1665
+ ...props
1666
+ }) {
1667
+ const context = useKeepContext2();
1668
+ const retryText = useUiLabel("retry");
1669
+ const removeText = useUiLabel("removeFromList");
1670
+ const errorText = useUiLabel("error");
1671
+ const [isRetrying, setIsRetrying] = useState3(false);
1672
+ const [error, setError] = useState3(null);
1673
+ const status = item.status && item.status !== "available" ? item.status : "unknown";
1674
+ async function handleRetry() {
1675
+ setError(null);
1676
+ setIsRetrying(true);
1677
+ try {
1678
+ if (onRetry) await onRetry(item);
1679
+ else await context.revalidateItems();
1680
+ } catch (cause) {
1681
+ setError(cause);
1682
+ } finally {
1683
+ setIsRetrying(false);
1684
+ }
1685
+ }
1686
+ async function handleRemove() {
1687
+ try {
1688
+ await context.removeItemWithUndo(item.id);
1689
+ onRemoved?.(item);
1690
+ } catch (cause) {
1691
+ setError(cause);
1692
+ }
1693
+ }
1694
+ return /* @__PURE__ */ jsxs3("aside", { ...props, className, "data-keepkit": "stale-notice", "data-state": error ? "error" : "stale", children: [
1695
+ /* @__PURE__ */ jsx8(KeepItemStatusBadge, { status }),
1696
+ children ?? (item.statusReason ? /* @__PURE__ */ jsx8("p", { children: item.statusReason }) : null),
1697
+ /* @__PURE__ */ jsxs3("div", { children: [
1698
+ /* @__PURE__ */ jsx8("button", { type: "button", onClick: () => void handleRetry(), disabled: isRetrying || context.isMutating, children: retryLabel ?? retryText }),
1699
+ /* @__PURE__ */ jsx8("button", { type: "button", onClick: () => void handleRemove(), disabled: context.isMutating, children: removeLabel ?? removeText })
1700
+ ] }),
1701
+ error ? /* @__PURE__ */ jsx8("p", { role: "alert", children: error instanceof Error ? error.message : errorText }) : null
1702
+ ] });
1703
+ }
1704
+ function KeepPruneStaleButton({
1705
+ statuses = ["expired", "removed", "deleted", "private", "unknown"],
1706
+ label,
1707
+ onPruned,
1708
+ children,
1709
+ disabled,
1710
+ ...props
1711
+ }) {
1712
+ const context = useKeepContext2();
1713
+ const defaultLabel = useUiLabel("pruneStale");
1714
+ const staleIds = context.items.filter((item) => item.status && statuses.includes(item.status)).map((item) => item.id);
1715
+ async function handlePrune() {
1716
+ const ids = [...staleIds];
1717
+ await context.removeItemsWithUndo(ids);
1718
+ onPruned?.(ids);
1719
+ }
1720
+ return /* @__PURE__ */ jsx8(
1721
+ "button",
1722
+ {
1723
+ ...props,
1724
+ type: "button",
1725
+ className: props.className,
1726
+ "data-keepkit": "prune-stale",
1727
+ "data-state": staleIds.length > 0 ? "available" : "empty",
1728
+ disabled: staleIds.length === 0 || context.isMutating || disabled,
1729
+ onClick: () => void handlePrune(),
1730
+ children: children ?? label ?? `${defaultLabel} (${staleIds.length})`
1731
+ }
1732
+ );
1733
+ }
1734
+
1735
+ // src/KeepItemCard.tsx
1736
+ import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
566
1737
  function KeepItemCard({
567
1738
  item,
568
1739
  title,
@@ -578,6 +1749,7 @@ function KeepItemCard({
578
1749
  removeLabel,
579
1750
  onRemoveError,
580
1751
  onRemoved,
1752
+ onRetry,
581
1753
  showSaveButton = true,
582
1754
  saveButtonLabels,
583
1755
  asChild = false,
@@ -606,7 +1778,7 @@ function KeepItemCard({
606
1778
  const imageProps = getImageProps?.(item, resolvedTitle);
607
1779
  const href = typeof hrefOption === "function" ? hrefOption(item) : hrefOption;
608
1780
  const isAvailable = item.status === void 0 || item.status === "available";
609
- const statusLabelKey = item.status && item.status !== "available" ? getStatusLabelKey(item.status) : "statusUnknown";
1781
+ const statusLabelKey = item.status && item.status !== "available" ? getStatusLabelKey2(item.status) : "statusUnknown";
610
1782
  const unavailableLabel = useUiLabel(statusLabelKey);
611
1783
  const tagsLabel = useUiLabel("tags");
612
1784
  const statusLabel = item.status && item.status !== "available" ? unavailableLabel : void 0;
@@ -619,7 +1791,7 @@ function KeepItemCard({
619
1791
  onClick: (event) => onOpen?.(item, event),
620
1792
  children: content
621
1793
  };
622
- return LinkComponent ? /* @__PURE__ */ jsx7(LinkComponent, { ...linkProps }) : /* @__PURE__ */ jsx7("a", { ...linkProps });
1794
+ return LinkComponent ? /* @__PURE__ */ jsx9(LinkComponent, { ...linkProps }) : /* @__PURE__ */ jsx9("a", { ...linkProps });
623
1795
  }
624
1796
  async function handleRemove() {
625
1797
  try {
@@ -629,12 +1801,12 @@ function KeepItemCard({
629
1801
  onRemoveError?.(error);
630
1802
  }
631
1803
  }
632
- const body = render ? render(state) : typeof contentChildren === "function" ? contentChildren(state) : contentChildren ?? /* @__PURE__ */ jsxs3(Fragment3, { children: [
633
- imageProps ? renderImage?.({ ...imageProps, alt: imageAlt ?? imageProps.alt }, item) ?? (ImageComponent ? /* @__PURE__ */ jsx7(ImageComponent, { ...imageProps, alt: imageAlt ?? imageProps.alt }) : /* @__PURE__ */ jsx7("img", { ...imageProps, alt: imageAlt ?? imageProps.alt })) : null,
634
- /* @__PURE__ */ jsx7("h3", { children: linkTarget === "title" ? renderLink(resolvedTitle) : resolvedTitle }),
635
- showTags && (item.tags?.length ?? 0) > 0 ? renderTags ? renderTags(item.tags ?? [], item) : /* @__PURE__ */ jsx7("ul", { "aria-label": tagsLabel, children: item.tags?.map((tag) => /* @__PURE__ */ jsx7("li", { children: tag }, tag)) }) : null,
636
- statusLabel ? /* @__PURE__ */ jsx7("p", { "data-status": item.status, children: statusLabel }) : null,
637
- showSaveButton ? /* @__PURE__ */ jsx7(
1804
+ const body = render ? render(state) : typeof contentChildren === "function" ? contentChildren(state) : contentChildren ?? /* @__PURE__ */ jsxs4(Fragment3, { children: [
1805
+ imageProps ? renderImage?.({ ...imageProps, alt: imageAlt ?? imageProps.alt }, item) ?? (ImageComponent ? /* @__PURE__ */ jsx9(ImageComponent, { ...imageProps, alt: imageAlt ?? imageProps.alt }) : /* @__PURE__ */ jsx9("img", { ...imageProps, alt: imageAlt ?? imageProps.alt })) : null,
1806
+ /* @__PURE__ */ jsx9("h3", { children: linkTarget === "title" ? renderLink(resolvedTitle) : resolvedTitle }),
1807
+ showTags && (item.tags?.length ?? 0) > 0 ? renderTags ? renderTags(item.tags ?? [], item) : /* @__PURE__ */ jsx9("ul", { "aria-label": tagsLabel, children: item.tags?.map((tag) => /* @__PURE__ */ jsx9("li", { children: tag }, tag)) }) : null,
1808
+ statusLabel ? /* @__PURE__ */ jsx9(KeepStaleNotice, { item, onRetry, onRemoved }) : null,
1809
+ showSaveButton && !statusLabel ? /* @__PURE__ */ jsx9(
638
1810
  KeepButton,
639
1811
  {
640
1812
  item: toKeepButtonItem(item),
@@ -642,7 +1814,7 @@ function KeepItemCard({
642
1814
  getAriaLabel: (buttonState) => `${buttonState.isSaved ? removeActionLabel : saveActionLabel} ${String(resolvedTitle)}`
643
1815
  }
644
1816
  ) : null,
645
- /* @__PURE__ */ jsx7("button", { type: "button", onClick: () => void handleRemove(), disabled: itemState.isMutating, children: removeLabel ?? removeActionLabel })
1817
+ !statusLabel ? /* @__PURE__ */ jsx9("button", { type: "button", onClick: () => void handleRemove(), disabled: itemState.isMutating, children: removeLabel ?? removeActionLabel }) : null
646
1818
  ] });
647
1819
  const linkedBody = linkTarget === "card" ? renderLink(body) : body;
648
1820
  return renderRoot(
@@ -660,7 +1832,7 @@ function KeepItemCard({
660
1832
  "KeepItemCard"
661
1833
  );
662
1834
  }
663
- function getStatusLabelKey(status) {
1835
+ function getStatusLabelKey2(status) {
664
1836
  switch (status) {
665
1837
  case "expired":
666
1838
  return "statusExpired";
@@ -676,12 +1848,12 @@ function getStatusLabelKey(status) {
676
1848
  }
677
1849
 
678
1850
  // src/KeepList.tsx
679
- import { jsx as jsx8 } from "react/jsx-runtime";
1851
+ import { jsx as jsx10 } from "react/jsx-runtime";
680
1852
  function KeepList(props) {
681
1853
  const { fallback, onBoundaryError, boundaryResetKey, ...listProps } = props;
682
- const content = /* @__PURE__ */ jsx8(KeepListContent, { ...listProps });
1854
+ const content = /* @__PURE__ */ jsx10(KeepListContent, { ...listProps });
683
1855
  if (fallback === void 0 && onBoundaryError === void 0) return content;
684
- return /* @__PURE__ */ jsx8(KeepErrorBoundary, { fallback, onError: onBoundaryError, resetKey: boundaryResetKey, children: content });
1856
+ return /* @__PURE__ */ jsx10(KeepErrorBoundary, { fallback, onError: onBoundaryError, resetKey: boundaryResetKey, children: content });
685
1857
  }
686
1858
  function KeepListContent({
687
1859
  query,
@@ -735,13 +1907,13 @@ function getListBody(state, options) {
735
1907
  if (state.isHydrated && state.items.length === 0) return resolveContent(options.empty, state);
736
1908
  if (typeof options.children === "function") return options.children(state);
737
1909
  if (options.children !== void 0 && !isValidElement3(options.children)) return options.children;
738
- return /* @__PURE__ */ jsx8(
1910
+ return /* @__PURE__ */ jsx10(
739
1911
  "ul",
740
1912
  {
741
1913
  "data-layout": options.layout,
742
1914
  style: options.layout === "grid" ? { display: "grid", gap: "1rem", gridTemplateColumns: "repeat(auto-fit, minmax(16rem, 1fr))" } : options.layout === "compact" ? { display: "grid", gap: "0.5rem", gridTemplateColumns: "repeat(auto-fit, minmax(12rem, 1fr))" } : { display: "flex", flexDirection: "column", gap: "1rem" },
743
1915
  children: state.items.map(
744
- (item) => options.renderItem ? options.renderItem(item, state) : /* @__PURE__ */ jsx8("li", { children: /* @__PURE__ */ jsx8(KeepItemCard, { item, ...options.itemCardProps }) }, item.id)
1916
+ (item) => options.renderItem ? options.renderItem(item, state) : /* @__PURE__ */ jsx10("li", { children: /* @__PURE__ */ jsx10(KeepItemCard, { item, ...options.itemCardProps }) }, item.id)
745
1917
  )
746
1918
  }
747
1919
  );
@@ -749,8 +1921,8 @@ function getListBody(state, options) {
749
1921
 
750
1922
  // src/KeepTagFilter.tsx
751
1923
  import { useKeepList as useKeepList3 } from "@keepkit/core/react";
752
- import { isValidElement as isValidElement4, useCallback, useMemo as useMemo2, useState as useState3 } from "react";
753
- import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
1924
+ import { isValidElement as isValidElement4, useCallback, useMemo as useMemo2, useState as useState4 } from "react";
1925
+ import { jsx as jsx11, jsxs as jsxs5 } from "react/jsx-runtime";
754
1926
  function KeepTagFilter({
755
1927
  query,
756
1928
  value: controlledValue,
@@ -768,7 +1940,7 @@ function KeepTagFilter({
768
1940
  }) {
769
1941
  const uiAllLabel = useUiLabel("allTags");
770
1942
  const uiAriaLabel = useUiLabel("filterTags");
771
- const [uncontrolledValue, setUncontrolledValue] = useState3(defaultValue);
1943
+ const [uncontrolledValue, setUncontrolledValue] = useState4(defaultValue);
772
1944
  const resolvedValue = controlledValue ?? uncontrolledValue;
773
1945
  const list = useKeepList3({
774
1946
  ...query,
@@ -787,12 +1959,12 @@ function KeepTagFilter({
787
1959
  [list.tagCounts, list.tags, resolvedValue, select]
788
1960
  );
789
1961
  const contentChildren = asChild && isValidElement4(children) ? void 0 : children;
790
- const body = render ? render(state) : typeof contentChildren === "function" ? contentChildren(state) : contentChildren ?? /* @__PURE__ */ jsxs4("fieldset", { children: [
791
- /* @__PURE__ */ jsx9("legend", { children: ariaLabel ?? uiAriaLabel }),
792
- /* @__PURE__ */ jsx9("button", { type: "button", "aria-pressed": resolvedValue === void 0, onClick: () => select(), children: allLabel ?? uiAllLabel }),
793
- list.tags.map((tag) => /* @__PURE__ */ jsxs4("button", { type: "button", "aria-pressed": resolvedValue === tag, onClick: () => select(tag), children: [
1962
+ const body = render ? render(state) : typeof contentChildren === "function" ? contentChildren(state) : contentChildren ?? /* @__PURE__ */ jsxs5("fieldset", { children: [
1963
+ /* @__PURE__ */ jsx11("legend", { children: ariaLabel ?? uiAriaLabel }),
1964
+ /* @__PURE__ */ jsx11("button", { type: "button", "aria-pressed": resolvedValue === void 0, onClick: () => select(), children: allLabel ?? uiAllLabel }),
1965
+ list.tags.map((tag) => /* @__PURE__ */ jsxs5("button", { type: "button", "aria-pressed": resolvedValue === tag, onClick: () => select(tag), children: [
794
1966
  renderTag ? renderTag(tag, list.tagCounts[tag] ?? 0, resolvedValue === tag) : tag,
795
- /* @__PURE__ */ jsxs4("span", { children: [
1967
+ /* @__PURE__ */ jsxs5("span", { children: [
796
1968
  " (",
797
1969
  list.tagCounts[tag] ?? 0,
798
1970
  ")"
@@ -814,8 +1986,8 @@ function KeepTagFilter({
814
1986
  }
815
1987
 
816
1988
  // src/query-controls.tsx
817
- import { useEffect, useState as useState4 } from "react";
818
- import { Fragment as Fragment4, jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1989
+ import { useEffect, useState as useState5 } from "react";
1990
+ import { Fragment as Fragment4, jsx as jsx12, jsxs as jsxs6 } from "react/jsx-runtime";
819
1991
  function KeepSearchInput({
820
1992
  value: controlledValue,
821
1993
  defaultValue = "",
@@ -826,7 +1998,7 @@ function KeepSearchInput({
826
1998
  ...props
827
1999
  }) {
828
2000
  const label = useUiLabel("search");
829
- const [uncontrolledValue, setUncontrolledValue] = useState4(defaultValue);
2001
+ const [uncontrolledValue, setUncontrolledValue] = useState5(defaultValue);
830
2002
  const value = controlledValue ?? uncontrolledValue;
831
2003
  useEffect(() => {
832
2004
  if (!onValueChange) return;
@@ -837,7 +2009,7 @@ function KeepSearchInput({
837
2009
  const timer = window.setTimeout(() => onValueChange(value), debounceMs);
838
2010
  return () => window.clearTimeout(timer);
839
2011
  }, [debounceMs, onValueChange, value]);
840
- return /* @__PURE__ */ jsx10(
2012
+ return /* @__PURE__ */ jsx12(
841
2013
  "input",
842
2014
  {
843
2015
  ...props,
@@ -867,15 +2039,15 @@ function KeepSortSelect({
867
2039
  const updatedOldestLabel = useUiLabel("updatedOldest");
868
2040
  const savedNewestLabel = useUiLabel("savedNewest");
869
2041
  const savedOldestLabel = useUiLabel("savedOldest");
870
- const [uncontrolledValue, setUncontrolledValue] = useState4(defaultValue);
2042
+ const [uncontrolledValue, setUncontrolledValue] = useState5(defaultValue);
871
2043
  const value = controlledValue ?? uncontrolledValue;
872
- const options = children ?? /* @__PURE__ */ jsxs5(Fragment4, { children: [
873
- /* @__PURE__ */ jsx10("option", { value: "updatedAt:desc", children: updatedNewestLabel }),
874
- /* @__PURE__ */ jsx10("option", { value: "updatedAt:asc", children: updatedOldestLabel }),
875
- /* @__PURE__ */ jsx10("option", { value: "savedAt:desc", children: savedNewestLabel }),
876
- /* @__PURE__ */ jsx10("option", { value: "savedAt:asc", children: savedOldestLabel })
2044
+ const options = children ?? /* @__PURE__ */ jsxs6(Fragment4, { children: [
2045
+ /* @__PURE__ */ jsx12("option", { value: "updatedAt:desc", children: updatedNewestLabel }),
2046
+ /* @__PURE__ */ jsx12("option", { value: "updatedAt:asc", children: updatedOldestLabel }),
2047
+ /* @__PURE__ */ jsx12("option", { value: "savedAt:desc", children: savedNewestLabel }),
2048
+ /* @__PURE__ */ jsx12("option", { value: "savedAt:asc", children: savedOldestLabel })
877
2049
  ] });
878
- return /* @__PURE__ */ jsx10(
2050
+ return /* @__PURE__ */ jsx12(
879
2051
  "select",
880
2052
  {
881
2053
  ...props,
@@ -917,11 +2089,11 @@ function KeepPagination({
917
2089
  "aria-label": props["aria-label"] ?? paginationLabel,
918
2090
  "data-state": pageCount > 1 ? "active" : "idle"
919
2091
  };
920
- if (render) return /* @__PURE__ */ jsx10("nav", { ...navProps, children: render({ page: currentPage, pageCount, goToPage }) });
2092
+ if (render) return /* @__PURE__ */ jsx12("nav", { ...navProps, children: render({ page: currentPage, pageCount, goToPage }) });
921
2093
  const visiblePages = getVisiblePages(currentPage, pageCount, Math.max(1, maxPageButtons));
922
- return /* @__PURE__ */ jsxs5("nav", { ...navProps, children: [
923
- /* @__PURE__ */ jsx10("button", { type: "button", onClick: () => goToPage(currentPage - 1), disabled: currentPage <= 1, children: previousPageLabel }),
924
- visiblePages.map((nextPage) => /* @__PURE__ */ jsx10(
2094
+ return /* @__PURE__ */ jsxs6("nav", { ...navProps, children: [
2095
+ /* @__PURE__ */ jsx12("button", { type: "button", onClick: () => goToPage(currentPage - 1), disabled: currentPage <= 1, children: previousPageLabel }),
2096
+ visiblePages.map((nextPage) => /* @__PURE__ */ jsx12(
925
2097
  "button",
926
2098
  {
927
2099
  type: "button",
@@ -932,7 +2104,7 @@ function KeepPagination({
932
2104
  },
933
2105
  nextPage
934
2106
  )),
935
- /* @__PURE__ */ jsx10("button", { type: "button", onClick: () => goToPage(currentPage + 1), disabled: currentPage >= pageCount, children: nextPageLabel })
2107
+ /* @__PURE__ */ jsx12("button", { type: "button", onClick: () => goToPage(currentPage + 1), disabled: currentPage >= pageCount, children: nextPageLabel })
936
2108
  ] });
937
2109
  }
938
2110
  function getVisiblePages(currentPage, pageCount, maxPageButtons) {
@@ -1025,12 +2197,12 @@ function getBrowserAdapter() {
1025
2197
  }
1026
2198
 
1027
2199
  // src/KeepCollection.tsx
1028
- import { jsx as jsx11, jsxs as jsxs6 } from "react/jsx-runtime";
2200
+ import { jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
1029
2201
  function KeepCollection(props) {
1030
2202
  const { fallback, onBoundaryError, boundaryResetKey, ...collectionProps } = props;
1031
- const content = /* @__PURE__ */ jsx11(KeepCollectionContent, { ...collectionProps });
2203
+ const content = /* @__PURE__ */ jsx13(KeepCollectionContent, { ...collectionProps });
1032
2204
  if (fallback === void 0 && onBoundaryError === void 0) return content;
1033
- return /* @__PURE__ */ jsx11(KeepErrorBoundary2, { fallback, onError: onBoundaryError, resetKey: boundaryResetKey, children: content });
2205
+ return /* @__PURE__ */ jsx13(KeepErrorBoundary2, { fallback, onError: onBoundaryError, resetKey: boundaryResetKey, children: content });
1034
2206
  }
1035
2207
  function KeepCollectionContent({
1036
2208
  query = {},
@@ -1055,10 +2227,10 @@ function KeepCollectionContent({
1055
2227
  bulkActions: false,
1056
2228
  ...features
1057
2229
  };
1058
- const [searchValue, setSearchValue] = useState5(query.search?.query ?? "");
1059
- const [sort, setSort] = useState5(query.sort ?? { by: "updatedAt", direction: "desc" });
1060
- const [tag, setTag] = useState5(query.tags?.[0]);
1061
- const [page, setPage] = useState5(query.pagination?.page ?? 1);
2230
+ const [searchValue, setSearchValue] = useState6(query.search?.query ?? "");
2231
+ const [sort, setSort] = useState6(query.sort ?? { by: "updatedAt", direction: "desc" });
2232
+ const [tag, setTag] = useState6(query.tags?.[0]);
2233
+ const [page, setPage] = useState6(query.pagination?.page ?? 1);
1062
2234
  const resolvedPageSize = query.pagination?.pageSize ?? pageSize;
1063
2235
  const resolvedQuery = useMemo3(
1064
2236
  () => ({
@@ -1084,7 +2256,7 @@ function KeepCollectionContent({
1084
2256
  adapter: urlAdapter
1085
2257
  });
1086
2258
  const list = useKeepList4(resolvedQuery);
1087
- return /* @__PURE__ */ jsxs6(
2259
+ return /* @__PURE__ */ jsxs7(
1088
2260
  "section",
1089
2261
  {
1090
2262
  ...rootProps,
@@ -1093,8 +2265,8 @@ function KeepCollectionContent({
1093
2265
  "data-state": getCollectionState(list),
1094
2266
  "data-loading": list.isLoading || list.isMutating ? "true" : void 0,
1095
2267
  children: [
1096
- /* @__PURE__ */ jsxs6("div", { children: [
1097
- enabled.search ? /* @__PURE__ */ jsx11(
2268
+ /* @__PURE__ */ jsxs7("div", { children: [
2269
+ enabled.search ? /* @__PURE__ */ jsx13(
1098
2270
  KeepSearchInput,
1099
2271
  {
1100
2272
  value: searchValue,
@@ -1104,7 +2276,7 @@ function KeepCollectionContent({
1104
2276
  }
1105
2277
  }
1106
2278
  ) : null,
1107
- enabled.sort ? /* @__PURE__ */ jsx11(
2279
+ enabled.sort ? /* @__PURE__ */ jsx13(
1108
2280
  KeepSortSelect,
1109
2281
  {
1110
2282
  value: sortToValue(sort),
@@ -1114,7 +2286,7 @@ function KeepCollectionContent({
1114
2286
  }
1115
2287
  }
1116
2288
  ) : null,
1117
- enabled.tagFilter ? /* @__PURE__ */ jsx11(
2289
+ enabled.tagFilter ? /* @__PURE__ */ jsx13(
1118
2290
  KeepTagFilter,
1119
2291
  {
1120
2292
  query,
@@ -1126,7 +2298,7 @@ function KeepCollectionContent({
1126
2298
  }
1127
2299
  ) : null
1128
2300
  ] }),
1129
- /* @__PURE__ */ jsx11(
2301
+ /* @__PURE__ */ jsx13(
1130
2302
  KeepList,
1131
2303
  {
1132
2304
  query: resolvedQuery,
@@ -1138,7 +2310,7 @@ function KeepCollectionContent({
1138
2310
  error
1139
2311
  }
1140
2312
  ),
1141
- enabled.pagination ? /* @__PURE__ */ jsx11(
2313
+ enabled.pagination ? /* @__PURE__ */ jsx13(
1142
2314
  KeepPagination,
1143
2315
  {
1144
2316
  totalCount: list.totalCount,
@@ -1147,7 +2319,7 @@ function KeepCollectionContent({
1147
2319
  onPageChange: (nextPage) => setPage(nextPage)
1148
2320
  }
1149
2321
  ) : null,
1150
- enabled.bulkActions ? /* @__PURE__ */ jsx11(KeepBulkActions, { query: resolvedQuery }) : null
2322
+ enabled.bulkActions ? /* @__PURE__ */ jsx13(KeepBulkActions, { query: resolvedQuery }) : null
1151
2323
  ]
1152
2324
  }
1153
2325
  );
@@ -1160,10 +2332,10 @@ function getCollectionState(list) {
1160
2332
  }
1161
2333
 
1162
2334
  // src/KeepLayout.tsx
1163
- import { jsx as jsx12 } from "react/jsx-runtime";
2335
+ import { jsx as jsx14 } from "react/jsx-runtime";
1164
2336
  function KeepLayout({ layout = "list", children, style, ...props }) {
1165
2337
  const layoutStyle = layout === "grid" ? { display: "grid", gap: "1rem", gridTemplateColumns: "repeat(auto-fit, minmax(16rem, 1fr))" } : layout === "compact" ? { display: "grid", gap: "0.5rem", gridTemplateColumns: "repeat(auto-fit, minmax(12rem, 1fr))" } : { display: "flex", flexDirection: "column", gap: "1rem" };
1166
- return /* @__PURE__ */ jsx12("div", { ...props, style: { ...layoutStyle, ...style }, "data-layout": layout, children });
2338
+ return /* @__PURE__ */ jsx14("div", { ...props, style: { ...layoutStyle, ...style }, "data-layout": layout, children });
1167
2339
  }
1168
2340
 
1169
2341
  // src/KeepNoteEditor.tsx
@@ -1173,9 +2345,9 @@ import {
1173
2345
  useCallback as useCallback2,
1174
2346
  useEffect as useEffect3,
1175
2347
  useRef as useRef3,
1176
- useState as useState6
2348
+ useState as useState7
1177
2349
  } from "react";
1178
- import { Fragment as Fragment5, jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
2350
+ import { Fragment as Fragment5, jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
1179
2351
  function KeepNoteEditor({
1180
2352
  item,
1181
2353
  label,
@@ -1195,7 +2367,7 @@ function KeepNoteEditor({
1195
2367
  const itemState = useKeepItem3(item);
1196
2368
  const { error, isMutating, item: savedItem, updateNote } = itemState;
1197
2369
  const contentChildren = asChild && isValidElement5(children) ? void 0 : children;
1198
- const [note, setNote] = useState6(item.note ?? "");
2370
+ const [note, setNote] = useState7(item.note ?? "");
1199
2371
  const baselineNote = savedItem?.note ?? item.note ?? "";
1200
2372
  const isDirty = note !== baselineNote;
1201
2373
  const lastSavedNoteRef = useRef3(void 0);
@@ -1225,10 +2397,10 @@ function KeepNoteEditor({
1225
2397
  error,
1226
2398
  save
1227
2399
  };
1228
- const body = render ? render(state) : typeof contentChildren === "function" ? contentChildren(state) : contentChildren ?? /* @__PURE__ */ jsxs7(Fragment5, { children: [
1229
- /* @__PURE__ */ jsxs7("label", { children: [
2400
+ const body = render ? render(state) : typeof contentChildren === "function" ? contentChildren(state) : contentChildren ?? /* @__PURE__ */ jsxs8(Fragment5, { children: [
2401
+ /* @__PURE__ */ jsxs8("label", { children: [
1230
2402
  label ?? defaultLabel,
1231
- /* @__PURE__ */ jsx13(
2403
+ /* @__PURE__ */ jsx15(
1232
2404
  "textarea",
1233
2405
  {
1234
2406
  value: note,
@@ -1244,14 +2416,14 @@ function KeepNoteEditor({
1244
2416
  }
1245
2417
  )
1246
2418
  ] }),
1247
- /* @__PURE__ */ jsx13("button", { type: "submit", disabled: isMutating, "aria-busy": isMutating, children: saveLabel ?? defaultSaveLabel })
2419
+ /* @__PURE__ */ jsx15("button", { type: "submit", disabled: isMutating, "aria-busy": isMutating, children: saveLabel ?? defaultSaveLabel })
1248
2420
  ] });
1249
2421
  const handleSubmit = (event) => {
1250
2422
  event.preventDefault();
1251
2423
  void save().catch(() => void 0);
1252
2424
  };
1253
2425
  if (!asChild) {
1254
- return /* @__PURE__ */ jsx13(
2426
+ return /* @__PURE__ */ jsx15(
1255
2427
  "form",
1256
2428
  {
1257
2429
  ...formProps,
@@ -1282,10 +2454,159 @@ function KeepNoteEditor({
1282
2454
  );
1283
2455
  }
1284
2456
 
2457
+ // src/KeepSyncRecoveryDialog.tsx
2458
+ import { useKeepContext as useKeepContext3 } from "@keepkit/core/react";
2459
+ import { useEffect as useEffect4, useState as useState8 } from "react";
2460
+ import { jsx as jsx16, jsxs as jsxs9 } from "react/jsx-runtime";
2461
+ function KeepSyncRecoveryDialog({
2462
+ open,
2463
+ onOpenChange,
2464
+ conflicts,
2465
+ onManualMerge,
2466
+ backup,
2467
+ showBackupControls = true,
2468
+ title,
2469
+ children,
2470
+ className,
2471
+ ...props
2472
+ }) {
2473
+ const context = useKeepContext3();
2474
+ const closeLabel = useUiLabel("close");
2475
+ const defaultDialogTitle = useUiLabel("resolveSync");
2476
+ const dialogTitle = title ?? defaultDialogTitle;
2477
+ const conflictLabel = useUiLabel("syncConflict");
2478
+ const keepLocalLabel = useUiLabel("keepLocal");
2479
+ const useServerLabel = useUiLabel("useServer");
2480
+ const manualMergeLabel = useUiLabel("manualMerge");
2481
+ const backupRecoveryLabel = useUiLabel("backupRecovery");
2482
+ const backupRecoveryDescription = useUiLabel("backupRecoveryDescription");
2483
+ const errorLabel = useUiLabel("error");
2484
+ const conflictList = conflicts ?? context.syncState.conflicts ?? [];
2485
+ const hasRecovery = conflictList.length > 0 || context.syncState.status === "error" || Boolean(context.error);
2486
+ const [dismissed, setDismissed] = useState8(false);
2487
+ const [busyId, setBusyId] = useState8();
2488
+ const [error, setError] = useState8();
2489
+ useEffect4(() => {
2490
+ if (hasRecovery) setDismissed(false);
2491
+ }, [hasRecovery]);
2492
+ const isOpen = open ?? (hasRecovery && !dismissed);
2493
+ if (!isOpen) return null;
2494
+ const close = () => {
2495
+ setDismissed(true);
2496
+ onOpenChange?.(false);
2497
+ };
2498
+ async function resolve(conflict, resolution) {
2499
+ setError(void 0);
2500
+ setBusyId(conflict.id);
2501
+ try {
2502
+ const merged = resolution === "manual" ? await onManualMerge?.(conflict) : void 0;
2503
+ if (resolution === "manual" && !merged) throw new Error("A manual merge result is required.");
2504
+ await context.resolveSyncConflict(conflict.id, resolution, merged);
2505
+ } catch (cause) {
2506
+ setError(cause);
2507
+ } finally {
2508
+ setBusyId(void 0);
2509
+ }
2510
+ }
2511
+ return /* @__PURE__ */ jsxs9(
2512
+ "section",
2513
+ {
2514
+ ...props,
2515
+ className,
2516
+ role: "dialog",
2517
+ "aria-modal": "true",
2518
+ "aria-labelledby": "keepkit-sync-recovery-title",
2519
+ "data-keepkit": "sync-recovery",
2520
+ "data-state": conflictList.length > 0 ? "conflict" : "error",
2521
+ children: [
2522
+ /* @__PURE__ */ jsxs9("header", { children: [
2523
+ /* @__PURE__ */ jsx16("h2", { id: "keepkit-sync-recovery-title", children: dialogTitle }),
2524
+ /* @__PURE__ */ jsx16("button", { type: "button", onClick: close, "aria-label": closeLabel, children: closeLabel })
2525
+ ] }),
2526
+ children,
2527
+ conflictList.length > 0 ? /* @__PURE__ */ jsxs9("div", { children: [
2528
+ /* @__PURE__ */ jsx16("p", { children: conflictLabel }),
2529
+ conflictList.map((conflict) => /* @__PURE__ */ jsxs9("article", { "data-conflict-id": conflict.id, children: [
2530
+ /* @__PURE__ */ jsx16("h3", { children: getMetaTitle(conflict.operation.item?.meta) ?? conflict.id }),
2531
+ /* @__PURE__ */ jsxs9("div", { children: [
2532
+ /* @__PURE__ */ jsx16("button", { type: "button", onClick: () => void resolve(conflict, "local"), disabled: busyId !== void 0, children: keepLocalLabel }),
2533
+ /* @__PURE__ */ jsx16("button", { type: "button", onClick: () => void resolve(conflict, "remote"), disabled: busyId !== void 0, children: useServerLabel }),
2534
+ /* @__PURE__ */ jsx16(
2535
+ "button",
2536
+ {
2537
+ type: "button",
2538
+ onClick: () => void resolve(conflict, "manual"),
2539
+ disabled: busyId !== void 0 || !onManualMerge,
2540
+ children: manualMergeLabel
2541
+ }
2542
+ )
2543
+ ] })
2544
+ ] }, conflict.id))
2545
+ ] }) : null,
2546
+ context.syncState.status === "error" || context.error ? /* @__PURE__ */ jsxs9("section", { "data-recovery": "backup", children: [
2547
+ /* @__PURE__ */ jsx16("h3", { children: backupRecoveryLabel }),
2548
+ /* @__PURE__ */ jsx16("p", { children: backupRecoveryDescription }),
2549
+ backup ?? (showBackupControls ? /* @__PURE__ */ jsx16(KeepBackup, {}) : null)
2550
+ ] }) : null,
2551
+ error ? /* @__PURE__ */ jsx16("p", { role: "alert", children: error instanceof Error ? error.message : errorLabel }) : null
2552
+ ]
2553
+ }
2554
+ );
2555
+ }
2556
+
2557
+ // src/KeepSyncStatusBanner.tsx
2558
+ import { useKeepContext as useKeepContext4 } from "@keepkit/core/react";
2559
+ import { jsx as jsx17, jsxs as jsxs10 } from "react/jsx-runtime";
2560
+ function KeepSyncStatusBanner({
2561
+ onRetry,
2562
+ onResolveConflicts,
2563
+ children,
2564
+ className,
2565
+ ...props
2566
+ }) {
2567
+ const context = useKeepContext4();
2568
+ const retryLabel = useUiLabel("retrySync");
2569
+ const resolveLabel = useUiLabel("resolveSync");
2570
+ const conflictLabel = useUiLabel("syncConflict");
2571
+ const pendingLabel = useUiLabel("syncPending");
2572
+ const syncedLabel = useUiLabel("syncSynced");
2573
+ const status = context.syncState.status;
2574
+ const hasConflicts = (context.syncState.conflicts?.length ?? 0) > 0 || context.syncState.conflictIds.length > 0;
2575
+ if (status === "idle" && !hasConflicts) return null;
2576
+ const message = children ?? (status === "error" ? getErrorMessage2(context.syncState.error) : status === "conflict" || hasConflicts ? conflictLabel : status === "pending" || status === "syncing" ? pendingLabel : syncedLabel);
2577
+ const role = status === "error" || status === "conflict" || hasConflicts ? "alert" : "status";
2578
+ const retry = async () => {
2579
+ if (onRetry) {
2580
+ await onRetry();
2581
+ return;
2582
+ }
2583
+ await context.flushSync();
2584
+ };
2585
+ return /* @__PURE__ */ jsxs10(
2586
+ "aside",
2587
+ {
2588
+ ...props,
2589
+ className,
2590
+ role: props.role ?? role,
2591
+ "aria-live": props["aria-live"] ?? "polite",
2592
+ "data-keepkit": "sync-status",
2593
+ "data-state": status,
2594
+ children: [
2595
+ /* @__PURE__ */ jsx17("p", { children: message }),
2596
+ status === "error" || status === "pending" || status === "syncing" ? /* @__PURE__ */ jsx17("button", { type: "button", onClick: () => void retry(), disabled: context.isMutating, children: retryLabel }) : null,
2597
+ hasConflicts ? /* @__PURE__ */ jsx17("button", { type: "button", onClick: onResolveConflicts, disabled: !onResolveConflicts, children: resolveLabel }) : null
2598
+ ]
2599
+ }
2600
+ );
2601
+ }
2602
+ function getErrorMessage2(error) {
2603
+ return error instanceof Error ? error.message : "Sync failed.";
2604
+ }
2605
+
1285
2606
  // src/KeepTagEditor.tsx
1286
2607
  import { useKeepItem as useKeepItem4 } from "@keepkit/core/react";
1287
- import { useCallback as useCallback3, useEffect as useEffect4, useState as useState7 } from "react";
1288
- import { Fragment as Fragment6, jsx as jsx14, jsxs as jsxs8 } from "react/jsx-runtime";
2608
+ import { useCallback as useCallback3, useEffect as useEffect5, useState as useState9 } from "react";
2609
+ import { Fragment as Fragment6, jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
1289
2610
  function KeepTagEditor({
1290
2611
  item,
1291
2612
  availableTags = [],
@@ -1298,9 +2619,9 @@ function KeepTagEditor({
1298
2619
  const removeLabel = useUiLabel("remove");
1299
2620
  const applyTagsLabel = useUiLabel("applyTags");
1300
2621
  const itemState = useKeepItem4(item);
1301
- const [tags, setTags] = useState7(item.tags ?? []);
1302
- const [input, setInput] = useState7("");
1303
- useEffect4(() => setTags(itemState.item?.tags ?? item.tags ?? []), [item.tags, itemState.item?.tags]);
2622
+ const [tags, setTags] = useState9(item.tags ?? []);
2623
+ const [input, setInput] = useState9("");
2624
+ useEffect5(() => setTags(itemState.item?.tags ?? item.tags ?? []), [item.tags, itemState.item?.tags]);
1304
2625
  const save = useCallback3(async () => {
1305
2626
  const nextTags = normalizeUiTags(tags);
1306
2627
  try {
@@ -1316,10 +2637,10 @@ function KeepTagEditor({
1316
2637
  setTags(normalizeUiTags([...tags, tag]));
1317
2638
  setInput("");
1318
2639
  };
1319
- const body = render ? render({ tags, setTags, save, isSaving: itemState.isMutating }) : /* @__PURE__ */ jsxs8(Fragment6, { children: [
1320
- /* @__PURE__ */ jsxs8("label", { children: [
2640
+ const body = render ? render({ tags, setTags, save, isSaving: itemState.isMutating }) : /* @__PURE__ */ jsxs11(Fragment6, { children: [
2641
+ /* @__PURE__ */ jsxs11("label", { children: [
1321
2642
  tagsLabel,
1322
- /* @__PURE__ */ jsx14(
2643
+ /* @__PURE__ */ jsx18(
1323
2644
  "input",
1324
2645
  {
1325
2646
  value: input,
@@ -1338,14 +2659,14 @@ function KeepTagEditor({
1338
2659
  }
1339
2660
  )
1340
2661
  ] }),
1341
- availableTags.length > 0 ? /* @__PURE__ */ jsx14("datalist", { id: `keep-tags-${item.id}`, children: availableTags.map((tag) => /* @__PURE__ */ jsx14("option", { value: tag }, tag)) }) : null,
1342
- /* @__PURE__ */ jsx14("ul", { "aria-label": tagsLabel, children: tags.map((tag) => /* @__PURE__ */ jsxs8("li", { children: [
2662
+ availableTags.length > 0 ? /* @__PURE__ */ jsx18("datalist", { id: `keep-tags-${item.id}`, children: availableTags.map((tag) => /* @__PURE__ */ jsx18("option", { value: tag }, tag)) }) : null,
2663
+ /* @__PURE__ */ jsx18("ul", { "aria-label": tagsLabel, children: tags.map((tag) => /* @__PURE__ */ jsxs11("li", { children: [
1343
2664
  tag,
1344
- /* @__PURE__ */ jsx14("button", { type: "button", onClick: () => setTags(tags.filter((current) => current !== tag)), children: removeLabel })
2665
+ /* @__PURE__ */ jsx18("button", { type: "button", onClick: () => setTags(tags.filter((current) => current !== tag)), children: removeLabel })
1345
2666
  ] }, tag)) }),
1346
- /* @__PURE__ */ jsx14("button", { type: "submit", disabled: itemState.isMutating, "aria-busy": itemState.isMutating, children: applyTagsLabel })
2667
+ /* @__PURE__ */ jsx18("button", { type: "submit", disabled: itemState.isMutating, "aria-busy": itemState.isMutating, children: applyTagsLabel })
1347
2668
  ] });
1348
- return /* @__PURE__ */ jsx14(
2669
+ return /* @__PURE__ */ jsx18(
1349
2670
  "form",
1350
2671
  {
1351
2672
  ...props,
@@ -1363,23 +2684,23 @@ function KeepTagEditor({
1363
2684
  }
1364
2685
 
1365
2686
  // src/KeepUndo.tsx
1366
- import { useKeepContext as useKeepContext2 } from "@keepkit/core/react";
1367
- import { jsx as jsx15, jsxs as jsxs9 } from "react/jsx-runtime";
2687
+ import { useKeepContext as useKeepContext5 } from "@keepkit/core/react";
2688
+ import { jsx as jsx19, jsxs as jsxs12 } from "react/jsx-runtime";
1368
2689
  function KeepUndo({ children, label, ...props }) {
1369
- const context = useKeepContext2();
2690
+ const context = useKeepContext5();
1370
2691
  const message = useUiLabel("undoAvailable");
1371
2692
  const undoLabel = useUiLabel("undo");
1372
2693
  if (!context.undo.canUndo) return null;
1373
- return /* @__PURE__ */ jsxs9("div", { ...props, role: "status", "aria-live": "polite", "data-state": "available", children: [
2694
+ return /* @__PURE__ */ jsxs12("div", { ...props, role: "status", "aria-live": "polite", "data-state": "available", children: [
1374
2695
  children ?? message,
1375
- /* @__PURE__ */ jsx15("button", { type: "button", onClick: () => void context.undoLastRemoval(), children: label ?? undoLabel })
2696
+ /* @__PURE__ */ jsx19("button", { type: "button", onClick: () => void context.undoLastRemoval(), children: label ?? undoLabel })
1376
2697
  ] });
1377
2698
  }
1378
2699
 
1379
2700
  // src/status.tsx
1380
- import { useKeepContext as useKeepContext3 } from "@keepkit/core/react";
1381
- import { isValidElement as isValidElement6, useEffect as useEffect5, useRef as useRef4, useState as useState8 } from "react";
1382
- import { Fragment as Fragment7, jsx as jsx16, jsxs as jsxs10 } from "react/jsx-runtime";
2701
+ import { useKeepContext as useKeepContext6 } from "@keepkit/core/react";
2702
+ import { isValidElement as isValidElement6, useEffect as useEffect6, useRef as useRef4, useState as useState10 } from "react";
2703
+ import { Fragment as Fragment7, jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
1383
2704
  function KeepEmptyState({
1384
2705
  title,
1385
2706
  description,
@@ -1391,9 +2712,9 @@ function KeepEmptyState({
1391
2712
  }) {
1392
2713
  const defaultTitle = useUiLabel("noItems").replace(/\.$/, "");
1393
2714
  const contentChildren = asChild && isValidElement6(children) ? void 0 : children;
1394
- const body = contentChildren ?? /* @__PURE__ */ jsxs10(Fragment7, { children: [
1395
- /* @__PURE__ */ jsx16("h2", { children: title ?? defaultTitle }),
1396
- description ? /* @__PURE__ */ jsx16("p", { children: description }) : null,
2715
+ const body = contentChildren ?? /* @__PURE__ */ jsxs13(Fragment7, { children: [
2716
+ /* @__PURE__ */ jsx20("h2", { children: title ?? defaultTitle }),
2717
+ description ? /* @__PURE__ */ jsx20("p", { children: description }) : null,
1397
2718
  action
1398
2719
  ] });
1399
2720
  return renderRoot(asChild, children, { ...rootProps, className, "data-state": "empty" }, body, "KeepEmptyState");
@@ -1407,10 +2728,10 @@ function KeepStatus({
1407
2728
  className,
1408
2729
  ...rootProps
1409
2730
  }) {
1410
- const context = useKeepContext3();
2731
+ const context = useKeepContext6();
1411
2732
  const contentChildren = asChild && isValidElement6(children) ? void 0 : children;
1412
2733
  const resolvedStatus = status ?? getDerivedStatus(context);
1413
- const defaultLabel = useUiLabel(getStatusLabelKey2(resolvedStatus));
2734
+ const defaultLabel = useUiLabel(getStatusLabelKey3(resolvedStatus));
1414
2735
  const state = {
1415
2736
  status: resolvedStatus,
1416
2737
  error: context.error,
@@ -1435,13 +2756,13 @@ function KeepStatus({
1435
2756
  );
1436
2757
  }
1437
2758
  function KeepAnnouncements({ messages, ...props }) {
1438
- const context = useKeepContext3();
2759
+ const context = useKeepContext6();
1439
2760
  const savedMessage = useUiLabel("savedMessage", messages?.save);
1440
2761
  const removedMessage = useUiLabel("removedMessage", messages?.remove);
1441
2762
  const noteSavedMessage = useUiLabel("noteSavedMessage", messages?.note);
1442
- const [message, setMessage] = useState8("");
2763
+ const [message, setMessage] = useState10("");
1443
2764
  const lastChangeRef = useRef4(void 0);
1444
- useEffect5(() => {
2765
+ useEffect6(() => {
1445
2766
  const change = context.lastChange;
1446
2767
  if (!change || change === lastChangeRef.current) return;
1447
2768
  lastChangeRef.current = change;
@@ -1449,7 +2770,7 @@ function KeepAnnouncements({ messages, ...props }) {
1449
2770
  else if (change.action === "remove" || change.action === "removeBatch") setMessage(removedMessage);
1450
2771
  else if (change.action === "updateNote") setMessage(noteSavedMessage);
1451
2772
  }, [context.lastChange, noteSavedMessage, removedMessage, savedMessage]);
1452
- return /* @__PURE__ */ jsx16(
2773
+ return /* @__PURE__ */ jsx20(
1453
2774
  "div",
1454
2775
  {
1455
2776
  ...props,
@@ -1470,7 +2791,7 @@ function getDerivedStatus(context) {
1470
2791
  if (context.isHydrated && context.items.length === 0) return "empty";
1471
2792
  return "idle";
1472
2793
  }
1473
- function getStatusLabelKey2(status) {
2794
+ function getStatusLabelKey3(status) {
1474
2795
  if (status === "empty") return "noItems";
1475
2796
  if (status === "loading") return "loadingItems";
1476
2797
  if (status === "error") return "error";
@@ -1480,10 +2801,11 @@ function getStatusLabelKey2(status) {
1480
2801
  }
1481
2802
 
1482
2803
  // src/index.tsx
2804
+ import { createAuthenticatedSyncKit } from "@keepkit/core/core";
1483
2805
  import {
1484
2806
  KeepErrorBoundary as KeepErrorBoundary3,
1485
2807
  KeepProvider,
1486
- useKeepContext as useKeepContext4,
2808
+ useKeepContext as useKeepContext7,
1487
2809
  useKeepItem as useKeepItem5,
1488
2810
  useKeepList as useKeepList5,
1489
2811
  useKeepShortcut
@@ -1498,7 +2820,7 @@ import {
1498
2820
  LocalStorageSyncQueueAdapter,
1499
2821
  SyncStorageAdapter
1500
2822
  } from "@keepkit/core/storage";
1501
- import { jsx as jsx17, jsxs as jsxs11 } from "react/jsx-runtime";
2823
+ import { jsx as jsx21, jsxs as jsxs14 } from "react/jsx-runtime";
1502
2824
  function KeepKitProvider({
1503
2825
  labels,
1504
2826
  locale,
@@ -1506,16 +2828,16 @@ function KeepKitProvider({
1506
2828
  children,
1507
2829
  ...providerProps
1508
2830
  }) {
1509
- return /* @__PURE__ */ jsx17(KeepUiProvider, { labels, locale, labelResolver, children: /* @__PURE__ */ jsxs11(CoreKeepProvider, { ...providerProps, children: [
2831
+ return /* @__PURE__ */ jsx21(KeepUiProvider, { labels, locale, labelResolver, children: /* @__PURE__ */ jsxs14(CoreKeepProvider, { ...providerProps, children: [
1510
2832
  children,
1511
- /* @__PURE__ */ jsx17(KeepAnnouncements, {})
2833
+ /* @__PURE__ */ jsx21(KeepAnnouncements, {})
1512
2834
  ] }) });
1513
2835
  }
1514
2836
  function createKeepKit(options = {}) {
1515
2837
  const { labels, locale, labelResolver, getTitle, getImageProps, ...coreOptions } = options;
1516
2838
  const coreKit = createCoreKeepKit(coreOptions);
1517
2839
  return {
1518
- Provider: (props) => /* @__PURE__ */ jsx17(
2840
+ Provider: (props) => /* @__PURE__ */ jsx21(
1519
2841
  KeepKitProvider,
1520
2842
  {
1521
2843
  ...coreOptions,
@@ -1525,9 +2847,9 @@ function createKeepKit(options = {}) {
1525
2847
  ...props
1526
2848
  }
1527
2849
  ),
1528
- Button: (props) => /* @__PURE__ */ jsx17(KeepButton, { ...props }),
1529
- Backup: (props) => /* @__PURE__ */ jsx17(KeepBackup, { ...props }),
1530
- Collection: (props) => /* @__PURE__ */ jsx17(
2850
+ Button: (props) => /* @__PURE__ */ jsx21(KeepButton, { ...props }),
2851
+ Backup: (props) => /* @__PURE__ */ jsx21(KeepBackup, { ...props }),
2852
+ Collection: (props) => /* @__PURE__ */ jsx21(
1531
2853
  KeepCollection,
1532
2854
  {
1533
2855
  ...props,
@@ -1558,15 +2880,20 @@ export {
1558
2880
  KeepErrorBoundary3 as KeepErrorBoundary,
1559
2881
  KeepItemCard,
1560
2882
  KeepItemCheckbox,
2883
+ KeepItemStatusBadge,
1561
2884
  KeepKitProvider,
1562
2885
  KeepLayout,
1563
2886
  KeepList,
1564
2887
  KeepNoteEditor,
1565
2888
  KeepPagination,
1566
2889
  KeepProvider,
2890
+ KeepPruneStaleButton,
1567
2891
  KeepSearchInput,
1568
2892
  KeepSortSelect,
2893
+ KeepStaleNotice,
1569
2894
  KeepStatus,
2895
+ KeepSyncRecoveryDialog,
2896
+ KeepSyncStatusBanner,
1570
2897
  KeepTagEditor,
1571
2898
  KeepTagFilter,
1572
2899
  KeepUiProvider,
@@ -1574,6 +2901,7 @@ export {
1574
2901
  LocalStorageAdapter,
1575
2902
  LocalStorageSyncQueueAdapter,
1576
2903
  SyncStorageAdapter,
2904
+ createAuthenticatedSyncKit,
1577
2905
  createBrowserStorageAdapter,
1578
2906
  createKeepKit,
1579
2907
  createNextPagesRouterAdapter,
@@ -1581,7 +2909,7 @@ export {
1581
2909
  getKeepLocaleLabels,
1582
2910
  isAllSelected,
1583
2911
  toggleSelectAll,
1584
- useKeepContext4 as useKeepContext,
2912
+ useKeepContext7 as useKeepContext,
1585
2913
  useKeepItem5 as useKeepItem,
1586
2914
  useKeepList5 as useKeepList,
1587
2915
  useKeepShortcut,