The bar's track was line, which is pure black in light mode. A blue fill at
60% opacity over black is two dark colours an arm's length apart, 1.9:1, and the
filled length is the only thing the bar is for. On hairline, the soft rule
this design keeps for exactly this job, it goes to 4.0:1, and the fill can climb
back to full strength so the rank tiers separate by weight rather than by all
being faint together. Dark lands at 2.9:1, a shade under the 3:1 that non-text
contrast asks for but far past where it was, and the hue carries the rest.
paper measured better still, 5.2:1, but a track the colour of the recessed
ground all but disappears against the card, and a bar with no visible extent has
nothing to be read against. Comparing lengths is the entire point of a column of
them.
The ballot message now names a few of the ballot. It named nobody before, on the
grounds that a ballot was thirty-eight handles and a partial list would imply a
ranking. The first half of that was simply wrong: a ballot is ten votes, and
thirty-eight is how many names the list ends up with. Three handles a reader
already follows say more about what this is than any sentence describing it, and
the sample is shuffled off the ballot's own dids rather than Math.random() so
the message holds still under an open menu instead of re-rolling on every tick.
Names drop from the end until the post fits, so ten long handles shorten rather
than overflow, and a ballot whose profiles have not landed yet falls back to
describing the poll.
The rest of the copy lost the framing it was leaning on. "A readers' poll with
no shortlist" is a phrase about polls, not about this one; what a stranger needs
is that anyone with a Bluesky account can be voted for, that they get ten votes,
and that every vote is a public record on their own account. Every message now
ends with its call to action and the link alone on their own line: run into the
end of a paragraph a link reads as a footnote to the sentence it is buried in,
and on its own line it reads as the thing to do next, which is the only reason
the post exists. The newlines survive the compose intent, where they travel as
%0A%0A in a query parameter.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com