Files
zroc/zroc-ui/src/styles/index.css
T
Justin b7b9f6191d feat: add DR Capacity Planner, light/dark mode toggle, and PDF export
- 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>
2026-04-12 20:29:38 -04:00

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;
}
}