feat: settings modal with database export and import
All checks were successful
CI / test (pull_request) Successful in 12s
CI / build-dev (pull_request) Has been skipped

Adds a gear button to the nav that opens a settings modal with:
- Export: GET /api/export returns all instances as a JSON backup file
  with a Content-Disposition attachment header
- Import: POST /api/import validates and bulk-replaces all instances;
  client uses FileReader to POST the parsed JSON, with a confirm dialog
  before destructive replace

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-28 14:10:59 -04:00
parent 20d8a13375
commit af207339a4
7 changed files with 230 additions and 4 deletions

View File

@@ -70,6 +70,19 @@ nav {
.nav-sep { flex: 1; }
.nav-btn {
background: none;
border: 1px solid var(--border2);
color: var(--text2);
border-radius: 6px;
padding: 4px 8px;
font-size: 14px;
cursor: pointer;
margin-left: 10px;
line-height: 1;
}
.nav-btn:hover { border-color: var(--accent); color: var(--accent); }
.nav-divider { color: var(--border2); }
.nav-status {
@@ -615,6 +628,31 @@ select:focus { border-color: var(--accent); }
.confirm-actions { display: flex; justify-content: flex-end; gap: 10px; }
/* ── SETTINGS MODAL ── */
.settings-section { padding: 16px 0; border-bottom: 1px solid var(--border); }
.settings-section:last-child { border-bottom: none; padding-bottom: 0; }
.settings-section-title {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--text3);
margin-bottom: 8px;
}
.settings-desc { font-size: 12px; color: var(--text2); margin: 0 0 14px; line-height: 1.6; }
.import-row { display: flex; gap: 10px; align-items: center; }
.import-file-input { flex: 1; }
.btn-secondary {
background: var(--bg3);
border-color: var(--border2);
color: var(--text);
}
.btn-secondary:hover { border-color: var(--accent); color: var(--accent); }
.btn-danger { background: var(--red2); border-color: var(--red); color: var(--text); }
.btn-danger:hover { background: var(--red); }
/* ── SCROLLBAR ── */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: var(--bg); }