A four-state NBA half-court zone chart in hand-rolled SVG — six rule-book zones tinted by points per shot against a league bar, replayed attempt by attempt with a real quarter-and-game-clock transport.
Preview in your theme
Loading preview…
This component is part of Pro
The install command, prompt and concept map are included with a Pro license — one purchase unlocks every Pro component, forever.
status="ready" · one team's 64 attempts from the floor, the playhead parked on the final buzzer. Solid tint is above the league bar (the rim at 1.44, the left corner at 1.80), diagonal hatch is below it (mid-range 0.55, above the break 0.83), and the right corner is dotted because three attempts is not a sample. Press play, or drag the rail, to watch the zones fill in quarter by quarter — the ring travels to the newest attempt.
Shot zones
Ridgeview Hawks vs Lakeside Prep · Feb 14, 2026 · 7:08 pm tip
Q4 01:09
64 of 64 attempts
1.05points per shotFG 29/64 · eFG 52.3%
Restricted area: 13 of 18, 1.44 points per shot, 0.12 above the league bar 1.32.
▲ above the league bar
▼ below it
~ under 4 attempts
no attempts
Q1Q2Q3Q4
Play walks the attempts in game order. Drag the rail, or focus it and use the arrows — Page Up and Page Down jump a quarter.
Q4 01:09. 64 attempts, 1.05 points per shot. Last: D. Okafor made a 2-pointer from the restricted area, cutting layup.
Half-court shot zones at Q4 01:09, from tip-off: 64 attempts, 29 made, 1.05 points per shot. Best zone Left corner 3 at 1.80. Worst Mid-range at 0.55. Zones are tinted by how far their points per shot sit from the league bar; solid is above it, hatched below. Figures are for the attempts on the floor at this instant; move the transport to change it.
Zone
Attempts
Made
FG%
Points per shot
League bar
Difference
Share of attempts
Restricted area
18
13
72.2%
1.44
1.32
0.12 above the bar
28.1%
In the paint
9
4
44.4%
0.89
0.86
0.03 above the bar
14.1%
Mid-range
11
3
27.3%
0.55
0.82
0.27 below the bar
17.2%
Left corner 3
5
3
60%
1.80
1.17
0.63 above the bar
7.8%
Right corner 3
3
1
33.3%
1.00
1.17
0.17 below the bar
4.7%
Above the break 3
18
5
27.8%
0.83
1.05
0.22 below the bar
28.1%
onZoneSelect → nothing selected
The same night, paused at Q3 08:16 through the controlled frame/defaultFrame/onFrameChange triple: attempt 38 of 64, and the card renders identically on every load, which is what makes a replay screenshot-stable. The transport still works — every press, scrub and arrow key goes out through onFrameChange and comes back as a prop.
Shot zones
Ridgeview Hawks vs Lakeside Prep · Feb 14, 2026 · 7:08 pm tip
Q3 08:16
38 of 64 attempts
1.05points per shotFG 17/38 · eFG 52.6%
Restricted area: 5 of 8, 1.25 points per shot, 0.07 below the league bar 1.32.
▲ above the league bar
▼ below it
~ under 4 attempts
no attempts
Q1Q2Q3Q4
Play walks the attempts in game order. Drag the rail, or focus it and use the arrows — Page Up and Page Down jump a quarter.
Q3 08:16. 38 attempts, 1.05 points per shot. Last: A. Rowe made a 2-pointer from the restricted area, putback.
Half-court shot zones at Q3 08:16, from tip-off: 38 attempts, 17 made, 1.05 points per shot. Best zone In the paint at 1.60. Worst Mid-range at 0.50. Zones are tinted by how far their points per shot sit from the league bar; solid is above it, hatched below. Figures are for the attempts on the floor at this instant; move the transport to change it.
Zone
Attempts
Made
FG%
Points per shot
League bar
Difference
Share of attempts
Restricted area
8
5
62.5%
1.25
1.32
0.07 below the bar
21.1%
In the paint
5
4
80%
1.60
0.86
0.74 above the bar
13.2%
Mid-range
8
2
25%
0.50
0.82
0.32 below the bar
21.1%
Left corner 3
3
2
66.7%
2.00
1.17
0.83 above the bar
7.9%
Right corner 3
2
0
0%
0.00
1.17
1.17 below the bar
5.3%
Above the break 3
12
4
33.3%
1.00
1.05
0.05 below the bar
31.6%
controlled frame → 38 of 64 · Q3 08:16
accumulate="period" · the same feed, but each quarter starts from zero, so the zones read as this quarter only rather than as the game so far. Uncontrolled and opened on attempt 40 — eight attempts into the third, so the header says Q3 only.
Shot zones
Ridgeview Hawks vs Lakeside Prep · Feb 14, 2026 · 7:08 pm tip
Q3 06:57
40 of 64 attempts
1.38points per shotFG 5/8 · eFG 68.8% · Q3 only
Above the break 3: 1 of 3, 1.00 points per shot, league bar 1.05. Thin sample — too few attempts to judge.
▲ above the league bar
▼ below it
~ under 4 attempts
no attempts
Q1Q2Q3Q4
Play walks the attempts in game order. Drag the rail, or focus it and use the arrows — Page Up and Page Down jump a quarter.
Q3 06:57. 8 attempts, 1.38 points per shot. Last: M. Salas missed a 3-pointer from the above the break 3, catch-and-shoot three.
Half-court shot zones at Q3 06:57, Q3 only: 8 attempts, 5 made, 1.38 points per shot. Zones are tinted by how far their points per shot sit from the league bar; solid is above it, hatched below. Figures are for the attempts on the floor at this instant; move the transport to change it.
Zone
Attempts
Made
FG%
Points per shot
League bar
Difference
Share of attempts
Restricted area
2
2
100%
2.00
1.32
0.68 above the bar
25%
In the paint
2
2
100%
2.00
0.86
1.14 above the bar
25%
Mid-range
0
0
—
—
0.82
—
0%
Left corner 3
0
0
—
—
1.17
—
0%
Right corner 3
1
0
0%
0.00
1.17
1.17 below the bar
12.5%
Above the break 3
3
1
33.3%
1.00
1.05
0.05 below the bar
37.5%
Degenerate feed · one clean attempt, a corner three logged 3.5 ft out of bounds, a heave from past half court, a row whose x is not a number, "halftime" where a game clock should be, and an overtime attempt with tenths on it. Nothing is dropped in silence: the clamped and unplaceable counts are printed, the unreadable clock keeps its place at the end of its quarter, the rail grows an OT stop, and every zone that was touched at all comes back dotted, because one attempt grades nothing.
Shot zones · degenerate feed
Ridgeview Hawks · every edge the floor can throw
OT 00:04
5 of 5 attempts
1.40points per shotFG 3/5 · eFG 70%
2 attempts landed off the floor — clamped onto the nearest legal spot and counted in the zone that spot falls in · 1 attempt carry no usable location — left out of the drawing and out of every figure above · 1 attempt have an unreadable game clock — kept at the end of their own quarter and shown as --:--.
Above the break 3: 1 of 2, 1.50 points per shot, league bar 1.05. Thin sample — too few attempts to judge.
▲ above the league bar
▼ below it
~ under 4 attempts
no attempts
Q1Q2Q3OT
Play walks the attempts in game order. Drag the rail, or focus it and use the arrows — Page Up and Page Down jump a quarter.
OT 00:04. 5 attempts, 1.40 points per shot. Last: A. Rowe made a 3-pointer from the above the break 3, step-back three.
Half-court shot zones at OT 00:04, from tip-off: 5 attempts, 3 made, 1.40 points per shot. Zones are tinted by how far their points per shot sit from the league bar; solid is above it, hatched below. Figures are for the attempts on the floor at this instant; move the transport to change it.
Zone
Attempts
Made
FG%
Points per shot
League bar
Difference
Share of attempts
Restricted area
1
1
100%
2.00
1.32
0.68 above the bar
20%
In the paint
0
0
—
—
0.86
—
0%
Mid-range
1
1
100%
2.00
0.82
1.18 above the bar
20%
Left corner 3
1
0
0%
0.00
1.17
1.17 below the bar
20%
Right corner 3
0
0
—
—
1.17
—
0%
Above the break 3
2
1
50%
1.50
1.05
0.45 above the bar
40%
status="empty" · a valid contract with no attempts, worded so it cannot be mistaken for a failed fetch — the six zones sit on the floor waiting for the first quarter.
Shot zones
Ridgeview Hawks vs Lakeside Prep · Feb 14, 2026 · 7:08 pm tip
No attempts from the floor yet
The six zones fill in as the play-by-play arrives — press play once the first quarter is logged.
status="loading" · a deterministic skeleton in the ready layout — figures, floor, chips, transport — with no timer involved and animation off under prefers-reduced-motion.
Shot zones
Ridgeview Hawks vs Lakeside Prep · Feb 14, 2026 · 7:08 pm tip
Loading shot zones
status="error" · the play-by-play feed failed. Try again only appears when onRetry is passed, and pressing it flips the card to ready.
Shot zones
Ridgeview Hawks vs Lakeside Prep · Feb 14, 2026 · 7:08 pm tip