@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: 12 18 28; --foreground-muted: 38 48 62; --foreground-faint: 62 72 88; --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: 255 255 255; --foreground-muted: 228 234 244; --foreground-faint: 195 205 220; --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; } } /* ── Knowledge Chat: RAG architecture animated flow ─────────────────────────── */ @keyframes rag-flow { from { background-position: 0 0; } to { background-position: 20px 0; } } @keyframes rag-dot { 0% { left: 0; opacity: 0; } 12% { opacity: 1; } 88% { opacity: 1; } 100% { left: 100%; opacity: 0; } } @keyframes rag-node-pulse { 0%, 100% { box-shadow: 0 0 0 0 transparent; } 50% { box-shadow: 0 0 11px 1px var(--rag-glow, rgba(56,189,248,0.4)); } } .rag-track { animation: rag-flow 2.2s linear infinite; } .rag-dot { animation: rag-dot 3s linear infinite; } .rag-node { animation: rag-node-pulse 3.2s ease-in-out infinite; } .rag-flowing .rag-track { animation-duration: 0.6s; } .rag-flowing .rag-dot { animation-duration: 1s; } .rag-flowing .rag-node { animation-duration: 1.2s; } @media (prefers-reduced-motion: reduce) { .rag-track, .rag-dot, .rag-node { animation: none !important; } } /* RAG flow — active/done stage states (real-time per-stage pulsing) */ @keyframes rag-active-pulse { 0%, 100% { box-shadow: 0 0 0 0 var(--rag-glow); transform: scale(1); } 50% { box-shadow: 0 0 16px 3px var(--rag-glow); transform: scale(1.08); } } .rag-node-active { animation: rag-active-pulse 0.8s ease-in-out infinite; border-color: var(--rag-line) !important; z-index: 1; } .rag-node-done { border-color: var(--rag-line) !important; } @media (prefers-reduced-motion: reduce) { .rag-node-active { animation: none !important; } }