Changelog
What we shipped, in plain English. Beta testers, you'll recognize most of it. The big stuff appears here first ; small bug fixes are batched into a "Polish & fixes" line so the list stays readable.
September 13, 2026
Touch/Poss is gone — we never had tracking data
« Touches » has a precise public meaning: optical tracking, the kind that knows when the ball is in a player’s hands. We do not have it, no public WNBA source does, and our column was counting box-score events instead. It has been removed. The column next to it, OnBall%, was renaming the same mistake — it is now Involvement%, and it says what it actually measures.
Removed
- Touch/Poss. Two reasons, and either one would have been enough. It borrowed a term from tracking providers for a number no external source can check — every other figure on this site is verified against a reference after each deploy, and this one structurally could not be. And it was redundant: across the 2025 WNBA season it correlated at r = 0.96 with the column beside it, so it carried about 8 % of its own information.
- OffBall%. It was defined as 100 minus OnBall%. A column that is the arithmetic complement of its neighbour tells you nothing the neighbour did not.
Renamed
- OnBall% is now Involvement%, on all leagues. « On-ball » promised the ball in her hands; the play-by-play cannot see that. What we can count exactly is the share of on-court offensive possessions in which she appears in the box score — a shot, a free throw, an assist, a turnover, an offensive rebound, a foul drawn. That is a floor on her involvement, never a touch count, and the glossary now says so without the apologetic paragraph it used to carry.
- The Playmaking radar axis loses Touch/Poss and gains %TmFGM AST, which we already publish. Seven stats before, seven after — but percentile values on that axis shift slightly for everyone.
Fixed
- A defensive rebound could invent an offensive possession. When a possession had already closed — which happens on every missed last free throw — the rebound that followed opened one and closed it in the same step, crediting the rebounder with a possession that never existed. On the 2025 season this affected 1.5 to 2.5 % of possessions, and it cut both ways: bigs collected phantom possessions with an event of their own, guards collected phantoms without one. Involvement% is now right at both ends.
Why remove rather than caveat. The glossary used to tell you this family of stats was « around 60 to 70 % accurate ». That sentence was honest, and it was the problem: a number that needs a paragraph of defence, and that no reference can settle, does not belong next to columns you can check.
September 1, 2026
Assist rates — a percentage that went past 100
On team rosters, some players were showing an assist rate of 121 %, 157 %, even 200 %. A percentage cannot do that. Across the 2025 WNBA season, 35 players out of 182 were above 100 — one of them at 300 %. This is fixed, and the columns have been renamed so the mistake behind it cannot come back quietly.
Fixed
- The formula was right, the subject was wrong. « Assists ÷ made field goals » is a real team statistic. Applied to one player it becomes « her passes ÷ the baskets she scores herself », which has no ceiling and measures nothing useful. A player who passes far more than she shoots lands above 100 mechanically.
- What replaces it is the exact mirror of the defensive column we already published: the share of the team's made field goals that were assisted while she is on the floor. Same shape, same period, same denominator logic as the opponent side — which is what makes the difference between the two readable.
- %AS 2P was showing negative values — for 14 players out of 16 on the roster we checked. Its denominator is « the team's two-point makes minus her own », and the team total was silently missing: the data feed reports two-pointers for players but not for teams, so the code was reading zero and subtracting her own makes from it. The team figure is now derived. %AS 3P was never affected, purely because three-pointers are reported at team level.
Renamed
- OffAST% and DefAST% are now TmAST% and OppAST%, on all four leagues. The old names suggested a pair with AST% sitting next to them, and all three looked like the same family. They are not: AST% is a personal creation rate, the other two describe how much the ball moves on the floor. Seeing 30 % next to 68 % on one row is expected — the glossary now says so explicitly.
- Three help texts described a formula we never computed, crediting the figure to Dean Oliver. They have been rewritten to match what the number actually is.
Why it lasted. The function carried a comment reading « team-level only ». It was accurate, and it was written before the bug. But a comment does not enforce anything, and the player pages called the function anyway. There is now a test that fails if the old formula ever comes back — and we checked it fails, rather than assuming it would.
August 31, 2026
NetTSA — who gets the ball up more often
The NET tab already told you whether a team wins the possession battle. It said nothing about what happens inside those possessions. NetTSA is the shot-volume gap: over 100 trips, do you get more attempts off than the team you are playing?
Added
- A NetTSA column on the NET tab of the league teams table, next to NetPoss — WNBA and NBA. Sortable and chartable.
- NetPoss and NetTSA are not the same question. NetPoss asks how many trips you win ; NetTSA asks how many shots you get out of them. Across the WNBA this season the two only partly agree with the final margin — one team sits at +3.4 NetTSA and −11.3 NetRtg: it takes plenty more shots than its opponents and still loses heavily.
- Nothing new was computed. The possession counts behind ORtg and DRtg were already in the payload ; NetTSA divides by the exact same numbers, so it cannot disagree with the ratings sitting on its own row.
It is a volume figure, not an efficiency one. It says nothing about whether the shots went in — that is what NetTS%, two columns over, is for. Read across a whole league it averages to zero, by construction: every attempt one team creates is an attempt another team concedes.
August 31, 2026
TSA — the volume behind the efficiency
TS% has been on the site for a while. It answers "how efficient?" and says nothing about "how much?". Two players at 58% TS% do not carry the same load if one took 400 scoring possessions and the other 900. TSA is that missing half.
Added
- A TSA column on the Shooting tab, right of TS%, for players, teams and the league — WNBA and NBA, same scope as Location eFG%. Per game, like the FGA and 3PA next to it. Sortable and chartable.
- Nothing new was computed. TSA is the denominator of TS%:
FGA + 0.44 × FTA. The backend already worked it out to produce TS%, then threw it away. We now show it.
Why 0.44 and not 0.5. Not every trip to the line is two shots — and-ones are one, three-shot fouls are three, and some free throws come from technicals. 0.44 is the long-standing estimate of how many possessions a free throw attempt actually costs.
August 31, 2026
Location eFG% — separating where you shoot from how well you shoot
Two players post the same eFG%. One gets there on layups, the other on contested pull-ups. Same number, opposite skills. Location eFG% pulls those apart: it is the eFG% you would post with your shot distribution if every shot converted at the league-average rate for the zone it came from.
Added
- Two columns on the Shooting tab, right of eFG%, for players, teams and the league — WNBA and NBA.
LocEFG%is what your shot diet is worth at league rates.eFG +/-is the gap to your real eFG%, in percentage points, coloured around zero. - The gap is the useful half. LocEFG% alone measures shot selection, not shooting. Read next to eFG%, it says which of the two a player is actually good at. On the WNBA 2026 season, Angel Reese has the best shot diet in the league among high-volume shooters (58.7% expected) and converts at 42.9% — the largest negative gap. Paige Bueckers is the mirror image: a hard shot diet (46.3%) shot at 56.4%.
- College zones are read from coordinates, not from text. The Rim% and Mid% columns already on the NCAA pages come from the play description ("layup", "jumper"); Location eFG% uses the same six coordinate-based zones as the WNBA and NBA. That is deliberate — the number has to mean the same thing in every league — but it does mean you cannot recompute it by hand from the two columns beside it. Lining those up is a separate job.
- A league reference by zone, which did not exist before.
/league/league-averagesreturned totals, rates, per-game and four factors, and no zone breakdown at all. It now carries one, scoped to the season and season type you are looking at.
One number, not one per zone. Our six zones are pure — none of them mixes 2- and 3-pointers. Inside a pure zone every shot is worth the same, so a per-zone eFG% would be the FG% already displayed next to it, rescaled. A single aggregated figure is the only version that says something new.
What this number does not include: shooting fouls. A missed shot on a foul is never recorded as a field goal attempt. On the WNBA 2026 regular season, only 1 265 of 4 422 shooting fouls have a shot logged alongside them — and the ones we can see are 55% rim attempts against 27% for the league. The attempts that go missing are overwhelmingly attempts at the basket, so our shot distribution under-represents the rim and LocEFG% runs low for players who live on contact. The bias is the same for everyone, so comparisons hold; the absolute value is softer than it looks. It is written up in the glossary, in plain terms, not as a footnote.
Heaves are kept — deliberately. Cleaning the Glass removes end-of-period desperation shots because they inflate 3-point frequency. Our feed carries no heave marker, so excluding them would mean inventing a clock-and-distance rule and would put this column at odds with the Freq% columns beside it. For scale: 171 shots out of 12 908 three-point attempts, 1.3%.
College too — and getting there fixed a bug of ours. Our NCAA data had no shot locations at all, and that turned out to be our doing rather than ESPN's: our own converter was discarding coordinates on every season, on the strength of a 2019 measurement generalised to all of them. ESPN in fact supplies them on 99.7% of 2026 women's shots and 99.6% of the men's. Fixed, and the column ships on the NCAAW and NCAAM pages — 2026 only. Earlier seasons sit between 14% and 42% coverage, and coverage is a property of the game, not the shot: those seasons are a few hundred fully-covered games picked by ESPN, not a random sample. A league average built on that is a selection bias wearing a statistic's clothes, so the column shows "—" there instead
August 24, 2026
MeBounds — who rebounds their own miss
An offensive rebound usually follows a teammate's miss. Sometimes it follows your own. Those two events sit in the same column everywhere, and they describe different things — so we split them out.
Added
- Three new columns on the Offense tab, for players and for teams, WNBA and NBA: the raw count (MeB), the per-game average (MeB/G), and the share of that player's offensive rebounds taken off their own shot (MeB%). Sortable like the rest.
- Read straight from the feed, not inferred. Each rebound event points to the shot it followed — on 100% of offensive rebounds in both leagues. We never guess from event order, so a blocked shot followed by a scramble is never miscounted.
The rate is a position marker before it is a skill. In the NBA the highest shares belong almost entirely to perimeter creators — Edwards 56%, Ingram 55%, Harden 55% — and the lowest to pure centers, around 12 to 15%. A guard grabs few offensive rebounds but takes most of them off her own shot: she is already standing where the ball comes back. Read the count and the rate together; neither tells the story alone.
It holds up as a player trait: a player's rate correlates 0.62 to 0.80 from one season to the next, across eleven season pairs in two leagues. A team's rate does not — it reflects who is on the roster, not a system. League averages: 23.2% in the WNBA, 19.8% in the NBA.
Two deliberate exclusions. Rebounds off your own missed free throw don't count — the shooter cannot enter the lane before the ball hits the rim, which is a different skill. And the denominator is the player's own offensive rebounds, never the team total: 37 to 39% of rebound events in the feed belong to no player, and counting them would flatten every rate by a third.
WNBA and NBA only. The NCAA feed does not link rebounds to shots. We could have approximated it from event order — we would rather show nothing than a number built on a different method and placed next to ones that aren't.
August 23, 2026
A defensive stat was showing 0.0% for every team, in every zone
Rebuilding the team pages on a faster query engine meant recomputing every number and comparing it against what we were serving. The comparison matched everywhere except one column — and that column turned out to have been wrong all along.
Fixed
- Opponent AST% by shot zone read 0.0% everywhere — on the Opp Shooting tab of every team page, all six zones. The code that breaks down opponent shots by zone counted attempts and makes, but never counted which of those makes came off an assist, while the percentage was computed anyway. A zero that looks like a real number is worse than an empty cell. The real figures are substantial: around 65% at the rim, close to 90% on above-the-break threes.
Team and league pages are also markedly faster — they no longer read the full play-by-play of a season to produce a table. A cold league page went from roughly three seconds to about a tenth of one. Every number was compared field by field before and after the change, across two seasons, with no difference.
August 21, 2026
Shot zones were missing a third of the shots — and four players were shooting 100%
Moving college basketball onto the same data engine as the WNBA meant recomputing every number and comparing it, field by field, against what we were serving. That comparison found three real errors. Two of them had been live since we launched the college pages.
Fixed
- A third of the shots were missing from older college seasons — the shot-zone breakdown only counted a shot when ESPN's feed labelled how many points it was worth, and on older seasons that label is frequently absent. On 2022–23 women's college basketball we were counting 133,058 field goal attempts where the box score says 203,210. The rim/mid/three split, and every frequency built on it, was computed from a third of the data. It now lands within 1.7% of the box score — the remainder is a gap inside ESPN's own feed, which we can measure but not close.
- Four players were shown shooting 100% from the field — a shot counted as made if the play description contained the word “made”. ESPN's descriptions start with the player's name, so Madelyn Bischoff, Madelynn Muniz, Madeline Potts and Madelyne Davis had every single attempt counted as a make. Bischoff's zone chart read 40/40 instead of 14/40. Make/miss now comes from the typed result, never from the text.
- Team shot zones undercounted too, for the same reason — now 1.98% off the box score instead of 2.40%, closer on 122 of 127 teams.
- Games with a box score but no play-by-play were dropped — 36 games and 33 players vanished from the 2024–25 women's season rankings. Everything we compute there comes from the box score, so those games belong in it.
Changed
- On/off ratings move slightly for about 1% of players — when several substitutions happen at the same moment on the clock, a free throw can land in the middle of them, while the team is briefly listed with four players on the floor. Two parts of our code disagreed about who to credit. They now agree, and both follow the same rule: a free throw awarded for a foul committed before the substitution belongs to the players who were on the floor when the foul happened. The difference is one possession per affected game. Minutes played are unaffected and still match the box score exactly.
College pages are also considerably faster. A filtered query on a women's college season used to time out after 60 seconds; it now answers in well under one.
August 12, 2026
Two empty columns filled — and a rebounding stat corrected
NetRB% and NetPoss have been blank on every player page since they were introduced. Fixing them turned up a second, quieter problem : the defensive rebounding percentage we were showing was too low.
Fixed
- NetRB% and NetPoss now have values — both need your team's offensive rebounding rate while you're on the floor, and that number was never being counted. Only the defensive side of the rebounding tracker existed. Both columns had been null on every player page, in every league, since launch.
- DRB% was understated by about 7.6 points — the play-by-play feed reports team rebounds (dead balls, end of quarter, a missed free throw sailing out of bounds) as rebound events with no player attached. We were counting them. They inflated the opponent's offensive rebound total by 41%, while only inflating the defensive side by 10% — so the ratio was skewed, not just noisy. Excluding them makes our numbers match the official box score on all 171 games of the season, exactly. Rhyne Howard's on-court DRB% goes from 68.6% to 76.2%.
Changed
- A floor before NetRB% is shown — below 50 rebound opportunities on the floor, the percentage is noise rather than signal. One player with a single minute of court time was heading for a NetRB% of −100. Under the floor the column now reads “—”.
If you had noted a player's DRB% before today, the new figure is the right one. Season totals, shooting and every other rate are unchanged.
August 7, 2026
Rankings now require a minimum volume
Until today, a player who took one 3-pointer and made it sat at the top of the 3P% leaderboard, at 100%. Every table and every chart on the site now applies a qualification floor before ranking anyone.
Added
- A minimum volume, by stat — to be ranked, a player needs at least half the games her team has played (never fewer than 5), plus a per-game floor that depends on the stat : 12 minutes for anything built on possessions, 5 field-goal attempts for FG% and TS%, 1.5 attempts for 3P% and FT%. Those shooting floors are the official WNBA minimums converted to a per-game basis. Full detail in the glossary.
- A Qualified button — in the chart toolbar of every Players and Team page, on by default. One click shows everyone again.
- Player names on charts — the Names toggle, and a Top N selector, are now on the League and Team pages too, not just Players.
- The glossary went from 32 entries to 51 — every advanced stat on the site now has a definition. New : a « Reading a column name » section that explains the Off / Def / Opp / Net prefixes once, so you can read a table you've never opened. Also added : the Net family, NetPoss, 3PLuck, AST/TO, Assist Ratio, %TmFGM AST, On-Ball / Off-Ball, catch-and-shoot vs pull-up threes, average shot distance, layups, BLK/PF, charges and fouls drawn, and where points came from.
- Honest caveats where they matter — On-Ball% and the catch-and-shoot split are estimated from play-by-play, not tracking data. Both entries now say so, and say how far off they can be.
Changed
- Percentiles have moved — all of them. The small coloured number under each value is a rank against other players, and that population just lost its noise. If you had noted a rank somewhere, expect it to shift. This is a correction, not a regression : the comparison is now against players who actually have a season.
- The Profile radar is the biggest beneficiary — it was comparing every player against a pool where more than half had no meaningful sample on shooting stats.
- The Shot Zones glossary entry was wrong — it described three buckets with the rim at 4 feet. There are six zones, and the rim is 3 feet. Corrected, with the real boundaries.
- NetPoss now reads on one scale — it was centred on zero on player and team pages, but shown around 100 on the league table. Same name, two scales. Everywhere it is now centred on zero, so positive means a genuine possession edge.
Removed
- STOP% — it claimed to be Dean Oliver's stop percentage but was computed as
(200 − DRtg) / 200, a straight rescaling of defensive rating. It carried no information DRtg didn't already give you, under a name that promised otherwise. Read DRtg instead. - PIE — the column was offered in the chart picker but the value was never computed. It plotted nothing.
Fixed
- Sorting a Players table by clicking a column header — it updated the arrow but never reordered the rows. Long-standing, found while testing the above.
- Four columns sorted on nothing — AST:USG, BLK/PF, TS% and eFG% named a field the table row didn't carry, so clicking those headers did nothing at all. Sixteen headers across the Players and Team pages, WNBA and NBA. The same four columns also refused to plot on a chart, for the same reason.
- DefFTR wasn't chartable — the column existed everywhere except in the chart's stat catalogue.
- Charts came out empty whenever fewer players were plotted than the Top N setting — axes showed NaN and no points at all.
- Generational suffixes in chart labels — a point for Ron Harper Jr. was labelled simply « Jr. ».
- Axis graduations on tight scales — a stat ranging from 1.20 to 1.50 displayed « 1.3 » three times in a row.
July 6, 2026
The NBA lands on Metrics
Added
- Full NBA coverage, 2020-21 → 2025-26 — six seasons of play-by-play-derived advanced stats, regular season, play-in and playoffs. Same engine, same metrics, same tabs as the WNBA pages : League, Teams, Players, Games, and per-team / per-player / per-game detail pages.
- Play-by-Play NBA — the video playlist tool you know from the WNBA side, pointed at the NBA. Pick a season, a team, a player and a play type ; get every matching play with video.
- NBA in the header — the nav now carries three league tabs (WNBA / NBA / NCAA), each with its own dropdown.
One heads-up : on the 2025-26 season, the upstream video index is currently unreliable on their end, so the Play-by-Play tool may fall back to the last-10-games mode more often than usual. Earlier seasons are unaffected.
July 5, 2026
Stats workshop — ratings everywhere, AST:USG, smarter Profile radar
Added
- OffRtg / DefRtg columns everywhere ratings were missing — LEAGUE Net tab, PLAYERS & TEAM Overall + Net tabs, PLAYER Overall + Net tabs, and every Lineups view. At the player level these are individual Dean Oliver ratings (points produced / allowed per 100 possessions the player uses), not the team's on-court score.
- AST:USG, a new ratio (AST% ÷ USG%) that reads as playmaker-vs-scorer profile at a glance. In the Offense and Playmaking tabs, and in the GAME box score. Definition added to the Glossary.
- USG% and TS% in the Playmaking tab — creation volume and efficiency side by side, no more tab-hopping.
- AST% in the GAME box score Playmaking tab, computed per game with the Basketball-Reference formula.
Improved
- Profile radar rebuilt. Each of the 6 axes (Scoring, Playmaking, Rebounding, Defense, Efficiency, Volume) now blends several stats — the axis value is the average of their league percentiles within the player's position group — instead of mapping one stat per axis. TOV% enters inverted, so high = protects the ball.
- ★ Career radar card. Players with 2+ seasons get a career card at the front of the Profile grid, with percentiles weighted by minutes played. One glance = the career-long identity, then season by season.
- Trimmed low-signal columns : Avg Dist is gone from Shooting / Opp Shooting (the 7-zone breakdown tells the story better), and Opp FT% / DefFTR left the PLAYERS Opp Shooting tab (opponent free-throw shooting isn't a player skill).
This round came straight out of a stats workshop with one of our beta
testers — thanks Ghis. Keep the ideas coming via the Account form or
Discord #beta.
June 17, 2026
Data pipeline hardening — pages stay fresh, even on rough mornings
Improved
- Stats update within the hour on game days, every page. Until now the morning data refresh covered the league-wide tables fine, but per-player and per-team pages could lag a full day behind on a late game. Now the hourly catch-up rebuilds every page that depends on a new game's play-by-play — player overall, team trends, lineups, rotations, shot charts, the lot. By 9 AM Paris everything you see reflects last night's box scores.
- Cleaner, faster morning warmup. Behind-the-scenes : the daily compute now correctly recognizes when a cache is already fresh and skips it instead of recomputing — saves a few minutes off the morning refresh window.
- Player and team photos lighter. Headshots and team logos now stream as WebP when your browser supports it (~3× smaller than the PNG equivalent).
Fixed
- ~3-hour outage in the morning where the games calendar, LEAGUE sidebar, and some game-summary cards briefly showed empty or stuck on "Loading". An upstream WNBA security filter tightened overnight ; our requests started looking too much like a script. Fixed by sending fully browser-realistic request headers + a guardrail that refuses to cache an empty response if the upstream is down. Apologies to the testers who hit it.
- Caitlin Clark's 2026 row stayed stuck at GP=12 on the PLAYER page after her 13th game, until the next morning. Cause : the hourly refresh was only invalidating part of the derived cache stack ; per-player aggregates kept yesterday's snapshot. Now the refresh covers everything end-to-end. Same fix benefits every player and every team page.
- One game card (Toronto @ Indiana) stayed on "Loading" all day. The card was reading a sentinel value written during the outage. The recap reads the underlying box score directly now and never freezes on an error placeholder.
June 16, 2026
Team Trends overhaul + faster game-day updates
Added
- On / Off impact panel on the TEAM page Trends section. Pick a stat (NetRtg, TS%, ORB%, DRB%, TRB%, AST%, STL%, BLK%, TOV%) and see, for each player, how the team performs when she's on the floor vs. off it.
- Per-column stat selectors : the left column drives the On/Off panel, the right column drives the minute-by-minute usage heatmap. Independent, makes it easy to read two different stories side by side.
- Operator dashboard (
/admin) got time-series sparklines on every health card (CPU/RAM/disk, workers, 5xx, cache size, visits, signups) + an Alerts panel with 6 rules that email us if something breaks.
Improved
- LEAGUE STATS now updates within the hour on game days, even for West Coast games that end after our morning data refresh. No more "Minnesota played last night but their stats are still from yesterday".
- NCAAW player pages load instantly. The Season Trends sparklines were doing a 11k-file scan on first visit ; they're pre-warmed now.
- Bars on the new On/Off panel use a fixed 0-100% scale so values read absolutely. Before, a 60% TS% looked huge because the bar was scaled to the roster's max.
Fixed
- TRB% on the On/Off panel was stuck at 50% for every player (= maths bug, summing two complementary percentages). Now computed from raw rebound counts.
- DRB% read the opponent's defensive rebound % instead of ours. Inverted, now correct.
- Two columns on Trends (On/Off + Heatmap) are now pixel-perfectly aligned. There was a 4 px drift between rows.
- Page Trends no longer crashes if the lineups payload arrives in an unexpected shape — graceful "no data" message instead.
June 10, 2026
Closed beta opens
Added
- Apply for beta access form on the landing page. Tell us briefly what you make, we review and send an invite.
- Sign in via magic link — no password. Click the link in the email, you're in.
- Page
/account— your tier badge, account info, sign-out, plus a built-in feedback form (4 categories : bug / suggestion / love / general). Everything lands in our admin inbox. - Newsletter on the landing page, with double opt-in (we send a confirmation email so you keep control).
- Discord onboarding popup right after your first sign-in, with the invite to the private tester server.
Improved
- Header redesign — cleaner pill buttons across the app, burger menu (☰) on the top right with Account / Sign out, tier badge next to your name.
- Site is now entirely in English — the few remaining French labels are gone.
Late May → early June 2026
NCAAW pages + site-wide refresh
Added
- NCAAW player pages — full multi-tab interface : Basics, Advanced, Shooting, Profile radar (6-axis position-bucketed), Game Log, Season Trends sparklines. Same Glossary as WNBA, with NCAAW-specific notes where the data differs.
- NCAAW Players index uplift — filters by Position, Team, Class (Fr/So/Jr/Sr), Class column, and shot-zone heatmap previews.
- Player Compare modal with a real type-ahead search (replaced the rough prompt-based picker).
- Lineup compatibility — pair level on the PLAYER page : see chemistry stats for every two-player combo a roster has tried.
- Documentation at /docs covering every panel on every page, plus how to use the Play-by-Play tool.
Improved
- CHARTS tool rewritten with a single source of truth — stat definitions now live in one place, so adding or fixing a stat updates every chart at once.
- LEAGUE table got Standings details (Top5 / Bot5 / Conf splits), Defense opp stats across all panels, Adjusted toggles everywhere.
- Play-by-Play playlist polish : smooth scroll, fade gradients on long lists, ability to sort by date.
Fixed
- Many small bugs across PLAYER (info card data, career milestones, shot chart layout), LEAGUE (TOV sum, FORM dots, hover overflow), and PBP (year change resetting player selection). Beta testers have been pointing them out in feedback ; thank you for that.