ACLASCollege commited on
Commit
ecbbc4e
·
verified ·
1 Parent(s): 1dbe477

chore: sync dashboard index.hf.html

Browse files
Files changed (1) hide show
  1. dashboard/index.hf.html +361 -0
dashboard/index.hf.html ADDED
@@ -0,0 +1,361 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Aegis-Graph | Sovereign Audit Dashboard</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;800&family=Inter:wght@300;400;600&display=swap" rel="stylesheet">
8
+ <style>
9
+ :root {
10
+ --primary: #00ffaa;
11
+ --primary-glow: rgba(0, 255, 170, 0.4);
12
+ --bg: #010204;
13
+ --card-bg: rgba(10, 15, 25, 0.7);
14
+ --text: #e0e0e0;
15
+ --accent: #0088ff;
16
+ }
17
+
18
+ * {
19
+ margin: 0;
20
+ padding: 0;
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ body {
25
+ font-family: 'Inter', sans-serif;
26
+ background-color: var(--bg);
27
+ color: var(--text);
28
+ overflow: hidden;
29
+ display: flex;
30
+ flex-direction: column;
31
+ height: 100vh;
32
+ }
33
+
34
+ /* 3D Particle Background Overlay */
35
+ #bg-canvas {
36
+ position: absolute;
37
+ top: 0;
38
+ left: 0;
39
+ width: 100%;
40
+ height: 100%;
41
+ z-index: -1;
42
+ opacity: 0.4;
43
+ }
44
+
45
+ header {
46
+ padding: 2rem;
47
+ text-align: center;
48
+ background: linear-gradient(to bottom, rgba(0,0,0,0.8), transparent);
49
+ }
50
+
51
+ header h1 {
52
+ font-family: 'Outfit', sans-serif;
53
+ font-weight: 800;
54
+ letter-spacing: -1px;
55
+ font-size: 2.5rem;
56
+ background: linear-gradient(45deg, #fff, var(--primary));
57
+ -webkit-background-clip: text;
58
+ -webkit-text-fill-color: transparent;
59
+ }
60
+
61
+ .main-container {
62
+ flex: 1;
63
+ display: grid;
64
+ grid-template-columns: 350px 1fr;
65
+ gap: 2rem;
66
+ padding: 2rem;
67
+ max-width: 1400px;
68
+ margin: 0 auto;
69
+ width: 100%;
70
+ }
71
+
72
+ .sidebar {
73
+ display: flex;
74
+ flex-direction: column;
75
+ gap: 1.5rem;
76
+ }
77
+
78
+ .stats-card {
79
+ background: var(--card-bg);
80
+ backdrop-filter: blur(12px);
81
+ border: 1px solid rgba(255,255,255,0.1);
82
+ border-radius: 16px;
83
+ padding: 1.5rem;
84
+ transition: all 0.3s ease;
85
+ }
86
+
87
+ .stats-card:hover {
88
+ border-color: var(--primary);
89
+ box-shadow: 0 0 20px var(--primary-glow);
90
+ }
91
+
92
+ .stats-card h3 {
93
+ font-size: 0.8rem;
94
+ text-transform: uppercase;
95
+ color: var(--primary);
96
+ margin-bottom: 0.5rem;
97
+ }
98
+
99
+ .stats-card .value {
100
+ font-family: 'Outfit', sans-serif;
101
+ font-size: 2rem;
102
+ font-weight: 600;
103
+ }
104
+
105
+ .audit-panel {
106
+ background: var(--card-bg);
107
+ backdrop-filter: blur(12px);
108
+ border: 1px solid rgba(255,255,255,0.1);
109
+ border-radius: 20px;
110
+ display: flex;
111
+ flex-direction: column;
112
+ overflow: hidden;
113
+ position: relative;
114
+ }
115
+
116
+ .audit-visual {
117
+ flex: 1;
118
+ display: flex;
119
+ align-items: center;
120
+ justify-content: center;
121
+ position: relative;
122
+ }
123
+
124
+ .audit-button {
125
+ background: transparent;
126
+ border: 2px solid var(--primary);
127
+ color: var(--primary);
128
+ padding: 1.5rem 3rem;
129
+ font-size: 1.2rem;
130
+ font-family: 'Outfit', sans-serif;
131
+ font-weight: 600;
132
+ text-transform: uppercase;
133
+ cursor: pointer;
134
+ border-radius: 50px;
135
+ transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
136
+ z-index: 10;
137
+ }
138
+
139
+ .audit-button:hover {
140
+ background: var(--primary);
141
+ color: #000;
142
+ box-shadow: 0 0 50px var(--primary);
143
+ transform: scale(1.05);
144
+ }
145
+
146
+ .terminal-overlay {
147
+ height: 250px;
148
+ background: rgba(0, 0, 0, 0.8);
149
+ border-top: 1px solid rgba(255,255,255,0.1);
150
+ font-family: 'Courier New', Courier, monospace;
151
+ padding: 1rem;
152
+ font-size: 0.85rem;
153
+ overflow-y: auto;
154
+ color: #aaa;
155
+ }
156
+
157
+ .log-entry { margin-bottom: 0.3rem; }
158
+ .log-time { color: #666; margin-right: 0.5rem; }
159
+ .log-agent { color: var(--primary); font-weight: bold; }
160
+ .log-msg { color: #fff; }
161
+
162
+ .scan-line {
163
+ position: absolute;
164
+ top: 0;
165
+ left: 0;
166
+ width: 100%;
167
+ height: 2px;
168
+ background: var(--primary);
169
+ box-shadow: 0 0 15px var(--primary);
170
+ z-index: 5;
171
+ display: none;
172
+ animation: scan 2s linear infinite;
173
+ }
174
+
175
+ @keyframes scan {
176
+ from { top: 0; }
177
+ to { top: 100%; }
178
+ }
179
+
180
+ .verdict-popup {
181
+ position: absolute;
182
+ top: 50%;
183
+ left: 50%;
184
+ transform: translate(-50%, -50%) scale(0.8);
185
+ background: rgba(0,0,0,0.9);
186
+ border: 2px solid var(--primary);
187
+ padding: 2rem;
188
+ border-radius: 20px;
189
+ text-align: center;
190
+ opacity: 0;
191
+ visibility: hidden;
192
+ transition: all 0.5s ease;
193
+ z-index: 20;
194
+ }
195
+
196
+ .verdict-popup.show {
197
+ opacity: 1;
198
+ visibility: visible;
199
+ transform: translate(-50%, -50%) scale(1);
200
+ }
201
+ </style>
202
+ </head>
203
+ <body>
204
+ <canvas id="bg-canvas"></canvas>
205
+
206
+ <header>
207
+ <h1>AEGIS-GRAPH</h1>
208
+ <p style="color: #666; text-transform: uppercase; letter-spacing: 2px; font-size: 0.7rem; margin-top: 0.5rem;">Sovereign Audit Protocol // MARS Swarm v2.0</p>
209
+ </header>
210
+
211
+ <div class="main-container">
212
+ <div class="sidebar">
213
+ <div class="stats-card">
214
+ <h3>Sovereign Nodes</h3>
215
+ <div class="value">102,482</div>
216
+ </div>
217
+ <div class="stats-card">
218
+ <h3>Audit Precision</h3>
219
+ <div class="value">99.42%</div>
220
+ </div>
221
+ <div class="stats-card">
222
+ <h3>Graph Density</h3>
223
+ <div class="value">4.2M Edges</div>
224
+ </div>
225
+ <div class="stats-card" style="margin-top: auto; border-color: rgba(0,136,255,0.3);">
226
+ <h3>Protocol Authority</h3>
227
+ <p style="font-size: 0.8rem; line-height: 1.4; color: #888;">Demo visualization only; production verification requires server-signed audit evidence.</p>
228
+ </div>
229
+ </div>
230
+
231
+ <div class="audit-panel">
232
+ <div class="scan-line" id="scanLine"></div>
233
+ <div class="audit-visual" id="auditVisual">
234
+ <button class="audit-button" id="startBtn">Initialize Sovereign Audit</button>
235
+
236
+ <div class="verdict-popup" id="verdict">
237
+ <h2 style="color: var(--primary); margin-bottom: 1rem;">SERVER AUDIT REQUIRED</h2>
238
+ <p style="margin-bottom: 0.5rem;">Local Demo ID: <span style="color: #fff;">UNSIGNED-PREVIEW</span></p>
239
+ <p>Credential Status: <span style="color: var(--primary);">NEEDS SERVER REVIEW</span></p>
240
+ <button onclick="reset()" style="margin-top: 1.5rem; background: var(--primary); border: none; padding: 0.5rem 1rem; border-radius: 5px; cursor: pointer;">Close Proof</button>
241
+ </div>
242
+ </div>
243
+ <div class="terminal-overlay" id="terminal">
244
+ <div class="log-entry">System ready. Waiting for ingestion...</div>
245
+ </div>
246
+ </div>
247
+ </div>
248
+
249
+ <script>
250
+ const canvas = document.getElementById('bg-canvas');
251
+ const ctx = canvas.getContext('2d');
252
+ let particles = [];
253
+
254
+ function resize() {
255
+ canvas.width = window.innerWidth;
256
+ canvas.height = window.innerHeight;
257
+ }
258
+ window.addEventListener('resize', resize);
259
+ resize();
260
+
261
+ class Particle {
262
+ constructor() {
263
+ this.x = Math.random() * canvas.width;
264
+ this.y = Math.random() * canvas.height;
265
+ this.vx = (Math.random() - 0.5) * 0.5;
266
+ this.vy = (Math.random() - 0.5) * 0.5;
267
+ this.size = Math.random() * 2;
268
+ }
269
+ update() {
270
+ this.x += this.vx;
271
+ this.y += this.vy;
272
+ if (this.x < 0 || this.x > canvas.width) this.vx *= -1;
273
+ if (this.y < 0 || this.y > canvas.height) this.vy *= -1;
274
+ }
275
+ draw() {
276
+ ctx.fillStyle = '#00ffaa';
277
+ ctx.beginPath();
278
+ ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
279
+ ctx.fill();
280
+ }
281
+ }
282
+
283
+ for (let i = 0; i < 100; i++) particles.push(new Particle());
284
+
285
+ function animate() {
286
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
287
+ particles.forEach(p => {
288
+ p.update();
289
+ p.draw();
290
+ });
291
+ requestAnimationFrame(animate);
292
+ }
293
+ animate();
294
+
295
+ const terminal = document.getElementById('terminal');
296
+ const startBtn = document.getElementById('startBtn');
297
+ const scanLine = document.getElementById('scanLine');
298
+ const verdict = document.getElementById('verdict');
299
+
300
+ function addLog(agent, msg) {
301
+ const time = new Date().toLocaleTimeString([], { hour12: false, minute: '2-digit', second: '2-digit' });
302
+ const entry = document.createElement('div');
303
+ entry.className = 'log-entry';
304
+
305
+ const timeNode = document.createElement('span');
306
+ timeNode.className = 'log-time';
307
+ timeNode.innerText = `[${time}]`;
308
+ entry.appendChild(timeNode);
309
+ entry.appendChild(document.createTextNode(' '));
310
+
311
+ const agentNode = document.createElement('span');
312
+ agentNode.className = 'log-agent';
313
+ agentNode.innerText = agent;
314
+ entry.appendChild(agentNode);
315
+ entry.appendChild(document.createTextNode(' '));
316
+
317
+ const msgNode = document.createElement('span');
318
+ msgNode.className = 'log-msg';
319
+ msgNode.innerText = msg;
320
+ entry.appendChild(msgNode);
321
+
322
+ terminal.appendChild(entry);
323
+ terminal.scrollTop = terminal.scrollHeight;
324
+ }
325
+
326
+ startBtn.addEventListener('click', async () => {
327
+ startBtn.style.display = 'none';
328
+ scanLine.style.display = 'block';
329
+
330
+ addLog('SYSTEM', 'Initializing local demo visualization...');
331
+ await sleep(1000);
332
+ addLog('VISION', 'Demo animation only; no credential bytes are authenticated here...');
333
+ await sleep(1500);
334
+ addLog('GRAPH', 'Skipping browser-side registry approval; server audit required...');
335
+ await sleep(1000);
336
+ addLog('GRAPH', 'Institution registry evidence must be resolved by a trusted service.');
337
+ await sleep(1200);
338
+ addLog('LOGIC', 'Refusing automatic approval without signed server evidence...');
339
+ await sleep(800);
340
+ addLog('LOGIC', 'Credential status: NEEDS SERVER REVIEW.');
341
+ await sleep(1000);
342
+ addLog('SYSTEM', 'Demo complete. No audit certificate was issued.');
343
+
344
+ scanLine.style.display = 'none';
345
+ verdict.classList.add('show');
346
+ });
347
+
348
+ function reset() {
349
+ verdict.classList.remove('show');
350
+ startBtn.style.display = 'block';
351
+ terminal.replaceChildren();
352
+ const entry = document.createElement('div');
353
+ entry.className = 'log-entry';
354
+ entry.innerText = 'System ready. Waiting for ingestion...';
355
+ terminal.appendChild(entry);
356
+ }
357
+
358
+ function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
359
+ </script>
360
+ </body>
361
+ </html>