Implement option B card metadata and solid bottom edges
Some checks failed
review/code-claude Blocking: CardCaption focus-only caption invisible after first focus move in a shelf
review/design-claude Design review: 1 blocking (unframed skeleton caption bars); other differences are renderer/fixture artifacts

This commit is contained in:
justinzeus 2026-11-07 03:06:26 +01:00
parent fdff85c8a1
commit fe44a3c24f
27 changed files with 536 additions and 234 deletions

View file

@ -504,9 +504,9 @@ Down clamps a short final title row before entering the separate Try again / Sho
more row; an empty slot cannot activate recovery. An unavailable library hides
its unknown item count.
Caption separators use 40% of the existing muted colour's alpha. The rail follows
the locked prototype CSS: bold 24 px letters, with the focused letter bold 28 px,
overriding the spec table's generic caption style for this component.
Library titles and compact subtitles remain visible at rest, with one-line,
card-width ellipsis rather than a 640 px focused caption. The letter rail uses
bold 24 px letters, with the focused letter bold 28 px.
Library and Settings header initials use the muted colour over the person's fill;
navigation and picker avatars retain their dark initials.
@ -550,12 +550,31 @@ Title shelves reserve vertical drawing room for the scaled ring.
Before scaling the stroke, ring-to-neighbour clearances round to 28/22/16 px
for poster/tile/wide cards; including stroke scale they are 27.6/21.8/16.1 px.
Poster progress uses the independent 18 px title-card inset, not caption spacing:
the track remains 220 px wide on a 256 px poster. Library focus-follow restarts
when the effective column count, focused row or header geometry changes, retaining
deep focus across live snapshots that add or remove the letter rail.
`LibrarySpacingRegressionTest` renders both progress geometry and the unchanged
focused index across the 199↔200-title boundary.
Cards use the approved option-B bottom state line instead of a separate inset
resume bar: watched is 3 px accent; resume is 6 px proportional accent over
`color.progressTrack`; unwatched and Discover have no line. Opaque background
backs the entire strip, including its bottom 2 px and the 2 px separator above
the fill. Artwork is clipped out of the backing band before painting it so
rounded-corner antialiasing cannot leak poster pixels into the lowest row.
The separately drawn focus ring stays above the line.
Film subtitles are year + duration + a 24 px watched check, episode subtitles
are their own duration + check, and series subtitles are year + check with no
single runtime. Resuming cards have no check. The poster caption band remains
96 px; Home poster captions are focus-only. Home landscapes retain titles on
the art and reserve 64 px for focused metadata below it, making wide/tile shelf
pitches 522/441 px; poster shelves remain 632 px and grids remain 524 px.
Loading rows reserve the same caption slots and share one pulse layer.
`CardBottomPixelTest` samples full native bottom rows on four real posters at
rest and individually focused, including white Annie Hall and dark Locke.
`CardGeometryTest` measures 210/327 px caption fitting, card-width titles,
24 px checks, row pitches, pinned rows and ring clearances. The
[native option-B proof gallery](https://pages.justinvisser.org/wolfskin/tv-card-meta-build/)
contains the same illustrative watch-state data as the approved frames and
lists reference deviations; unapproved deviations block merge.
`LibrarySpacingRegressionTest` retains the deep focused index across the
199↔200-title letter-rail boundary.
`LibraryCaptureTest.spacingShowsFirstFocused`,
`HomeCaptureTest.spacingNextUpFirstFocused` and