Add dark mode palettes + Woodpecker CI pipeline

- Add 2 dark palettes (Nuit, Ocean) to DisplaySettings with full SVG
  theme tokens — all hardcoded SVG colors (grids, legends, text fills,
  pills, dot strokes, drag handles) replaced with reactive bindings
- Update scoped CSS to use var(--color-*) and var(--svg-*) throughout
- Add Woodpecker CI pipeline (.woodpecker.yml): build → docker push → deploy
- Add multi-stage Dockerfiles for backend (Python) and frontend (Nuxt)
- Add production docker-compose with Traefik labels + dev override
- Remove old single-stage Dockerfiles and root docker-compose.yml
- Update Makefile with docker-dev target
- Exclude data files (pdf, xls, ipynb) from git

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-02-23 21:36:31 +01:00
parent 5dc42af33e
commit 4ba5e78e58
16 changed files with 510 additions and 176 deletions

View File

@@ -15,6 +15,12 @@
--shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
--chart-scale: 1;
/* SVG theme tokens (overridden by DisplaySettings palettes) */
--svg-plot-bg: #f8fafc;
--svg-grid: #e2e8f0;
--svg-legend-bg: white;
--svg-text: #334155;
--svg-text-light: #64748b;
}
* {
@@ -235,6 +241,61 @@ a:hover {
to { transform: rotate(360deg); }
}
/* ── Dark mode overrides ── */
.palette-dark body,
.palette-dark {
color-scheme: dark;
}
.palette-dark .card {
background: var(--color-surface);
border-color: var(--color-border);
}
.palette-dark .btn-secondary {
background: var(--color-surface);
color: var(--color-text);
border-color: var(--color-border);
}
.palette-dark .btn-secondary:hover {
background: var(--color-bg);
}
.palette-dark .form-input {
background: var(--color-surface);
color: var(--color-text);
border-color: var(--color-border);
}
.palette-dark .alert-info { background: #1e3a5f; color: #93c5fd; border-color: #1e3a5f; }
.palette-dark .alert-success { background: #14532d; color: #86efac; border-color: #14532d; }
.palette-dark .alert-error { background: #450a0a; color: #fca5a5; border-color: #450a0a; }
.palette-dark .badge-green { background: #14532d; color: #86efac; }
.palette-dark .badge-blue { background: #1e3a5f; color: #93c5fd; }
.palette-dark .badge-amber { background: #451a03; color: #fcd34d; }
.palette-dark .table th,
.palette-dark .table td {
border-bottom-color: var(--color-border);
}
.palette-dark .table th { color: var(--color-text-muted); }
/* ── Dev hint ── */
.dev-hint {
margin-top: 1rem;
padding: 0.75rem;
background: #fef3c7;
border: 1px solid #f59e0b;
border-radius: 6px;
font-size: 0.8rem;
}
.palette-dark .dev-hint {
background: #451a03;
border-color: #92400e;
color: #fcd34d;
}
/* ── Responsive table ── */
@media (max-width: 480px) {
.table th, .table td {