diff --git a/public/data.json b/public/data.json index 2ea0c01..04c6305 100644 --- a/public/data.json +++ b/public/data.json @@ -215,7 +215,7 @@ "contributor": "@1feems" } ], - "last_updated": "2026-05-05", + "last_updated": "2026-05-10", "next_review": "weekly — Sundays (DRI synthesis)" }, "developers": [ @@ -233,7 +233,8 @@ "https://groups.google.com/g/bitcoindev/c/uUK6py0Yjq0", "https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki", "https://github.com/bitcoin/bips/blob/master/bip-0324.mediawiki" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 2, @@ -245,7 +246,8 @@ "notable": false, "summary": "No public statements on quantum risk; retired from Bitcoin development 2022", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 3, @@ -259,7 +261,8 @@ "key_source": "https://groups.google.com/g/bitcoindev/c/gOfL5ag_bDU/m/n41i8uXACgAJ", "sources": [ "https://groups.google.com/g/bitcoindev/c/gOfL5ag_bDU/m/n41i8uXACgAJ" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 4, @@ -273,7 +276,8 @@ "key_source": null, "sources": [ "https://www.dci.mit.edu/people" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 5, @@ -285,7 +289,8 @@ "notable": false, "summary": "No public statements on quantum risk; focused on build systems and release management", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 6, @@ -297,7 +302,8 @@ "notable": false, "summary": "No public statements on quantum risk; focused on wallet infrastructure", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 7, @@ -315,7 +321,8 @@ "https://x.com/n1ckler/status/2038695067754328095", "https://delvingbitcoin.org/t/shrincs", "https://github.com/bitcoin/bips/blob/master/bip-0360.mediawiki" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 8, @@ -329,7 +336,8 @@ "key_source": "https://gnusha.org/pi/bitcoindev/ZjD-dMMGxoGNgzIg@camus/", "sources": [ "https://gnusha.org/pi/bitcoindev/ZjD-dMMGxoGNgzIg@camus/" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 9, @@ -343,7 +351,8 @@ "key_source": "https://podcasts.apple.com/ug/podcast/id1569130932?i=1000665129605", "sources": [ "https://podcasts.apple.com/ug/podcast/id1569130932?i=1000665129605" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 10, @@ -355,7 +364,8 @@ "notable": false, "summary": "No public statements on quantum risk; focused on multiprocess architecture", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 11, @@ -367,7 +377,8 @@ "notable": false, "summary": "No public statements on quantum risk; focused on libbitcoinkernel", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 12, @@ -379,7 +390,8 @@ "notable": false, "summary": "No public statements on quantum risk; focused on build system/GUI", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 13, @@ -391,7 +403,8 @@ "notable": false, "summary": "No public statements on quantum risk; focused on P2P relay and mempool", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 14, @@ -403,7 +416,8 @@ "notable": false, "summary": "No personal statements; org published quantum report (Shikhelman May 2025)", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 15, @@ -417,7 +431,8 @@ "key_source": "https://x.com/LukeDashjr/status/2001602642179408164", "sources": [ "https://x.com/LukeDashjr/status/2001602642179408164" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 16, @@ -431,7 +446,8 @@ "key_source": "https://x.com/murchandamus/status/1989417359988462015", "sources": [ "https://x.com/murchandamus/status/1989417359988462015" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 17, @@ -447,7 +463,8 @@ "https://cointelegraph.com/magazine/bitcoin-7-years-upgrade-post-quantum-bip-360-co-author/", "https://github.com/bitcoin/bips/blob/master/bip-0360.mediawiki", "https://github.com/bitcoin/bips/blob/master/bip-0347.mediawiki" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 18, @@ -463,7 +480,8 @@ "https://github.com/bitcoin/bips/pull/1670", "https://github.com/bitcoin/bips/blob/master/bip-0360.mediawiki", "https://delvingbitcoin.org/t/proposing-a-p2qrh-bip-towards-a-quantum-resistant-soft-fork/956" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 19, @@ -477,7 +495,8 @@ "key_source": "https://x.com/theinstagibbs/status/1995889077661430216", "sources": [ "https://x.com/theinstagibbs/status/1995889077661430216" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 20, @@ -489,7 +508,8 @@ "notable": false, "summary": "No public statements on quantum risk; less active recently", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 21, @@ -501,7 +521,8 @@ "notable": false, "summary": "No public statements on quantum risk; less active recently", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 22, @@ -516,7 +537,8 @@ "sources": [ "https://eprint.iacr.org/2025/1307", "https://gist.github.com/harding/bfd094ab488fd3932df59452e5ec753f" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 23, @@ -530,7 +552,8 @@ "key_source": "https://x.com/darosior/status/2002021021625225310", "sources": [ "https://x.com/darosior/status/2002021021625225310" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 24, @@ -542,7 +565,8 @@ "notable": false, "summary": "No public statements on quantum risk; BIP editor", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 25, @@ -557,7 +581,8 @@ "sources": [ "https://bips.dev/352/", "https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 26, @@ -574,7 +599,8 @@ "https://gnusha.org/pi/bitcoindev/CAO3Pvs8A0GLW-xdSHCKosjPqo7WSf-=YJ7F7s7t65RvtArcBEQ@mail.gmail.com/", "https://www.coindesk.com/tech/2026/04/09/bitcoin-gets-first-working-prototype-of-quantum-resistant-wallet-rescue-tool", "https://www.crypto-news-flash.com/bitcoin-gets-first-working-prototype-of-quantum-resistant-wallet-rescue-tool/" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 27, @@ -586,7 +612,8 @@ "notable": false, "summary": "No quantum statements found across gnusha.org and diyhpl.us transcript archives", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 28, @@ -598,7 +625,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 29, @@ -610,7 +638,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 30, @@ -622,7 +651,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 31, @@ -634,7 +664,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 32, @@ -646,7 +677,8 @@ "notable": false, "summary": "Working on FROST (quantum-tangential) but no quantum position statements", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 33, @@ -663,7 +695,8 @@ "https://bitcoinops.org/en/newsletters/2025/06/06/", "https://bitcoinops.org/en/newsletters/2025/08/01/", "https://bitcoinops.org/en/newsletters/2026/02/06/" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 34, @@ -679,7 +712,8 @@ "https://bitcoinmagazine.com/print/the-core-issue-keeping-bitcoin-core-secure", "https://brink.dev/programs", "https://github.com/dergoegge/fuzzamoto" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 35, @@ -691,7 +725,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 36, @@ -706,7 +741,8 @@ "sources": [ "https://gnusha.org/pi/bitcoindev/aHuKIKqvCZl5rcEX@petertodd.org/", "https://groups.google.com/g/bitcoindev/c/uEaf4bj07rE" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 37, @@ -720,7 +756,8 @@ "key_source": "https://gnusha.org/pi/bitcoindev/87b4e402-39d8-46b0-8269-4f81fa501627n@googlegroups.com/", "sources": [ "https://gnusha.org/pi/bitcoindev/87b4e402-39d8-46b0-8269-4f81fa501627n@googlegroups.com/" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 38, @@ -735,7 +772,8 @@ "sources": [ "https://github.com/bitcoin/bips/blob/master/bip-0360.mediawiki", "https://github.com/bitcoin/bips/pull/1670" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 39, @@ -749,7 +787,8 @@ "key_source": "https://gnusha.org/pi/bitcoindev/ED96C777-5BBD-4ACE-8821-A53FDE8FA128@sprovoost.nl/", "sources": [ "https://gnusha.org/pi/bitcoindev/ED96C777-5BBD-4ACE-8821-A53FDE8FA128@sprovoost.nl/" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 40, @@ -764,7 +803,8 @@ "sources": [ "https://chaincode.com/bitcoin-post-quantum.pdf", "https://www.youtube.com/watch?v=FNqYU9TudRU" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 41, @@ -778,7 +818,8 @@ "key_source": "https://hrf.org/latest/the-quantum-threat-to-bitcoin/", "sources": [ "https://hrf.org/latest/the-quantum-threat-to-bitcoin/" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 42, @@ -793,7 +834,8 @@ "sources": [ "https://www.galaxy.com/insights/research/bitcoin-quantum-computing-risk", "https://www.theblock.co/post/388969/coinshares-says-only-10200-btc-face-real-quantum-risk-pushing-back-on-overblown-estimates" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 43, @@ -807,7 +849,8 @@ "key_source": "https://nehanarula.org/2026/04/03/bitcoin-and-quantum-computing.html", "sources": [ "https://nehanarula.org/2026/04/03/bitcoin-and-quantum-computing.html" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 44, @@ -821,7 +864,8 @@ "key_source": "https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2021-March/018645.html", "sources": [ "https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2021-March/018645.html" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 45, @@ -833,7 +877,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 46, @@ -847,7 +892,8 @@ "key_source": "https://freicoin.substack.com/p/why-im-against-taproot", "sources": [ "https://freicoin.substack.com/p/why-im-against-taproot" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 47, @@ -859,7 +905,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 48, @@ -871,7 +918,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 49, @@ -883,7 +931,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 50, @@ -895,7 +944,8 @@ "notable": false, "summary": "No public statements on quantum risk", "key_source": null, - "sources": [] + "sources": [], + "last_verified": "2026-04-10" }, { "rank": 51, @@ -910,7 +960,8 @@ "sources": [ "https://gnusha.org/pi/bitcoindev/43afd5bb-244e-4698-ba3d-139efa2c2058@mattcorallo.com/", "https://podcasts.apple.com/us/podcast/what-do-bitcoiners-do-about-quantum-with-matt-corallo/id1415720320?i=1000749245854" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 52, @@ -926,7 +977,8 @@ "https://x.com/adam3us/status/1989721899991986374", "https://www.coindesk.com/tech/2026/04/08/bitcoin-s-quantum-threat-is-distant-but-migration-clock-is-ticking-says-adam-back-says", "https://bitcoinmagazine.com/news/adam-back-says-quantum-threat-to-bitcoin" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 53, @@ -941,7 +993,8 @@ "sources": [ "https://www.benzinga.com/crypto/cryptocurrency/26/04/51687930/nobel-physicist-warns-bitcoin-could-be-cracked-in-minutes-but-the-community-has-5-10-years-to-act", "https://thequantuminsider.com/2026/03/26/john-martinis-nobel-prize-winning-physicist-joins-white-house-science-and-technology-panel/" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 54, @@ -956,7 +1009,8 @@ "sources": [ "https://github.com/bitcoin/bips/pull/1895", "https://github.com/jlopp" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 55, @@ -972,7 +1026,8 @@ "https://www.coindesk.com/markets/2026/04/10/quantum-safe-bitcoin-now-possible-without-a-soft-fork-but-costs-usd200-a-pop", "https://bitcoinmagazine.com/news/bitcoin-could-be-quantum-safe", "https://starkware.co/blog/bitcoins-quantum-proposal-features-starkware-co-author/" - ] + ], + "last_verified": "2026-04-10" }, { "rank": 57, diff --git a/public/index.html b/public/index.html index 5ad879f..214b96d 100644 --- a/public/index.html +++ b/public/index.html @@ -234,6 +234,33 @@ .drawer-source:hover{border-color:var(--border-light);color:var(--text);background:var(--bg-hover)} .drawer-source-num{flex-shrink:0;font-family:'JetBrains Mono',monospace;color:var(--text-muted);font-size:0.7rem;padding-top:0.05rem;min-width:1.25rem} .drawer-empty{font-size:0.8rem;color:var(--text-muted);font-style:italic} + +/* Compare view */ +.compare-panel{display:none;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-sm);margin-bottom:1rem;overflow:hidden} +.compare-panel.is-open{display:block} +.compare-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:0.85rem 1rem;border-bottom:1px solid var(--border)} +.compare-label{font-size:0.65rem;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:var(--text-muted)} +.compare-count{font-size:0.8rem;color:var(--text-secondary);margin-top:0.15rem} +.compare-clear,.compare-btn,.drawer-compare-btn,.compare-remove{border:1px solid var(--border);background:var(--bg);color:var(--text-secondary);border-radius:var(--radius-xs);font-family:'Inter',sans-serif;font-size:0.75rem;font-weight:600;cursor:pointer;transition:all 0.15s} +.compare-clear{padding:0.45rem 0.75rem;flex-shrink:0} +.compare-clear:hover,.compare-btn:hover,.drawer-compare-btn:hover,.compare-remove:hover{border-color:var(--border-light);background:var(--bg-hover);color:var(--text)} +.compare-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:1px;background:var(--border)} +.compare-card{background:var(--bg-elevated);padding:1rem;min-height:260px;display:flex;flex-direction:column;gap:0.75rem} +.compare-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:0.75rem} +.compare-name{font-size:0.95rem;font-weight:700;line-height:1.25} +.compare-meta{font-size:0.7rem;color:var(--text-muted);line-height:1.5;margin-top:0.25rem} +.compare-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--border);border-radius:var(--radius-xs);overflow:hidden} +.compare-stat{background:var(--bg);padding:0.55rem;text-align:center} +.compare-stat-value{font-family:'JetBrains Mono',monospace;font-size:0.9rem;font-weight:800} +.compare-stat-label{font-size:0.55rem;color:var(--text-muted);letter-spacing:0.06em;text-transform:uppercase;margin-top:0.15rem} +.compare-summary{font-size:0.78rem;color:var(--text-secondary);line-height:1.55;display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden} +.compare-source{font-size:0.75rem;color:var(--accent);text-decoration:none;margin-top:auto;font-weight:600;word-break:break-all} +.compare-source:hover{text-decoration:underline} +.compare-remove{padding:0.3rem 0.5rem;line-height:1} +.compare-btn{padding:0.35rem 0.55rem;white-space:nowrap} +.compare-btn.is-selected,.drawer-compare-btn.is-selected{background:rgba(247,147,26,0.12);border-color:rgba(247,147,26,0.35);color:var(--accent)} +.drawer-compare-btn{padding:0.5rem 0.75rem;width:100%;margin-bottom:1.25rem} +@media(max-width:640px){.compare-head{align-items:flex-start;flex-direction:column}.compare-clear{width:100%}.compare-grid{grid-template-columns:1fr}.compare-card{min-height:auto}} @@ -333,6 +360,16 @@

Scorecard

+
+
+
+
Compare View
+
+
+ +
+
+
@@ -344,6 +381,7 @@

Scorecard

+ @@ -438,6 +476,7 @@

Ecosystem

+
@@ -460,11 +499,45 @@

Ecosystem

const total=data.metadata.total_assessed; const qri=data.metadata.quantum_readiness_index; +function levelForScore(value){ +if(value<20)return 'Asleep'; +if(value<40)return 'Sleepwalking'; +if(value<60)return 'Awakening'; +if(value<80)return 'Mobilizing'; +return 'Ready'; +} + +function normalizeReadiness(raw){ +if(raw&&typeof raw==='object'&&raw.composite_readiness&&raw.voiced_urgency&&raw.coverage)return raw; +const silent=dist['1_no_known_view']||0; +const voicedCount=Math.max(0,total-silent); +const weighted=(dist['5_urgent']||0)*5+(dist['4_proactive']||0)*4+(dist['3_cautious']||0)*3+(dist['2_dismissive']||0)*2; +const voicedScore=voicedCount?Math.round(weighted/(voicedCount*5)*100):0; +const coverageScore=total?Math.round(voicedCount/total*100):0; +let compositeScore=Math.round(voicedScore*coverageScore/100); +if(typeof raw==='number'&&Number.isFinite(raw)){ +compositeScore=Math.round(raw<=1?raw*100:raw); +} +const currentLevel=levelForScore(compositeScore); +return { +composite_readiness:{ +score:compositeScore, +current_level:currentLevel, +formula:typeof raw==='number' +?'Index loaded from metadata. Voiced urgency and coverage panels are derived from the current score distribution.' +:'Voiced urgency multiplied by coverage. Derived from the current score distribution because no structured index object was present.' +}, +voiced_urgency:{score:voicedScore,voices_count:voicedCount}, +coverage:{score:coverageScore,silent,total} +}; +} + // Readiness Index const indexEl=document.getElementById('index-card'); -const comp=qri.composite_readiness; -const voiced=qri.voiced_urgency; -const coverage=qri.coverage; +const normalizedQri=normalizeReadiness(qri); +const comp=normalizedQri.composite_readiness; +const voiced=normalizedQri.voiced_urgency; +const coverage=normalizedQri.coverage; const score=comp.score; const circumference=2*Math.PI*65; const offset=circumference-(score/100)*circumference; @@ -534,6 +607,8 @@

Ecosystem

let activeAffiliation='all'; let searchQuery=''; let activeDevName=null; +let drawerDev=null; +const compareNames=new Set(); // Affiliation dropdown — populate from data const affilSelect=document.getElementById('affil-select'); @@ -548,6 +623,58 @@

Ecosystem

function escapeHtml(s){return String(s==null?'':s).replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''})[c]);} +function selectedCompareDevs(){ +return Array.from(compareNames).map(name=>devs.find(d=>d.name===name)).filter(Boolean); +} + +function toggleCompare(dev){ +if(compareNames.has(dev.name)){ +compareNames.delete(dev.name); +}else{ +if(compareNames.size>=4)compareNames.delete(compareNames.values().next().value); +compareNames.add(dev.name); +} +render(); +if(drawerDev&&drawerDev.name===dev.name)updateDrawerCompareButton(); +} + +function renderCompare(){ +const panel=document.getElementById('compare-panel'); +const grid=document.getElementById('compare-grid'); +const count=document.getElementById('compare-count'); +const selected=selectedCompareDevs(); +panel.classList.toggle('is-open',selected.length>0); +count.textContent=selected.length?`${selected.length} selected; choose up to 4 developers for side-by-side review.`:'No developers selected.'; +grid.innerHTML=selected.map(dev=>{ +const rank=dev.notable?'+':dev.rank; +const vol=dev.pq_work_volume||0; +const source=dev.key_source?`Open key source`:'No key source.'; +return `
+
+
+
${escapeHtml(dev.name)}
+
${escapeHtml(dev.affiliation||'Independent')}${dev.role?'
'+escapeHtml(dev.role):''}
+
+ +
+
+
${rank}
Rank
+
${dev.quantum_urgency_score}
Score
+
${vol}
PQ Work
+
+
${escapeHtml(dev.summary||'No public quantum position identified.')}
+${source} +
`; +}).join(''); +grid.querySelectorAll('[data-remove]').forEach(btn=>{ +btn.addEventListener('click',e=>{ +e.stopPropagation(); +compareNames.delete(btn.dataset.remove); +render(); +}); +}); +} + function render(){ const tbody=document.getElementById('table-body'); tbody.innerHTML=''; @@ -559,8 +686,9 @@

Ecosystem

return scoreMatch&&affilMatch&&textMatch; }); document.getElementById('showing-count').textContent=`Showing ${filtered.length} of ${total}`; +renderCompare(); if(!filtered.length){ -tbody.innerHTML='
'; +tbody.innerHTML=''; return; } const frag=document.createDocumentFragment(); @@ -568,6 +696,7 @@

Ecosystem

const src=dev.key_source?`View`:'--'; const notable=dev.notable?'notable':''; const rank=dev.notable?'+':dev.rank; +const selected=compareNames.has(dev.name); const tr=document.createElement('tr'); if(activeDevName===dev.name)tr.classList.add('is-active'); tr.innerHTML=` @@ -575,7 +704,12 @@

Ecosystem

-`; + +`; +tr.querySelector('.compare-btn').addEventListener('click',e=>{ +e.stopPropagation(); +toggleCompare(dev); +}); tr.addEventListener('click',()=>openDrawer(dev)); frag.appendChild(tr); }); @@ -624,9 +758,19 @@

Ecosystem

const drawer=document.getElementById('drawer'); const drawerBackdrop=document.getElementById('drawer-backdrop'); const drawerCloseBtn=document.getElementById('drawer-close'); +const drawerCompareBtn=document.getElementById('drawer-compare-btn'); let lastFocused=null; +function updateDrawerCompareButton(){ +if(!drawerDev)return; +const selected=compareNames.has(drawerDev.name); +drawerCompareBtn.textContent=selected?'Remove from compare':'Add to compare'; +drawerCompareBtn.classList.toggle('is-selected',selected); +drawerCompareBtn.setAttribute('aria-pressed',String(selected)); +} + function openDrawer(dev){ +drawerDev=dev; activeDevName=dev.name; const scoreLabelMap={5:'Urgent',4:'Proactive',3:'Cautious',2:'Dismissive',1:'No View'}; document.getElementById('drawer-meta').textContent=dev.notable?'Notable Contributor':`Influence Rank #${dev.rank}`; @@ -654,6 +798,7 @@

Ecosystem

}else{ sourcesEl.innerHTML='
No additional sources listed.
'; } +updateDrawerCompareButton(); lastFocused=document.activeElement; drawer.classList.add('is-open'); drawerBackdrop.classList.add('is-open'); @@ -667,6 +812,7 @@

Ecosystem

function closeDrawer(){ activeDevName=null; +drawerDev=null; drawer.classList.remove('is-open'); drawerBackdrop.classList.remove('is-open'); drawer.setAttribute('aria-hidden','true'); @@ -677,6 +823,14 @@

Ecosystem

} drawerCloseBtn.addEventListener('click',closeDrawer); +drawerCompareBtn.addEventListener('click',()=>{ +if(drawerDev)toggleCompare(drawerDev); +}); +document.getElementById('compare-clear').addEventListener('click',()=>{ +compareNames.clear(); +render(); +updateDrawerCompareButton(); +}); drawerBackdrop.addEventListener('click',closeDrawer); document.addEventListener('keydown',e=>{if(e.key==='Escape'&&drawer.classList.contains('is-open'))closeDrawer();});
Score Position Summary SourceCompare
No developers match your filters.
No developers match your filters.
${rank} ${escapeHtml(dev.affiliation)} ${dev.quantum_urgency_score} ${escapeHtml(dev.summary||'No public quantum position identified.')}${src}${src}