Player comparison: picking, not pulling down

Mockup for the Player comparison tab — the one in the main window, not the modal opened from a Squad depth position. Ross: "it is all a bit of a mess and it just doesn't work very well… when selecting a player in the dropdown it disappears and you have to click again to open and then select another player. It would be better if you can just select the players you want."

All 83 players are the real save, read out of squadvision.db — names, ages, FM position strings, squads and loans. Everything in the left rail below is live: click rows, type in the search, toggle the filters. The results panel is schematic and marked as such; the ranked grid already exists and this proposal does not change it.

What it does today

Six centred rows, each a different width, stacked above the results. Roughly 300px of chrome before an answer, and it never gets out of the way.

Squads First TeamU21sU18s
▸  Filter by position  None selected
Hide players out on loan
Comparing  Nobody selected
Capture pointDecember 25/26 Expand
Judged as  Pick a role to rank by
Picking 8 players costs 8 open‑scroll‑click cycles — the box closes on every pick The list behind it holds 28 First Team, 83 across all squads Two empty‑state messages show at once, in two alignments

The proposal — a roster rail you pick from

The rail is the filter, the picker and the record of who is in, so the six rows collapse into one column and one strip. Clicking a name adds him; clicking again takes him out. Nothing closes, nothing reopens. This is how Squad depth already works — you pick players off a list you are reading — and how #625 left the Analyse screen: a rail you navigate, panes that fill.

Squad
▸Filter by positionNone
Hide players out on loan
COMPARING
Click a name below to add him.
Judged as As of
what this fixes

The dropdown is gone

Eight players is eight clicks in one list, not eight open‑scroll‑click cycles. You can also see the pool you are choosing from, which a popup never showed you — and the filters visibly narrow the list underneath them, so Hide players out on loan stops being an act of faith. On the real save it removes 5 of 28 in the First Team and 25 of 83 across all squads.

what this fixes

The chrome gets out of the way

Six centred rows become a rail and one strip, and the rail folds when you want the width back — the same move the Analyse rail makes while a player is docked. The two competing empty‑state messages become one, in the panel that is actually empty.

Settled — the rail folds itself once the comparison is real Ross: "when you are comparing we should probably collapse the left hand side once you have selected the role to compare, like how now it fills everything." Built above — pick two names and then a role, and the rail folds on its own.

Two details it needed. The trigger is the results appearing — two players and a role — rather than the role alone, because a role chosen with nobody picked would fold the rail away from the job you are still doing. And it only ever folds once: opening the rail back up is how you add a ninth man or swap one out, and a rail that re-folds every time you touch the role picker is fighting you. Folded, it still carries the count and the initials, so you have not lost track of who is in — click it to open it again.
Answered — how the two routes differ today From Squad depth there is no cap at all. The tray needs two and that is the only bar; SetComparedPlayers takes the whole set. Its comment: "TAKES THEM ALL (#451). It used to trim to MaximumPicked, which made uncapping the tray pointless on its own: you could add a ninth centre back over there and he was silently dropped on the way in." Eight is the picker's limit and nothing else's.

Compare from the board still opens the same view — the modal hosts PlayerComparisonResultsView, which is exactly what this tab hosts inline, and the tab's own Expand opens that same modal. But the two routes keep separate view models on purpose, so "comparing from here never overwrites whatever the user has picked on that tab". Nothing in this proposal touches the board's route: it only replaces the tab's header.
Settled — the picked players stay pinned in the rail Ross: "keep them pinned in the rail." So there is no chip row above the results at all — the rail says who is in, the strip is only the role and the capture point, and the results get the rest. Folded, the count and the initials come with it.
Found while dropping the cap — the adds have to be coalesced Every change to the compared set runs a full RecomputeAsync through CascadeQueue, which serialises but does not coalesce. Today the dropdown's friction hides that: adding is slow, so the recomputes never pile up.

A rail removes the friction, and dropping the cap removes the ceiling. Clicking down a filtered list of 29 defenders — or pressing "Add all" — queues 29 full recomputes, each waiting on the last, 28 of them for a grid nobody sees. The bulk path already solved this: SetComparedPlayers suppresses the handler and recomputes once, because "arriving from a position is a single act". Picking from a rail is a burst of single acts and wants the same treatment — debounce the cascade, or route a burst through the same one-recompute door.

This is a real consequence of the change rather than a pre-existing bug: the cap and the dropdown were together holding it down.
Settled — the cap is gone Eight exists because "choosing names from a dropdown one at a time is a different act from right-clicking your way down a depth chart" — and a set arriving from a Squad depth position has not been capped since #451. Once the picker is a list you click, that sentence stops being true and the number stops having a reason. Ross: "drop the cap."

Measured on the real save, this is what the cap was refusing: 17 players reach centre back across the three squads and 19 reach central midfield — 8 and 4 of them in the First Team, 3 and 11 in the U21s. "Compare every centre back I own" is a 17-man question, and eight stopped it less than half way.

Two is still the floor — one player is not a comparison — and the rail now offers Add all n on whatever the filters have left, which is the thing dropping the cap is actually for.