.WORKER username) are unbreakable tokens.
+ Together they force horizontal overflow that clips the view on
+ a phone. Neutralize the inline mins and let long tokens wrap.
+ Static drop-in; serves the operator-flagged D-WEB.4 mobile clip. */
+ @media (max-width: 480px) {
+ #miner-info, #network-info {
+ min-width: 0 !important;
+ flex: 1 1 100% !important;
+ }
+ .miner-info [style*="monospace"],
+ .miner-info [style*="monospace"] span {
+ overflow-wrap: anywhere;
+ word-break: break-word;
+ }
+ }
+
/* Two-column layout for sections */
.two-col {
display: grid;
@@ -1790,6 +1809,12 @@ 🔀 Share-Version Crossing
Vote: - · Work-weighted: -
- → -
+
+
+
🧠Node Topology
+
+
+
@@ -2888,6 +2913,7 @@ Legend
d3.json('../merged_stats', function(d) { _ms = d || {}; _tryRenderStats(); });
d3.json('../best_share', function(d) { _bs = d || {}; _tryRenderStats(); });
d3.json('../v36_status', function(d) { if (d) renderV36Status(d); });
+ d3.json('../api/node_topology', function(d) { if (d) renderNodeTopology(d); });
}
// V36 crossing widget: maps /v36_status ratchet state to an at-a-glance label.
@@ -2914,6 +2940,28 @@ Legend
d3.select('#v36_msg').text(v.message ? '\u00b7 ' + v.message : '');
}
+ // Per-node topology: renders THIS node's real coin set (primary + embedded/aux),
+ // peer counts and embedded/RPC flags, straight from /api/node_topology.
+ // Config-driven/auto-detected -- never a baked-in coin list (charter #2).
+ function renderNodeTopology(t) {
+ var card = document.getElementById('node_topology_card');
+ if (!card || !t || !Array.isArray(t.coins) || !t.coins.length) return;
+ var rows = t.coins.map(function(c) {
+ var tags = [];
+ if (c.primary) tags.push('primary');
+ if (c.embedded) tags.push('embedded');
+ if (c.has_rpc) tags.push('rpc');
+ var tagStr = tags.length ? ' [' + tags.join(', ') + ']' : '';
+ var peers = (c.peers != null ? c.peers : 0);
+ return '' + c.coin + '' + tagStr +
+ ' · ' + peers + ' peer' + (peers === 1 ? '' : 's') + '
';
+ }).join('');
+ document.getElementById('node_topology_coins').innerHTML = rows;
+ d3.select('#node_topology_symbol').text(t.node_symbol ? '(' + t.node_symbol + ')' : '');
+ d3.select('#node_topology_note').text(t.auto_detected ? 'auto-detected' : '');
+ card.style.display = '';
+ }
+
function renderBestShare(bs) {
if (!bs || !bs.round) return;
d3.select('#best_share_round_pct_fancy').html(format_pct_fancy(bs.round.pct_of_block));