feat: implement Watchtower theme for web UI

Replace Pico CSS with custom Watchtower theme (Sci-Fi Dark Mode):
- Add backend/static/ directory with Watchtower CSS files
- tokens_watchtower.css: Design tokens (colors, typography, spacing)
- theme_watchtower.css: Theme overrides for components

Features:
- High-contrast dark mode (#0b0f14 background)
- Neon accent color (#00e08f teal/cyan)
- Glow effects on buttons and inputs
- Radial gradient background
- SVG noise texture overlay (bg-noise class)
- Pill-shaped buttons (border-radius: 999px)
- Uppercase labels with letter-spacing
- Monospace font for logs

UI Enhancements:
- FastAPI static files mount added
- Custom styling for all components (sections, buttons, inputs, forms)
- Accent border-left on header and update status
- Improved visual hierarchy with color coding
- OIDC button gets secondary style (outline)

Complete US_000024 and TASK_000024.
Based on minecraft-watchtower UI design.
All Pico CSS dependencies removed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-30 11:59:24 +01:00
parent f7b1a7987d
commit efd006276d
7 changed files with 233 additions and 7 deletions

View File

@ -0,0 +1,135 @@
/*
wlkns-dev-standards
Component Theme: Watchtower
Adapts standard components to the Sci-Fi/Dark aesthetic.
*/
/* =========================
Inputs & Forms
========================= */
input, select, textarea {
background: rgba(10, 14, 20, 0.6) !important;
border-color: rgba(255, 255, 255, 0.15) !important;
color: var(--color-text) !important;
transition: all 0.2s ease;
}
input:focus, select:focus, textarea:focus {
border-color: var(--color-accent) !important;
box-shadow: 0 0 15px var(--wt-glow);
}
/* =========================
Buttons
========================= */
.button {
text-transform: uppercase;
letter-spacing: 0.05em;
font-weight: 600;
border-radius: 999px !important; /* Pill shape */
}
.button.primary {
box-shadow: 0 0 15px var(--wt-glow);
color: #081015; /* Dark text on bright accent */
}
.button.secondary {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.2);
color: var(--color-text);
}
.button.secondary:hover {
border-color: var(--color-text);
background: rgba(255,255,255,0.05);
}
.button.danger {
box-shadow: 0 0 10px rgba(255, 94, 94, 0.4);
color: #1b0d0d;
}
/* =========================
Tables
========================= */
table {
border-collapse: separate;
border-spacing: 0 4px; /* Space between rows */
}
thead th {
border-bottom: 1px solid var(--color-accent);
text-transform: uppercase;
letter-spacing: 0.1em;
font-size: 0.75rem;
color: var(--color-accent);
background: transparent;
}
tbody tr {
background: rgba(255, 255, 255, 0.03);
transition: transform 0.2s;
}
tbody tr:hover {
background: rgba(255, 255, 255, 0.06);
transform: scale(1.01);
}
tbody td {
border: none;
}
tbody td:first-child {
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
}
tbody td:last-child {
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
}
/* =========================
Alerts & Toasts
========================= */
.alert, .toast {
background: rgba(10, 14, 20, 0.95);
backdrop-filter: blur(4px);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 10px 30px rgba(0,0,0,0.5);
}
.alert.success, .toast.success {
border-color: var(--color-success);
box-shadow: 0 0 10px rgba(0, 224, 143, 0.2);
color: var(--color-text);
}
.alert.warning, .toast.warning {
border-color: var(--color-warning);
color: var(--color-text);
}
.alert.error, .toast.error {
border-color: var(--color-error);
box-shadow: 0 0 10px rgba(255, 94, 94, 0.2);
color: var(--color-text);
}
/* =========================
Pagination
========================= */
.pagination .page {
background: transparent;
border: 1px solid rgba(255,255,255,0.1);
color: var(--color-text-muted);
}
.pagination .page.active {
background: var(--color-accent);
color: #081015;
border-color: var(--color-accent);
box-shadow: 0 0 10px var(--wt-glow);
}