` : ”;
return `
`;
}).join(”);
heroFirstItem.innerHTML = `
${firstItem.id}.
${firstItem.name || ”}
${firstItem.textTop}
` : ”}
${firstItem.img ? “ : ”}
${firstItem.textBottom}
` : ”}
${visibleStats.length ? `
${statsHtml}
` : ”}
`;
} else {
heroFirstItem.style.display = ‘none’;
}
}
// Build article items
data.items.forEach((d, index) => {
const nextDriver = data.items[index + 1];
const nextId = nextDriver ? nextDriver.id : null;
// Nav button
const btn = document.createElement(‘button’);
btn.className=”scores-nav-button”;
btn.textContent = d.id;
btn.dataset.articleId = String(d.id);
btn.onclick = () => scrollToSection(d.id);
nav.appendChild(btn);
// ToC entry
const tocBtn = document.createElement(‘button’);
tocBtn.style=”display:block; width:100%; text-align:left; padding:12px; margin-bottom:8px; border:none; background:var(–soft); cursor:pointer; border-radius:12px; font-weight:700; color:var(–text);”;
tocBtn.textContent = `${d.id}. ${d.name}`;
tocBtn.onclick = () => { scrollToSection(d.id); toggleToC(false); };
tocList.appendChild(tocBtn);
if (index === 0) return;
// Stats HTML
const visibleStats = (d.stats || []).filter(s => s && (
String(s.icon || ”).trim() ||
String(s.value || ”).trim() ||
String(s.label || ”).trim()
));
const statsHtml = visibleStats.map(s => {
const hasIcon = Boolean(String(s.icon || ”).trim());
const iconHtml = hasIcon ? `
` : ”;
return `
`;
}).join(”);
// Card
const sect = document.createElement(‘section’);
sect.className=”scores-section-shell”;
sect.id = `article-item-${d.id}`;
sect.innerHTML = `
${d.textTop}
${d.img ? `
` : ”}
${d.textBottom}
${visibleStats.length ? `
${statsHtml}
` : ”}
${nextId ? `` : ”}
`;
sections.appendChild(sect);
});
// ToC controls
function toggleToC(open) {
document.getElementById(‘js-toc-drawer’).classList.toggle(‘is-open’, open);
document.getElementById(‘js-toc-overlay’).classList.toggle(‘is-open’, open);
}
document.getElementById(‘js-toc-open’).onclick = () => toggleToC(true);
document.getElementById(‘js-toc-close’).onclick = () => toggleToC(false);
document.getElementById(‘js-toc-overlay’).onclick = () => toggleToC(false);
document.getElementById(‘js-start’).onclick = () => { if (data.items.length > 1) scrollToSection(data.items[1].id); else if (data.items.length) scrollToSection(data.items[0].id); };
// Active nav highlight for manual scrolling only. Clicks set the active state immediately.
const observer = new IntersectionObserver((entries) => {
if (scoresProgrammaticScroll) return;
entries.forEach(entry => {
if (entry.isIntersecting) {
const id = entry.target.id.replace(‘article-item-‘, ”);
setActiveNavButton(id);
}
});
}, { rootMargin: ‘-20% 0px -70% 0px’ });
const observedHero = document.querySelector(‘.scores-hero[id^=”article-item-“]’);
if (observedHero) observer.observe(observedHero);
document.querySelectorAll(‘.scores-section-shell’).forEach(s => observer.observe(s));
});