@import "tailwindcss"; /* ── Dark theme (default) ──────────────────────────────────────────────── */ :root { /* Surfaces */ --bg: #08080b; --surface: #101013; --surface-2: #16161b; --surface-3: #1c1c22; --border: rgba(255, 255, 255, 0.06); --border-2: rgba(255, 255, 255, 0.10); /* Text */ --text: #ededf0; --text-dim: #8b8b94; --text-faint: #4a4a52; /* Brand: violet primary, cyan live accent */ --accent: #8b5cf6; --accent-hi: #a78bfa; --accent-lo: #6d28d9; --accent-bg: rgba(139, 92, 246, 0.12); --accent-glow: rgba(139, 92, 246, 0.35); --live: #22d3ee; --live-glow: rgba(34, 211, 238, 0.45); --danger: #f87171; /* Code / logs — slightly darker than --bg so panels visually pop */ --code-bg: #0d0d0d; --code-text: #d1d5db; } /* ── Light theme ───────────────────────────────────────────────────────── */ [data-theme="light"] { --bg: #f7f7f9; --surface: #ffffff; --surface-2: #f1f1f4; --surface-3: #e8e8ec; --border: rgba(0, 0, 0, 0.08); --border-2: rgba(0, 0, 0, 0.14); --text: #18181b; --text-dim: #5b5b66; --text-faint: #a0a0aa; --accent: #7c3aed; --accent-hi: #6d28d9; --accent-lo: #5b21b6; --accent-bg: rgba(124, 58, 237, 0.10); --accent-glow: rgba(124, 58, 237, 0.25); --live: #0891b2; --live-glow: rgba(8, 145, 178, 0.30); --danger: #dc2626; --code-bg: #1e1e22; /* keep dark — log lines read better on dark */ --code-text: #d1d5db; } * { box-sizing: border-box; } html, body, #root { height: 100%; margin: 0; padding: 0; background: var(--bg); color: var(--text); font-family: 'Inter', system-ui, -apple-system, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } code, pre, .mono { font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace; font-feature-settings: 'calt' 1, 'liga' 0; } /* Scrollbars — slim, theme-coherent */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.08); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.16); } /* Selection */ ::selection { background: var(--accent-bg); color: var(--text); } /* Focus outline harmonised with brand */ :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; } /* Button press feedback */ button:not(:disabled) { transition: transform 0.08s ease, opacity 0.08s ease; } button:active:not(:disabled) { transform: scale(0.93); opacity: 0.8; } /* Streaming input border — applied directly to the textarea so it stays pixel-perfect */ @keyframes streaming-border-pulse { 0%, 100% { outline-color: var(--accent); box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.45), 0 0 18px rgba(139, 92, 246, 0.35); } 50% { outline-color: var(--live); box-shadow: 0 0 0 3px rgba(34, 211, 238, 0.5), 0 0 18px rgba(34, 211, 238, 0.4); } } .streaming-input { outline: 2px solid var(--accent) !important; outline-offset: 0px; animation: streaming-border-pulse 2s ease-in-out infinite; } /* Animations */ @keyframes pulse-live { 0%, 100% { box-shadow: 0 0 0 0 var(--live-glow); opacity: 1; } 50% { box-shadow: 0 0 0 6px transparent; opacity: 0.65; } } .pulse-live { animation: pulse-live 1.6s ease-in-out infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes fade-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fade-in 0.18s ease-out; } @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .streaming-border { position: relative; } .streaming-border::after { content: ''; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(90deg, transparent, var(--accent), var(--live), var(--accent), transparent); background-size: 200% 100%; animation: shimmer 2.4s linear infinite; -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; }