diff --git a/src/lib/settings/categories/AdvancedSettings.svelte b/src/lib/settings/categories/AdvancedSettings.svelte index df3d473..a82051e 100644 --- a/src/lib/settings/categories/AdvancedSettings.svelte +++ b/src/lib/settings/categories/AdvancedSettings.svelte @@ -249,73 +249,41 @@ .muted { color: var(--ctp-overlay0); } .available { color: var(--ctp-green); font-weight: 600; } .empty { font-size: 0.75rem; color: var(--ctp-overlay0); margin: 0.25rem 0; } - - input, .ta { - padding: 0.375rem 0.625rem; background: var(--ctp-surface0); border: 1px solid var(--ctp-surface1); - border-radius: 0.25rem; color: var(--ctp-text); font-size: 0.8rem; - } + input, .ta { padding: 0.375rem 0.625rem; background: var(--ctp-surface0); border: 1px solid var(--ctp-surface1); border-radius: 0.25rem; color: var(--ctp-text); font-size: 0.8rem; } .ta { font-family: var(--term-font-family, monospace); resize: vertical; min-height: 3rem; line-height: 1.4; } .ta:focus, input:focus { outline: none; border-color: var(--ctp-blue); } .ta::placeholder, input::placeholder { color: var(--ctp-overlay0); } - .toggle-row { display: flex; align-items: center; justify-content: space-between; cursor: pointer; } - .toggle { - position: relative; width: 2rem; height: 1.125rem; border: none; border-radius: 0.5625rem; - background: var(--ctp-surface1); cursor: pointer; transition: background 0.2s; padding: 0; flex-shrink: 0; - } + .toggle { position: relative; width: 2rem; height: 1.125rem; border: none; border-radius: 0.5625rem; background: var(--ctp-surface1); cursor: pointer; transition: background 0.2s; padding: 0; flex-shrink: 0; } .toggle.on { background: var(--ctp-blue); } - .thumb { - position: absolute; top: 0.125rem; left: 0.125rem; width: 0.875rem; height: 0.875rem; - border-radius: 50%; background: var(--ctp-text); transition: transform 0.2s; - } + .thumb { position: absolute; top: 0.125rem; left: 0.125rem; width: 0.875rem; height: 0.875rem; border-radius: 50%; background: var(--ctp-text); transition: transform 0.2s; } .toggle.on .thumb { transform: translateX(0.875rem); } - .seg-group { display: flex; border-radius: 0.25rem; overflow: hidden; border: 1px solid var(--ctp-surface1); } - .seg-btn { - flex: 1; padding: 0.25rem 0.5rem; border: none; background: var(--ctp-surface0); - color: var(--ctp-overlay1); font-size: 0.7rem; font-weight: 500; cursor: pointer; transition: background 0.12s, color 0.12s; - text-transform: capitalize; - } + .seg-btn { flex: 1; padding: 0.25rem 0.5rem; border: none; background: var(--ctp-surface0); color: var(--ctp-overlay1); font-size: 0.7rem; font-weight: 500; cursor: pointer; transition: background 0.12s, color 0.12s; text-transform: capitalize; } .seg-btn:not(:last-child) { border-right: 1px solid var(--ctp-surface1); } .seg-btn:hover { background: var(--ctp-surface1); color: var(--ctp-subtext1); } .seg-btn.active { background: color-mix(in srgb, var(--ctp-blue) 20%, var(--ctp-surface0)); color: var(--ctp-blue); font-weight: 600; } - .num-row { display: flex; align-items: center; gap: 0.25rem; } - .num { - width: 4.5rem; padding: 0.375rem 0.625rem; background: var(--ctp-surface0); border: 1px solid var(--ctp-surface1); - border-radius: 0.25rem; color: var(--ctp-text); font-size: 0.8rem; -moz-appearance: textfield; - } + .num { width: 4.5rem; padding: 0.375rem 0.625rem; background: var(--ctp-surface0); border: 1px solid var(--ctp-surface1); border-radius: 0.25rem; color: var(--ctp-text); font-size: 0.8rem; -moz-appearance: textfield; } .num::-webkit-inner-spin-button, .num::-webkit-outer-spin-button { -webkit-appearance: none; } .unit { font-size: 0.7rem; color: var(--ctp-overlay0); } - - .btn { - padding: 0.375rem 0.75rem; background: var(--ctp-surface0); border: 1px solid var(--ctp-surface1); - border-radius: 0.25rem; color: var(--ctp-text); font-size: 0.75rem; cursor: pointer; transition: background 0.12s; - } + .btn { padding: 0.375rem 0.75rem; background: var(--ctp-surface0); border: 1px solid var(--ctp-surface1); border-radius: 0.25rem; color: var(--ctp-text); font-size: 0.75rem; cursor: pointer; transition: background 0.12s; } .btn:hover { background: var(--ctp-surface1); } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-row { display: flex; gap: 0.5rem; } - .plug-list { display: flex; flex-direction: column; gap: 0.375rem; } .plug-row { background: var(--ctp-surface0); border: 1px solid var(--ctp-surface1); border-radius: 0.375rem; padding: 0.5rem 0.625rem; } .plug-top { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; } .plug-info { display: flex; align-items: center; gap: 0.375rem; flex: 1; min-width: 0; } .plug-name { font-size: 0.8rem; font-weight: 600; color: var(--ctp-text); white-space: nowrap; } .plug-ver { font-size: 0.65rem; color: var(--ctp-overlay0); } - .plug-badge { - padding: 0.0625rem 0.375rem; border-radius: 0.75rem; font-size: 0.575rem; font-weight: 600; - text-transform: uppercase; letter-spacing: 0.03em; white-space: nowrap; - } + .plug-badge { padding: 0.0625rem 0.375rem; border-radius: 0.75rem; font-size: 0.575rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; white-space: nowrap; } .plug-badge.loaded { background: color-mix(in srgb, var(--ctp-green) 15%, transparent); color: var(--ctp-green); } .plug-badge.err { background: color-mix(in srgb, var(--ctp-red) 15%, transparent); color: var(--ctp-red); } .plug-badge.off { background: color-mix(in srgb, var(--ctp-overlay0) 15%, transparent); color: var(--ctp-overlay0); } .plug-badge.disc { background: color-mix(in srgb, var(--ctp-blue) 15%, transparent); color: var(--ctp-blue); } .plug-desc { font-size: 0.7rem; color: var(--ctp-overlay1); margin: 0.25rem 0 0; } .plug-err { font-size: 0.65rem; color: var(--ctp-red); margin: 0.25rem 0 0; } - .hint-block { font-size: 0.75rem; color: var(--ctp-overlay1); margin: 0; line-height: 1.5; } - .hint-block code { - padding: 0.125rem 0.375rem; background: var(--ctp-surface0); border-radius: 0.1875rem; - font-family: var(--term-font-family, monospace); font-size: 0.7rem; color: var(--ctp-text); - } + .hint-block code { padding: 0.125rem 0.375rem; background: var(--ctp-surface0); border-radius: 0.1875rem; font-family: var(--term-font-family, monospace); font-size: 0.7rem; color: var(--ctp-text); } diff --git a/src/lib/settings/categories/SecuritySettings.svelte b/src/lib/settings/categories/SecuritySettings.svelte new file mode 100644 index 0000000..f666031 --- /dev/null +++ b/src/lib/settings/categories/SecuritySettings.svelte @@ -0,0 +1,420 @@ + + + + + +
+

Secrets

+
+ + {keyringAvailable ? 'System keyring available' : 'System keyring unavailable'} +
+ + {#if !keyringAvailable} +
+ + System keyring not available. Secrets cannot be stored securely. +
+ {:else} + {#if storedKeys.length > 0} +
+ {#each storedKeys as key} +
+
+ {getSecretKeyLabel(key)} + {key} +
+
+ {#if revealedKey === key} + + {:else} + {'\u25CF'.repeat(8)} + {/if} +
+
+ + +
+
+ {/each} +
+ {/if} + +
+
+
+ + {#if secretsKeyDropdownOpen} + + {/if} +
+ + +
+
+ {/if} +
+ + +
+

Branch Policies Pro

+
+ {#if branchPolicies.length > 0} +
+ {#each branchPolicies as policy, idx} +
+ {policy.pattern} + {policy.action} + +
+ {/each} +
+ {/if} +
+
+ { newBranchPattern = (e.target as HTMLInputElement).value; }} /> +
+ + +
+ +
+
+
+
+ + +
+

Privacy & Telemetry

+
+
+ + Send anonymous usage data to help improve BTerminal +
+
+ +
+ { const n = parseInt((e.target as HTMLInputElement).value, 10); if (!isNaN(n) && n >= 1 && n <= 365) { retentionDays = n; save('data_retention_days', String(n)); } }} /> + days +
+ How long to keep session history and logs +
+
+
+ +