Files
atc-agents/src/index.css
T
mo a11621b21f Add Command Center v2: DQ/RAG integration, S3 browser, Jupyter, GPU matrix.
Mirror mo/atc-GPU layout with config/, docs/, scripts/ for Gitea deploy.
2026-06-25 00:28:23 +00:00

630 lines
20 KiB
CSS

@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%); }
}