Skip to content

Commit a76b148

Browse files
quantbaiclaude
andcommitted
ux: unify caption rows across drill levels + suppress stray scrollbar
User: "點內圈 應該也都是要像是這樣 有顏色點 然後文字這樣 你沒有統一" — the caption rows should keep the same visual pattern at every drill level. Previously overview used color-dot rows but zoomed mode used flex chips, breaking consistency. Changes (v1.1.4): - renderZoomed in initLegend now emits .caption-row elements with the same [color-dot, label, meta] grid as overview. Each row shows the class color dot + bold mono symbol + dim name + chain ecosystem. - Click row -> setState({ selectedAsset: full }) — same flow as the old chip click. Active row gets .active accent background. - Old .caption-chip CSS rules unused but harmless (no chips emitted anymore). - .sunburst-caption gets overflow-x: hidden to suppress the spurious horizontal scrollbar (root cause was content briefly overflowing during state transitions). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 8ef92f3 commit a76b148

2 files changed

Lines changed: 46 additions & 18 deletions

File tree

docs/app.js

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,24 +1482,50 @@ function initLegend(hierarchy, assetsFlat) {
14821482
metaEl.textContent = assets.length + ' asset' + (assets.length !== 1 ? 's' : '');
14831483
root.innerHTML = '';
14841484

1485-
const chips = document.createElement('div');
1486-
chips.className = 'caption-chips';
1487-
1485+
// v1.1.4: unified row style — same pattern as overview class rows
1486+
// (color dot + label + meta). User asked for consistency across drill
1487+
// levels so the chart's color encoding always has a textual annotation.
14881488
assets.forEach(a => {
1489-
const chip = document.createElement('button');
1490-
chip.type = 'button';
1491-
chip.className = 'caption-chip';
1492-
chip.textContent = a.symbol;
1493-
chip.setAttribute('aria-label', a.name + ' (' + a.symbol + ')');
1494-
chip.dataset.assetId = a.asset_id;
1495-
chip.addEventListener('click', () => {
1496-
const fullAsset = assetById[a.asset_id] || a;
1497-
setState({ selectedAsset: fullAsset });
1489+
const full = assetById[a.asset_id] || a;
1490+
const classCode = full.class_code != null ? full.class_code : (sample && sample.class_code);
1491+
1492+
const row = document.createElement('div');
1493+
row.className = 'caption-row';
1494+
row.setAttribute('role', 'listitem');
1495+
row.dataset.assetId = a.asset_id;
1496+
1497+
const dot = document.createElement('span');
1498+
dot.className = 'caption-row-dot';
1499+
dot.style.background = CLASS_HEX[classCode] || 'var(--fg-3)';
1500+
1501+
const label = document.createElement('span');
1502+
label.className = 'caption-row-label';
1503+
// symbol prominent, name in dim
1504+
const sym = document.createElement('span');
1505+
sym.className = 'mono';
1506+
sym.style.fontWeight = '600';
1507+
sym.textContent = a.symbol;
1508+
const name = document.createElement('span');
1509+
name.style.color = 'var(--fg-2)';
1510+
name.style.marginLeft = 'var(--space-3)';
1511+
name.textContent = a.name;
1512+
label.appendChild(sym);
1513+
label.appendChild(name);
1514+
1515+
const meta = document.createElement('span');
1516+
meta.className = 'caption-row-meta';
1517+
meta.textContent = a.chain_ecosystem || full.chain_ecosystem || '';
1518+
1519+
row.appendChild(dot);
1520+
row.appendChild(label);
1521+
row.appendChild(meta);
1522+
1523+
row.addEventListener('click', () => {
1524+
setState({ selectedAsset: full });
14981525
});
1499-
chips.appendChild(chip);
1500-
});
15011526

1502-
root.appendChild(chips);
1527+
root.appendChild(row);
1528+
});
15031529
}
15041530

15051531
// Initial render
@@ -1515,10 +1541,10 @@ function initLegend(hierarchy, assetsFlat) {
15151541
else renderOverview();
15161542
});
15171543

1518-
// Highlight active asset chip
1544+
// Highlight active asset row (v1.1.4: rows replaced chips)
15191545
emitter.on('state:selectedAsset', asset => {
1520-
root.querySelectorAll('.caption-chip').forEach(c => {
1521-
c.classList.toggle('active', !!asset && c.dataset.assetId === asset.asset_id);
1546+
root.querySelectorAll('.caption-row[data-asset-id]').forEach(r => {
1547+
r.classList.toggle('active', !!asset && r.dataset.assetId === asset.asset_id);
15221548
});
15231549
});
15241550
}

docs/style.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,6 +1431,8 @@ text[role="button"]:focus-visible {
14311431
border: 1px solid var(--border);
14321432
border-radius: var(--radius-md);
14331433
padding: var(--space-4) var(--space-5);
1434+
/* Prevent stray horizontal scrollbar — content here should always wrap. */
1435+
overflow-x: hidden;
14341436
}
14351437

14361438
.caption-header {

0 commit comments

Comments
 (0)