selfstore 1.6.7 → 1.6.9
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/advanced.d.ts +5 -5
- package/dist/advanced.js +7 -7
- package/dist/backups.d.ts +1 -1
- package/dist/backups.js +2 -2
- package/dist/{cache-lock-NXIR6JRB.js → cache-lock-7D6N42ZP.js} +4 -4
- package/dist/{cache-lock-NXIR6JRB.js.map → cache-lock-7D6N42ZP.js.map} +1 -1
- package/dist/{chunk-JGDX663H.js → chunk-5SII5YHE.js} +92 -34
- package/dist/chunk-5SII5YHE.js.map +1 -0
- package/dist/{chunk-6746AL4I.js → chunk-CM3HSBCE.js} +3 -3
- package/dist/{chunk-6746AL4I.js.map → chunk-CM3HSBCE.js.map} +1 -1
- package/dist/{chunk-KHER6MWR.js → chunk-CT2HTWA7.js} +4 -4
- package/dist/{chunk-KHER6MWR.js.map → chunk-CT2HTWA7.js.map} +1 -1
- package/dist/{chunk-WF732QXN.js → chunk-JQ22IG2T.js} +3 -3
- package/dist/{chunk-WF732QXN.js.map → chunk-JQ22IG2T.js.map} +1 -1
- package/dist/{chunk-XN2J35I5.js → chunk-L6PT3NKO.js} +6 -6
- package/dist/{chunk-XN2J35I5.js.map → chunk-L6PT3NKO.js.map} +1 -1
- package/dist/{chunk-43BJDRPT.js → chunk-OIAXYI35.js} +3 -3
- package/dist/{chunk-43BJDRPT.js.map → chunk-OIAXYI35.js.map} +1 -1
- package/dist/{chunk-VBFMMR7Q.js → chunk-SFF7KKM4.js} +2 -2
- package/dist/chunk-SFF7KKM4.js.map +1 -0
- package/dist/{chunk-X2MCHPSY.js → chunk-XEIT5LET.js} +3 -3
- package/dist/{chunk-X2MCHPSY.js.map → chunk-XEIT5LET.js.map} +1 -1
- package/dist/{chunk-CB24V3VH.js → chunk-ZU6I247L.js} +8 -8
- package/dist/{chunk-CB24V3VH.js.map → chunk-ZU6I247L.js.map} +1 -1
- package/dist/{drive-Cf_ulDfn.d.ts → drive-DF08V8-L.d.ts} +1 -1
- package/dist/{flows-BIWaqRUz.d.ts → flows-dwgDgv6_.d.ts} +2 -2
- package/dist/flows.d.ts +3 -3
- package/dist/flows.js +8 -8
- package/dist/groups.js +4 -4
- package/dist/households.d.ts +1 -1
- package/dist/index.d.ts +20 -4
- package/dist/index.js +11 -11
- package/dist/{local-DM1WxzUX.d.ts → local-Cx655vG6.d.ts} +2 -2
- package/dist/local-ERVES7FZ.js +7 -0
- package/dist/{local-4ESDP4TU.js.map → local-ERVES7FZ.js.map} +1 -1
- package/dist/{store-CSxHlrov.d.ts → store-CbGrlMME.d.ts} +6 -1
- package/dist/widgets.d.ts +17 -3
- package/dist/widgets.js +213 -9
- package/dist/widgets.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-JGDX663H.js.map +0 -1
- package/dist/chunk-VBFMMR7Q.js.map +0 -1
- package/dist/local-4ESDP4TU.js +0 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as StoreError, B as BackupTarget, L as LocalStore, k as ReplicaState } from './store-
|
|
1
|
+
import { t as StoreError, B as BackupTarget, L as LocalStore, k as ReplicaState } from './store-CbGrlMME.js';
|
|
2
2
|
import { K as KV } from './cache-ilsK3Tki.js';
|
|
3
|
-
import { W as WebdavConfig, S as S3Config, D as DriveAuth } from './drive-
|
|
3
|
+
import { W as WebdavConfig, S as S3Config, D as DriveAuth } from './drive-DF08V8-L.js';
|
|
4
4
|
import { F as FlowStore } from './machine-ALMkT3mk.js';
|
|
5
5
|
|
|
6
6
|
type ConnectKind = 'drive' | 'file' | 'webdav' | 's3';
|
package/dist/flows.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { c as ConnectFlow, a as ConnectFlowOptions, h as ConnectFlowOutcome, b as ConnectKind, i as ConnectResolution, j as ConnectSnapshot, k as ConnectStep, C as ConnectTargets, l as Connector, F as FlowHost, J as JoinEngine, g as JoinFlow, m as JoinOutcome, n as JoinPreview, o as JoinSnapshot, p as JoinStep, q as REPLICA_ID, R as ReplicaFlow, r as ReplicaFlowOptions, s as ReplicaSnapshot, t as ReplicaStep, u as ShareBusy, d as ShareEngine, f as ShareFlow, e as ShareLevel, v as ShareLinkInfo, w as ShareMemberInfo, x as ShareSnapshot, y as connectFlow, z as joinFlow, A as replicaFlow, B as shareFlow } from './flows-
|
|
1
|
+
export { c as ConnectFlow, a as ConnectFlowOptions, h as ConnectFlowOutcome, b as ConnectKind, i as ConnectResolution, j as ConnectSnapshot, k as ConnectStep, C as ConnectTargets, l as Connector, F as FlowHost, J as JoinEngine, g as JoinFlow, m as JoinOutcome, n as JoinPreview, o as JoinSnapshot, p as JoinStep, q as REPLICA_ID, R as ReplicaFlow, r as ReplicaFlowOptions, s as ReplicaSnapshot, t as ReplicaStep, u as ShareBusy, d as ShareEngine, f as ShareFlow, e as ShareLevel, v as ShareLinkInfo, w as ShareMemberInfo, x as ShareSnapshot, y as connectFlow, z as joinFlow, A as replicaFlow, B as shareFlow } from './flows-dwgDgv6_.js';
|
|
2
2
|
export { F as FlowStore, w as withDeadline } from './machine-ALMkT3mk.js';
|
|
3
|
-
import './store-
|
|
3
|
+
import './store-CbGrlMME.js';
|
|
4
4
|
import './cache-ilsK3Tki.js';
|
|
5
5
|
import './sync.js';
|
|
6
|
-
import './drive-
|
|
6
|
+
import './drive-DF08V8-L.js';
|
package/dist/flows.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export { connectFlow, joinFlow, shareFlow } from './chunk-
|
|
2
|
-
import { connect, connect2, connect4, connect3, fromSession, fromSession2, fromSession3, fromSession4 } from './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import { makeMachine, toStoreError } from './chunk-
|
|
5
|
-
export { withDeadline } from './chunk-
|
|
6
|
-
import './chunk-
|
|
1
|
+
export { connectFlow, joinFlow, shareFlow } from './chunk-L6PT3NKO.js';
|
|
2
|
+
import { connect, connect2, connect4, connect3, fromSession, fromSession2, fromSession3, fromSession4 } from './chunk-JQ22IG2T.js';
|
|
3
|
+
import './chunk-5SII5YHE.js';
|
|
4
|
+
import { makeMachine, toStoreError } from './chunk-OIAXYI35.js';
|
|
5
|
+
export { withDeadline } from './chunk-OIAXYI35.js';
|
|
6
|
+
import './chunk-CT2HTWA7.js';
|
|
7
7
|
import './chunk-QBCU7OOP.js';
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
8
|
+
import './chunk-CM3HSBCE.js';
|
|
9
|
+
import './chunk-SFF7KKM4.js';
|
|
10
10
|
|
|
11
11
|
// src/flows/replica.ts
|
|
12
12
|
var REPLICA_ID = "replica";
|
package/dist/groups.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { generateIdentity } from './chunk-
|
|
2
|
-
export { GROUP_KEYING, generateIdentity, groupCryptoAvailable, keyId, newGroupId, openManifest, publicIdentity, signManifest } from './chunk-
|
|
1
|
+
import { generateIdentity } from './chunk-CT2HTWA7.js';
|
|
2
|
+
export { GROUP_KEYING, generateIdentity, groupCryptoAvailable, keyId, newGroupId, openManifest, publicIdentity, signManifest } from './chunk-CT2HTWA7.js';
|
|
3
3
|
import { seal, isEnvelope, unseal, newDeviceKey } from './chunk-QBCU7OOP.js';
|
|
4
|
-
import { assertKdfBounds, deriveKey, freshKdfParams } from './chunk-
|
|
5
|
-
import { SelfstoreError } from './chunk-
|
|
4
|
+
import { assertKdfBounds, deriveKey, freshKdfParams } from './chunk-CM3HSBCE.js';
|
|
5
|
+
import { SelfstoreError } from './chunk-SFF7KKM4.js';
|
|
6
6
|
|
|
7
7
|
// src/persistence/identity.ts
|
|
8
8
|
var VAULT_KEY = "groupVaultKey";
|
package/dist/households.d.ts
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { n as Snapshot, E as EncodeOptions, H as Header, f as PasswordPolicy, B as BackupTarget, q as StatusDescriptor, t as StoreError, c as LocalStoreState, L as LocalStore } from './store-
|
|
2
|
-
export { d as Mode, e as PasswordCheck, g as PasswordRequirement, S as SelfstoreError, l as SelfstoreErrorCode, m as Severity, o as SnapshotFile, p as StatusAction, s as StorageState, T as TargetKind, x as checkPasswordPolicy, C as errorLabelKey, G as isSelfstoreError } from './store-
|
|
1
|
+
import { n as Snapshot, E as EncodeOptions, H as Header, f as PasswordPolicy, B as BackupTarget, q as StatusDescriptor, t as StoreError, c as LocalStoreState, L as LocalStore } from './store-CbGrlMME.js';
|
|
2
|
+
export { d as Mode, e as PasswordCheck, g as PasswordRequirement, S as SelfstoreError, l as SelfstoreErrorCode, m as Severity, o as SnapshotFile, p as StatusAction, s as StorageState, T as TargetKind, x as checkPasswordPolicy, C as errorLabelKey, G as isSelfstoreError } from './store-CbGrlMME.js';
|
|
3
3
|
import { L as LocalCache, K as KV } from './cache-ilsK3Tki.js';
|
|
4
4
|
import { SyncConfig } from './sync.js';
|
|
5
|
-
import { D as DriveAuth, W as WebdavConfig, S as S3Config } from './drive-
|
|
6
|
-
export { c as changePassword, g as gisDriveAuth, p as pickFromDisk, s as saveToDisk } from './local-
|
|
5
|
+
import { D as DriveAuth, W as WebdavConfig, S as S3Config } from './drive-DF08V8-L.js';
|
|
6
|
+
export { c as changePassword, g as gisDriveAuth, p as pickFromDisk, s as saveToDisk } from './local-Cx655vG6.js';
|
|
7
7
|
|
|
8
8
|
declare const BACKUP_EXTENSION = ".zip";
|
|
9
9
|
declare const BACKUP_MIME = "application/zip";
|
|
@@ -24,6 +24,20 @@ declare class BackupBuilder {
|
|
|
24
24
|
constructor(snapshot: Snapshot, opts: EncodeOptions);
|
|
25
25
|
/** Encrypt the backup (AES-256-GCM over an Argon2id-derived key). */
|
|
26
26
|
encryptedWith(password: string): EncryptedBackupBuilder;
|
|
27
|
+
/**
|
|
28
|
+
* Read the backup back before handing it over, and throw VERIFY_FAILED if it
|
|
29
|
+
* does not hold what went in.
|
|
30
|
+
*
|
|
31
|
+
* A backup encrypted with a key nobody can reproduce, truncated, or built
|
|
32
|
+
* from an empty snapshot looks exactly like a good one: right name, right
|
|
33
|
+
* date, plausible size. The difference only shows up on the day of the
|
|
34
|
+
* disaster, when it is too late to make another. The only way to know is to
|
|
35
|
+
* open it, and it costs one decrypt of data the app already holds.
|
|
36
|
+
*
|
|
37
|
+
* Applies to every terminal below, so a host cannot verify and then write a
|
|
38
|
+
* different set of bytes by accident.
|
|
39
|
+
*/
|
|
40
|
+
verified(): BackupBuilder;
|
|
27
41
|
/** The backup as raw bytes. */
|
|
28
42
|
toBytes(): Promise<Uint8Array>;
|
|
29
43
|
/** The backup as a Blob, ready to upload or hand to a save dialog. */
|
|
@@ -42,6 +56,8 @@ declare class BackupBuilder {
|
|
|
42
56
|
}
|
|
43
57
|
declare class EncryptedBackupBuilder extends BackupBuilder {
|
|
44
58
|
constructor(snapshot: Snapshot, opts: EncodeOptions);
|
|
59
|
+
/** Same guarantee, keeping the encrypted chain's own links reachable. */
|
|
60
|
+
verified(): EncryptedBackupBuilder;
|
|
45
61
|
/** Brand the README shipped inside the encrypted ZIP. */
|
|
46
62
|
withReadme(text: string): EncryptedBackupBuilder;
|
|
47
63
|
/**
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { indexedDbCache, memoryCache, isLockableCache, createLocalStore } from './chunk-
|
|
2
|
-
export { gisDriveAuth } from './chunk-
|
|
3
|
-
import { saveToDisk } from './chunk-
|
|
4
|
-
export { pickFromDisk, saveToDisk } from './chunk-
|
|
1
|
+
import { indexedDbCache, memoryCache, isLockableCache, createLocalStore } from './chunk-ZU6I247L.js';
|
|
2
|
+
export { gisDriveAuth } from './chunk-ZU6I247L.js';
|
|
3
|
+
import { saveToDisk } from './chunk-XEIT5LET.js';
|
|
4
|
+
export { pickFromDisk, saveToDisk } from './chunk-XEIT5LET.js';
|
|
5
5
|
import './chunk-SKWHKM25.js';
|
|
6
|
-
import { fromSession, fromSession2, fromSession3, connect4, connect3, isSupported, connect2, connect } from './chunk-
|
|
7
|
-
import { restore } from './chunk-
|
|
8
|
-
export { BACKUP_EXTENSION, BACKUP_MIME, backup, changePassword, checkPasswordPolicy, restore } from './chunk-
|
|
9
|
-
import './chunk-
|
|
6
|
+
import { fromSession, fromSession2, fromSession3, connect4, connect3, isSupported, connect2, connect } from './chunk-JQ22IG2T.js';
|
|
7
|
+
import { restore } from './chunk-5SII5YHE.js';
|
|
8
|
+
export { BACKUP_EXTENSION, BACKUP_MIME, backup, changePassword, checkPasswordPolicy, restore } from './chunk-5SII5YHE.js';
|
|
9
|
+
import './chunk-CT2HTWA7.js';
|
|
10
10
|
import './chunk-QBCU7OOP.js';
|
|
11
|
-
import './chunk-
|
|
12
|
-
import { SelfstoreError } from './chunk-
|
|
13
|
-
export { SelfstoreError, errorLabelKey, isSelfstoreError } from './chunk-
|
|
11
|
+
import './chunk-CM3HSBCE.js';
|
|
12
|
+
import { SelfstoreError } from './chunk-SFF7KKM4.js';
|
|
13
|
+
export { SelfstoreError, errorLabelKey, isSelfstoreError } from './chunk-SFF7KKM4.js';
|
|
14
14
|
|
|
15
15
|
// src/simple/simple.ts
|
|
16
16
|
function idFieldOf(sync, collection) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as Snapshot, E as EncodeOptions, H as Header } from './store-
|
|
2
|
-
import { D as DriveAuth } from './drive-
|
|
1
|
+
import { n as Snapshot, E as EncodeOptions, H as Header } from './store-CbGrlMME.js';
|
|
2
|
+
import { D as DriveAuth } from './drive-DF08V8-L.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-XEIT5LET.js';
|
|
2
|
+
import './chunk-5SII5YHE.js';
|
|
3
|
+
import './chunk-CT2HTWA7.js';
|
|
4
|
+
import './chunk-CM3HSBCE.js';
|
|
5
|
+
import './chunk-SFF7KKM4.js';
|
|
6
|
+
//# sourceMappingURL=local-ERVES7FZ.js.map
|
|
7
|
+
//# sourceMappingURL=local-ERVES7FZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"local-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"local-ERVES7FZ.js"}
|
|
@@ -138,13 +138,18 @@ interface EncodeOptions {
|
|
|
138
138
|
dataKey: Uint8Array;
|
|
139
139
|
slots: KeySlot[];
|
|
140
140
|
};
|
|
141
|
+
/** Read the bytes back before returning them, and throw VERIFY_FAILED if
|
|
142
|
+
* they do not hold what went in. Carried in the options rather than on the
|
|
143
|
+
* builder so it survives every link of the chain: set on one link and lost
|
|
144
|
+
* by the next is the silent failure this whole feature exists to prevent. */
|
|
145
|
+
verify?: boolean;
|
|
141
146
|
/** Extra secrets that ALSO open this backup, each getting its own key slot
|
|
142
147
|
* around the same data key - typically a recovery code the user printed.
|
|
143
148
|
* Only meaningful alongside `password`. */
|
|
144
149
|
extraSecrets?: string[];
|
|
145
150
|
}
|
|
146
151
|
|
|
147
|
-
type SelfstoreErrorCode = 'BAD_FORMAT' | 'UNSUPPORTED_VERSION' | 'PASSWORD_REQUIRED' | 'DECRYPT_FAILED' | 'TOO_LARGE' | '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' | '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';
|
|
148
153
|
/**
|
|
149
154
|
* i18n key for an error code: lower-camel-cased under `error.`, e.g.
|
|
150
155
|
* 'error.authExpired'. The library ships the key, the app owns the copy;
|
package/dist/widgets.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { S as StoreLike, C as ConnectTargets, a as ConnectFlowOptions, b as ConnectKind, c as ConnectFlow, d as ShareEngine, e as ShareLevel, f as ShareFlow, J as JoinEngine, g as JoinFlow, R as ReplicaFlow } from './flows-
|
|
1
|
+
import { S as StoreLike, C as ConnectTargets, a as ConnectFlowOptions, b as ConnectKind, c as ConnectFlow, d as ShareEngine, e as ShareLevel, f as ShareFlow, J as JoinEngine, g as JoinFlow, R as ReplicaFlow } from './flows-dwgDgv6_.js';
|
|
2
2
|
import { BackupsManager } from './backups.js';
|
|
3
|
-
import './store-
|
|
3
|
+
import './store-CbGrlMME.js';
|
|
4
4
|
import './cache-ilsK3Tki.js';
|
|
5
5
|
import './sync.js';
|
|
6
|
-
import './drive-
|
|
6
|
+
import './drive-DF08V8-L.js';
|
|
7
7
|
import './machine-ALMkT3mk.js';
|
|
8
8
|
|
|
9
9
|
/** Flat key -> string map; widgets merge a partial override over EN defaults. */
|
|
@@ -18,12 +18,20 @@ declare abstract class FlowWidget extends HTMLElement {
|
|
|
18
18
|
protected unsub: (() => void) | null;
|
|
19
19
|
/** The widget's EN default strings; subclasses provide theirs. */
|
|
20
20
|
protected abstract defaults(): WidgetLabels;
|
|
21
|
+
/** Translations shipped with the widget, by language subtag ('fr'). A widget
|
|
22
|
+
* without any stays English until the host passes `labels`. */
|
|
23
|
+
protected packs(): Record<string, WidgetLabels>;
|
|
21
24
|
/** Build the current view into the given container. */
|
|
22
25
|
protected abstract view(into: HTMLElement): void;
|
|
23
26
|
constructor();
|
|
24
27
|
/** Partial override map, merged over the EN defaults (also the i18n hook). */
|
|
25
28
|
get labels(): WidgetLabels;
|
|
26
29
|
set labels(map: WidgetLabels);
|
|
30
|
+
/** The shipped translation for the page's language, if the widget has one.
|
|
31
|
+
* An explicit `lang` on the element (or on any ancestor) wins over the
|
|
32
|
+
* document's, which wins over the browser's, so a host that already sets
|
|
33
|
+
* `<html lang>` gets translated copy without writing a single label. */
|
|
34
|
+
private localized;
|
|
27
35
|
protected t(key: string): string;
|
|
28
36
|
/** A heading an empty-string label removes: labels = { 'share.title': '' }
|
|
29
37
|
* hides that heading (the host page already says it) without a fork.
|
|
@@ -83,6 +91,7 @@ declare class SelfstoreConnectElement extends FlowWidget {
|
|
|
83
91
|
#private;
|
|
84
92
|
static get observedAttributes(): string[];
|
|
85
93
|
protected defaults(): WidgetLabels;
|
|
94
|
+
protected packs(): Record<string, WidgetLabels>;
|
|
86
95
|
/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
|
|
87
96
|
get store(): StoreLike | null;
|
|
88
97
|
set store(v: StoreLike | null);
|
|
@@ -169,6 +178,7 @@ declare class SelfstoreShareElement extends FlowWidget {
|
|
|
169
178
|
#private;
|
|
170
179
|
static get observedAttributes(): string[];
|
|
171
180
|
protected defaults(): WidgetLabels;
|
|
181
|
+
protected packs(): Record<string, WidgetLabels>;
|
|
172
182
|
/** The app-side transport of links and memberships (see ShareEngine). */
|
|
173
183
|
get engine(): ShareEngine | null;
|
|
174
184
|
set engine(v: ShareEngine | null);
|
|
@@ -238,6 +248,7 @@ declare class SelfstoreJoinElement extends FlowWidget {
|
|
|
238
248
|
#private;
|
|
239
249
|
static get observedAttributes(): string[];
|
|
240
250
|
protected defaults(): WidgetLabels;
|
|
251
|
+
protected packs(): Record<string, WidgetLabels>;
|
|
241
252
|
get engine(): JoinEngine | null;
|
|
242
253
|
set engine(v: JoinEngine | null);
|
|
243
254
|
/** The invitation. Also settable as the `link` attribute. */
|
|
@@ -268,6 +279,7 @@ declare class SelfstoreStatusElement extends FlowWidget {
|
|
|
268
279
|
#private;
|
|
269
280
|
static get observedAttributes(): string[];
|
|
270
281
|
protected defaults(): WidgetLabels;
|
|
282
|
+
protected packs(): Record<string, WidgetLabels>;
|
|
271
283
|
/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
|
|
272
284
|
get store(): StoreLike | null;
|
|
273
285
|
set store(v: StoreLike | null);
|
|
@@ -310,6 +322,7 @@ declare class SelfstoreBackupsElement extends FlowWidget {
|
|
|
310
322
|
#private;
|
|
311
323
|
static get observedAttributes(): string[];
|
|
312
324
|
protected defaults(): WidgetLabels;
|
|
325
|
+
protected packs(): Record<string, WidgetLabels>;
|
|
313
326
|
/** The headless manager this panel drives (see 'selfstore/backups'). */
|
|
314
327
|
get manager(): BackupsManager | null;
|
|
315
328
|
set manager(v: BackupsManager | null);
|
|
@@ -447,6 +460,7 @@ declare class SelfstoreGateElement extends FlowWidget {
|
|
|
447
460
|
#private;
|
|
448
461
|
static get observedAttributes(): string[];
|
|
449
462
|
protected defaults(): WidgetLabels;
|
|
463
|
+
protected packs(): Record<string, WidgetLabels>;
|
|
450
464
|
/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
|
|
451
465
|
get store(): StoreLike | null;
|
|
452
466
|
set store(v: StoreLike | null);
|
package/dist/widgets.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { connectFlow, shareFlow, joinFlow } from './chunk-
|
|
2
|
-
import { isOpenSupported } from './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
1
|
+
import { connectFlow, shareFlow, joinFlow } from './chunk-L6PT3NKO.js';
|
|
2
|
+
import { isOpenSupported } from './chunk-JQ22IG2T.js';
|
|
3
|
+
import './chunk-5SII5YHE.js';
|
|
4
|
+
import './chunk-OIAXYI35.js';
|
|
5
|
+
import './chunk-CT2HTWA7.js';
|
|
6
6
|
import './chunk-QBCU7OOP.js';
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
7
|
+
import './chunk-CM3HSBCE.js';
|
|
8
|
+
import './chunk-SFF7KKM4.js';
|
|
9
9
|
|
|
10
10
|
// src/widgets/base.ts
|
|
11
11
|
var baseStyles = `
|
|
@@ -343,6 +343,11 @@ var FlowWidget = class extends HTMLElement {
|
|
|
343
343
|
body;
|
|
344
344
|
overrides = {};
|
|
345
345
|
unsub = null;
|
|
346
|
+
/** Translations shipped with the widget, by language subtag ('fr'). A widget
|
|
347
|
+
* without any stays English until the host passes `labels`. */
|
|
348
|
+
packs() {
|
|
349
|
+
return {};
|
|
350
|
+
}
|
|
346
351
|
constructor() {
|
|
347
352
|
super();
|
|
348
353
|
this.root = this.attachShadow({ mode: "open" });
|
|
@@ -360,8 +365,16 @@ var FlowWidget = class extends HTMLElement {
|
|
|
360
365
|
this.overrides = map ?? {};
|
|
361
366
|
this.rerender();
|
|
362
367
|
}
|
|
368
|
+
/** The shipped translation for the page's language, if the widget has one.
|
|
369
|
+
* An explicit `lang` on the element (or on any ancestor) wins over the
|
|
370
|
+
* document's, which wins over the browser's, so a host that already sets
|
|
371
|
+
* `<html lang>` gets translated copy without writing a single label. */
|
|
372
|
+
localized() {
|
|
373
|
+
const tag = this.closest("[lang]")?.getAttribute("lang") || document.documentElement.lang || navigator.language || "";
|
|
374
|
+
return this.packs()[tag.slice(0, 2).toLowerCase()] ?? {};
|
|
375
|
+
}
|
|
363
376
|
t(key) {
|
|
364
|
-
return this.overrides[key] ?? this.defaults()[key] ?? key;
|
|
377
|
+
return this.overrides[key] ?? this.localized()[key] ?? this.defaults()[key] ?? key;
|
|
365
378
|
}
|
|
366
379
|
/** A heading an empty-string label removes: labels = { 'share.title': '' }
|
|
367
380
|
* hides that heading (the host page already says it) without a fork.
|
|
@@ -374,7 +387,7 @@ var FlowWidget = class extends HTMLElement {
|
|
|
374
387
|
* ('error.targetUnavailable', ...), with a generic fallback. */
|
|
375
388
|
errorText(labelKey) {
|
|
376
389
|
if (labelKey) {
|
|
377
|
-
const specific = this.overrides[labelKey] ?? this.defaults()[labelKey];
|
|
390
|
+
const specific = this.overrides[labelKey] ?? this.localized()[labelKey] ?? this.defaults()[labelKey];
|
|
378
391
|
if (specific) return specific;
|
|
379
392
|
}
|
|
380
393
|
return this.t("error.generic");
|
|
@@ -470,6 +483,66 @@ var EN = {
|
|
|
470
483
|
"error.decryptFailed": "This backup could not be opened with that password.",
|
|
471
484
|
"error.badFormat": "This file does not look like a readable backup."
|
|
472
485
|
};
|
|
486
|
+
var FR = {
|
|
487
|
+
"connect.title": "O\xF9 enregistrer vos donn\xE9es ?",
|
|
488
|
+
"connect.recommended": "Recommand\xE9",
|
|
489
|
+
"connect.drive": "Google Drive",
|
|
490
|
+
"connect.drive.sub": "Disponible sur tous vos appareils",
|
|
491
|
+
"connect.file": "Un fichier sur cet appareil",
|
|
492
|
+
"connect.file.sub": "Hors ligne, le fichier reste chez vous",
|
|
493
|
+
"connect.file.new": "Nouvelle sauvegarde",
|
|
494
|
+
"connect.file.open": "Ouvrir un fichier existant",
|
|
495
|
+
"connect.webdav": "Mon serveur (WebDAV)",
|
|
496
|
+
"connect.webdav.sub": "Nextcloud, ownCloud, le v\xF4tre",
|
|
497
|
+
"connect.s3": "Mon bucket (S3)",
|
|
498
|
+
"connect.s3.sub": "Amazon S3, R2, B2, MinIO",
|
|
499
|
+
"connect.server": "Mon serveur",
|
|
500
|
+
"connect.server.sub": "WebDAV ou un bucket S3 que vous contr\xF4lez",
|
|
501
|
+
"connect.tab.webdav": "WebDAV",
|
|
502
|
+
"connect.tab.s3": "S3",
|
|
503
|
+
"connect.s3.endpoint": "URL du point d'acc\xE8s",
|
|
504
|
+
"connect.s3.region": "R\xE9gion",
|
|
505
|
+
"connect.s3.bucket": "Bucket",
|
|
506
|
+
"connect.s3.key": "Chemin du fichier",
|
|
507
|
+
"connect.s3.accessKeyId": "Identifiant de la cl\xE9 d'acc\xE8s",
|
|
508
|
+
"connect.s3.secret": "Cl\xE9 secr\xE8te",
|
|
509
|
+
"connect.s3.submit": "Connecter",
|
|
510
|
+
"connect.connecting": "Connexion en cours...",
|
|
511
|
+
"connect.connecting.drive": "Autorisez l'acc\xE8s dans la fen\xEAtre Google.",
|
|
512
|
+
"connect.cancel": "Annuler",
|
|
513
|
+
"connect.retry": "R\xE9essayer",
|
|
514
|
+
"connect.password.title": "Cette sauvegarde est prot\xE9g\xE9e",
|
|
515
|
+
"connect.password.hint": "Entrez son mot de passe pour l\u2019ouvrir.",
|
|
516
|
+
"connect.password.placeholder": "Mot de passe",
|
|
517
|
+
"connect.password.wrong": "Mot de passe incorrect. R\xE9essayez.",
|
|
518
|
+
"connect.password.submit": "Ouvrir",
|
|
519
|
+
"connect.password.show": "Afficher le mot de passe",
|
|
520
|
+
"connect.password.hide": "Masquer le mot de passe",
|
|
521
|
+
"connect.password.forgot": "Mot de passe oubli\xE9 ?",
|
|
522
|
+
"connect.password.forgot.warn": "Sans le mot de passe, cette sauvegarde ne peut pas \xEAtre ouverte. Vous pouvez repartir d\u2019une sauvegarde vide : l\u2019ancienne sera perdue d\xE9finitivement.",
|
|
523
|
+
"connect.password.forgot.confirm": "Remplacer la sauvegarde",
|
|
524
|
+
"connect.password.forgot.back": "Retour",
|
|
525
|
+
"connect.conflict.title": "Cette destination contient d\xE9j\xE0 une sauvegarde",
|
|
526
|
+
"connect.conflict.merge": "Tout garder",
|
|
527
|
+
"connect.conflict.merge.sub": "R\xE9unir la sauvegarde et les donn\xE9es de cet appareil",
|
|
528
|
+
"connect.conflict.resume": "Utiliser la sauvegarde",
|
|
529
|
+
"connect.conflict.resume.sub": "Cet appareil adopte la sauvegarde existante",
|
|
530
|
+
"connect.conflict.replace": "Remplacer la sauvegarde",
|
|
531
|
+
"connect.conflict.replace.sub": "Les donn\xE9es de cet appareil \xE9crasent la sauvegarde",
|
|
532
|
+
"connect.webdav.url": "URL du serveur",
|
|
533
|
+
"connect.webdav.user": "Identifiant",
|
|
534
|
+
"connect.webdav.password": "Mot de passe",
|
|
535
|
+
"connect.webdav.submit": "Connecter",
|
|
536
|
+
"connect.webdav.signup": "Cr\xE9er un compte",
|
|
537
|
+
"connect.webdav.help.more": "Comment faire ?",
|
|
538
|
+
"connect.done": "Connect\xE9. Vos donn\xE9es sont enregistr\xE9es.",
|
|
539
|
+
"connect.done.manual": "Mode fichier : exportez apr\xE8s chaque changement.",
|
|
540
|
+
"error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez.",
|
|
541
|
+
"error.targetUnavailable": "La destination ne r\xE9pond pas. R\xE9essayez dans un instant.",
|
|
542
|
+
"error.authExpired": "Acc\xE8s expir\xE9 : reconnectez-vous pour continuer.",
|
|
543
|
+
"error.decryptFailed": "Cette sauvegarde n'a pas pu \xEAtre ouverte avec ce mot de passe.",
|
|
544
|
+
"error.badFormat": "Ce fichier ne ressemble pas \xE0 une sauvegarde lisible."
|
|
545
|
+
};
|
|
473
546
|
var EYE_SHOW = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-8 10-8 10 8 10 8-3 8-10 8-10-8-10-8Z"/><circle cx="12" cy="12" r="3"/></svg>';
|
|
474
547
|
var EYE_HIDE = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 10 8 10 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><path d="M6.61 6.61A18.45 18.45 0 0 0 2 12s3 8 10 8a9.12 9.12 0 0 0 5.39-1.61"/><line x1="2" y1="2" x2="22" y2="22"/></svg>';
|
|
475
548
|
function eyeIcon(visible) {
|
|
@@ -508,6 +581,9 @@ var SelfstoreConnectElement = class extends FlowWidget {
|
|
|
508
581
|
defaults() {
|
|
509
582
|
return EN;
|
|
510
583
|
}
|
|
584
|
+
packs() {
|
|
585
|
+
return { fr: FR };
|
|
586
|
+
}
|
|
511
587
|
/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
|
|
512
588
|
get store() {
|
|
513
589
|
return this.#store;
|
|
@@ -1181,6 +1257,26 @@ var EN2 = {
|
|
|
1181
1257
|
"error.generic": "That did not work. Check the connection and try again.",
|
|
1182
1258
|
"error.targetUnavailable": "The share service did not answer. Try again in a moment."
|
|
1183
1259
|
};
|
|
1260
|
+
var FR2 = {
|
|
1261
|
+
"share.title": "Partage",
|
|
1262
|
+
"share.create.read": "Cr\xE9er un lien de lecture",
|
|
1263
|
+
"share.create.write": "Cr\xE9er un lien de modification",
|
|
1264
|
+
"share.creating": "Cr\xE9ation...",
|
|
1265
|
+
"share.level.read": "Peut consulter",
|
|
1266
|
+
"share.level.write": "Peut modifier",
|
|
1267
|
+
"share.copy": "Copier",
|
|
1268
|
+
"share.copied": "Copi\xE9",
|
|
1269
|
+
"share.revoke": "R\xE9voquer",
|
|
1270
|
+
"share.members": "Personnes ayant acc\xE8s",
|
|
1271
|
+
"share.member.you": "vous",
|
|
1272
|
+
"share.member.owner": "propri\xE9taire",
|
|
1273
|
+
"share.remove": "Retirer",
|
|
1274
|
+
"share.stop": "Arr\xEAter le partage",
|
|
1275
|
+
"share.empty": "Personne d'autre n'a acc\xE8s pour le moment.",
|
|
1276
|
+
"share.stale": "Connexion instable : cette vue est peut-\xEAtre en retard.",
|
|
1277
|
+
"error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez.",
|
|
1278
|
+
"error.targetUnavailable": "Le service de partage ne r\xE9pond pas. R\xE9essayez dans un instant."
|
|
1279
|
+
};
|
|
1184
1280
|
var isOff = (v) => v != null && ["off", "false", "no", "0"].includes(v.trim().toLowerCase());
|
|
1185
1281
|
var SelfstoreShareElement = class extends FlowWidget {
|
|
1186
1282
|
static get observedAttributes() {
|
|
@@ -1201,6 +1297,9 @@ var SelfstoreShareElement = class extends FlowWidget {
|
|
|
1201
1297
|
defaults() {
|
|
1202
1298
|
return EN2;
|
|
1203
1299
|
}
|
|
1300
|
+
packs() {
|
|
1301
|
+
return { fr: FR2 };
|
|
1302
|
+
}
|
|
1204
1303
|
/** The app-side transport of links and memberships (see ShareEngine). */
|
|
1205
1304
|
get engine() {
|
|
1206
1305
|
return this.#engine;
|
|
@@ -1494,6 +1593,22 @@ var EN3 = {
|
|
|
1494
1593
|
"error.generic": "That did not work. Check the connection and try again.",
|
|
1495
1594
|
"error.targetUnavailable": "The invitation could not be read. Try again in a moment."
|
|
1496
1595
|
};
|
|
1596
|
+
var FR3 = {
|
|
1597
|
+
"join.previewing": "Lecture de l'invitation...",
|
|
1598
|
+
"join.title": "Vous \xEAtes invit\xE9",
|
|
1599
|
+
"join.from": "Partag\xE9 par {from}",
|
|
1600
|
+
"join.level.read": "Vous pourrez consulter.",
|
|
1601
|
+
"join.level.write": "Vous pourrez consulter et modifier.",
|
|
1602
|
+
"join.accept": "Rejoindre",
|
|
1603
|
+
"join.joining": "Connexion en cours...",
|
|
1604
|
+
"join.joined": "C'est fait. Les donn\xE9es partag\xE9es se synchronisent sur cet appareil.",
|
|
1605
|
+
"join.mismatch": "Cet appareil suit d\xE9j\xE0 un autre partage. Quittez-le d'abord, ou utilisez un autre profil.",
|
|
1606
|
+
"join.noInvite": "Cette invitation a d\xE9j\xE0 servi, ou elle vise un autre compte.",
|
|
1607
|
+
"join.switchAccount": "Utiliser un autre compte",
|
|
1608
|
+
"join.retry": "R\xE9essayer",
|
|
1609
|
+
"error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez.",
|
|
1610
|
+
"error.targetUnavailable": "L'invitation n'a pas pu \xEAtre lue. R\xE9essayez dans un instant."
|
|
1611
|
+
};
|
|
1497
1612
|
var SelfstoreJoinElement = class extends FlowWidget {
|
|
1498
1613
|
static get observedAttributes() {
|
|
1499
1614
|
return ["link", "variant"];
|
|
@@ -1506,6 +1621,9 @@ var SelfstoreJoinElement = class extends FlowWidget {
|
|
|
1506
1621
|
defaults() {
|
|
1507
1622
|
return EN3;
|
|
1508
1623
|
}
|
|
1624
|
+
packs() {
|
|
1625
|
+
return { fr: FR3 };
|
|
1626
|
+
}
|
|
1509
1627
|
get engine() {
|
|
1510
1628
|
return this.#engine;
|
|
1511
1629
|
}
|
|
@@ -1717,6 +1835,19 @@ var EN4 = {
|
|
|
1717
1835
|
"status.action.reconnect": "Reconnect",
|
|
1718
1836
|
"status.action.unlock": "Unlock"
|
|
1719
1837
|
};
|
|
1838
|
+
var FR4 = {
|
|
1839
|
+
"status.ephemeral": "Rien n'est enregistr\xE9",
|
|
1840
|
+
"status.cacheOnly": "Sur cet appareil seulement",
|
|
1841
|
+
"status.saving": "Enregistrement...",
|
|
1842
|
+
"status.saved": "Sauvegarde \xE0 jour",
|
|
1843
|
+
"status.needsAttention": "Acc\xE8s \xE0 retrouver",
|
|
1844
|
+
"status.locked": "Sauvegarde verrouill\xE9e",
|
|
1845
|
+
"status.pendingDownload": "Modifications \xE0 exporter",
|
|
1846
|
+
"status.action.choose-destination": "Choisir une sauvegarde",
|
|
1847
|
+
"status.action.download": "Exporter",
|
|
1848
|
+
"status.action.reconnect": "Retrouver l'acc\xE8s",
|
|
1849
|
+
"status.action.unlock": "D\xE9verrouiller"
|
|
1850
|
+
};
|
|
1720
1851
|
var SelfstoreStatusElement = class extends FlowWidget {
|
|
1721
1852
|
static get observedAttributes() {
|
|
1722
1853
|
return ["variant"];
|
|
@@ -1727,6 +1858,9 @@ var SelfstoreStatusElement = class extends FlowWidget {
|
|
|
1727
1858
|
defaults() {
|
|
1728
1859
|
return EN4;
|
|
1729
1860
|
}
|
|
1861
|
+
packs() {
|
|
1862
|
+
return { fr: FR4 };
|
|
1863
|
+
}
|
|
1730
1864
|
/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
|
|
1731
1865
|
get store() {
|
|
1732
1866
|
return this.#store;
|
|
@@ -1885,6 +2019,63 @@ var EN5 = {
|
|
|
1885
2019
|
"backups.replica.s3.secret": "Secret access key",
|
|
1886
2020
|
"error.generic": "That did not work. Check the connection and try again."
|
|
1887
2021
|
};
|
|
2022
|
+
var FR5 = {
|
|
2023
|
+
"backups.mine.heading": "Sauvegardes",
|
|
2024
|
+
"backups.mine.personal": "Sauvegarde principale",
|
|
2025
|
+
"backups.active": "Active",
|
|
2026
|
+
"backups.pill.encrypted": "Chiffr\xE9e",
|
|
2027
|
+
"backups.pill.plain": "Non chiffr\xE9e",
|
|
2028
|
+
"backups.pill.shared": "Partag\xE9e",
|
|
2029
|
+
"backups.pill.private": "Non partag\xE9e",
|
|
2030
|
+
"backups.modified": "modifi\xE9e {when}",
|
|
2031
|
+
"backups.replaceHint": "L'ouvrir remplace les donn\xE9es de cet appareil.",
|
|
2032
|
+
"backups.loading": "Ouverture...",
|
|
2033
|
+
"backups.menu": "Actions",
|
|
2034
|
+
"backups.open": "Ouvrir",
|
|
2035
|
+
"backups.encrypt": "Chiffrer",
|
|
2036
|
+
"backups.share": "Partager",
|
|
2037
|
+
"backups.rename": "Renommer",
|
|
2038
|
+
"backups.delete": "Supprimer",
|
|
2039
|
+
"backups.new": "+ Nouvelle sauvegarde",
|
|
2040
|
+
"backups.newTitle": "Nouvelle sauvegarde",
|
|
2041
|
+
"backups.startsBlank": "Elle d\xE9marre vide.",
|
|
2042
|
+
"backups.namePh": "Son nom",
|
|
2043
|
+
"backups.willBe": "Fichier : {file}",
|
|
2044
|
+
"backups.taken": "Ce nom est d\xE9j\xE0 pris.",
|
|
2045
|
+
"backups.create": "Cr\xE9er",
|
|
2046
|
+
"backups.renameTitle": "Renommer cette sauvegarde",
|
|
2047
|
+
"backups.pwHint": "Cette sauvegarde est prot\xE9g\xE9e : entrez son mot de passe.",
|
|
2048
|
+
"backups.pwShow": "Afficher le mot de passe",
|
|
2049
|
+
"backups.pwHide": "Masquer le mot de passe",
|
|
2050
|
+
"backups.cancel": "Annuler",
|
|
2051
|
+
"backups.shared.heading": "Partag\xE9es avec moi",
|
|
2052
|
+
"backups.shared.by": "Partag\xE9e par {who}",
|
|
2053
|
+
"backups.shared.leave": "Quitter",
|
|
2054
|
+
"backups.replica.add": "Seconde sauvegarde",
|
|
2055
|
+
"backups.replica.title": "Seconde sauvegarde",
|
|
2056
|
+
"backups.replica.intro": "Le m\xEAme fichier chiffr\xE9, \xE9crit aussi \xE0 un second endroit. Si l\u2019un tombe, l\u2019autre reste.",
|
|
2057
|
+
"backups.replica.dest.drive": "Google Drive",
|
|
2058
|
+
"backups.replica.dest.file": "Un fichier sur cet appareil",
|
|
2059
|
+
"backups.replica.dest.webdav": "Un serveur WebDAV",
|
|
2060
|
+
"backups.replica.dest.s3": "Un bucket S3",
|
|
2061
|
+
"backups.replica.card": "Seconde sauvegarde - {label}",
|
|
2062
|
+
"backups.replica.uptodate": "\xC0 jour, {when}",
|
|
2063
|
+
"backups.replica.pending": "Premi\xE8re copie au prochain enregistrement",
|
|
2064
|
+
"backups.replica.error": "Injoignable - nouvel essai au prochain enregistrement",
|
|
2065
|
+
"backups.replica.remove": "Retirer",
|
|
2066
|
+
"backups.replica.save": "Ajouter la copie",
|
|
2067
|
+
"backups.replica.webdav.url": "URL du fichier sur le serveur (https://hote:8443/dav/fichier.zip)",
|
|
2068
|
+
"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.",
|
|
2069
|
+
"backups.replica.webdav.user": "Identifiant",
|
|
2070
|
+
"backups.replica.webdav.password": "Mot de passe",
|
|
2071
|
+
"backups.replica.s3.endpoint": "URL du point d'acc\xE8s",
|
|
2072
|
+
"backups.replica.s3.region": "R\xE9gion",
|
|
2073
|
+
"backups.replica.s3.bucket": "Bucket",
|
|
2074
|
+
"backups.replica.s3.key": "Chemin du fichier",
|
|
2075
|
+
"backups.replica.s3.accessKeyId": "Identifiant de la cl\xE9 d'acc\xE8s",
|
|
2076
|
+
"backups.replica.s3.secret": "Cl\xE9 secr\xE8te",
|
|
2077
|
+
"error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez."
|
|
2078
|
+
};
|
|
1888
2079
|
var isOff2 = (v) => v != null && ["off", "false", "no", "0"].includes(v.trim().toLowerCase());
|
|
1889
2080
|
var EYE_OPEN = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>';
|
|
1890
2081
|
var EYE_SHUT = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m3 3 18 18"/><path d="M10.6 5.1A10.9 10.9 0 0 1 12 5c6.5 0 10 7 10 7a17.4 17.4 0 0 1-3.4 4.4M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a10.7 10.7 0 0 0 5.4-1.4"/></svg>';
|
|
@@ -1939,6 +2130,9 @@ var SelfstoreBackupsElement = class extends FlowWidget {
|
|
|
1939
2130
|
defaults() {
|
|
1940
2131
|
return EN5;
|
|
1941
2132
|
}
|
|
2133
|
+
packs() {
|
|
2134
|
+
return { fr: FR5 };
|
|
2135
|
+
}
|
|
1942
2136
|
/** The headless manager this panel drives (see 'selfstore/backups'). */
|
|
1943
2137
|
get manager() {
|
|
1944
2138
|
return this.#manager;
|
|
@@ -2958,6 +3152,13 @@ var EN6 = {
|
|
|
2958
3152
|
"gate.defer": "Later - keep it in this browser only",
|
|
2959
3153
|
"gate.defer.note": "Data kept only in this browser is lost if its storage is cleared."
|
|
2960
3154
|
};
|
|
3155
|
+
var FR6 = {
|
|
3156
|
+
"gate.title": "O\xF9 enregistrer vos donn\xE9es ?",
|
|
3157
|
+
"gate.hint": "Elles sont chiffr\xE9es sur cet appareil. Choisissez une sauvegarde : tout y sera enregistr\xE9 automatiquement.",
|
|
3158
|
+
"gate.fine": "",
|
|
3159
|
+
"gate.defer": "Plus tard - garder sur cet appareil seulement",
|
|
3160
|
+
"gate.defer.note": "Sans sauvegarde, les donn\xE9es disparaissent si le stockage de cet appareil est vid\xE9."
|
|
3161
|
+
};
|
|
2961
3162
|
var GATE_STYLES = `
|
|
2962
3163
|
:host { display: contents; }
|
|
2963
3164
|
[part~='gate'] {
|
|
@@ -3017,6 +3218,9 @@ var SelfstoreGateElement = class extends FlowWidget {
|
|
|
3017
3218
|
defaults() {
|
|
3018
3219
|
return EN6;
|
|
3019
3220
|
}
|
|
3221
|
+
packs() {
|
|
3222
|
+
return { fr: FR6 };
|
|
3223
|
+
}
|
|
3020
3224
|
/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
|
|
3021
3225
|
get store() {
|
|
3022
3226
|
return this.#store;
|