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