selfstore 1.8.20 → 1.8.22

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.
Files changed (89) hide show
  1. package/README.md +109 -12
  2. package/dist/advanced.d.ts +23 -8
  3. package/dist/advanced.js +23 -12
  4. package/dist/advanced.js.map +1 -1
  5. package/dist/backups.d.ts +4 -4
  6. package/dist/backups.js +8 -6
  7. package/dist/{cache-lock-KWJUORTS.js → cache-lock-5RNG6CIK.js} +4 -3
  8. package/dist/cache-lock-5RNG6CIK.js.map +1 -0
  9. package/dist/{chunk-SKWHKM25.js → chunk-23UAUYSW.js} +40 -4
  10. package/dist/chunk-23UAUYSW.js.map +1 -0
  11. package/dist/chunk-3BWBBGFW.js +29 -0
  12. package/dist/chunk-3BWBBGFW.js.map +1 -0
  13. package/dist/{chunk-W22V5CRM.js → chunk-3KAAPYPO.js} +3 -3
  14. package/dist/{chunk-W22V5CRM.js.map → chunk-3KAAPYPO.js.map} +1 -1
  15. package/dist/chunk-757ZOSUI.js +27 -0
  16. package/dist/chunk-757ZOSUI.js.map +1 -0
  17. package/dist/{chunk-DCEXWSM6.js → chunk-AUH35AAQ.js} +3 -3
  18. package/dist/{chunk-DCEXWSM6.js.map → chunk-AUH35AAQ.js.map} +1 -1
  19. package/dist/{chunk-ULPGGZ6L.js → chunk-DJZ5S3FI.js} +11 -10
  20. package/dist/chunk-DJZ5S3FI.js.map +1 -0
  21. package/dist/{chunk-HOG2IKEP.js → chunk-EBCQ7ZG7.js} +4 -4
  22. package/dist/{chunk-HOG2IKEP.js.map → chunk-EBCQ7ZG7.js.map} +1 -1
  23. package/dist/chunk-FJGWTBAL.js +6 -0
  24. package/dist/chunk-FJGWTBAL.js.map +1 -0
  25. package/dist/chunk-GW5CYP4C.js +212 -0
  26. package/dist/chunk-GW5CYP4C.js.map +1 -0
  27. package/dist/{chunk-MGDXR3RB.js → chunk-HHPJPEEG.js} +6 -5
  28. package/dist/chunk-HHPJPEEG.js.map +1 -0
  29. package/dist/{chunk-J5MFXJU6.js → chunk-JTNFZV2B.js} +78 -26
  30. package/dist/chunk-JTNFZV2B.js.map +1 -0
  31. package/dist/chunk-JZHWAX34.js +178 -0
  32. package/dist/chunk-JZHWAX34.js.map +1 -0
  33. package/dist/chunk-LUNYYH6D.js +223 -0
  34. package/dist/chunk-LUNYYH6D.js.map +1 -0
  35. package/dist/{chunk-LKIRWVXM.js → chunk-LYO36VYB.js} +12 -11
  36. package/dist/chunk-LYO36VYB.js.map +1 -0
  37. package/dist/{chunk-O3Y6FORN.js → chunk-OY2A5DCB.js} +4 -3
  38. package/dist/chunk-OY2A5DCB.js.map +1 -0
  39. package/dist/chunk-QSLHEE2L.js +13 -0
  40. package/dist/chunk-QSLHEE2L.js.map +1 -0
  41. package/dist/{chunk-3OBJOMQ2.js → chunk-RREJ2MFN.js} +4 -28
  42. package/dist/chunk-RREJ2MFN.js.map +1 -0
  43. package/dist/chunk-XMC67RNM.js +29 -0
  44. package/dist/chunk-XMC67RNM.js.map +1 -0
  45. package/dist/{connect-GY1R9c6Q.d.ts → connect-Bob2mofK.d.ts} +3 -3
  46. package/dist/{drive-BLRsK32w.d.ts → drive-86CHuTij.d.ts} +63 -2
  47. package/dist/flows.d.ts +5 -5
  48. package/dist/flows.js +17 -15
  49. package/dist/flows.js.map +1 -1
  50. package/dist/groups.js +4 -3
  51. package/dist/groups.js.map +1 -1
  52. package/dist/households.d.ts +1 -1
  53. package/dist/index.d.ts +50 -8
  54. package/dist/index.js +72 -17
  55. package/dist/index.js.map +1 -1
  56. package/dist/kdf-worker.js +7 -2
  57. package/dist/kdf-worker.js.map +1 -1
  58. package/dist/{local-DrziuI_t.d.ts → local-8H61XxbL.d.ts} +2 -2
  59. package/dist/local-XET4G32B.js +7 -0
  60. package/dist/{local-DPS35F5C.js.map → local-XET4G32B.js.map} +1 -1
  61. package/dist/{manager-BlSs6Q5S.d.ts → manager-Di6lNE4E.d.ts} +1 -1
  62. package/dist/manager-drive-YLSLQ63O.js +10 -0
  63. package/dist/{manager-drive-4WLKOOXO.js.map → manager-drive-YLSLQ63O.js.map} +1 -1
  64. package/dist/s3-43RWNCV3.js +11 -0
  65. package/dist/s3-43RWNCV3.js.map +1 -0
  66. package/dist/{s3-BLgf6hqR.d.ts → s3-BsbVn3fw.d.ts} +1 -1
  67. package/dist/{store-DhrWMYg_.d.ts → store-CIbiNoiE.d.ts} +1 -1
  68. package/dist/sync.d.ts +7 -6
  69. package/dist/sync.js +3 -1
  70. package/dist/webdav-EEQKX5TZ.js +9 -0
  71. package/dist/webdav-EEQKX5TZ.js.map +1 -0
  72. package/dist/widgets.d.ts +19 -5
  73. package/dist/widgets.js +29 -22
  74. package/dist/widgets.js.map +1 -1
  75. package/llms.txt +51 -4
  76. package/package.json +12 -5
  77. package/skills/selfstore/SKILL.md +115 -0
  78. package/dist/cache-lock-KWJUORTS.js.map +0 -1
  79. package/dist/chunk-3OBJOMQ2.js.map +0 -1
  80. package/dist/chunk-J5MFXJU6.js.map +0 -1
  81. package/dist/chunk-LKIRWVXM.js.map +0 -1
  82. package/dist/chunk-MGDXR3RB.js.map +0 -1
  83. package/dist/chunk-O3Y6FORN.js.map +0 -1
  84. package/dist/chunk-SKWHKM25.js.map +0 -1
  85. package/dist/chunk-TKWU52LK.js +0 -607
  86. package/dist/chunk-TKWU52LK.js.map +0 -1
  87. package/dist/chunk-ULPGGZ6L.js.map +0 -1
  88. package/dist/local-DPS35F5C.js +0 -6
  89. package/dist/manager-drive-4WLKOOXO.js +0 -8
@@ -1,5 +1,5 @@
1
- import { o as Snapshot, E as EncodeOptions, H as Header } from './store-DhrWMYg_.js';
2
- import { a as DriveAuth } from './drive-BLRsK32w.js';
1
+ import { o as Snapshot, E as EncodeOptions, H as Header } from './store-CIbiNoiE.js';
2
+ import { a as DriveAuth } from './drive-86CHuTij.js';
3
3
 
4
4
  /** Serialize a snapshot to a portable backup blob (compressed; encrypted if a password is given). */
5
5
  declare function exportSnapshot(snapshot: Snapshot, opts: EncodeOptions): Promise<Blob>;
@@ -0,0 +1,7 @@
1
+ export { datedName, downloadBlob, pickFromDisk, pickSaveHandle, saveToDisk, writeToHandle } from './chunk-AUH35AAQ.js';
2
+ import './chunk-HHPJPEEG.js';
3
+ import './chunk-OY2A5DCB.js';
4
+ import './chunk-RREJ2MFN.js';
5
+ import './chunk-XMC67RNM.js';
6
+ //# sourceMappingURL=local-XET4G32B.js.map
7
+ //# sourceMappingURL=local-XET4G32B.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"local-DPS35F5C.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"local-XET4G32B.js"}
@@ -1,5 +1,5 @@
1
1
  import { K as KV } from './cache-ilsK3Tki.js';
2
- import { B as BackupTarget, L as LocalStore } from './store-DhrWMYg_.js';
2
+ import { B as BackupTarget, L as LocalStore } from './store-CIbiNoiE.js';
3
3
  import { F as FlowStore } from './machine-ALMkT3mk.js';
4
4
 
5
5
  /** What the destination reports about a listed file (one cheap metadata call). */
@@ -0,0 +1,10 @@
1
+ export { createBackupsManager, driveBackupsHost } from './chunk-EBCQ7ZG7.js';
2
+ import './chunk-3KAAPYPO.js';
3
+ import './chunk-JTNFZV2B.js';
4
+ import './chunk-757ZOSUI.js';
5
+ import './chunk-HHPJPEEG.js';
6
+ import './chunk-OY2A5DCB.js';
7
+ import './chunk-RREJ2MFN.js';
8
+ import './chunk-XMC67RNM.js';
9
+ //# sourceMappingURL=manager-drive-YLSLQ63O.js.map
10
+ //# sourceMappingURL=manager-drive-YLSLQ63O.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"manager-drive-4WLKOOXO.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"manager-drive-YLSLQ63O.js"}
@@ -0,0 +1,11 @@
1
+ export { connect, fromSession } from './chunk-LUNYYH6D.js';
2
+ import './chunk-QSLHEE2L.js';
3
+ import './chunk-757ZOSUI.js';
4
+ import './chunk-HHPJPEEG.js';
5
+ import './chunk-QBCU7OOP.js';
6
+ import './chunk-OY2A5DCB.js';
7
+ import './chunk-RREJ2MFN.js';
8
+ import './chunk-FJGWTBAL.js';
9
+ import './chunk-XMC67RNM.js';
10
+ //# sourceMappingURL=s3-43RWNCV3.js.map
11
+ //# sourceMappingURL=s3-43RWNCV3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"s3-43RWNCV3.js"}
@@ -1,4 +1,4 @@
1
- import { B as BackupTarget, P as PeerSource } from './store-DhrWMYg_.js';
1
+ import { B as BackupTarget, P as PeerSource } from './store-CIbiNoiE.js';
2
2
  import { K as KV } from './cache-ilsK3Tki.js';
3
3
 
4
4
  /**
@@ -149,7 +149,7 @@ interface EncodeOptions {
149
149
  extraSecrets?: string[];
150
150
  }
151
151
 
152
- type SelfstoreErrorCode = 'BAD_FORMAT' | 'UNSUPPORTED_VERSION' | 'PASSWORD_REQUIRED' | 'DECRYPT_FAILED' | 'TOO_LARGE' | 'VERIFY_FAILED' | 'FOREIGN_BACKUP' | 'AUTH_EXPIRED' | 'TARGET_UNAVAILABLE' | 'TARGET_WRITE_FAILED' | 'TARGET_GONE' | 'NOT_CONNECTED' | 'WEAK_PASSWORD' | 'ENCRYPTION_REQUIRED' | 'UNEXPECTEDLY_UNENCRYPTED' | 'SCHEMA_TOO_NEW' | 'IDENTITY_REQUIRED' | 'SIGNATURE_INVALID' | 'NOT_A_RECIPIENT' | 'MANIFEST_ROLLBACK';
152
+ type SelfstoreErrorCode = 'BAD_FORMAT' | 'UNSUPPORTED_VERSION' | 'PASSWORD_REQUIRED' | 'DECRYPT_FAILED' | 'TOO_LARGE' | 'VERIFY_FAILED' | 'FOREIGN_BACKUP' | 'AUTH_EXPIRED' | 'TARGET_UNAVAILABLE' | 'TARGET_WRITE_FAILED' | 'TARGET_GONE' | 'NOT_CONNECTED' | 'WEAK_PASSWORD' | 'ENCRYPTION_REQUIRED' | 'UNEXPECTEDLY_UNENCRYPTED' | 'SCHEMA_TOO_NEW' | 'IDENTITY_REQUIRED' | 'SIGNATURE_INVALID' | 'NOT_A_RECIPIENT' | 'MANIFEST_ROLLBACK' | 'CLOCK_DRIFT';
153
153
  /**
154
154
  * i18n key for an error code: lower-camel-cased under `error.`, e.g.
155
155
  * 'error.authExpired'. The library ships the key, the app owns the copy;
package/dist/sync.d.ts CHANGED
@@ -4,7 +4,13 @@
4
4
  * string so a plain string comparison equals causal order.
5
5
  */
6
6
  type Hlc = string;
7
- /** A fresh random replica id (one per device). */
7
+ /**
8
+ * A fresh random replica id (one per device). Not a secret - but two replicas
9
+ * sharing an id lose the tiebreak that makes the order total, so it comes from
10
+ * the same source as everything else here. `randomUUID` is exposed only in a
11
+ * secure context; `getRandomValues` is not, which is why the fallback is that
12
+ * one and never `Math.random`.
13
+ */
8
14
  declare function createNode(): string;
9
15
 
10
16
  /**
@@ -79,11 +85,6 @@ interface ReplicaState {
79
85
  meta: SyncMeta;
80
86
  }
81
87
  type State = ReplicaState;
82
- /**
83
- * Merge replica `b` into `a` (commutative for the convergent strategies). The
84
- * optional `base` lets 'manual' tell a true concurrent conflict from a one-sided
85
- * change; without it, 'manual' errs toward surfacing.
86
- */
87
88
  declare function merge(a: State, b: State, config: SyncConfig, base?: SyncMeta): MergeResult;
88
89
  /**
89
90
  * Concurrent same-id edits that a convergent strategy resolves silently by keeping
package/dist/sync.js CHANGED
@@ -1,3 +1,5 @@
1
- export { changes, createMeta, createNode, detectConflicts, merge, stamp } from './chunk-SKWHKM25.js';
1
+ export { changes, createMeta, createNode, detectConflicts, merge, stamp } from './chunk-23UAUYSW.js';
2
+ import './chunk-FJGWTBAL.js';
3
+ import './chunk-XMC67RNM.js';
2
4
  //# sourceMappingURL=sync.js.map
3
5
  //# sourceMappingURL=sync.js.map
@@ -0,0 +1,9 @@
1
+ export { connect, fromSession, peer } from './chunk-JZHWAX34.js';
2
+ import './chunk-757ZOSUI.js';
3
+ import './chunk-HHPJPEEG.js';
4
+ import './chunk-QBCU7OOP.js';
5
+ import './chunk-OY2A5DCB.js';
6
+ import './chunk-RREJ2MFN.js';
7
+ import './chunk-XMC67RNM.js';
8
+ //# sourceMappingURL=webdav-EEQKX5TZ.js.map
9
+ //# sourceMappingURL=webdav-EEQKX5TZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"webdav-EEQKX5TZ.js"}
package/dist/widgets.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { S as StoreLike, F as FlowHost, C as ConnectTargets, a as ConnectFlowOptions, b as ConnectKind, c as ConnectFlow } from './connect-GY1R9c6Q.js';
1
+ import { S as StoreLike, F as FlowHost, C as ConnectTargets, a as ConnectFlowOptions, b as ConnectKind, c as ConnectFlow } from './connect-Bob2mofK.js';
2
2
  import { ShareEngine, ShareLevel, ShareFlow, JoinEngine, JoinFlow, ReplicaFlow } from './flows.js';
3
- import { f as BackupsManager } from './manager-BlSs6Q5S.js';
4
- import './store-DhrWMYg_.js';
3
+ import { f as BackupsManager } from './manager-Di6lNE4E.js';
4
+ import './store-CIbiNoiE.js';
5
5
  import './cache-ilsK3Tki.js';
6
6
  import './sync.js';
7
- import './drive-BLRsK32w.js';
8
- import './s3-BLgf6hqR.js';
7
+ import './drive-86CHuTij.js';
8
+ import './s3-BsbVn3fw.js';
9
9
  import './machine-ALMkT3mk.js';
10
10
 
11
11
  /** Flat key -> string map; widgets merge a partial override over EN defaults. */
@@ -685,6 +685,20 @@ declare class SelfstoreDestinationElement extends FlowWidget {
685
685
  * a host can still mount separately, with every knob they already had. What is
686
686
  * added here is only the CHOICE between them, which follows the engine's own
687
687
  * status - the same signal the gate uses to decide whether to be on screen.
688
+ *
689
+ * WHERE IT FITS, and where it does not. Before a home is chosen this element IS
690
+ * the gate, and the gate is a full-viewport modal (measured: it covers the page
691
+ * at z-index 280 and takes focus). That is right for an app whose data means
692
+ * nothing until the user answers - a wallet, a record, anything the user will
693
+ * be told is safe - and it is the reason the question is asked once, up front,
694
+ * instead of hiding in a settings screen.
695
+ *
696
+ * It is wrong for a page that must work before any answer: a landing demo, a
697
+ * scratchpad, anything whose whole point is that you can type first. There,
698
+ * mount <selfstore-destination> (the panel on its own, no modal) or
699
+ * <selfstore-status> (one line), and offer the connect journey from a control
700
+ * the user reaches deliberately. Both are the same elements this one composes,
701
+ * so nothing is lost by starting there.
688
702
  */
689
703
 
690
704
  declare class SelfstoreStorageElement extends FlowWidget {
package/dist/widgets.js CHANGED
@@ -1,12 +1,14 @@
1
- import { saveToDisk, datedName } from './chunk-DCEXWSM6.js';
2
- import { connectFlow, shareFlow, joinFlow } from './chunk-LKIRWVXM.js';
3
- import { isOpenSupported } from './chunk-TKWU52LK.js';
4
- import './chunk-W22V5CRM.js';
5
- import './chunk-J5MFXJU6.js';
6
- import './chunk-MGDXR3RB.js';
7
- import './chunk-QBCU7OOP.js';
8
- import './chunk-O3Y6FORN.js';
9
- import './chunk-3OBJOMQ2.js';
1
+ import { saveToDisk, datedName } from './chunk-AUH35AAQ.js';
2
+ import { connectFlow, shareFlow, joinFlow } from './chunk-LYO36VYB.js';
3
+ import './chunk-3BWBBGFW.js';
4
+ import { isOpenSupported } from './chunk-GW5CYP4C.js';
5
+ import './chunk-3KAAPYPO.js';
6
+ import './chunk-JTNFZV2B.js';
7
+ import './chunk-757ZOSUI.js';
8
+ import './chunk-HHPJPEEG.js';
9
+ import './chunk-OY2A5DCB.js';
10
+ import './chunk-RREJ2MFN.js';
11
+ import './chunk-XMC67RNM.js';
10
12
 
11
13
  // src/widgets/icons.ts
12
14
  var INK = "#8a8f98";
@@ -38,7 +40,12 @@ var baseStyles = `
38
40
  color: inherit;
39
41
  --_accent: var(--selfstore-accent, #2563eb);
40
42
  --_accent-ink: var(--selfstore-accent-contrast, #ffffff);
41
- --_ink-dim: var(--selfstore-muted, color-mix(in srgb, currentColor 55%, transparent));
43
+ /* Dimmed ink is TEXT too - it words every sub, hint and field label - so it
44
+ answers to 4.5:1, and an alpha over the host background is what decides
45
+ that. At 55% a near-black ink on white composited to 3.99:1 and failed;
46
+ 62% lands at 5.0:1 there and at 6.3:1 for a near-white ink on a near-black
47
+ page, while still reading a clear step below the main ink. */
48
+ --_ink-dim: var(--selfstore-muted, color-mix(in srgb, currentColor 62%, transparent));
42
49
  --_border: var(--selfstore-border, color-mix(in srgb, currentColor 16%, transparent));
43
50
  --_radius: var(--selfstore-radius, 12px);
44
51
  --_gap: var(--selfstore-gap, 0.6rem);
@@ -689,7 +696,7 @@ var EN = {
689
696
  "error.foreignBackup": "This backup belongs to a different app. Open it in the app that created it."
690
697
  };
691
698
  var FR = {
692
- "connect.title": "O\xF9 enregistrer vos donn\xE9es ?",
699
+ "connect.title": "O\xF9 enregistrer vos donn\xE9es\xA0?",
693
700
  "connect.recommended": "Recommand\xE9",
694
701
  "connect.resume": "Reprendre ma sauvegarde",
695
702
  "connect.or": "ou",
@@ -725,8 +732,8 @@ var FR = {
725
732
  "connect.password.submit": "Ouvrir",
726
733
  "connect.password.show": "Afficher le mot de passe",
727
734
  "connect.password.hide": "Masquer le mot de passe",
728
- "connect.password.forgot": "Mot de passe oubli\xE9 ?",
729
- "connect.password.forgot.warn": "Sans le mot de passe, cette sauvegarde ne peut pas \xEAtre ouverte. Vous pouvez repartir d'une sauvegarde vide : l'ancienne sera perdue d\xE9finitivement.",
735
+ "connect.password.forgot": "Mot de passe oubli\xE9\xA0?",
736
+ "connect.password.forgot.warn": "Sans le mot de passe, cette sauvegarde ne peut pas \xEAtre ouverte. Vous pouvez repartir d'une sauvegarde vide\xA0: l'ancienne sera perdue d\xE9finitivement.",
730
737
  "connect.password.forgot.confirm": "Remplacer la sauvegarde",
731
738
  "connect.password.forgot.back": "Retour",
732
739
  "connect.conflict.title": "Une sauvegarde existe d\xE9j\xE0 ici",
@@ -741,12 +748,12 @@ var FR = {
741
748
  "connect.webdav.password": "Mot de passe",
742
749
  "connect.webdav.submit": "Connecter",
743
750
  "connect.webdav.signup": "Cr\xE9er un compte",
744
- "connect.webdav.help.more": "Comment faire ?",
751
+ "connect.webdav.help.more": "Comment faire\xA0?",
745
752
  "connect.done": "Connect\xE9. Vos donn\xE9es sont enregistr\xE9es.",
746
- "connect.done.manual": "Mode export : ce navigateur ne peut pas garder le fichier ouvert.",
753
+ "connect.done.manual": "Mode export\xA0: ce navigateur ne peut pas garder le fichier ouvert.",
747
754
  "error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez.",
748
755
  "error.targetUnavailable": "La sauvegarde ne r\xE9pond pas. R\xE9essayez dans un instant.",
749
- "error.authExpired": "Acc\xE8s expir\xE9 : reconnectez-vous pour continuer.",
756
+ "error.authExpired": "Acc\xE8s expir\xE9\xA0: reconnectez-vous pour continuer.",
750
757
  "error.decryptFailed": "Cette sauvegarde n'a pas pu \xEAtre ouverte avec ce mot de passe.",
751
758
  "error.badFormat": "Ce fichier ne ressemble pas \xE0 une sauvegarde lisible.",
752
759
  "error.foreignBackup": "Cette sauvegarde appartient \xE0 une autre application. Ouvrez-la dans l'application qui l'a cr\xE9\xE9e."
@@ -1521,7 +1528,7 @@ var FR2 = {
1521
1528
  "share.remove": "Retirer",
1522
1529
  "share.stop": "Arr\xEAter le partage",
1523
1530
  "share.empty": "Personne d'autre n'a acc\xE8s pour le moment.",
1524
- "share.stale": "Connexion instable : cette vue est peut-\xEAtre en retard.",
1531
+ "share.stale": "Connexion instable\xA0: cette vue est peut-\xEAtre en retard.",
1525
1532
  "error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez.",
1526
1533
  "error.targetUnavailable": "Le service de partage ne r\xE9pond pas. R\xE9essayez dans un instant."
1527
1534
  };
@@ -2349,11 +2356,11 @@ var FR6 = {
2349
2356
  "backups.newTitle": "Nouvelle sauvegarde",
2350
2357
  "backups.startsBlank": "Elle d\xE9marre vide.",
2351
2358
  "backups.namePh": "Son nom",
2352
- "backups.willBe": "Fichier : {file}",
2359
+ "backups.willBe": "Fichier\xA0: {file}",
2353
2360
  "backups.taken": "Ce nom est d\xE9j\xE0 pris.",
2354
2361
  "backups.create": "Cr\xE9er",
2355
2362
  "backups.renameTitle": "Renommer cette sauvegarde",
2356
- "backups.pwHint": "Cette sauvegarde est prot\xE9g\xE9e : entrez son mot de passe.",
2363
+ "backups.pwHint": "Cette sauvegarde est prot\xE9g\xE9e\xA0: entrez son mot de passe.",
2357
2364
  "backups.pwShow": "Afficher le mot de passe",
2358
2365
  "backups.pwHide": "Masquer le mot de passe",
2359
2366
  "backups.cancel": "Annuler",
@@ -2374,7 +2381,7 @@ var FR6 = {
2374
2381
  "backups.replica.remove": "Retirer",
2375
2382
  "backups.replica.save": "Ajouter la copie",
2376
2383
  "backups.replica.webdav.url": "URL du fichier sur le serveur (https://hote:8443/dav/fichier.zip)",
2377
- "backups.replica.webdav.help": "L'URL compl\xE8te du fichier de sauvegarde, port personnalis\xE9 compris. Le serveur doit autoriser cette application \xE0 le joindre (CORS) : certains h\xE9bergeurs ne le font pas et ne se connecteront pas depuis un navigateur.",
2384
+ "backups.replica.webdav.help": "L'URL compl\xE8te du fichier de sauvegarde, port personnalis\xE9 compris. Le serveur doit autoriser cette application \xE0 le joindre (CORS)\xA0: certains h\xE9bergeurs ne le font pas et ne se connecteront pas depuis un navigateur.",
2378
2385
  "backups.replica.webdav.user": "Identifiant",
2379
2386
  "backups.replica.webdav.password": "Mot de passe",
2380
2387
  "backups.replica.s3.endpoint": "URL du point d'acc\xE8s",
@@ -3463,8 +3470,8 @@ var EN7 = {
3463
3470
  "gate.defer.note": "Data kept only in this browser is lost if its storage is cleared."
3464
3471
  };
3465
3472
  var FR7 = {
3466
- "gate.title": "O\xF9 enregistrer vos donn\xE9es ?",
3467
- "gate.hint": "Elles sont chiffr\xE9es sur cet appareil. Choisissez une sauvegarde : tout y sera enregistr\xE9 automatiquement.",
3473
+ "gate.title": "O\xF9 enregistrer vos donn\xE9es\xA0?",
3474
+ "gate.hint": "Elles sont chiffr\xE9es sur cet appareil. Choisissez une sauvegarde\xA0: tout y sera enregistr\xE9 automatiquement.",
3468
3475
  "gate.fine": "",
3469
3476
  "gate.defer": "Plus tard - garder sur cet appareil seulement",
3470
3477
  "gate.defer.note": "Sans sauvegarde, les donn\xE9es disparaissent si le stockage de cet appareil est vid\xE9."