nba-dataview — getting around
Three kinds of page, nested: the season holds thirty
teams, a team holds its games. Everything is drawn in HTML and CSS —
every control is a label wired to a hidden checkbox, every plot is
positioned elements. No images anywhere. A handful of small inline
scripts ride along for the things CSS cannot price: sorting tables,
remembering your palette across pages, shareable links, hover
readouts, and tours that walk the real pages. Strip the scripts and
every page still renders whole and every filter still works — you
would only lose the sorting, the memory and the tooltips.
The map
SEASON — all 30 teams, one row each
↓ click any tricode (ring, conference rows, or plot label)
TEAM — one team's whole season, game by game
↓ click a game column, then LINK
GAME — one game, both teams, play by play
Each level climbs back up and moves sideways from its top-left
corner: ▴ or ^ goes
up a level, ‹ ›
or ◂ ▸
step to the neighbour. HELP,
INDEX, TOURS and
SHOWCASE close every page; INDEX drops you back
at the current season, TOURS is the player for the scripted walks, and
SHOWCASE is the curated greatest hits — the games, teams and seasons
every change to this site is judged against.
Season page
Navigating
- Down to a team: the table's tricodes are links, and in the
spinning ring shift-click a name to open its team page — a
plain click there hides/shows that team instead.
- Sideways: ‹ 24/25 /
› 24/25 in the top left circle through
the published seasons.
Controls
The same plot management the team page uses (SHOW/SHRINK, chips,
member toggles, sorts, packs), over the 30 teams instead of games.
- Teams ring / East–West rows — click a tricode to hide that
team everywhere; NONE inverts (start empty, add one by one).
Hiding teams lights SHOW, which restores them.
- Sorts order by displayed value (PF/TO/L sort by value, not rank).
- ←→ stacks visible teams keeping
the current order.
- PM auto-ranges to the shown teams; conference masks re-scale every
lane to the filtered field.
- The table sorts: click any column head to sort by it, click
again to flip, and the first column (Team) restores the written
order.
Team page
Navigating
- Down to a game: hover a game column to track it, click to
pin it. The pinned game's info line — date, matchup,
team-coloured score — appears centred on the SHOW/SHRINK row with a
LINK to that game's page.
- Up: ^ 25/26 returns to the season
page.
- Sideways: ‹ TRI /
› TRI step to the previous / next team,
alphabetical and circular.
- Across seasons: ◂ 23/24 /
▸ 25/26 open THIS team's page in the
neighbouring season — a link appears only where that season is
published.
Tabs
- Games — the filter card. Plots — the plot
show/shrink card. Players — the roster card.
GAMES card (filters)
- Chips are dim until selected, lit while active.
- All — lights whenever any filter is active; click to clear
them.
- 1:26 / 27:56 / 57:82 — season thirds (game-number ranges).
- Regular / Playoffs, East / West, OT / Clutch,
W / L, H / A — one of each pair at a time; click the
other to switch, All to clear.
- Filters hide game columns everywhere: plots, averages, the box.
Scales stay season-wide except PM, which re-ranges to the shown games.
PLAYERS card
- The roster as chips in minutes order, each in the player's own
chart colour — the same colour the game pages deal that player.
- Every player starts ON. Click a chip and that player leaves every
box number: the counting columns re-count, the percentages re-divide,
and PM becomes the margin over the minutes NONE of the deselected
players were on the floor (an em dash when no such minutes exist —
solo a starter and most games have none). ALL brings everyone
back; CLEAR removes everyone.
- The plots above stay whole-team — only the box re-counts.
PLOTS card
- Colored plot names — click to shrink/show that plot (dim =
shrunk).
- SHOW / SHRINK — copies of the main controls (below).
SHOW / SHRINK (main row, right side)
- SHRINK — shuts every plot. Your individually closed plots
are remembered through it.
- First SHOW after a SHRINK — restores exactly what that
SHRINK closed (your own closures stay closed).
- Second SHOW — shows everything (also the full reset: clears
member toggles and, on the season page, hidden teams).
- After SHRINK, a PLOTS-card chip peeks that one plot open;
its ✕ re-shuts it.
Plot label lines (under each plot)
- Single stats (PF, TO, BLK, STL, AST, PM) — the label itself
closes the plot. ↑↓ cycles none → sort-up
→ sort-down by that stat. ✕ closes.
←→ (appears under a filter) stacks
the shown games against an edge, keeping the current order.
- Groups (DR OR, FT% FTA FTM, 3P% …, 2P% …) — each member
name toggles that member: dimmed label, its bars and pole chips drop
from the plot. Each member has its own ↑↓
sorting the lane by that member's values. ✕
closes the whole plot.
The W/L band (bottom)
One shared plot area, three rows: W/L result on top
(green/red),
opponent color mid, B2B bottom (venue-pair colors:
yellow HH, pink
mixed, red AA;
creme = 2D rest; nothing = ordinary gap).
- W/L label, then four color-coded sorts that reorder all
three rows together: green by result, the
team color by home/away, gold by the
B2B value, white by opponent tricode.
- ←→ (under a filter) stacks the
band, keeping the active sort.
- The readout shows the tracked game: W/L, H/A, opponent,
B2B, each in its color. ✕ shrinks the band.
Tracking and pinning
- Hovering a game column raises the pole: a vertical tracking
line through every plot at that game's date (grey on hover, white when
pinned).
- The flags sit at each plot's pole tip: left of the pole is
that game's value for the stat, right of it the value's
rank among the season's games — rank 1 is always best
(most assists, but fewest fouls/turnovers). Group plots stack one
value|rank row per member, in the member's color.
- The date hat (mm-dd) rides just above the hovered plot's
flags.
- PINNED (left) releases the pinned game. Hovering another
game temporarily takes over the readouts; box-score rows track and
snap the same way.
Box score
- 10 / 25 / ALL / HIDE — visible rows. HIDE folds the game
rows away but keeps the summary lines standing.
- Filtered views add a status line naming the active filters with
the game count and W-L
record — it composes across every axis, opponent included.
- Under the table, always in view: a PER GAME line in the
column grid, then the TOTAL block — five labelled rows in the
stat colours, big numbers in 23.5K notation,
shooting with live percentages. Both re-sum to the games in view and
the player subset.
- Hovering a box column stripes the matching plot; hovering a row
tracks its game.
- The table sorts: click any column head to sort by it, click
again to flip; the Date column restores chronological order.
Game page
Navigating
All of it stacks in the top-left corner, five lines in the title
block's own type, each line sitting on one of the header's own rows:
- Lines 1–2 — the first team's
◂ previous and
▸ next game, each labelled with matchup
and date.
- Lines 3–4 — the same pair for the second team. So you can
follow either side of this matchup forward or back, and switch which
team you're chasing at any game.
- Line 5 — ▴ TRI goes up to the
team page this game belongs to.
- Games outside the published set 404 — the link is still there,
waiting for that page to exist.
Reading the page
It opens as a folded index — a stack of title lines — so you choose
what to look at. Every title with a ▸
opens and closes on click; ▾ means
open. A folded section shows nothing but its title, and its switches
go with it. The order: the header, the Scouting desk, the
shared Box Score — one fold holding both teams' box scores,
which open with it and still fold one at a time on their bare
TRI Box Score lines — the shared Lineups, then
Possessions, Rotations, the Shot Chart, and the
ESPN recap closing the page. Every
section loads closed, the closed titles keeping one shared pitch, so
the page opens as a true folded index end to end. Every scroller on
the page wears the teams' colours — a team's own table scrolls under
its brand, the shared ones under both.
Header
Stacked on the page's right: the game id alone in dark grey on
the top line, then the matchup, tip-off date and time, venue, and
the linescore —
team names in their colours, each quarter green
for the team that won it and red for the one
that lost, the final in full strength.
Scouting
The scout's desk opens the page: a welcome and a few words on how
to read a game with these sections, then the team windows —
two columns, the home team on the left and the away team on the
right, nine games apiece: the four before this game, this game, and
the four after — each with its date, matchup, score and margin, this
game's own row standing brighter. Every other game in the columns is
a link to its page; the season's edges leave a column short. This
game's row and every row BEFORE it carry a Notes
toggle — trailing the cells on both sides, under the team's tricode
that heads the column, so each team's notes sit on its own side of
the page — opening the desk's notes on
that team's night in that game: why it won or lost, argued from the
game's own numbers (the shooting and free-throw ledgers, the leaders,
the period that decided it, the plus/minus poles). Each opened note
is headed by its game, so several can stand at once; the rows after
this game stay plain — a scout previews from what came before. The
desk writes every game's notes itself; a few games carry notes
written by hand. Where the desk has called a game in advance, an
I Know toggle sits on the line under this
game's row, under Notes on both sides, and opens its forecast —
written before tip-off from the five games each side brought in, so
the notes beside it can grade it; where no one has written one, the
desk writes its own from the derived tables — each side's form,
leaders, absentees and rest, then the call with a score. The rows
AFTER this game carry their I Know in the Notes
slot, so the forecasts for the games ahead sit where their notes will
one day be. Every row of both windows carries an
Available toggle beside its Notes slot, opening
that team's
availability board going into that game, headed by the game
day and the team's rest: OUT (a rotation player who has missed
two or more straight, since when, and whether he returns tonight),
BACK (returned within the last five after such a streak, with
his minutes since), NEW (five or more minutes over his season
norm across the last five); "full strength" when there is nothing to
report.
Box Score (one per team, inside the shared fold)
One fold owns the team's whole player story: the box score leads,
and its rows ARE the player selector — no separate tab bar.
- The shot columns split the twos out:
2PM 2PA 2P%, then
3PM 3PA 3P% and
FTM FTA FT% — a two is a field goal less its
threes, here and everywhere else on the site's player tables.
- Click a player's row to add their chart below; click again
to drop it. A selected row dims — its player is already showing.
Selected charts overlay in one frame, translucent, on a fixed
+15 / -15 scale so the shapes compare
directly: on-court stretches tinted in the player's colour, the line
their running plus/minus, event letters along the way.
- The table sorts: click any column head, again to flip, and
the Player corner restores minutes order. Sorting carries the
colour masks and the row pickers with it.
- Show Per 32 swaps every counting stat for
its per-32-minutes rate (percentages stay true ratios); click again
for per-game.
- Column bests are goldenrod, column worsts red; shot groups with
no attempts read as grey dashes.
- The stack above the charts lists the selected players' box
lines. Mouse over a player's stint plane and their line swaps to that
stint's numbers; players on the bench read
- - -.
Lineups
The one section both teams share — the plain title reads
AWY @ HOM Lineups (or vs at home), and the whole package
folds on the first team's Lineups Box Score line: its
▾ closes both tables and the plot down
to that one title.
- The drawn unit is a face-off: the stretch where the SAME
ten players — five a side — shared the floor for at least a minute.
The translucent bands split the height (first team's tinting the top
half, second team's the bottom) with their boundaries aligned across
the halves; churn shorter than a minute shows as a thin dimmed sliver
in each team's colour, with no unit of its own.
- One marker per face-off: a circle at the POSITIVE
plus/minus, standing at the face-off's END — the moment the value is
actually in hand. Its top half wears the leading unit's team colour,
its bottom half the trailing unit's: the split names the winner, the
height names the amount. The plus/minus axis carries no numbers — the
grid, the zero line and the quarter marks are the frame.
- The lines: both teams' running scores climb the panel in
their own colours, and the game's score margin runs in
olive — the game clock's story behind the
lineup story.
- SCORES PM
LU PM — one chip per layer on the title line:
the score climbs, the olive margin line, and the face-off circles. A
dropped chip dims and takes its layer — and its pole flags — with
it.
- Hover the plot and a pole rides the cursor, flying both
scores, the olive game plus/minus and — inside a face-off — the
unit's own plus/minus as one positive flag in the leading team's ink
at the winning circle's height, with the game clock stamped at the
pole's foot. Click pins the moment; click again or Escape
releases.
- A face-off answers as one unit: hovering either half
lights both bands, rings the shared circle, and moves BOTH teams'
five-line summaries — the readouts above and below the plot, always
showing the last face-off touched: minutes and stats, who was on the
floor, who entered and left (the opening stint lists the starting
five as in). Click to pin a unit's readout; one per
team can be pinned at once.
- The box scores sit above and below the plot, labels flush
with the lineup codes. ALL /
10 and PER 8 /
GAME stack one line above the header,
right-aligned: rosters past ten lineups clip behind a scrollbar in
the team's colour with the header pinned along the top, and PER 8
swaps the counting stats for per-8-minute rates. The tables sort on
their column heads like the player boxes and double-click zeros a
column family; hovering a row lights that lineup's bands in the
plot, and hovering a band lights the row right back. Hovering a
lineup's code drops down the five names.
Possessions
Derived rather than reported: the play-by-play walked end to end
and cut into possessions. Points reconcile to the final score. A plot
of the game's four ledgers leads the section, and the table of every
trip follows it.
- The plot runs tip-off to final horn on the same frame as the
plots above it, so a period line drawn here stands under the same
moment there. Four ledgers share it: each team's running score
as a solid line in its own colour; the scoring plus/minus in
olive, with a dim straight chord behind it for
the pace the game eventually settled at — bright line above the chord
means that side is running ahead of the night's own drift; the
possession margin in teal, the running
difference in ball time; and each team's cumulative time of
possession as a solid staircase in its own colour, flat through a
trip and stepping up by its whole length at the end.
- The mast closes the plot at the right edge, flying the six
finals as flags at the heights their lines ended on — the two scores,
the two possession times, the plus/minus and the possession margin.
- Hover the plot and a second pole rides the cursor from
tip-off to the horn, flying those same six values for whatever moment
you are standing on, with the game clock stamped at its foot. It reads
the plots above too: sweep them and the pole follows along; sweep the
panel and a grey rule stands at that moment up there. Hovering a single
line steps the others back so it reads alone. Pointing at a possession
row stands the pole at that trip's end — where the pole's TOP
flag reads exactly what the row's TOP column says.
- The PIN: click a row (or a spot on the plot) and the moment
sticks — the row lights, the mast firms to double weight, and the pole
stands through any mouse travel. Click the same row again, click the
lit PIN chip on the period line, or press
Escape to release; clicking elsewhere moves the pin.
- PM SCORES
POSS DUR — one switch per
ledger, each chip inked like the lines it owns, all four on to start.
Dropping one takes its flags with it.
- Q1 … OT2
ALL — one period at a time, or ALL for the whole
game with each period headed by its own name. The table scrolls inside
its own window; the plot always shows the whole game.
- The columns read left to right as a sentence: # and
Team whose ball it was, Start the period and game clock it
began on, Dur how long it lasted, TOP that team's time of
possession for the game so far, PM what this trip scored, then
Players who was involved, Events what they did, and
Offset when — whole seconds from the start of the possession to
each event, one number per event in the Events order.
- The two running columns close the game out: the last TOP of
each team sums to the whole game, and the PM column sums to each
team's final score.
- A shot code carries where it came from:
M3.LW.25 is a made three from the left wing, 25
feet out; X2.RM.01 a missed two at the rim. The
distance is computed from the shot's own coordinates.
- Players are two initials; hover one for the full name. A tricode in
that column means the team itself rather than a person, and
-- means the feed named nobody.
- A value too long for its column wraps and carries on at that same
column, so a busy possession can be two lines deep.
- Who What
Where When — four legends
on the title line: the initials expanded for this game, the event codes,
the location codes, and what Offset means. Each opens over the
table without moving it.
Rotations
The whole game on one plot: the home-perspective
score margin runs through the middle as a step curve — the tie line
dead centre, leads shaded in the leading team's colour — with one
lane per player riding its banks,
home above, away below, stacked outward in minutes order, names on
the gutter in each player's colour
(SGA, Wemby and friends
go by the names people use). Quarter marks carry the period names and
the wall-clock time.
- The controls read across one line:
EVENTS ROT |
CLASSIC GREY LIGHT |
GAME LEN PTS PM.
- EVENTS prints what each player did ON their lane at the
minute it happened — 1 2 3 made shots by
value, 1x 2x 3x the misses,
a r s b t f
assist/rebound/steal/block/turnover/foul (the key sits in the
gutter). ROT book-ends every shift: how long it ran at the
start, what the scoreboard did — 9-4 +5, this
player's side first — at the end. Both start on; each is its own
switch.
- The palettes: CLASSIC is a dark
grey pill with the player's colour doing the talking as the text;
GREY turns the bars light grey under dark
text and takes the whole plot with it — caps, band, score lines,
legend down to a whisper; LIGHT fills each
bar with the player's colour at full strength, pale colours flipping
to dark text so the words never sink. Your pick follows you to every
page.
- The sorts: GAME is the game as
played; LEN, PTS and
PM stack every shift one after another —
longest or best first, wrapping at the plot's edge like words in a
line — the home block hanging from the top, the away block standing
on the bottom, mirrored bookends.
- Hover a shift — game-time or sorted — and it underlines
itself and prints its box-score line just under the controls; hover
a NAME for that player's whole game on the same row.
- Sweep the band and a pole follows the cursor carrying the
three numbers of that moment: the margin and both scores, each flag
riding at the height of its own line.
Shot Chart
The last section: a half court drawn to the rule book, with both
teams' field goals on it — each shot a line from where it was launched
to the rim, ending in a dot that is solid for a make and an open ring
for a miss, both in the team's colour. One chip cycles the four COLOUR
SCHEMES, always naming the next one:
Classic → Grey
→ CVD → TMS
→ back.
Classic is the opening view (ALL also lands there);
Grey drops the floor to shades of grey, the away side light
and the home side dark; CVD is the colour-blind-safe scheme —
the teams always read Okabe-Ito blue vs orange whatever their
brand colours, and every player is re-dealt a CVD-planned colour
(cool shades for the blue side, warm for the orange, stepping through
lightness — lightness survives colour blindness when hue does not);
TMS is the TEAMS look, standing still: every mark keeps its
team-colour body and wears its shooter's wedge, aimed down its
own flight line to the basket — a pie of a third on a make, the
ring's quarter arc on a miss, the stacks' wedges at the bottom — with
the flight lines in the shooter's colour full-time.
The Shot Box below keeps its player colours in every scheme, because
the table is the legend. Your pick follows you to
every page. Both teams share one floor because the feed plots every
shot against the basket it attacked. Hover a shot for its readout —
the player code in the shooter's own colour, the shot code
M2 / X3, the distance,
then the shot-clock numbers: AS M3 25
11 | 7 is eleven seconds into the shot clock with
seven left before it would have sounded (24 at possession start, 14
again after an offensive rebound; other resets are not modelled). The
same readout answers EVERY mark that is a shot — the floor dots, the
baseline and free-throw stacks, the zone-mode beads, the histogram
squares.
- Q1 … ALL —
the section opens on ALL, the whole game; every layer below — floor,
stacks, Shot Box — swaps with the tab.
- The filter strip: both tricodes, Made / Miss,
2 / 3, then the scheme chip, then
2x (grows the court), FT (the
corner stacks and the box's FT numbers) and the five
zone modes, then ALL, which
puts every filter, mode and scheme back at once, and the two dance
chips, SLOW and TEAMS
(their own entries below). The flight lines and the named zones are
always drawn now, and the Scale rings deploy themselves with the
modes that use them — none of the three needs a chip. Dim means
subtracted.
- Zone modes — CLK RNG TTS TTV TIME,
select one (they are one radio group; ALL is the way back to the
shots). The first four replace the floor with beads on five radial
lines, one per sector: CLK in game order at a fixed step
(filtered beads collapse and the string closes ranks), RNG at
the shot's TRUE distance on the court's own scale, TTS seconds
into the shot clock, TTV seconds left before the violation.
TIME fans the game clock across the court instead: tip-off at
the left horizon, halftime straight up, the final horn at the right,
every shot at its true distance with a flight line trailing back to
the rim (the Lines chip governs them) — you can watch the game's
story sweep left to right. Concentric Scale rings come
with the mode — feet for RNG and TIME, seconds to the 24s ring
for the clocks, every fifth bead for CLK — and leave with it. Every
bead answers the mouse with the shot's own readout.
- RM shots live at the baseline, not at the rim: an 8-wide
stack per team, first row on the baseline, the pair centred on it —
away team left — in game order with the same make/miss marks and the
full hover readout. The rim area itself stays clean.
- Free throws stack in the court's upper corners — away team
left, home right growing inward — one circle per throw in game order,
wrapping every 7, with a thin seam between periods on the ALL stack.
Filtered circles collapse and the grid re-stacks, always 7 wide.
Hover a circle for its initials, M1 /
X1 and period.
- Player filters LIVE ON THE SHOT BOX — the separate names
column is gone. A row's name, in the player's own chart colour, is the
switch, and the whole row is its click target: click
anywhere on a player's row and they zero out — the row stands,
dimmed, every cell re-counted to 0-0, their
marks leave the floor, and the team totals re-sum without them; click
the dim row again to bring them back. Double-click a row and
the player SOLOS — they stay while every teammate zeroes, the other
team untouched. The tricodes fold the roster: the totals row's
tricode hides all of that team's player rows — purely visually,
no value anywhere changes, the team line keeps its full numbers —
and the head's tricode shows them again. Hover a name and the
floor answers:
every mark that is not theirs steps back to a whisper, and their own
marks — floor shots, zone beads, free throws, both histograms — take
the player's own colour. The panel off the court's right
shoulder keeps Lineup Filters (every lineup with five-plus
minutes as the Lineups section's own code — hover a code for who is
in it) and Clear, which blacks the whole floor
from any state — it only clears, never shows — with ALL the way
back.
- The shot-clock histograms, under the court:
TTS - Time To Shoot and TTV -
Time to Violation side by side, one second per bucket 0..24.
Each bar is a stack of make/miss cells mirrored around a centre
line — the away team climbs, the home team hangs — with a count axis
every five shots. Every filter and period tab re-stacks the bars;
shots the possession model cannot time sit out. Hover any square for
its shot's readout.
- The Shot Box — the per-player shooting table, LIVE. One
per team: PTS, then each family split three
ways — 2M 2A 2%, 3M 3A
3%, FTM FTA FT% (a two is a field goal
less its threes) — then the six segments and the three two-point
bands as makes-attempts (the 16+ band takes
every shot from 16 feet out, threes included, though the threes keep
their own counts out of the other bands). Every count is a live
counter and every
percent is refigured from the counts beside it, so EVERY filter
re-counts the table — areas, values, results, lineups, players.
A filtered player's row STANDS, dimmed
and zeroed, the team line re-sums without them, and clicking the
dim row restores them; Clear reads zeros; zero attempts rest at
0-0. The name reads in its player's colour in
every scheme.
- Shot Box sorting: click a column head and the rows rank by
it (the sort waits a beat, making sure the click is not the start of
a double), every column on the same cycle — sort, reversed, no
sort. The
M, A and % columns rank their own number; a location column (a
makes-attempts pair) ranks by its percent, makes over
attempts, attempts breaking ties, the never-tried sinking last. A
small blue dot on the ruling head says what
stands: ABOVE for the forward sort, BELOW for the reverse; no sort,
no dot. One click sorts EVERY box — both teams' tables and the period
copies rank together, the dot on every matching head. Sorting ranks
the FILTERED numbers on screen, and the team totals stay
pinned.
- Column zeros: double-click any head and its
column toggles between actual values and ZEROS — for that team
only, and in place: the column never moves or leaves, every cell
simply reads 0-0 (totals line included), the
head dims as the standing toggle, and NOTHING ELSE changes — PTS,
the other columns, the team line and the floor keep their true
numbers. The M, A and % of a family move as one (a zeroed family
blanks its %). Double-click again and the actuals return.
Goldenrod marks the period's best per column, red its worst
among those who tried, re-ranked per period tab, and the marks stay
gold and red in the Grey scheme too. The team totals row closes each
table; MIN and plus-minus are deliberately absent — they are not shot
data and cannot re-count.
- The dances — SLOW and
TEAMS at the strip's far end. SLOW
darkens the floor while a random player takes the spotlight: their
WHOLE night — field goals, rim shots from the baseline stack, free
throws from the corner — enters one note at a time in true game
order, and the band plays it: a made shot holds 160ms and fades
80 on a warm low triangle, a miss gets 80/80 an octave up on a
duller sine, each player singing from their own root, the reign
lasting exactly as long as their run needs. The TTS/TTV squares land
in step, the outgoing dancer's ghost overlaps the next entrance,
unchecked players sit out, the lit chip stops on a click, and Escape
always lets go. Between dancers the handoff is a fixed
160ms, and the jump circle follows the dancer: their
running points tick above in their own colour, their name and the
game clock of each landing note on the line beneath. TEAMS plays the ENTIRE GAME once through —
both sides interleaved in game order at the same cadence, the two
teams conversing on their own roots. Every mark lands in its
shooter's colour and settles into the team's over five
seconds, keeping the shooter's wedge aimed down its own flight line
to the basket — a pie of a third on a make, the ring's quarter arc
on a miss, free throws and rim beads included — and the flight lines
wear the shooter's colour throughout. The half-court jump circle keeps the
running score in team colours with the game clock
beneath, both ticking with every landed note. TEAMS is a strict
toggle: the first click starts it (the chip underlines while the
game is gathered — a few seconds on a fresh page — and every extra
click is eaten), and once the show is up the next TEAMS click
stops every facet at once.
ESPN Update
The AP game recap, via ESPN — headline and story. It closes the
page's app list.
Tours
Scripted walks of the site. A tour opens pages, glides
to things, clicks and mouses over them, and pauses to let you look —
with a ghost cursor playing the hand. TOURS
sits beside HELP and INDEX in every page's corner.
Playing one
- The TOURS page lists every tour; click one and it plays in
the frame. The line above the frame is the instruction being performed
(12/32 click "Playoffs"). Click
another tour to switch mid-run. tours.html#sga-3p
deep-links a tour and autoplays it.
- LIVE, beside each tour, runs it on the REAL pages instead
of the frame: the tour launches straight into its first page and
walks the actual site — a multi-page tour genuinely navigates, with
a progress strip bottom-left and esc to stop.
Any game, team or season URL with
#tour=name on the end starts one right
there.
- What the marks mean: the white circle is the hand, the gold ring
flashes on the thing about to be activated, and a click lands with a
ripple.
- One limit: the player's mouse-overs are synthetic, so pure-CSS
hover readouts (the floor shots' labels) don't pop — the scripted
readouts (beads, squares) do, and the cursor and ring always mark the
spot.
Writing one
- A tour is a plain text file in tours/ named
*.tour.txt, one instruction per line,
# for comments:
open team 2025-26 okc (also
game S TRI GID,
season S, help,
index, or any URL) ·
click "Colors" ·
hover "Gilgeous-Alexander" ·
scroll "TOTAL" /
scroll down 800 /
scroll up 800 /
scroll top /
scroll bottom ·
wait 2.5 ·
snap name.
- Targets are the visible text of the thing (exact first,
then the tightest element containing it) or a raw
css: selector.
- Reading and deciding:
let xx = box "S. Gilgeous-Alexander" "PTS"
reads the box-score cell where that row meets that column (the cell
gets the ring and the cursor);
say SGA scored {xx} shows a caption with the
value filled in; if xx < 10 say bad else say
god branches on it (< > <= >= == !=). Works on any
of the boxes — team, season, or game page (open the shot-chart fold
first there); made-attempt cells read as
12-21 and compare by their first number.
- Noises: beep (a bright blip),
boop (lower), bell,
horn, buzz,
chime and tada. Each
takes an optional duration and volume —
bell 2 0.5 is a two-second bell at half
volume — and tone 440 0.5 0.6 plays a raw
note (Hz, seconds, volume). A verdict can sound instead of speak:
if xx < 10 buzz else bell. They ring while
a tour plays on this site and in a live browser run; a recorded
video comes out silent.
- The TOURS page list refreshes itself on every rebuild and publish
— drop a file in tours/ and it appears.
- The same file also drives a real browser on the dev machine:
scripts/tour.py tours/x.tour.txt --headed to
watch live, --video for a recording, numbered
screenshots after every step either way.
Links and memory
- The address bar carries your view (game pages): any control
that differs from the page's default — palettes, schemes, sorts,
filters, picked players, folds, per-32 — writes itself into the URL
after #v=. Copy the address and send it;
whoever opens it sees exactly your view, without their own saved
preferences being touched.
- The pages remember you: the Rotations palette, the shot
chart scheme, the section folds and the per-32 switch all persist in
your browser — pick GREY once and every page opens in it. A form
reset (ALL) still restores any page to its
written state.
Layout and coverage
- The season and team pages are frozen at a 900px design canvas —
identical at every window size (small windows scroll). Game pages
scale with the window.
- Every season and team page is here in full, with data and links
for the whole season, and EVERY game page is published — all 3,936
games across the three seasons, linked from the index and the team
pages.