@tailwind base; @tailwind components; @tailwind utilities; :root, .light { --bg-1: #e8f4fc; --bg-2: #f4f7fb; --bg-3: #f5f0ff; --grid-color: rgba(8, 145, 178, 0.06); --surface: rgba(255, 255, 255, 0.72); --surface-strong: rgba(255, 255, 255, 0.94); --surface-elevated: #f1f5f9; --surface-muted: #e2e8f0; --text: #0f172a; --text-muted: #64748b; --text-faint: #94a3b8; --border: rgba(15, 23, 42, 0.09); --accent: #0891b2; --accent-gpu: #65a30d; --accent-secondary: #7c3aed; --glow: rgba(8, 145, 178, 0.22); --status-ok: #16a34a; --status-ok-bg: rgba(22, 163, 74, 0.1); --status-warn: #d97706; --status-warn-bg: rgba(217, 119, 6, 0.1); --status-down: #dc2626; --status-down-bg: rgba(220, 38, 38, 0.08); --shadow: 0 12px 40px rgba(15, 40, 80, 0.09); --floor-bg: linear-gradient(180deg, #f1f5f9 0%, #ffffff 100%); --aurora-1: rgba(8, 145, 178, 0.12); --aurora-2: rgba(124, 58, 237, 0.08); } .dark { --bg-1: #050810; --bg-2: #0a0f1a; --bg-3: #100818; --grid-color: rgba(34, 211, 238, 0.05); --surface: rgba(12, 18, 32, 0.78); --surface-strong: rgba(16, 22, 38, 0.94); --surface-elevated: #1a2236; --surface-muted: #243049; --text: #eef2f9; --text-muted: #94a3b8; --text-faint: #64748b; --border: rgba(34, 211, 238, 0.14); --accent: #22d3ee; --accent-gpu: #a3e635; --accent-secondary: #c084fc; --glow: rgba(34, 211, 238, 0.28); --status-ok: #4ade80; --status-ok-bg: rgba(74, 222, 128, 0.12); --status-warn: #fbbf24; --status-warn-bg: rgba(251, 191, 36, 0.12); --status-down: #f87171; --status-down-bg: rgba(248, 113, 113, 0.12); --shadow: 0 12px 48px rgba(0, 0, 0, 0.5); --floor-bg: linear-gradient(180deg, #121a2e 0%, #0a0e18 100%); --aurora-1: rgba(34, 211, 238, 0.15); --aurora-2: rgba(192, 132, 252, 0.1); } body { margin: 0; min-height: 100vh; color: var(--text); background: linear-gradient(145deg, var(--bg-1) 0%, var(--bg-2) 45%, var(--bg-3) 100%); background-attachment: fixed; transition: background 0.4s ease, color 0.4s ease; } body::before { content: ''; position: fixed; inset: 0; background-image: radial-gradient(ellipse 80% 50% at 20% 0%, var(--aurora-1), transparent 50%), radial-gradient(ellipse 60% 40% at 80% 10%, var(--aurora-2), transparent 45%), linear-gradient(var(--grid-color) 1px, transparent 1px), linear-gradient(90deg, var(--grid-color) 1px, transparent 1px); background-size: 100% 100%, 100% 100%, 40px 40px, 40px 40px; pointer-events: none; z-index: 0; } #root { position: relative; z-index: 1; } .section-eyebrow { @apply text-[10px] font-mono uppercase tracking-[0.2em] text-[var(--text-faint)] mb-0.5; } .panel { background: var(--surface-strong); backdrop-filter: blur(20px); border: 1px solid var(--border); box-shadow: var(--shadow); transition: background 0.35s ease, border-color 0.35s ease, box-shadow 0.35s ease; } .neon-text { text-shadow: 0 0 32px var(--glow); } .logo-mark { @apply w-12 h-12 rounded-2xl flex items-center justify-center text-sm font-bold text-white shrink-0; background: linear-gradient(135deg, var(--accent), var(--accent-secondary)); box-shadow: 0 4px 28px var(--glow); } .header-aurora { position: absolute; inset: 0; background: linear-gradient(90deg, transparent, var(--aurora-1), transparent); opacity: 0.6; pointer-events: none; } .status-pill { @apply text-xs font-mono px-3 py-1.5 rounded-full border inline-flex items-center gap-1.5; } .status-pill::before { content: '●'; font-size: 8px; } .status-pill.ok { color: var(--status-ok); border-color: var(--status-ok); background: var(--status-ok-bg); } .status-pill.warn { color: var(--status-warn); border-color: var(--status-warn); background: var(--status-warn-bg); } .status-pill.gpu { color: var(--accent-gpu); border-color: var(--accent-gpu); background: color-mix(in srgb, var(--accent-gpu) 10%, transparent); } .live-badge { @apply text-xs font-mono px-2.5 py-1 rounded-full border animate-pulse; color: var(--status-ok); border-color: var(--status-ok); background: var(--status-ok-bg); } /* Agent cards */ .agent-roster-glow { background: radial-gradient(ellipse at 50% 0%, var(--aurora-1), transparent 70%); } .agent-card { @apply rounded-2xl p-[1px] transition-all duration-300 cursor-pointer; background: var(--border); } .agent-card:hover, .agent-card.selected { background: linear-gradient(135deg, var(--agent-color, var(--accent)), var(--accent-secondary)); box-shadow: 0 8px 32px color-mix(in srgb, var(--agent-color, var(--accent)) 25%, transparent); } .agent-card-inner { background: var(--surface-strong); min-height: 200px; } .agent-card.selected .agent-card-inner { background: color-mix(in srgb, var(--agent-color, var(--accent)) 4%, var(--surface-strong)); } .agent-avatar { @apply relative w-11 h-11 rounded-xl flex items-center justify-center border-2; } .agent-status-dot { @apply absolute -bottom-0.5 -right-0.5 w-3 h-3 rounded-full border-2; border-color: var(--surface-strong); } .agent-status-dot.active { animation: pulse-dot 1.2s ease infinite; } .agent-state-pill { @apply text-[10px] font-mono px-2 py-0.5 rounded-full bg-[var(--surface-elevated)]; } .agent-state-pill.busy { background: color-mix(in srgb, currentColor 12%, transparent); } .cap-chip { @apply text-[9px] font-mono px-1.5 py-0.5 rounded-md; background: var(--surface-elevated); color: var(--text-muted); border: 1px solid var(--border); } .delegate-btn { background: color-mix(in srgb, currentColor 8%, transparent); border: 1px solid color-mix(in srgb, currentColor 25%, transparent); transition: all 0.15s ease; } .delegate-btn:hover { background: color-mix(in srgb, currentColor 18%, transparent); } /* Ops floor */ .ops-floor-stage { background: var(--floor-bg); border-color: var(--border); overflow: hidden; } .ops-floor-scan { position: absolute; inset: 0; background: linear-gradient(180deg, transparent 0%, color-mix(in srgb, var(--accent) 4%, transparent) 50%, transparent 100%); animation: scan 4s ease-in-out infinite; pointer-events: none; } .zone-node { background: var(--surface-strong); } .sprite-wrap.selected::after { content: ''; position: absolute; inset: -10px -6px; border-radius: 50%; border: 2px dashed var(--sprite-color, var(--accent)); opacity: 0.65; animation: spin-slow 10s linear infinite; pointer-events: none; } .sprite-wrap { position: relative; } .sprite-wrap.busy { filter: drop-shadow(0 0 16px var(--sprite-color)) drop-shadow(0 4px 8px rgba(0,0,0,0.3)); } .sprite-figure { position: relative; display: flex; align-items: center; justify-content: center; } .sprite-figure-busy .sprite-svg { filter: drop-shadow(0 0 8px var(--sprite-color, var(--accent))); } .sprite-ring-outer { position: absolute; inset: -4px 2px 16px 2px; border-radius: 50%; border: 1.5px solid; pointer-events: none; } .sprite-holo-shimmer { position: absolute; inset: 0; border-radius: 40%; pointer-events: none; animation: holo-shimmer 3s ease-in-out infinite; opacity: 0.7; } .sprite-nameplate { @apply flex items-center gap-1.5 mt-1.5 px-2.5 py-0.5 rounded-full border; background: color-mix(in srgb, var(--surface-strong) 85%, transparent); backdrop-filter: blur(6px); } .sprite-nameplate-dot { @apply w-1.5 h-1.5 rounded-full shrink-0; } .sprite-nameplate-text { @apply text-[10px] font-mono font-bold tracking-wide; } .sprite-platform-pulse { animation: platform-pulse 2s ease-in-out infinite; } .sprite-core-pulse { animation: pulse-dot 1.5s ease infinite; } .sprite-svg { overflow: visible; } .sprite-ring { position: absolute; inset: -6px; border-radius: 50%; border: 2px solid; animation: pulse-ring 1.5s ease infinite; } /* Activity feed */ .activity-feed { scrollbar-width: thin; } .activity-item { @apply flex gap-3; } .activity-rail { @apply flex flex-col items-center w-4 shrink-0; } .activity-dot { @apply w-2.5 h-2.5 rounded-full shrink-0 mt-1.5; } .activity-line { @apply w-px flex-1 bg-[var(--border)] min-h-[1rem]; } .activity-agent-badge { @apply text-[10px] font-mono px-2 py-0.5 rounded-full border; background: var(--surface-elevated); } .empty-state { @apply text-sm text-[var(--text-muted)] text-center py-8; } /* Chat */ .chat-message { @apply flex gap-2 items-end; } .chat-message.user { @apply flex-row-reverse; } .chat-avatar { @apply w-8 h-8 rounded-xl flex items-center justify-center text-sm shrink-0 border; } .chat-bubble { @apply rounded-2xl px-3 py-2 max-w-[90%]; } .chat-meta { @apply text-[10px] font-mono text-[var(--text-faint)] flex gap-2 mb-1; } .chat-text { @apply text-sm leading-relaxed; } .chat-bubble-user { background: color-mix(in srgb, var(--accent) 14%, var(--surface-elevated)); border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent); } .chat-bubble-agent { background: var(--surface-elevated); border: 1px solid var(--border); } .thinking-pulse { animation: pulse-dot 1s ease infinite; } .typing-indicator { @apply flex gap-1 py-1; } .typing-indicator span { @apply w-1.5 h-1.5 rounded-full bg-[var(--text-faint)]; animation: typing 1.2s ease infinite; } .typing-indicator span:nth-child(2) { animation-delay: 0.15s; } .typing-indicator span:nth-child(3) { animation-delay: 0.3s; } /* Command dock */ .command-dock { border-color: color-mix(in srgb, var(--accent) 20%, var(--border)); } .command-input-wrap { background: var(--surface-elevated); border: 1px solid var(--border); transition: border-color 0.2s, box-shadow 0.2s; } .command-input-wrap:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--glow); } .quick-prompt-chip { @apply text-xs font-mono px-3 py-1.5 rounded-full border transition-all disabled:opacity-40; background: var(--surface-elevated); border-color: var(--border); color: var(--text-muted); } .quick-prompt-chip:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); background: color-mix(in srgb, var(--accent) 8%, var(--surface-elevated)); } /* Shared */ .status-card { background: var(--surface-strong); border: 1px solid var(--border); transition: transform 0.15s ease, box-shadow 0.15s ease; } .status-card:hover { transform: translateY(-2px); box-shadow: var(--shadow); } .gpu-card { background: var(--surface-elevated); transition: border-color 0.2s ease; } .gpu-card:hover { border-color: var(--accent-gpu); } .btn-primary { @apply px-5 py-2.5 rounded-xl font-display text-sm font-semibold text-white transition-all hover:brightness-110 disabled:opacity-40; background: linear-gradient(135deg, var(--accent), var(--accent-secondary)); box-shadow: 0 4px 24px var(--glow); } .btn-secondary { @apply px-3 py-1.5 rounded-lg font-mono border transition-all; background: var(--surface-elevated); border-color: var(--border); color: var(--accent); } .btn-secondary:hover { border-color: var(--accent); box-shadow: 0 0 16px var(--glow); } .tab-btn { @apply px-4 py-2 rounded-xl text-sm font-mono border transition-all inline-flex items-center gap-2; border-color: var(--border); color: var(--text-muted); background: var(--surface); } .tab-btn.active { border-color: var(--accent); color: var(--accent); background: var(--surface-strong); box-shadow: 0 0 24px var(--glow); font-weight: 600; } .tab-badge { @apply text-[10px] px-1.5 py-0.5 rounded-full font-bold; background: var(--accent-secondary); color: white; } .theme-toggle { @apply flex items-center gap-2 px-2 py-1 rounded-xl border transition-all; border-color: var(--border); background: var(--surface-elevated); } .theme-toggle:hover { border-color: var(--accent); } .theme-toggle-track { @apply relative w-11 h-6 rounded-full transition-colors; background: var(--surface-muted); } .theme-toggle-track.is-dark { background: linear-gradient(90deg, #1e293b, #312e81); } .theme-toggle-thumb { @apply absolute top-0.5 left-0.5 w-5 h-5 rounded-full flex items-center justify-center text-xs transition-transform; background: var(--surface-strong); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); } .theme-toggle-track.is-dark .theme-toggle-thumb { transform: translateX(1.25rem); } .prompt-input { @apply flex-1 rounded-xl px-4 py-2.5 outline-none font-mono text-sm transition; background: var(--surface-elevated); border: 1px solid var(--border); color: var(--text); } .prompt-input::placeholder { color: var(--text-faint); } .prompt-input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--glow); } .agent-sprite .sprite-body { fill: var(--surface-strong); } .agent-sprite .sprite-limb { fill: var(--surface-elevated); } .agent-sprite .sprite-head { fill: var(--surface-strong); } /* Agent terminals */ .agent-terminal { @apply rounded-xl border overflow-hidden flex flex-col cursor-pointer transition-all; border-color: var(--border); background: #0a0e14; min-height: 200px; max-height: 240px; } .dark .agent-terminal { background: #060a10; } .light .agent-terminal { background: #0f172a; } .agent-terminal.active { border-color: color-mix(in srgb, var(--term-accent, var(--accent)) 55%, transparent); box-shadow: 0 0 24px color-mix(in srgb, var(--term-accent, var(--accent)) 15%, transparent); } .agent-terminal.expanded { max-height: 480px; min-height: 400px; } .agent-terminal-header { @apply flex items-center justify-between gap-2 px-3 py-2 border-b; border-color: rgba(255,255,255,0.06); background: rgba(0,0,0,0.25); } .agent-terminal-body { @apply flex-1 overflow-y-auto p-2 font-mono text-[11px] leading-relaxed; scrollbar-width: thin; } .term-line { @apply flex gap-2 py-0.5; word-break: break-word; } .term-ts { @apply shrink-0 text-[10px] opacity-50 w-[4.5rem]; color: #64748b; } .term-phase { @apply shrink-0 text-[9px] uppercase w-10 opacity-40 hidden sm:inline; } .term-text { flex: 1; } .term-info .term-text { color: #94a3b8; } .term-ok .term-text { color: #4ade80; } .term-warn .term-text { color: #fbbf24; } .term-err .term-text { color: #f87171; } .term-cmd .term-text { color: #67e8f9; } .term-llm .term-text { color: #c084fc; } .term-live-badge { @apply text-[9px] font-mono px-1.5 py-0.5 rounded-full animate-pulse; color: var(--term-accent, var(--accent)); border: 1px solid color-mix(in srgb, var(--term-accent, var(--accent)) 40%, transparent); } .term-cursor { animation: blink 1s step-end infinite; color: var(--term-accent, var(--accent)); } .agent-terminal-focus { @apply flex flex-col gap-3; } .agent-terminal-tabs { @apply flex flex-wrap gap-2; } .agent-terminal-tab { @apply text-xs font-mono px-3 py-1.5 rounded-lg border transition-all; border-color: var(--border); color: var(--text-muted); background: var(--surface-elevated); } .agent-terminal-tab.active { font-weight: 600; background: var(--surface-strong); } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } @keyframes pulse-dot { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.6; transform: scale(1.15); } } @keyframes pulse-ring { 0%, 100% { opacity: 0.8; transform: scale(1); } 50% { opacity: 0.4; transform: scale(1.08); } } @keyframes scan { 0%, 100% { transform: translateY(-100%); opacity: 0; } 50% { opacity: 1; } 100% { transform: translateY(100%); } } @keyframes spin-slow { to { transform: rotate(360deg); } } @keyframes holo-shimmer { 0%, 100% { opacity: 0.4; transform: translateX(-2px); } 50% { opacity: 0.85; transform: translateX(2px); } } @keyframes platform-pulse { 0%, 100% { opacity: 0.35; transform: scaleX(1); } 50% { opacity: 0.7; transform: scaleX(1.08); } } @keyframes typing { 0%, 60%, 100% { transform: translateY(0); opacity: 0.4; } 30% { transform: translateY(-4px); opacity: 1; } } /* Live cluster map */ .live-cluster-map { isolation: isolate; } .cluster-ambient { position: absolute; inset: 0; background: radial-gradient(ellipse 70% 50% at 50% 30%, var(--aurora-1), transparent 60%); pointer-events: none; } .cluster-stage-grid { position: absolute; inset: 0; background-image: linear-gradient(var(--grid-color) 1px, transparent 1px), linear-gradient(90deg, var(--grid-color) 1px, transparent 1px); background-size: 24px 24px; opacity: 0.5; border-radius: inherit; } .cluster-agent-stage { overflow: hidden; } .zone-tower { @apply rounded-xl px-2.5 py-2 text-center min-w-[84px] border-2; background: color-mix(in srgb, var(--surface-strong) 90%, transparent); backdrop-filter: blur(8px); } .zone-tower-live { animation: tower-breathe 3s ease-in-out infinite; } .zone-tower-active { transform: scale(1.05); } .zone-tower-label { @apply text-[8px] font-mono font-bold tracking-wider; } .zone-tower-stats { @apply text-[10px] font-mono font-semibold mt-0.5 flex items-center justify-center gap-1; } .zone-tower-extra { @apply text-[8px] font-mono opacity-70 mt-0.5; } .zone-level-dot { @apply w-1.5 h-1.5 rounded-full; } .zone-level-dot.level-ok { background: var(--status-ok); box-shadow: 0 0 6px var(--status-ok); } .zone-level-dot.level-warn { background: var(--status-warn); } .zone-level-dot.level-down { background: var(--status-down); } .zone-app-orbit { @apply flex flex-col gap-0.5 mt-1 max-w-[90px]; } .zone-app-chip { @apply flex items-center gap-1 text-[8px] font-mono px-1.5 py-0.5 rounded-md border; background: var(--surface-strong); } .zone-app-chip.state-running { opacity: 1; } .zone-app-chip.state-down, .zone-app-chip.state-created { opacity: 0.45; filter: grayscale(0.5); } .command-desk { @apply relative px-4 py-2 rounded-xl text-[9px] font-mono font-bold tracking-widest border-2; border-color: var(--accent); color: var(--accent); background: var(--surface-strong); } .command-desk-ring { @apply absolute inset-0 rounded-xl border border-[var(--accent)] opacity-30 animate-ping; pointer-events: none; } .gpu-beacon { @apply rounded-xl border px-3 py-2 text-left min-w-[140px]; border-color: var(--accent-gpu); background: color-mix(in srgb, var(--accent-gpu) 8%, var(--surface-strong)); } .gpu-beacon-title { @apply text-[9px] font-mono font-bold text-[var(--accent-gpu)]; } .gpu-beacon-model { @apply text-xs font-semibold text-[var(--text)] mt-0.5; } .gpu-beacon-meta { @apply text-[9px] font-mono text-[var(--text-muted)]; } .gpu-beacon-bar { @apply h-1 rounded-full bg-[var(--surface-muted)] mt-2 overflow-hidden; } .gpu-beacon-fill { @apply h-full rounded-full bg-[var(--accent-gpu)]; } .workload-ticker-wrap { @apply flex items-center gap-3 overflow-hidden rounded-xl border px-3 py-2; border-color: var(--border); background: var(--surface-elevated); } .workload-ticker-label { @apply text-[9px] font-mono font-bold tracking-widest shrink-0 text-[var(--accent)]; } .workload-ticker-track { @apply flex-1 overflow-hidden; } .workload-ticker-inner { @apply flex gap-2 whitespace-nowrap; } .ticker-chip { @apply inline-flex items-center gap-1 text-[10px] font-mono px-2 py-0.5 rounded-full border; background: var(--surface-strong); } .ticker-chip.state-running { opacity: 1; } .ticker-chip.state-down, .ticker-chip.state-created { opacity: 0.4; } .live-domain-card { @apply rounded-xl p-4 border-2 transition-all; background: var(--surface-strong); } .domain-pulse-dot { @apply w-2.5 h-2.5 rounded-full shrink-0; } .domain-pulse-dot.level-ok { background: var(--status-ok); } .domain-pulse-dot.level-warn { background: var(--status-warn); } .domain-pulse-dot.level-down { background: var(--status-down); } .domain-progress-bar { @apply h-1.5 rounded-full bg-[var(--surface-muted)] overflow-hidden; } .domain-progress-fill { @apply h-full rounded-full; } .domain-app-grid { @apply grid grid-cols-3 gap-1; } .domain-app-tile { @apply flex flex-col items-center text-[8px] font-mono p-1 rounded-md border border-[var(--border)]; background: var(--surface-elevated); } .domain-app-tile.state-down { opacity: 0.35; } .gpu-mini-tile { @apply text-[8px] font-mono px-1.5 py-0.5 rounded border border-[var(--accent-gpu)] text-[var(--accent-gpu)]; background: color-mix(in srgb, var(--accent-gpu) 10%, transparent); } .ambient-bg { pointer-events: none; } .ambient-orb { position: absolute; width: 120px; height: 120px; border-radius: 50%; background: radial-gradient(circle, var(--aurora-1), transparent 70%); animation: orb-float linear infinite; opacity: 0.35; } @keyframes tower-breathe { 0%, 100% { filter: brightness(1); } 50% { filter: brightness(1.15); } } @keyframes orb-float { 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.2; } 33% { transform: translate(20px, -30px) scale(1.1); opacity: 0.4; } 66% { transform: translate(-15px, 20px) scale(0.9); opacity: 0.25; } } @keyframes ticker-scroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }