Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions 404.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<link rel="icon" href="/assets/favicon.svg" type="image/svg+xml"/>
<link rel="manifest" href="/manifest.json"/>
<link rel="stylesheet" href="assets/fonts.css?v=8f376b2a"/>
<link rel="stylesheet" href="/assets/atlas.css?v=0e414fbd"/>
<link rel="stylesheet" href="/assets/atlas.css?v=e01c0f2f"/>
<style>
.nf{ min-height: calc(100vh - var(--nav-h) - 180px); display: grid; place-items: center; }
.nf__code{ font-family: var(--font-display); font-size: clamp(96px, 20vw, 220px); font-weight: 700; letter-spacing: -.06em; line-height: .85; color: transparent; -webkit-text-stroke: 1px var(--line-2); font-variant-numeric: tabular-nums; }
Expand All @@ -38,6 +38,6 @@ <h1 class="title-card__title reveal reveal-2">There’s no page at this address.
<div class="site-footer__links"><a href="/">Atlas</a><a href="/play">Play</a><a href="/players">Players</a><a href="/insights">Insights</a><a href="/methods">Methods</a><a href="https://github.com/jcdavis131/vector-hoops" rel="noopener">Source</a></div>
<p class="site-footer__attribution">Every number recomputable from stats.nba.com · A <a href="https://dumbmodel.com">dumbmodel</a> project</p>
</footer>
<script src="/assets/site-nav.js?v=1d646996"></script>
<script src="/assets/site-nav.js?v=0f2cbdd2"></script>
</body>
</html>
2 changes: 1 addition & 1 deletion assets/arc_priors_2026-27.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion assets/atlas-map.js
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@
'<div><dt>Paint → perimeter</dt><dd>' + p.x.toFixed(3) + '</dd></div>' +
'<div><dt>Scoring load</dt><dd>' + p.y.toFixed(3) + '</dd></div>' +
'</dl>' +
'<a class="readout__link" href="/players">Open player directory →</a>';
'<a class="readout__link" href="/players?q=' + encodeURIComponent(p.n) + '">Open ' + esc(p.n) + ' dossier →</a>';

if (!window.VHMtnn || !window.VHMtnn.isReady()) {
body.innerHTML = [0, 1, 2].map(function (k) {
Expand Down
6 changes: 6 additions & 0 deletions assets/atlas.css
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,12 @@ table{ border-collapse: collapse; width: 100%; }
color: var(--fg-2); text-decoration: none;
}
.site-footer__links a:hover{ color: var(--fg); }
.site-footer__links--more{ margin-top: var(--s-3); gap: 8px 20px; }
.site-footer__links--more span{
font-family: var(--font-display); font-size: 11px; font-weight: 600; font-stretch: 112%;
letter-spacing: .16em; text-transform: uppercase; color: var(--fg-3);
}
.site-footer__links--more a{ font-size: 10px; }
.site-footer__attribution{ margin: 0; opacity: 1; font-size: 12px; color: var(--fg-3); }
.site-footer__attribution a{ color: var(--fg-2); }

Expand Down
2 changes: 1 addition & 1 deletion assets/current_rosters.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion assets/eratwins.json

Large diffs are not rendered by default.

8 changes: 6 additions & 2 deletions assets/game-mechanics.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,10 @@
}catch(e){ console.warn('twin reveal map fail', e); }
}
var s=slotScope(); lsSet('vh.twinreveal.'+s.day+'.'+s.slot, true);
lifelineStatus('🔭 Twins of '+(q.name||'your guess')+': '+names.join(' • '));
/* renderLifelines() rebuilds #lifelines-bar (wiping #lifeline-status),
so flip the button state FIRST, then write the reveal text. */
renderLifelines();
lifelineStatus('🔭 Twins of '+(q.name||'your guess')+': '+names.join(' • '));
}).catch(function(e){ lifelineStatus('Twin data still loading — try again in a moment.'); });
}
function eraLock(){
Expand All @@ -155,8 +157,10 @@
}).catch(function(){});
// consume a turn: the status bar + finish() read eraLocksUsed(), so the cost is visible
try{ if(window.updateStatusBar) window.updateStatusBar(); }catch(e){}
lifelineStatus('🕰 Era Lock: the mystery player is from the '+dec+' (−1 guess). Other decades dimmed.');
/* renderLifelines() rebuilds #lifelines-bar (wiping #lifeline-status),
so flip the button state FIRST, then write the status text. */
renderLifelines();
lifelineStatus('🕰 Era Lock: the mystery player is from the '+dec+' (−1 guess). Other decades dimmed.');
}
function openCourtCheck(playerId){
// Hook for the Court Lab page (spec §2.2). Hidden until the page exists.
Expand Down
2 changes: 1 addition & 1 deletion assets/game_vectors.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion assets/ghost_db.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion assets/honors.json

Large diffs are not rendered by default.

22 changes: 17 additions & 5 deletions assets/insights.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,32 @@
};
}

/* Kicker -> theme class for color-coded card grouping. */
/* Kicker -> theme class for color-coded card grouping.
Kickers are a controlled topic vocabulary (see insights.json). */
var KICKER_THEMES = {
'Cap spike': 'money', 'Dead money': 'money', 'Contracts': 'money',
'Sacrifice': 'money', 'Payroll': 'money', 'Tickets': 'money',
'Tax': 'money', 'Meta': 'entity',
'Money layer': 'money', 'Money': 'money', 'Overpaid': 'money',
'Underpaid': 'money', 'Dead money': 'money', '2016 cap spike': 'money',
'Underpaid': 'money', '2016 cap spike': 'money',
'Tax Burden': 'money', 'Repeater Tax': 'money', 'Second Apron': 'money',
'Entity grounding': 'entity'
};
function kickerTheme(kicker) {
return KICKER_THEMES[kicker] || 'default';
}

/* Card numbers, filled by render() from JSON order. */
var NUM_BY_SLUG = {};

function esc(s) {
return String(s).replace(/[&<>"']/g, function (c) {
return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
});
}

function load() {
return fetch('assets/insights.json?v=19b59a90').then(function (r) {
return fetch('assets/insights.json?v=4ffe6eff').then(function (r) {
if (!r.ok) throw new Error('insights.json ' + r.status);
return r.json();
});
Expand Down Expand Up @@ -268,8 +275,10 @@

function cardHTML(ins, featured) {
var viz = (VIZ[ins.viz] || barsSVG)(ins);
var num = NUM_BY_SLUG[ins.slug];
return '<article class="vh-ins__card' + (featured ? ' vh-ins__card--featured' : '') + '" id="ins-' + ins.slug + '" data-slug="' + ins.slug + '" data-theme="' + kickerTheme(ins.kicker) + '">' +
'<div class="vh-ins__kicker vh-ins__kicker--' + kickerTheme(ins.kicker) + '">' + esc(ins.kicker) + '</div>' +
'<div class="vh-ins__kicker vh-ins__kicker--' + kickerTheme(ins.kicker) + '">' +
(num ? '<span class="vh-ins__num">№' + num + '</span>' : '') + esc(ins.kicker) + '</div>' +
'<h2 class="vh-ins__title">' + esc(ins.title) + '</h2>' +
(ins.tldr ? '<p class="vh-ins__tldr"><span>tl;dr</span>' + esc(ins.tldr) + '</p>' : '') +
'<p class="vh-ins__lede">' + esc(ins.lede) + '</p>' +
Expand Down Expand Up @@ -306,7 +315,10 @@
cardHTML(pick, true);
}
var lastSeries = null;
host.innerHTML = rest.map(function (ins) {
/* Card numbers (№1..№27) are the card's position in insights.json —
the home "Fresh from the lab" doors reference them. */
NUM_BY_SLUG = {};
list.forEach(function (ins, i) { NUM_BY_SLUG[ins.slug] = i + 1; }); host.innerHTML = rest.map(function (ins) {
var head = '';
if (ins.series && ins.series !== lastSeries) { lastSeries = ins.series; head = seriesHead(ins.series); }
return head + cardHTML(ins, false);
Expand Down
Loading
Loading