feat(web): React SPA with realtime task detail over WebSocket

Vite + React 19 + TS console-style operator UI: hash-routed Login,
Endpoints, Tasks, and TaskDetail (realtime accounts table over /ws,
Run gated on all accounts testing ok on both sides).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMHQTtnQtQqL8muAXHr9kd
This commit is contained in:
2026-07-01 19:01:05 +07:00
co-authored by Claude Opus 4.8
parent 4c57848c35
commit 1a451f9dbb
22 changed files with 3175 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
@import '@fontsource/jetbrains-mono/400.css';
@import '@fontsource/jetbrains-mono/500.css';
@import '@fontsource/jetbrains-mono/700.css';
@import '@fontsource/big-shoulders-display/600.css';
@import '@fontsource/big-shoulders-display/800.css';
:root {
--bg: #0a0d0b;
--bg-panel: #0f1512;
--bg-panel-raised: #141b17;
--bg-inset: #070a08;
--border: #23342b;
--border-bright: #3a5443;
--fg: #dbe8de;
--fg-dim: #6f8478;
--fg-faint: #4a5c50;
--accent: #ffb238;
--accent-strong: #ffd27a;
--accent-dim: #7a5a26;
--ok: #52e6a0;
--ok-dim: #234a37;
--fail: #ff5d5d;
--fail-dim: #4a2323;
--pending: #f0c419;
--info: #57c2ff;
--font-display: 'Big Shoulders Display', 'Arial Narrow', sans-serif;
--font-mono: 'JetBrains Mono', ui-monospace, monospace;
color-scheme: dark;
}
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
}
body {
min-height: 100vh;
background:
radial-gradient(ellipse 80% 60% at 50% -10%, rgba(255, 178, 56, 0.06), transparent),
repeating-linear-gradient(
to bottom,
rgba(255, 255, 255, 0.012) 0px,
rgba(255, 255, 255, 0.012) 1px,
transparent 1px,
transparent 3px
),
var(--bg);
color: var(--fg);
font-family: var(--font-mono);
font-size: 14px;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
}
#root {
min-height: 100vh;
}
a {
color: inherit;
}
button {
font-family: var(--font-mono);
cursor: pointer;
}
input,
select {
font-family: var(--font-mono);
}
::selection {
background: var(--accent-dim);
color: var(--accent-strong);
}
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: var(--bg-inset);
}
::-webkit-scrollbar-thumb {
background: var(--border-bright);
}
.mono-num {
font-variant-numeric: tabular-nums;
}