|
96 | 96 | .stat-card .stat-label{color:var(--text2);font-size:.82em;text-transform:uppercase;letter-spacing:.06em;font-weight:500} |
97 | 97 | .stat-card .stat-sub{color:var(--text3);font-size:.78em;margin-top:4px} |
98 | 98 | h1,.section-title{font-family:'Space Grotesk','DM Sans',sans-serif;letter-spacing:-.01em} |
99 | | -#content{max-width:1400px} |
| 99 | +#content{max-width:1400px;margin:0 auto;width:100%} |
100 | 100 |
|
101 | 101 | /* Progress bar */ |
102 | 102 | .progress-bar{height:8px;background:var(--border);border-radius:4px;overflow:hidden;margin-top:8px} |
|
175 | 175 |
|
176 | 176 | /* Responsive */ |
177 | 177 | #mobile-toggle{display:none;position:fixed;top:12px;left:12px;z-index:200;padding:8px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;color:var(--text)} |
| 178 | +#mobile-backdrop{display:none;position:fixed;inset:0;z-index:99;background:rgba(0,0,0,.5)} |
| 179 | +.inline-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px} |
178 | 180 | @media(max-width:768px){ |
179 | 181 | #sidebar{transform:translateX(-100%)} |
180 | 182 | #sidebar.open{transform:translateX(0)} |
| 183 | + #sidebar.open~#mobile-backdrop{display:block} |
181 | 184 | #main{margin-left:0;padding:16px} |
182 | 185 | #mobile-toggle{display:block} |
183 | 186 | .cards-grid{grid-template-columns:1fr} |
| 187 | + .inline-grid{grid-template-columns:1fr} |
| 188 | +} |
| 189 | +@media(max-width:480px){ |
| 190 | + .stat-card .stat-value{font-size:1.3em} |
| 191 | + .page-header h1{font-size:1.2em} |
| 192 | + #main{padding:12px} |
| 193 | + .card{padding:14px} |
184 | 194 | } |
185 | 195 |
|
186 | 196 | /* Skeleton animation */ |
|
211 | 221 | </head> |
212 | 222 | <body> |
213 | 223 |
|
214 | | -<button id="mobile-toggle" onclick="document.getElementById('sidebar').classList.toggle('open')"> |
| 224 | +<button id="mobile-toggle" onclick="var s=document.getElementById('sidebar');s.classList.toggle('open');document.getElementById('mobile-backdrop').style.display=s.classList.contains('open')?'block':'none'"> |
215 | 225 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="20" height="20"><path d="M3 12h18M3 6h18M3 18h18"/></svg> |
216 | 226 | </button> |
| 227 | +<div id="mobile-backdrop" onclick="document.getElementById('sidebar').classList.remove('open');this.style.display='none'"></div> |
217 | 228 |
|
218 | 229 | <aside id="sidebar"> |
219 | 230 | <div class="logo"> |
|
586 | 597 | <div style="display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:16px"> |
587 | 598 | <div> |
588 | 599 | <div style="font-size:.8em;text-transform:uppercase;letter-spacing:.08em;color:var(--text3);margin-bottom:4px">Your Balance</div> |
589 | | - <div style="font-family:'Space Grotesk','DM Sans',sans-serif;font-size:2.1em;font-weight:700;color:var(--green);font-variant-numeric:tabular-nums;font-feature-settings:'tnum'"><span id="d-balance">${myBalanceBaud}</span> <span style="font-size:.45em;color:var(--text2)">BAUD</span></div> |
| 600 | + <div style="font-family:'Space Grotesk','DM Sans',sans-serif;font-size:clamp(1.3em,4vw,2.1em);font-weight:700;color:var(--green);font-variant-numeric:tabular-nums;font-feature-settings:'tnum'"><span id="d-balance">${myBalanceBaud}</span> <span style="font-size:.45em;color:var(--text2)">BAUD</span></div> |
590 | 601 | <div id="d-ownership" style="font-size:.85em;color:var(--text2);margin-top:2px"> |
591 | 602 | ${myPctOfSupply > 0 ? `You own <strong style="color:var(--primary-light)">${myPctStr}%</strong> of the total 1 billion BAUD supply` : 'Mining in progress…'} |
592 | 603 | </div> |
593 | 604 | </div> |
594 | 605 | <div style="text-align:right"> |
595 | 606 | <div style="font-size:.8em;color:var(--text3);margin-bottom:4px">Earning</div> |
596 | | - <div style="font-family:'Space Grotesk','DM Sans',sans-serif;font-size:1.4em;font-weight:600;color:var(--gold);font-feature-settings:'tnum'"><span id="d-reward">${rewardBaud}</span> <span id="d-reward-unit" style="font-size:.6em;color:var(--text2)">BAUD/block</span></div> |
| 607 | + <div style="font-family:'Space Grotesk','DM Sans',sans-serif;font-size:clamp(1em,3vw,1.4em);font-weight:600;color:var(--gold);font-feature-settings:'tnum'"><span id="d-reward">${rewardBaud}</span> <span id="d-reward-unit" style="font-size:.6em;color:var(--text2)">BAUD/block</span></div> |
597 | 608 | <div id="d-reward-min" style="font-size:.8em;color:var(--text3);margin-top:2px">≈ ${m ? fmt(m.current_block_reward_baud * 60) : '—'} BAUD/minute</div> |
598 | 609 | </div> |
599 | 610 | </div> |
|
636 | 647 | <span id="d-halving">${m ? fmt(m.blocks_until_halving) : '—'} blocks until reward halves</span> |
637 | 648 | </div> |
638 | 649 | <div class="progress-bar"><div class="fill" id="d-era-bar" style="width:${m ? ((1 - m.blocks_until_halving/m.halving_interval)*100) : 0}%"></div></div> |
639 | | - <div style="margin-top:16px;display:grid;grid-template-columns:1fr 1fr;gap:12px;font-size:.85em"> |
| 650 | + <div class="inline-grid" style="margin-top:16px;font-size:.85em"> |
640 | 651 | <div><span style="color:var(--text3)">Blocks Per Era</span><br><strong id="d-era-interval">${m ? fmt(m.halving_interval) : '—'}</strong></div> |
641 | 652 | <div><span style="color:var(--text3)">Next Halving</span><br>Block <strong id="d-next-halving">#${m ? fmt(m.next_halving_block) : '—'}</strong></div> |
642 | 653 | <div><span style="color:var(--text3)">Max Supply</span><br><strong id="d-max-supply">${m ? fmt(m.total_supply_baud) : '—'} BAUD</strong></div> |
|
928 | 939 | <div class="two-col"> |
929 | 940 | <div class="card"> |
930 | 941 | <div class="section-title">Chain Details</div> |
931 | | - <table><tbody> |
| 942 | + <div class="table-wrap"><table><tbody> |
932 | 943 | <tr><td style="color:var(--text3);width:140px">Chain ID</td><td><strong>${escapeHtml(s.chain_id)}</strong></td></tr> |
933 | 944 | <tr><td style="color:var(--text3)">Node Address</td><td class="mono copyable" onclick="copyText('${s.node_address}')">${s.node_address}</td></tr> |
934 | 945 | <tr><td style="color:var(--text3)">State Root</td><td class="mono copyable" onclick="copyText('${s.state_root}')">${shortAddr(s.state_root)}</td></tr> |
935 | 946 | <tr><td style="color:var(--text3)">Last Block Hash</td><td class="mono copyable" onclick="copyText('${s.last_block_hash}')">${shortAddr(s.last_block_hash)}</td></tr> |
936 | 947 | <tr><td style="color:var(--text3)">Escrows</td><td id="n-escrows">${fmt(s.escrows)}</td></tr> |
937 | 948 | <tr><td style="color:var(--text3)">Mempool Size</td><td id="n-mempool">${fmt(s.mempool_size)}</td></tr> |
938 | | - </tbody></table> |
| 949 | + </tbody></table></div> |
939 | 950 | </div> |
940 | 951 | <div class="card"> |
941 | 952 | <div class="section-title">API Endpoints</div> |
|
997 | 1008 | el.innerHTML = ` |
998 | 1009 | <div class="card"> |
999 | 1010 | <div class="section-title">Account Details</div> |
1000 | | - <table><tbody> |
| 1011 | + <div class="table-wrap"><table><tbody> |
1001 | 1012 | <tr><td style="color:var(--text3);width:120px">Address</td><td class="mono copyable" onclick="copyText('${data.address}')" style="word-break:break-all">${data.address}</td></tr> |
1002 | 1013 | <tr><td style="color:var(--text3)">Balance</td><td><strong style="color:var(--green);font-size:1.2em">${fmtBaud(data.balance)} BAUD</strong><br><span style="font-size:.8em;color:var(--text3)">${fmt(data.balance)} quanta</span></td></tr> |
1003 | 1014 | <tr><td style="color:var(--text3)">Nonce</td><td>${data.nonce}</td></tr> |
|
1006 | 1017 | <tr><td style="color:var(--text3)">Endpoint</td><td>${escapeHtml(data.agent_meta.endpoint)}</td></tr> |
1007 | 1018 | <tr><td style="color:var(--text3)">Capabilities</td><td>${data.agent_meta.capabilities.map(c => `<span class="badge badge-cyan">${escapeHtml(c)}</span> `).join('')}</td></tr> |
1008 | 1019 | ` : ''} |
1009 | | - </tbody></table> |
| 1020 | + </tbody></table></div> |
1010 | 1021 | </div> |
1011 | 1022 | `; |
1012 | 1023 | } |
|
1210 | 1221 | if (!resp.ok) { const d = await resp.json(); el.innerHTML = `<div class="alert alert-error">${escapeHtml(d.error||'Not found')}</div>`; return; } |
1211 | 1222 | const data = await resp.json(); |
1212 | 1223 | el.innerHTML = `<div class="card" style="background:var(--bg1)"> |
1213 | | - <table><tbody> |
| 1224 | + <div class="table-wrap"><table><tbody> |
1214 | 1225 | <tr><td style="color:var(--text3);width:120px">Hash</td><td class="mono" style="word-break:break-all">${escapeHtml(data.hash || hash)}</td></tr> |
1215 | 1226 | <tr><td style="color:var(--text3)">Sender</td><td class="mono" style="word-break:break-all">${escapeHtml(data.sender)}</td></tr> |
1216 | 1227 | <tr><td style="color:var(--text3)">Nonce</td><td>${data.nonce}</td></tr> |
1217 | 1228 | <tr><td style="color:var(--text3)">Type</td><td><span class="badge badge-primary">${escapeHtml(data.tx_type || data.payload_type || 'Unknown')}</span></td></tr> |
1218 | 1229 | <tr><td style="color:var(--text3)">Timestamp</td><td>${new Date(data.timestamp).toLocaleString()}</td></tr> |
1219 | | - </tbody></table> |
| 1230 | + </tbody></table></div> |
1220 | 1231 | </div>`; |
1221 | 1232 | } catch(e) { el.innerHTML = `<div class="alert alert-error">${escapeHtml(e.message)}</div>`; } |
1222 | 1233 | } |
|
1232 | 1243 | const data = await resp.json(); |
1233 | 1244 | const statusColor = data.status === 'Active' ? 'var(--green)' : data.status === 'Released' ? 'var(--primary)' : 'var(--text3)'; |
1234 | 1245 | el.innerHTML = `<div class="card" style="background:var(--bg1)"> |
1235 | | - <table><tbody> |
| 1246 | + <div class="table-wrap"><table><tbody> |
1236 | 1247 | <tr><td style="color:var(--text3);width:120px">Escrow ID</td><td class="mono" style="word-break:break-all">${escapeHtml(data.id || id)}</td></tr> |
1237 | 1248 | <tr><td style="color:var(--text3)">Status</td><td><strong style="color:${statusColor}">${escapeHtml(data.status)}</strong></td></tr> |
1238 | 1249 | <tr><td style="color:var(--text3)">Sender</td><td class="mono" style="word-break:break-all">${escapeHtml(data.sender)}</td></tr> |
1239 | 1250 | <tr><td style="color:var(--text3)">Recipient</td><td class="mono" style="word-break:break-all">${escapeHtml(data.recipient)}</td></tr> |
1240 | 1251 | <tr><td style="color:var(--text3)">Amount</td><td><strong>${fmtBaud(data.amount)} BAUD</strong></td></tr> |
1241 | 1252 | <tr><td style="color:var(--text3)">Deadline</td><td>${data.deadline}</td></tr> |
1242 | | - </tbody></table> |
| 1253 | + </tbody></table></div> |
1243 | 1254 | </div>`; |
1244 | 1255 | } catch(e) { el.innerHTML = `<div class="alert alert-error">${escapeHtml(e.message)}</div>`; } |
1245 | 1256 | } |
|
1359 | 1370 |
|
1360 | 1371 | <div class="card" style="margin-bottom:20px"> |
1361 | 1372 | <div class="section-title">Dashboard Pages Explained</div> |
1362 | | - <div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;font-size:.93em"> |
| 1373 | + <div class="inline-grid" style="gap:16px;font-size:.93em"> |
1363 | 1374 | <div style="padding:14px;background:var(--bg);border-radius:var(--radius-sm);border-left:3px solid var(--primary)"> |
1364 | 1375 | <strong style="color:var(--primary)">Dashboard</strong> |
1365 | 1376 | <p style="color:var(--text2);margin-top:4px;line-height:1.5">Your home screen. Shows your BAUD balance, mining rewards, block production stats, and a quick overview of the entire network at a glance.</p> |
|
0 commit comments