diff --git a/public/live.css b/public/live.css index f77b2cff..d47efa6f 100644 --- a/public/live.css +++ b/public/live.css @@ -986,7 +986,7 @@ } .vcr-scope-btn.active { background: rgba(59,130,246,0.2); - color: var(--accent); + color: var(--text); border-color: rgba(59,130,246,0.3); } diff --git a/public/nodes.js b/public/nodes.js index 87acfc3b..ce327092 100644 --- a/public/nodes.js +++ b/public/nodes.js @@ -202,14 +202,14 @@ const info = getStatusInfo(n); let html = `${n.role}`; if (n.hash_size) { - html += ` ${n.public_key.slice(0, n.hash_size * 2).toUpperCase()}`; + html += ` ${n.public_key.slice(0, n.hash_size * 2).toUpperCase()}`; } // #1279 P2 #4: multibyte capability badge — surfaced from the observable // multibyte hash_size (firmware Feat1/Feat2 carry the wire capability bits // per AdvertDataHelpers.h:14-16, but Feat1/Feat2 aren't persisted per-node // in CoreScope today; hash_size is the observed effective capability). if (n.hash_size && Number(n.hash_size) >= 2) { - html += ` Multibyte: ${Number(n.hash_size)}-byte`; + html += ` Multibyte: ${Number(n.hash_size)}-byte`; } if (n.hash_size_inconsistent) { html += ` ⚠️ variable hash size`; diff --git a/public/style.css b/public/style.css index 748726f5..afe654be 100644 --- a/public/style.css +++ b/public/style.css @@ -104,6 +104,8 @@ --nav-text-muted: #cbd5e1; --nav-active-bg: rgba(74, 158, 255, 0.15); --accent: #4a9eff; + --accent-bg: rgba(59, 130, 246, 0.12); + --accent-border: rgba(59, 130, 246, 0.25); --geo-filter-color: #3b82f6; --status-green: #22c55e; --status-yellow: #eab308; @@ -1165,7 +1167,16 @@ body.scroll-locked { overflow: hidden; } font-size: 10px; font-weight: 600; background: #ede9fe; color: #6d28d9; } - +.multibyte-badge { + color: var(--text); + background: var(--accent-bg); + font-size: 10px; +} +.pubkey-prefix-badge { + background:var(--nav-bg); + color:var(--nav-text); + font-family:var(--mono) +} /* === Monospace === */ .mono { font-family: var(--mono); font-size: 12px; } @@ -1241,7 +1252,7 @@ body.scroll-locked { overflow: hidden; } } .field-table .section-row td { background: var(--section-bg, #eef2ff); font-weight: 700; font-size: 11px; - text-transform: uppercase; letter-spacing: .5px; color: var(--accent); + text-transform: uppercase; letter-spacing: .5px; color: var(--text); } .field-table .section-header td { background: rgba(243,139,168,0.18); } .field-table .section-transport td { background: rgba(137,180,250,0.18); } @@ -2619,9 +2630,9 @@ button.ch-item.ch-item-encrypted .ch-badge { filter: grayscale(0.6); } .copy-link-btn { padding: 5px 12px; - background: rgba(59, 130, 246, 0.12); - border: 1px solid rgba(59, 130, 246, 0.25); - color: var(--accent, #3b82f6); + background: var(--accent-bg); + border: 1px solid var(--accent-border); + color: var(--text); border-radius: 6px; font-size: 0.78rem; font-weight: 600; diff --git a/test-e2e-playwright.js b/test-e2e-playwright.js index dff156b8..f375193d 100644 --- a/test-e2e-playwright.js +++ b/test-e2e-playwright.js @@ -670,6 +670,15 @@ async function run() { assert(hasChannelHash, 'Undecrypted GRP_TXT detail should show "Channel Hash"'); }); + await test('#1530 copy-link-btn color differs from accent', async () => { + const hash = await page.evaluate(async () => (await (await fetch('/api/packets?limit=1')).json()).packets?.[0]?.hash); + if (!hash) return console.log(' ⏭️ Skipped (no packets)'); + await page.goto(`${BASE}/#/packets/${hash}`, { waitUntil: 'domcontentloaded' }); + await page.waitForSelector('.copy-link-btn', { timeout: 8000 }); + const diff = await page.evaluate(() => window.getComputedStyle(document.querySelector('.copy-link-btn')).color !== window.getComputedStyle(document.documentElement).getPropertyValue('--accent').trim()); + assert(diff, 'copy-link-btn color should not match --accent'); + }); + // --- Group: Analytics page (test 8 + sub-tabs) --- // Test 8: Analytics page loads with overview