:root { --ink: #060c17; --ink-2: #0b1626; --panel: rgba(17, 31, 51, 0.72); --panel-solid: #111f33; --line: rgba(110, 170, 200, 0.18); --line-strong: rgba(110, 200, 210, 0.38); --text: #e8f0f7; --muted: #8ea3ba; --dim: #5d7189; --input: #47d6c6; /* user's voice */ --output: #f2b04a; /* Jarvis's voice */ --alert: #ff5d63; --radius-lg: 18px; --radius-md: 12px; --radius-sm: 8px; --font: "Schibsted Grotesk", system-ui, -apple-system, "Segoe UI", sans-serif; --display: "Orbitron", "Schibsted Grotesk", system-ui, sans-serif; color-scheme: dark; } * { box-sizing: border-box; } html, body { margin: 0; } body { color: var(--text); font: 400 16px/1.5 var(--font); font-variant-numeric: tabular-nums; min-height: 100vh; background: radial-gradient(1100px 620px at 32% 28%, rgba(71, 214, 198, 0.10), transparent 60%), radial-gradient(900px 600px at 62% 36%, rgba(242, 176, 74, 0.07), transparent 60%), linear-gradient(180deg, var(--ink-2), var(--ink) 60%); } h1, h2, h3, p { margin: 0; } button, select { font: inherit; color: inherit; } :focus-visible { outline: 2px solid var(--input); outline-offset: 2px; } .card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.02) inset, 0 18px 40px rgba(0, 0, 0, 0.35); backdrop-filter: blur(8px); } /* ---------- top bar ---------- */ .topbar { display: grid; grid-template-columns: auto auto auto 1fr; gap: 10px 28px; align-items: center; padding: 16px 28px; border-bottom: 1px solid var(--line); } .brand-block { padding-right: 28px; border-right: 1px solid var(--line); } .brand { font: 700 34px/1 var(--display); letter-spacing: 0.06em; background: linear-gradient(90deg, #8ff3e8, var(--input) 45%, #c7f6f1); -webkit-background-clip: text; background-clip: text; color: transparent; text-shadow: 0 0 22px rgba(71, 214, 198, 0.25); } .brand-sub { margin-top: 4px; font-size: 13px; letter-spacing: 0.12em; color: var(--muted); } .mode { color: var(--muted); font-size: 15px; letter-spacing: 0.02em; } .conn { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 15px; } .conn-dot { width: 10px; height: 10px; border-radius: 50%; background: var(--dim); box-shadow: 0 0 0 3px rgba(93, 113, 137, 0.2); } .conn[data-up="true"] { color: var(--input); } .conn[data-up="true"] .conn-dot { background: var(--input); box-shadow: 0 0 10px var(--input); } .gpu { justify-self: end; width: min(460px, 100%); padding: 12px 16px; border-radius: var(--radius-md); } .gpu-head { display: grid; grid-template-columns: auto 1fr; gap: 14px; align-items: center; } .gpu-title { font-weight: 500; } .gpu-bar { position: relative; height: 8px; border-radius: 4px; background: rgba(255, 255, 255, 0.06); overflow: visible; } .gpu-used { position: absolute; inset: 0 auto 0 0; width: 0; border-radius: 4px; background: linear-gradient(90deg, #3d7bd6, var(--input)); box-shadow: 0 0 10px rgba(71, 214, 198, 0.45); } .gpu-bar.blocked .gpu-used { background: var(--alert); box-shadow: 0 0 10px rgba(255, 93, 99, 0.45); } .gpu-cap { position: absolute; top: -5px; bottom: -5px; left: 75%; width: 2px; background: var(--text); } .gpu-text { margin-top: 6px; font-size: 13px; color: var(--muted); } .gpu-text.blocked { color: var(--alert); } /* ---------- layout ---------- */ .layout { display: grid; grid-template-columns: minmax(0, 1fr) 400px; gap: 28px; padding: 24px 28px 40px; max-width: 1500px; margin: 0 auto; } .stage { display: grid; gap: 18px; align-content: start; } .orb-wrap { position: relative; display: grid; place-items: center; } .orb { width: 100%; max-width: 900px; height: auto; aspect-ratio: 900 / 560; } .orb-legend { position: absolute; left: 0; bottom: 6px; display: grid; gap: 4px; font-size: 13px; color: var(--muted); } .key::before { content: ""; display: inline-block; width: 18px; height: 3px; margin-right: 8px; vertical-align: middle; border-radius: 2px; } .key-in::before { background: var(--input); box-shadow: 0 0 6px var(--input); } .key-out::before { background: var(--output); box-shadow: 0 0 6px var(--output); } .state-line { text-align: center; } #state-name { display: block; font: 700 40px/1.1 var(--display); letter-spacing: 0.04em; color: var(--text); } .state-desc { display: block; margin-top: 6px; font-size: 16px; color: var(--muted); } .state-line.error #state-name { color: var(--alert); text-shadow: 0 0 18px rgba(255, 93, 99, 0.45); } .controls { display: flex; flex-wrap: wrap; gap: 14px; justify-content: center; align-items: end; } .btn { border: 1px solid var(--line-strong); background: var(--panel-solid); padding: 12px 20px; border-radius: var(--radius-sm); cursor: pointer; transition: border-color .15s, box-shadow .15s, background .15s; } .btn:hover:not(:disabled) { border-color: var(--input); } .btn:disabled { opacity: .45; cursor: not-allowed; } .btn-primary { display: inline-flex; align-items: center; gap: 10px; background: linear-gradient(180deg, #5fe6d6, var(--input)); border-color: transparent; color: #032521; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; box-shadow: 0 0 22px rgba(71, 214, 198, 0.35); } .btn-primary:hover:not(:disabled) { box-shadow: 0 0 30px rgba(71, 214, 198, 0.55); } .btn-stop { color: var(--alert); border-color: rgba(255, 93, 99, 0.5); text-transform: uppercase; letter-spacing: 0.04em; } .btn-stop:not(:disabled) { box-shadow: 0 0 16px rgba(255, 93, 99, 0.25); } .btn-stop:hover:not(:disabled) { border-color: var(--alert); } .mic-icon { width: 12px; height: 18px; border: 2px solid currentColor; border-radius: 6px; position: relative; } .mic-icon::after { content: ""; position: absolute; left: 50%; bottom: -7px; width: 2px; height: 5px; background: currentColor; transform: translateX(-50%); } .select { display: grid; gap: 4px; font-size: 13px; color: var(--muted); } .select select { background: var(--panel-solid); border: 1px solid var(--line-strong); border-radius: var(--radius-sm); padding: 11px 12px; color: var(--text); max-width: 100%; } .hint { text-align: center; font-size: 14px; color: var(--muted); min-height: 1.5em; } .hint.warn { color: var(--output); background: rgba(242, 176, 74, 0.08); border: 1px solid rgba(242, 176, 74, 0.35); border-radius: var(--radius-sm); padding: 8px 12px; } .hint.error { color: var(--alert); } .lane { margin: 0; padding: 10px; } .lane canvas { width: 100%; height: 120px; display: block; border-radius: var(--radius-sm); background: rgba(5, 12, 22, 0.6); } .lane figcaption { font-size: 13px; color: var(--muted); margin-top: 8px; } .transcript h2 { font: 600 15px/1 var(--display); letter-spacing: 0.14em; color: var(--muted); margin-bottom: 12px; } .turns { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; } .turn { display: grid; grid-template-columns: 44px minmax(0, 1fr); gap: 12px; align-items: start; max-width: 76ch; } .turn .avatar { width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center; border: 1px solid var(--line-strong); background: var(--panel-solid); font: 700 13px/1 var(--display); } .turn .bubble { padding: 10px 14px; border-radius: var(--radius-md); border: 1px solid var(--line); background: var(--panel); } .turn.user .avatar { color: var(--input); border-color: rgba(71, 214, 198, 0.55); box-shadow: 0 0 12px rgba(71, 214, 198, 0.25); } .turn.user .bubble { border-color: rgba(71, 214, 198, 0.4); background: rgba(71, 214, 198, 0.07); } .turn.assistant .avatar { color: var(--output); border-color: rgba(242, 176, 74, 0.55); box-shadow: 0 0 12px rgba(242, 176, 74, 0.25); } .turn.assistant .bubble { border-color: rgba(242, 176, 74, 0.4); background: rgba(242, 176, 74, 0.07); } .turn .who { display: flex; align-items: center; gap: 10px; font-size: 14px; } .turn.user .who { color: var(--input); } .turn.assistant .who { color: var(--output); } .turn .spark { flex: 1; height: 18px; min-width: 60px; max-width: 220px; } .turn .note { font-size: 13px; color: var(--alert); margin-top: 4px; } .empty { color: var(--muted); font-size: 14px; } /* ---------- side panels ---------- */ .side { padding: 18px; align-self: start; position: sticky; top: 16px; } .tabs { display: flex; gap: 2px; margin-bottom: 16px; border-bottom: 1px solid var(--line); overflow-x: auto; } .tabs button { background: none; border: 0; border-bottom: 2px solid transparent; padding: 9px 10px; cursor: pointer; color: var(--muted); white-space: nowrap; } .tabs button[aria-selected="true"] { color: var(--input); border-bottom-color: var(--input); text-shadow: 0 0 10px rgba(71, 214, 198, 0.4); } [role="tabpanel"] h3 { font-size: 15px; margin: 16px 0 6px; letter-spacing: 0.02em; } [role="tabpanel"] p { font-size: 14px; color: var(--muted); } .stage-badge { display: inline-block; margin-bottom: 10px; padding: 4px 10px; border-radius: 999px; border: 1px solid var(--line-strong); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; } /* state timeline */ .states { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; position: relative; } .states::before { content: ""; position: absolute; left: 19px; top: 14px; bottom: 14px; width: 2px; background: var(--line); } .states li { position: relative; display: grid; grid-template-columns: 22px 1fr; gap: 12px; align-items: center; padding: 7px 10px 7px 12px; border-radius: var(--radius-sm); border: 1px solid transparent; font-size: 15px; } .states li::before { content: ""; width: 12px; height: 12px; border-radius: 50%; background: var(--panel-solid); border: 2px solid var(--dim); justify-self: center; z-index: 1; } .states li.active { background: rgba(71, 214, 198, 0.12); border-color: rgba(71, 214, 198, 0.55); box-shadow: 0 0 18px rgba(71, 214, 198, 0.2); } .states li.active::before { background: var(--input); border-color: var(--input); box-shadow: 0 0 0 0 rgba(71, 214, 198, 0.6); animation: pulse 1.6s ease-out infinite; } .states li.active.out { background: rgba(242, 176, 74, 0.12); border-color: rgba(242, 176, 74, 0.55); box-shadow: 0 0 18px rgba(242, 176, 74, 0.2); } .states li.active.out::before { background: var(--output); border-color: var(--output); animation-name: pulse-out; } .states li.active.bad { background: rgba(255, 93, 99, 0.1); border-color: rgba(255, 93, 99, 0.55); box-shadow: 0 0 18px rgba(255, 93, 99, 0.2); } .states li.active.bad::before { background: var(--alert); border-color: var(--alert); animation-name: pulse-bad; } .states li.later { color: var(--dim); } .states li.later::before { border-style: dashed; } .states small { display: block; color: var(--muted); font-size: 13px; } .states li.later small { color: var(--dim); } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(71, 214, 198, 0.6); } 100% { box-shadow: 0 0 0 10px rgba(71, 214, 198, 0); } } @keyframes pulse-out { 0% { box-shadow: 0 0 0 0 rgba(242, 176, 74, 0.6); } 100% { box-shadow: 0 0 0 10px rgba(242, 176, 74, 0); } } @keyframes pulse-bad { 0% { box-shadow: 0 0 0 0 rgba(255, 93, 99, 0.6); } 100% { box-shadow: 0 0 0 10px rgba(255, 93, 99, 0); } } .metrics { display: grid; grid-template-columns: auto 1fr; gap: 5px 12px; margin: 16px 0 0; font-size: 13px; } .metrics dt { color: var(--muted); } .metrics dd { margin: 0; text-align: right; overflow-wrap: anywhere; min-width: 0; } .probe-buttons { display: grid; gap: 8px; margin: 10px 0; } .probe-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 8px; } .probe-table th, .probe-table td { text-align: left; padding: 6px 4px; border-bottom: 1px solid var(--line); vertical-align: top; overflow-wrap: anywhere; } .tool-log { list-style: none; padding: 0; margin: 0; } @media (max-width: 1100px) { .layout { grid-template-columns: 1fr; padding: 16px; } .side { position: static; } .topbar { grid-template-columns: 1fr 1fr; padding: 12px 16px; } .brand-block { border-right: 0; padding-right: 0; } .gpu { grid-column: 1 / -1; justify-self: stretch; width: 100%; } } @media (max-width: 560px) { .topbar { grid-template-columns: 1fr; } #state-name { font-size: 28px; } .turn { grid-template-columns: 36px minmax(0, 1fr); } .turn .avatar { width: 36px; height: 36px; } } @media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } } /* stage 3: sources and tool log */ .sources { list-style: none; padding: 0; margin: 0; display: grid; gap: 10px; } .source { border: 1px solid var(--line); border-radius: var(--radius-md); padding: 10px 12px; background: var(--panel); } .source .src-head { display: flex; gap: 8px; align-items: baseline; justify-content: space-between; } .source .src-title { font-weight: 700; } .source .src-status { font-size: 12px; padding: 1px 8px; border-radius: 999px; border: 1px solid var(--line); white-space: nowrap; } .source .src-status[data-status="potwierdzone"] { color: var(--input); border-color: var(--input); } .source .src-status[data-status="niepotwierdzone"] { color: var(--alert); border-color: var(--alert); } .source a { color: var(--output); word-break: break-all; font-size: 13px; } .source .src-meta { color: var(--muted); font-size: 12px; margin: 2px 0; } .source .src-snippet { font-size: 13px; margin: 6px 0 0; } .source .src-cited { font-size: 12px; color: var(--muted); margin-top: 4px; } .tool-log li { border-bottom: 1px solid var(--line); padding: 6px 0; font-size: 13px; overflow-wrap: anywhere; } .turn .bubble .pending { color: var(--muted); font-style: italic; } .turn .bubble .rejected { color: var(--muted); font-style: italic; opacity: 0.7; }