192 lines
6.3 KiB
CSS
192 lines
6.3 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
@layer base {
|
|
:root {
|
|
color-scheme: light;
|
|
--surface: 244 245 247;
|
|
--surface-raised: 255 255 255;
|
|
--surface-overlay: 236 240 245;
|
|
--surface-muted: 221 225 230;
|
|
--border: 210 218 228;
|
|
--border-strong: 180 192 208;
|
|
--foreground: 26 31 38;
|
|
--foreground-muted: 95 107 122;
|
|
--foreground-faint: 139 149 165;
|
|
--shadow-panel: 0 1px 3px rgba(15, 40, 80, 0.06), 0 4px 12px rgba(36, 150, 237, 0.06);
|
|
--shadow-docker: 0 0 0 1px rgba(36, 150, 237, 0.12), 0 4px 14px rgba(36, 150, 237, 0.1);
|
|
--topo-canvas: linear-gradient(145deg, #dbeafe 0%, #e0f2fe 35%, #ede9fe 70%, #ecfdf5 100%);
|
|
--topo-grid: rgba(37, 99, 235, 0.06);
|
|
--topo-stage-border: rgba(37, 99, 235, 0.15);
|
|
--topo-node-bg: linear-gradient(145deg, #1e40af 0%, #2563eb 50%, #1d4ed8 100%);
|
|
--topo-node-border: rgba(147, 197, 253, 0.45);
|
|
--topo-node-shadow: 0 4px 14px rgba(30, 64, 175, 0.35);
|
|
--topo-header-bg: linear-gradient(90deg, rgba(36, 150, 237, 0.12), rgba(99, 102, 241, 0.08));
|
|
}
|
|
|
|
.dark {
|
|
color-scheme: dark;
|
|
--surface: 15 27 46;
|
|
--surface-raised: 22 38 62;
|
|
--surface-overlay: 28 48 78;
|
|
--surface-muted: 36 58 92;
|
|
--border: 48 74 112;
|
|
--border-strong: 64 96 140;
|
|
--foreground: 232 241 255;
|
|
--foreground-muted: 148 175 212;
|
|
--foreground-faint: 100 130 168;
|
|
--shadow-panel: 0 1px 0 rgba(147, 197, 253, 0.06) inset, 0 8px 24px rgba(0, 0, 0, 0.35);
|
|
--shadow-docker: 0 0 0 1px rgba(56, 189, 248, 0.2), 0 4px 16px rgba(14, 116, 214, 0.25);
|
|
--topo-canvas: linear-gradient(145deg, #0c1929 0%, #132f4c 40%, #1a365d 75%, #0f2847 100%);
|
|
--topo-grid: rgba(56, 189, 248, 0.07);
|
|
--topo-stage-border: rgba(56, 189, 248, 0.18);
|
|
--topo-node-bg: linear-gradient(145deg, #1e3a5f 0%, #234876 45%, #1a4470 100%);
|
|
--topo-node-border: rgba(96, 165, 250, 0.4);
|
|
--topo-node-shadow: 0 4px 16px rgba(0, 20, 60, 0.45);
|
|
--topo-header-bg: linear-gradient(90deg, rgba(36, 150, 237, 0.18), rgba(99, 102, 241, 0.12));
|
|
}
|
|
|
|
html, body, #root {
|
|
height: 100%;
|
|
scrollbar-gutter: stable;
|
|
}
|
|
|
|
body {
|
|
@apply bg-surface font-sans text-foreground antialiased;
|
|
background-image: var(--body-gradient, none);
|
|
}
|
|
|
|
.dark body {
|
|
--body-gradient: radial-gradient(ellipse 120% 80% at 50% -20%, rgba(37, 99, 235, 0.15), transparent);
|
|
}
|
|
|
|
:root body {
|
|
--body-gradient: radial-gradient(ellipse 100% 60% at 50% -10%, rgba(36, 150, 237, 0.08), transparent);
|
|
}
|
|
}
|
|
|
|
@layer components {
|
|
.panel {
|
|
@apply rounded-lg border border-border bg-surface-raised shadow-panel;
|
|
}
|
|
|
|
.topo-canvas {
|
|
@apply relative min-h-0 flex-1 overflow-hidden rounded-lg;
|
|
background:
|
|
linear-gradient(var(--topo-grid) 1px, transparent 1px),
|
|
linear-gradient(90deg, var(--topo-grid) 1px, transparent 1px),
|
|
var(--topo-canvas);
|
|
background-size: 20px 20px, 20px 20px, auto;
|
|
}
|
|
|
|
.topo-edge-glow {
|
|
stroke: rgba(56, 189, 248, 0.18);
|
|
stroke-width: 4;
|
|
fill: none;
|
|
}
|
|
|
|
.topo-edge-idle {
|
|
stroke: rgba(100, 140, 180, 0.35);
|
|
stroke-width: 1.5;
|
|
stroke-dasharray: 4 8;
|
|
fill: none;
|
|
}
|
|
|
|
.topo-edge-live {
|
|
stroke-width: 2;
|
|
stroke-dasharray: 8 12;
|
|
fill: none;
|
|
animation: flow-dash 1.2s linear infinite;
|
|
}
|
|
|
|
.topo-edge-orchestration.topo-edge-live { stroke: #f59e0b; filter: drop-shadow(0 0 3px rgba(245, 158, 11, 0.5)); }
|
|
.topo-edge-cdc.topo-edge-live { stroke: #22d3ee; filter: drop-shadow(0 0 3px rgba(34, 211, 238, 0.45)); }
|
|
.topo-edge-stream.topo-edge-live { stroke: #38bdf8; filter: drop-shadow(0 0 3px rgba(56, 189, 248, 0.45)); }
|
|
.topo-edge-etl.topo-edge-live { stroke: #a78bfa; filter: drop-shadow(0 0 3px rgba(167, 139, 250, 0.45)); }
|
|
.topo-edge-query.topo-edge-live { stroke: #818cf8; filter: drop-shadow(0 0 3px rgba(129, 140, 248, 0.45)); }
|
|
.topo-edge-serve.topo-edge-live { stroke: #34d399; filter: drop-shadow(0 0 3px rgba(52, 211, 153, 0.45)); }
|
|
|
|
/* Whole-flow pulse triggered by a data-generation run */
|
|
.topo-pulsing .topo-edge-live {
|
|
stroke-width: 3;
|
|
animation: flow-dash 0.6s linear infinite;
|
|
}
|
|
.topo-pulsing .topo-edge-glow {
|
|
stroke: rgba(124, 231, 135, 0.35);
|
|
stroke-width: 6;
|
|
animation: topo-pulse-glow 1.4s ease-in-out infinite;
|
|
}
|
|
@keyframes topo-pulse-glow {
|
|
0%, 100% { opacity: 0.4; }
|
|
50% { opacity: 1; }
|
|
}
|
|
|
|
.topo-edge-active {
|
|
stroke: url(#topo-flow-gradient);
|
|
stroke-width: 2.5;
|
|
stroke-dasharray: 10 14;
|
|
fill: none;
|
|
animation: flow-dash 1.4s linear infinite;
|
|
}
|
|
|
|
.topo-edge-pulse {
|
|
stroke: #34d399;
|
|
stroke-width: 2;
|
|
stroke-dasharray: 4 100;
|
|
fill: none;
|
|
opacity: 0.9;
|
|
animation: flow-pulse 2s linear infinite;
|
|
}
|
|
|
|
.topo-node-airflow {
|
|
border-color: rgba(245, 158, 11, 0.55) !important;
|
|
box-shadow: 0 0 12px rgba(245, 158, 11, 0.25), var(--topo-node-shadow);
|
|
}
|
|
|
|
.topo-node-hadoop {
|
|
border-color: rgba(57, 255, 20, 0.45) !important;
|
|
box-shadow: 0 0 12px rgba(57, 255, 20, 0.2), var(--topo-node-shadow);
|
|
}
|
|
|
|
.topo-node {
|
|
@apply mx-auto w-[72%] max-w-[104px] rounded border px-1.5 py-1 text-left transition-all;
|
|
background: var(--topo-node-bg);
|
|
border-color: var(--topo-node-border);
|
|
box-shadow: var(--topo-node-shadow);
|
|
}
|
|
|
|
.topo-node:hover {
|
|
filter: brightness(1.12);
|
|
transform: translateY(-1px);
|
|
}
|
|
|
|
.topo-node-selected {
|
|
@apply ring-2 ring-cyan-400/60 border-cyan-300;
|
|
}
|
|
|
|
.topo-stage-col {
|
|
@apply flex min-w-[100px] flex-1 flex-col px-1 py-1.5 last:border-r-0;
|
|
border-right: 1px dashed var(--topo-stage-border);
|
|
}
|
|
|
|
.topo-stage-col--sources { background: linear-gradient(180deg, rgba(16, 185, 129, 0.08), transparent 60%); }
|
|
.topo-stage-col--ingestion { background: linear-gradient(180deg, rgba(6, 182, 212, 0.1), transparent 60%); }
|
|
.topo-stage-col--compute { background: linear-gradient(180deg, rgba(139, 92, 246, 0.1), transparent 60%); }
|
|
.topo-stage-col--storage { background: linear-gradient(180deg, rgba(37, 99, 235, 0.1), transparent 60%); }
|
|
.topo-stage-col--consumers { background: linear-gradient(180deg, rgba(245, 158, 11, 0.08), transparent 60%); }
|
|
}
|
|
|
|
@layer utilities {
|
|
.scrollbar-thin {
|
|
scrollbar-width: thin;
|
|
scrollbar-color: rgb(var(--border-strong)) transparent;
|
|
}
|
|
|
|
.scroll-x-stable {
|
|
overflow-x: auto;
|
|
overflow-y: hidden;
|
|
scrollbar-gutter: stable;
|
|
}
|
|
}
|