|
16 | 16 | * { box-sizing: border-box; } |
17 | 17 | body { background: var(--bg); color: var(--text); font-family: 'Inter', sans-serif; margin: 0; padding: 15px; line-height: 1.5; } |
18 | 18 | .hud-container { max-width: 1200px; margin: 0 auto; display: grid; grid-template-columns: 1fr 1fr; gap: 20px; } |
19 | | - |
20 | 19 | /* Typography & Glow */ |
21 | 20 | h1 { grid-column: span 2; font-family: 'JetBrains Mono'; font-size: 1.2rem; letter-spacing: 2px; color: var(--accent); text-transform: uppercase; margin: 10px 0; display: flex; justify-content: space-between; } |
22 | 21 | .glow { text-shadow: 0 0 15px var(--accent); } |
23 | | -
|
24 | 22 | /* Component Cards */ |
25 | 23 | .card { background: var(--card); border: 1px solid #2a2a30; border-radius: 8px; padding: 20px; overflow: hidden; position: relative; } |
26 | 24 | .card::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 2px; background: linear-gradient(90deg, transparent, var(--accent), transparent); opacity: 0.3; } |
27 | 25 | .label { font-size: 0.7rem; font-weight: 600; color: var(--dim); text-transform: uppercase; margin-bottom: 12px; letter-spacing: 1px; display: flex; align-items: center; gap: 8px; } |
28 | 26 | .label::before { content: ''; width: 6px; height: 6px; background: var(--accent); border-radius: 50%; box-shadow: 0 0 8px var(--accent); } |
29 | | -
|
30 | 27 | /* Data Displays */ |
31 | 28 | .data-box { font-family: 'JetBrains Mono', monospace; font-size: 0.85rem; height: 250px; overflow-y: auto; background: #00000044; border-radius: 4px; padding: 12px; color: #ced4e0; scrollbar-width: thin; } |
32 | 29 | .stat-grid { grid-column: span 2; display: flex; gap: 40px; background: var(--card); padding: 15px 25px; border-radius: 8px; border: 1px solid #2a2a30; } |
33 | 30 | .stat-item { display: flex; flex-direction: column; } |
34 | 31 | .stat-val { font-size: 1.5rem; font-weight: 700; font-family: 'JetBrains Mono'; color: #fff; } |
35 | 32 | .stat-lbl { font-size: 0.6rem; color: var(--dim); } |
36 | | -
|
37 | 33 | /* Mobile Specifics */ |
38 | 34 | @media (max-width: 768px) { |
39 | 35 | .hud-container { grid-template-columns: 1fr; } |
40 | 36 | h1, .stat-grid { grid-column: 1; } |
41 | 37 | .stat-grid { flex-wrap: wrap; gap: 20px; } |
42 | 38 | } |
43 | | -
|
44 | 39 | .status-pill { padding: 4px 12px; border-radius: 20px; font-size: 0.7rem; font-weight: 800; background: #222; } |
45 | 40 | .evolving { color: var(--accent); border: 1px solid var(--accent); box-shadow: 0 0 10px #00ffa344; } |
46 | | - |
47 | 41 | input { background: #000; border: 1px solid #2a2a30; color: var(--accent); padding: 10px; border-radius: 4px; width: 100%; font-family: 'JetBrains Mono'; margin-bottom: 10px; } |
48 | 42 | button { width: 100%; padding: 12px; background: var(--accent); color: #000; border: none; border-radius: 4px; font-weight: 700; cursor: pointer; transition: 0.2s; } |
49 | 43 | button:hover { filter: brightness(1.2); } |
|
54 | 48 | <span>PyOB // Evolution Engine</span> |
55 | 49 | <span id="status-pill" class="status-pill">READY</span> |
56 | 50 | </h1> |
57 | | -
|
58 | 51 | <div class="hud-container"> |
59 | 52 | <div class="stat-grid"> |
60 | 53 | <div class="stat-item"><span class="stat-lbl">Iteration</span><span id="iteration" class="stat-val">--</span></div> |
61 | 54 | <div class="stat-item"><span class="stat-lbl">Symbolic Ledger</span><span id="ledger" class="stat-val">--</span></div> |
62 | 55 | <div class="stat-item"><span class="stat-lbl">Pending Cascades</span><span id="queue-count" class="stat-val">--</span></div> |
63 | 56 | </div> |
64 | | -
|
65 | 57 | <div class="card"> |
66 | 58 | <div class="label">Logic Memory (MEMORY.md)</div> |
67 | 59 | <div id="memory" class="data-box">Initializing brain...</div> |
68 | 60 | </div> |
69 | | -
|
70 | 61 | <div class="card"> |
71 | 62 | <div class="label">System Logs (HISTORY.md)</div> |
72 | 63 | <div id="history" class="data-box">No history yet.</div> |
73 | 64 | </div> |
74 | | -
|
75 | 65 | <div class="card" style="grid-column: span 2;"> |
76 | 66 | <div class="label">Architectural Analysis</div> |
77 | 67 | <div id="analysis" class="data-box" style="height: 350px;">Scanning structure...</div> |
78 | 68 | </div> |
79 | | -
|
80 | 69 | <div class="card"> |
81 | 70 | <div class="label">Manual Override</div> |
82 | 71 | <input type="text" id="manualTargetFile" placeholder="src/pyob/target.py"> |
83 | 72 | <button onclick="setManualTarget()">FORCE TARGET</button> |
84 | 73 | </div> |
85 | | -
|
86 | 74 | <div class="card"> |
87 | 75 | <div class="label">Queue Status</div> |
88 | 76 | <div id="queue" class="data-box" style="height: 100px;">IDLE</div> |
|
94 | 82 | try { |
95 | 83 | const response = await fetch('/api/status'); |
96 | 84 | const data = await response.json(); |
97 | | - |
98 | 85 | document.getElementById('iteration').innerText = data.iteration || "0"; |
99 | 86 | document.getElementById('ledger').innerText = (data.ledger_stats?.definitions || 0) + " SYM"; |
100 | 87 | document.getElementById('queue-count').innerText = data.cascade_queue?.length || "0"; |
101 | | - |
102 | 88 | const pill = document.getElementById('status-pill'); |
103 | 89 | const isEvolving = data.cascade_queue?.length > 0 || data.patches_count > 0; |
104 | 90 | pill.innerText = isEvolving ? "EVOLVING" : "STABLE"; |
105 | 91 | pill.className = isEvolving ? "status-pill evolving" : "status-pill"; |
106 | | -
|
107 | 92 | document.getElementById('memory').innerText = data.memory || "Brain empty."; |
108 | 93 | document.getElementById('history').innerText = data.history || "No logs."; |
109 | 94 | document.getElementById('analysis').innerText = data.analysis || "Parsing..."; |
110 | | - |
111 | 95 | const queueDiv = document.getElementById('queue'); |
112 | 96 | queueDiv.innerText = data.cascade_queue?.length > 0 ? data.cascade_queue.join('\\n') : "EMPTY"; |
113 | 97 | } catch (e) { document.getElementById('status-pill').innerText = "OFFLINE"; } |
|
0 commit comments