-
Settings
-
- {/* ─── Theme ─────────────────────────────────────────────────────── */}
-
-
Appearance
-
-
-
-
-
-
-
-
- {(['light', 'dark'] as ThemeMode[]).map((m) => (
-
- ))}
-
-
-
-
- {/* Theme swatches */}
-
- {THEME_NAMES.map((t) => (
- setTheme(t.id, settings.mode)}
- />
- ))}
-
-
-
- {/* ─── Defaults ──────────────────────────────────────────────────── */}
-
-
Defaults
-
-
- setDefaultRate(parseFloat(e.target.value) || 0)}
- />
-
-
-
- {/* ─── Storage ───────────────────────────────────────────────────── */}
-
-
Data Storage
-
-
- {(['cookie', 'file', 'cloud'] as StorageMode[]).map((m) => (
-
- ))}
-
-
- {settings.storageMode === 'cookie' && (
-
- Encrypted data is chunked into browser cookies. Survives page refresh
- but tied to this browser on this device.
-
- )}
-
- {settings.storageMode === 'file' && (
-
- Each save triggers a download of an encrypted .t99 file.
- You can import it on any device.
-
- )}
-
- {/* Cloud config */}
-
-
- setCloudUrl(e.target.value)}
- placeholder="https://your-server.example.com"
- />
-
- {cloudAuth.token && (
-
- ✓ Authenticated as {cloudAuth.email} via {cloudAuth.provider}
-
- )}
-
- Your data is encrypted with your password BEFORE it reaches the cloud.
- The server only ever sees encrypted blobs.
-
-
-
- {/* ─── Import / Export ───────────────────────────────────────────── */}
-
-
Import / Export
-
-
-
-
-
-
- setImportFileObj(e.target.files?.[0] ?? null)}
- />
-
-
-
- setImportPwd(e.target.value)}
- />
-
-
-
-
-
- {/* ─── Account ───────────────────────────────────────────────────── */}
-
-
Account
-
-
-
- );
-}
-
-function ThemeSwatch({
- theme, mode, label, active, onClick,
-}: {
- theme: ThemeName; mode: ThemeMode; label: string; active: boolean; onClick: () => void;
-}) {
- return (
-