Objective taxonomy and signal-to-noise analyzer across 32 vetted technology publications and research feeds.
`; downloadFile("tech-news-stack.opml", opmlContent, "application/xml"); }); document.getElementById("btnExportJson").addEventListener("click", () => { const stackArr = SOURCES.filter(s => currentStack.has(s.id)); const exportData = { exportedAt: new Date().toISOString(), sourceCount: stackArr.length, estimatedWeeklyMinutes: stackArr.reduce((acc, s) => acc + s.timeMin, 0), sources: stackArr }; downloadFile("tech-news-manifest.json", JSON.stringify(exportData, null, 2), "application/json"); }); document.getElementById("btnResetStack").addEventListener("click", () => { currentStack.clear(); document.querySelectorAll(".chip").forEach(c => c.classList.remove("active")); updateUI(); }); // Setup persona chips document.querySelectorAll(".chip").forEach(chip => { chip.addEventListener("click", () => { document.querySelectorAll(".chip").forEach(c => c.classList.remove("active")); chip.classList.add("active"); const p = chip.getAttribute("data-persona"); if (PERSONA_PRESETS[p]) { currentStack = new Set(PERSONA_PRESETS[p]); updateUI(); } }); }); // Setup domain filters document.querySelectorAll(".f-btn").forEach(btn => { btn.addEventListener("click", () => { document.querySelectorAll(".f-btn").forEach(b => b.classList.remove("active")); btn.classList.add("active"); activeDomain = btn.getAttribute("data-domain"); renderMatrix(); }); }); window.addEventListener("resize", () => { renderMatrix(); }); // Init updateUI();