b7b9f6191d
- Add zroc-planner UI page with VM selector, journal retention slider (1h-30d), WAN compression input, and live bandwidth/journal/mirror storage estimates - Add CSV and PDF export for planning reports - Add light/dark mode toggle in TopBar with localStorage persistence - Wire theme via CSS custom properties for full Tailwind opacity support - Add Planner route and sidebar entry Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
124 lines
3.9 KiB
CSS
124 lines
3.9 KiB
CSS
/* src/styles/index.css */
|
|
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
/* ── Theme tokens (space-separated RGB for Tailwind opacity support) ── */
|
|
:root,
|
|
[data-theme="dark"] {
|
|
--color-canvas: 8 13 26;
|
|
--color-surface: 13 21 38;
|
|
--color-raised: 19 31 53;
|
|
--color-border: 30 45 71;
|
|
--color-border-bright: 42 64 102;
|
|
--color-text-primary: 226 232 240;
|
|
--color-text-secondary: 124 147 181;
|
|
--color-text-muted: 74 96 128;
|
|
}
|
|
|
|
[data-theme="light"] {
|
|
--color-canvas: 240 244 248;
|
|
--color-surface: 255 255 255;
|
|
--color-raised: 248 250 252;
|
|
--color-border: 226 232 240;
|
|
--color-border-bright: 203 213 225;
|
|
--color-text-primary: 15 23 42;
|
|
--color-text-secondary: 71 85 105;
|
|
--color-text-muted: 148 163 184;
|
|
}
|
|
|
|
@layer base {
|
|
html { @apply scroll-smooth; }
|
|
|
|
body {
|
|
@apply bg-canvas text-text-primary font-sans;
|
|
font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
|
|
}
|
|
|
|
::-webkit-scrollbar { width: 6px; height: 6px; }
|
|
::-webkit-scrollbar-track { @apply bg-surface; }
|
|
::-webkit-scrollbar-thumb { @apply bg-border-bright rounded-full; }
|
|
::-webkit-scrollbar-thumb:hover { @apply bg-accent; }
|
|
|
|
*:focus-visible {
|
|
@apply outline-none ring-1 ring-accent ring-offset-2 ring-offset-canvas;
|
|
}
|
|
}
|
|
|
|
@layer components {
|
|
.data-value {
|
|
@apply font-data tabular-nums;
|
|
}
|
|
|
|
.status-dot {
|
|
@apply inline-block w-2 h-2 rounded-full flex-shrink-0;
|
|
}
|
|
.status-dot-ok { @apply bg-ok shadow-glow-ok animate-pulse-led; }
|
|
.status-dot-warn { @apply bg-warn; }
|
|
.status-dot-crit { @apply bg-crit shadow-glow-crit animate-pulse-led; }
|
|
.status-dot-idle { @apply bg-text-muted; }
|
|
|
|
.card {
|
|
@apply bg-surface border border-border rounded-lg;
|
|
}
|
|
.card-raised {
|
|
@apply bg-raised border border-border rounded-lg shadow-panel;
|
|
}
|
|
|
|
.table-row-hover {
|
|
@apply hover:bg-raised transition-colors duration-100 cursor-pointer;
|
|
}
|
|
|
|
.field {
|
|
@apply w-full bg-canvas border border-border rounded-md px-3 py-2
|
|
text-sm text-text-primary placeholder-text-muted
|
|
focus:border-accent focus:ring-0
|
|
transition-colors duration-150;
|
|
}
|
|
.field-label {
|
|
@apply block text-xs font-mono uppercase tracking-widest text-text-muted mb-1.5;
|
|
}
|
|
|
|
.btn-primary {
|
|
@apply inline-flex items-center gap-2 px-4 py-2 rounded-md
|
|
bg-accent hover:bg-accent-bright text-white text-sm font-medium
|
|
shadow-glow-sm hover:shadow-glow
|
|
transition-all duration-150 disabled:opacity-40 disabled:cursor-not-allowed;
|
|
}
|
|
|
|
.btn-ghost {
|
|
@apply inline-flex items-center gap-2 px-4 py-2 rounded-md
|
|
bg-transparent hover:bg-raised text-text-secondary hover:text-text-primary
|
|
border border-border hover:border-border-bright text-sm font-medium
|
|
transition-all duration-150;
|
|
}
|
|
|
|
.btn-danger {
|
|
@apply inline-flex items-center gap-2 px-4 py-2 rounded-md
|
|
bg-crit/10 hover:bg-crit/20 text-crit border border-crit/30 text-sm font-medium
|
|
transition-all duration-150;
|
|
}
|
|
|
|
.badge {
|
|
@apply inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-mono font-medium;
|
|
}
|
|
.badge-ok { @apply bg-ok/10 text-ok border border-ok/20; }
|
|
.badge-warn { @apply bg-warn/10 text-warn border border-warn/20; }
|
|
.badge-crit { @apply bg-crit/10 text-crit border border-crit/20; }
|
|
.badge-info { @apply bg-info/10 text-info border border-info/20; }
|
|
.badge-muted { @apply bg-raised text-text-muted border border-border; }
|
|
|
|
.section-title {
|
|
@apply font-mono text-xs uppercase tracking-widest text-text-muted;
|
|
}
|
|
|
|
.drawer-overlay {
|
|
@apply fixed inset-0 bg-canvas/60 backdrop-blur-sm z-40;
|
|
}
|
|
.drawer-panel {
|
|
@apply fixed top-0 right-0 h-full w-full max-w-lg bg-surface
|
|
border-l border-border shadow-panel z-50
|
|
animate-slide-in-right flex flex-col;
|
|
}
|
|
}
|