@@ -7,7 +7,14 @@ doc is the single, un-fragmented home for the round shipped 2026-07-23
77(` SPEC-display-left-rail.md ` , owner-approved; built into PR #352 ) — see
88[ ` docs/upstreaming/readiness-audit.md ` ] ( ../upstreaming/readiness-audit.md ) 's
99§10 for the presentation-only upstream-divergence ledger this round seeded
10- (not duplicated here).
10+ (not duplicated here). A corrected fidelity round (also 2026-07-23,
11+ Yori) normalized every rail block-boundary divider to ` #16202b ` (O1,
12+ below). A follow-up machine-diff round (same day) fixed 63 further
13+ mismatches a computed-style diff against the corrected mockup caught —
14+ mostly Bootstrap body-default font-size fall-throughs, plus (per an
15+ explicit owner ruling) the ` AutofillCollapse ` header hex, the Source
16+ toggle's visual shape, and the Filters toggle's ` .btn-sm ` sizing — see
17+ the "Machine-diff fix round" section below.
1118
1219Companion design artifacts (spec + mockup) live at
1320[ ` docs/proposals/mockups/proposal-h/display-left-rail-mockup.html ` ] ( ../proposals/mockups/proposal-h/display-left-rail-mockup.html )
@@ -270,7 +277,7 @@ bulk/pin/save-defaults controls (above). The empty-state "Find this card
270277↗" link stays a link — pure navigation out to Scryfall, the rule's own
271278explicit exception.
272279
273- ## Density (mechanical, SPEC §2 )
280+ ## Density (mechanical, SPEC §D.1 )
274281
275282Rail blocks now butt against each other separated by 1px borders —
276283vertical rhythm comes from each block's own compact padding
@@ -281,6 +288,102 @@ behavior changed — see `proposal-h-display-layout-spec.md` §4.1 for the
281288unchanged R2 shell (Offcanvas placement per tier, 380px inline width,
282289etc.); this round only restyles/recomposes the rail's interior.
283290
291+ ## O1 — divider normalization (corrected fidelity round, 2026-07-23)
292+
293+ The rail's own block-boundary hairlines were inconsistent: ` .d14 ` (the
294+ confidence band) already used an explicit ` #16202b ` , while ` .rail-head ` ,
295+ ` .artist-line ` , and the Sources accordion's outer wrapper used the plain
296+ Bootstrap ` .border-bottom ` utility — whose active ` --bs-border-color ` is
297+ genuinely ambiguous in this theme's compiled CSS (both ` #495057 ` and
298+ ` #ced4da ` are present), risking a pale line on the dark rail depending on
299+ cascade order. The unified Frame+Treatment filter's own border (and its
300+ internal Frame↔Treatment divider) separately hardcoded the unthemed
301+ ` rgba(0,0,0,.22) ` . The Select Version wrapper had no boundary divider at
302+ all.
303+
304+ ** Normalized (owner-approved, corrected ` SPEC-display-left-rail.md ` §A/
305+ §D.1) — every one of the above now explicitly renders ` #16202b ` , 1px** :
306+ ` .rail-head ` , ` .artist-line ` , and ` .sources ` (all three now via
307+ ` RailRoot ` 's own styled-component rules in ` DisplayPage.tsx ` , replacing
308+ the Bootstrap utility classes they used to carry); the Select Version
309+ wrapper (gained a ` select-version-wrapper ` className plus a new
310+ ` RailRoot ` rule — it never had a boundary before); the unified filter
311+ ` fieldset ` 's own border and its internal ` UnifiedFilterDivider ` (both
312+ inline/styled-component literals in ` SelectVersionResults.tsx ` ). The
313+ Sources list's own inner border was deliberately left at ` rgba(0,0,0,.22) `
314+ — the spec's own binding table marks that one specifically as unchanged
315+ (` I ` , not ` I (border N) ` ), not part of O1's scope. Each source ROW's own
316+ bottom divider was ALSO meant to stay ` rgba(0,0,0,.22) ` per that same
317+ table, but O1's own named list (` .rail-head ` /` .artist-line ` /` .sources `
318+ only) missed that it was ALSO using the ambiguous Bootstrap utility and
319+ resolving to the wrong colour (` #ced4da ` ) — caught and fixed in the
320+ machine-diff round below, not this one.
321+
322+ ## Machine-diff fix round (2026-07-23)
323+
324+ A throwaway Playwright/computed-style diff (session tmp dir, not
325+ committed) measured the corrected mockup against the O1-round build and
326+ found 63 property mismatches — mostly Bootstrap body-default (16px)
327+ font-size fall-throughs on bespoke rail classnames that had never had
328+ their own font-size rule at all (` .rail-head .slot ` -> 14px, ` .rail-head .name ` -> 15px + ` margin-top:1px ` , ` .artist-line ` -> 13px (replacing the
329+ close-but-not-exact Bootstrap ` small ` utility), ` .select-version-heading `
330+ -> 14px), plus the Sources filter input's font-size/padding (Bootstrap's
331+ stock ` .form-control ` -> the spec's ` 14px ` /` 6px 10px ` , fixed as a
332+ component-scoped inline style, not a ` .form-control ` RailRoot selector),
333+ the source row's own border-bottom (the same ambiguous-Bootstrap-utility
334+ pattern O1 missed on this one element, now ` rgba(0,0,0,.22) ` explicitly),
335+ the tile corner tag (` 0.5rem ` /alpha ` .9 ` -> the spec's ` 7px ` /alpha
336+ ` .92 ` ), and the Ghost "+N" tile's padding (a real ` <button> ` needed an
337+ explicit ` padding:0 ` reset against the browser's own UA-stylesheet
338+ default).
339+
340+ Three further rows the diff also flagged were held back for an explicit
341+ owner ruling rather than applied speculatively — ** all three are now
342+ resolved, same day, per that ruling** (the corrected mockup is the
343+ binding reference for all three, confirmed by the owner):
344+
345+ - ** ` AutofillCollapse ` header background hex** — ` #4E5D6B ` is REVERTED
346+ from PR #400 's own "correction" to ` #4e5d6c ` (` $secondary ` ). The owner
347+ confirmed ` #4E5D6B ` is deliberate, distinct from the panel/seticon
348+ token elsewhere in the rail, one hex digit apart by design. Do not
349+ "fix" this back again — ` AutofillCollapse.tsx ` 's own comment at this
350+ line carries the note.
351+ - ** Source toggle shape** — restyled from the shared
352+ ` react-bootstrap-toggle ` library's stock sliding single-label switch
353+ into the corrected mockup's static two-cell segmented control (both
354+ On/Off labels always visible). The library's own DOM already renders
355+ both cells with the correct colour classes unconditionally; only its
356+ ` overflow:hidden ` /sliding-` .toggle-group ` CSS needed overriding, scoped
357+ to a ` rail-source-toggle ` className ` SourcesAccordion.tsx ` 's Toggle
358+ passes — every other ` react-bootstrap-toggle ` mount sitewide (roughly
359+ ten other call sites: ` FinishSettings ` , ` PDFGenerator ` ,
360+ ` SearchTypeSettings ` , the filter Toggles, etc) is unaffected.
361+ - ** ` .btn-sm ` sizing** — the Filters disclosure toggle (` CompactButton ` ,
362+ ` SelectVersionResults.tsx ` ) returns to the spec's real Bootstrap ` sm `
363+ metrics (` 14px ` /` 4px 8px ` ), superseding the earlier "the buttons are
364+ too big" shrink for that one control. ` CompactButton ` has exactly one
365+ call site, so this is component-scoped by construction.
366+ ` CompactToggleButton ` (Frame/Border segments) and ` TreatmentChip `
367+ (Treatment chips) are UNCHANGED — they bind to their own distinct,
368+ still-in-force spec rows (` 11px ` each), never the generic ` .btn-sm `
369+ row. Every OTHER ` .btn-sm ` -class rail control (Sources bulk/save-
370+ defaults, Slot Actions, Artist support, D14 ` ✗ ` ) was already at
371+ ` 14px ` /` 4px 8px ` via plain ` <Button size="sm"> ` with no override at
372+ all — this ruling only ever affected the one Compact-wrapped control.
373+
374+ ** Deliberately left open this round** : "Demoted body" ` 13px ` (§D.1) — a
375+ known gap the diff's own measurement surfaced (via Slot Actions' body
376+ font-size), not fixed because the mechanical repair (an additive
377+ ` bodyFontSize?: string ` prop on ` AutofillCollapse.tsx ` , mirroring the
378+ existing ` headerPadding ` precedent) would touch every demoted
379+ ` RailSection ` — Card Details/Attributes/Printing Tags/Print Options/
380+ Report, not just Slot Actions (the only one the diff actually measured)
381+ — and the blast radius across the other four wasn't verified. See
382+ ` SPEC-display-left-rail.md ` §D.1's own note under the "Demoted body" row
383+ for the full reasoning.
384+
385+ ` frontend/tests/DisplayLeftRailFidelity.spec.ts ` asserts every fix above.
386+
284387## File-level summary
285388
286389| File | Change |
0 commit comments