Photo Polish — the colour rows, measured

Lane R1a. Every frame below is the REAL shipped Photo Polish dialog rendered in headless Chromium at a true viewport width — left is PR #463 as it stood, right is the fix. The photo itself is a broken-image placeholder because the harness has no engine key; that area is a fixed 4:3 box and does not affect the rows being measured.

Summary — 8 renders
WidthStateBefore gapAfter gap (Warmth / Tint)No overflowMin fontContrastTwinsBadge
390pxWarmth +2 / Tint +16px6px / 6pxtrue (390/390)12px13:1yespresent
430pxWarmth +2 / Tint +16px6px / 6pxtrue (430/430)12px13:1yespresent
768pxWarmth +2 / Tint +1452.6px6px / 6pxtrue (768/768)12px13:1yespresent
1280pxWarmth +2 / Tint +1452.6px6px / 6pxtrue (1280/1280)12px13:1yespresent
390pxNeutral6px6px / 6pxtrue (390/390)12px5.88:1yespresent
430pxNeutral6px6px / 6pxtrue (430/430)12px5.88:1yespresent
768pxNeutral478.7px6px / 6pxtrue (768/768)12px5.88:1yespresent
1280pxNeutral478.7px6px / 6pxtrue (1280/1280)12px5.88:1yespresent

Gap = shortest edge-to-edge distance between the live readout and its nearest −/+ stepper. Contrast is alpha-composited over the popover surface (#0B2E25): 13:1 for a non-zero readout, 5.88:1 for Neutral — both above the 4.5:1 target.

Non-zero — Warmth +2 / Tint +1
390px Warmth +2 · Tint +1
Before (PR #463) — gap 6px
Before at 390px, nonzero
After — gap 6px
After at 390px, nonzero
readout → nearest stepper6px (Warmth) · 6px (Tint)
scrollWidth === clientWidthtrue (390 / 390)
smallest rendered font12px
readout contrast13:1
axes identical (twins)yes
AI-Enhanced badgepresent
430px Warmth +2 · Tint +1
Before (PR #463) — gap 6px
Before at 430px, nonzero
After — gap 6px
After at 430px, nonzero
readout → nearest stepper6px (Warmth) · 6px (Tint)
scrollWidth === clientWidthtrue (430 / 430)
smallest rendered font12px
readout contrast13:1
axes identical (twins)yes
AI-Enhanced badgepresent
768px Warmth +2 · Tint +1
Before (PR #463) — gap 452.6px
Before at 768px, nonzero
After — gap 6px
After at 768px, nonzero
readout → nearest stepper6px (Warmth) · 6px (Tint)
scrollWidth === clientWidthtrue (768 / 768)
smallest rendered font12px
readout contrast13:1
axes identical (twins)yes
AI-Enhanced badgepresent
1280px Warmth +2 · Tint +1
Before (PR #463) — gap 452.6px
Before at 1280px, nonzero
After — gap 6px
After at 1280px, nonzero
readout → nearest stepper6px (Warmth) · 6px (Tint)
scrollWidth === clientWidthtrue (1280 / 1280)
smallest rendered font12px
readout contrast13:1
axes identical (twins)yes
AI-Enhanced badgepresent
Neutral — both axes at 0
390px Neutral · Neutral
Before (PR #463) — gap 6px
Before at 390px, neutral
After — gap 6px
After at 390px, neutral
readout → nearest stepper6px (Warmth) · 6px (Tint)
scrollWidth === clientWidthtrue (390 / 390)
smallest rendered font12px
readout contrast5.88:1
axes identical (twins)yes
AI-Enhanced badgepresent
430px Neutral · Neutral
Before (PR #463) — gap 6px
Before at 430px, neutral
After — gap 6px
After at 430px, neutral
readout → nearest stepper6px (Warmth) · 6px (Tint)
scrollWidth === clientWidthtrue (430 / 430)
smallest rendered font12px
readout contrast5.88:1
axes identical (twins)yes
AI-Enhanced badgepresent
768px Neutral · Neutral
Before (PR #463) — gap 478.7px
Before at 768px, neutral
After — gap 6px
After at 768px, neutral
readout → nearest stepper6px (Warmth) · 6px (Tint)
scrollWidth === clientWidthtrue (768 / 768)
smallest rendered font12px
readout contrast5.88:1
axes identical (twins)yes
AI-Enhanced badgepresent
1280px Neutral · Neutral
Before (PR #463) — gap 478.7px
Before at 1280px, neutral
After — gap 6px
After at 1280px, neutral
readout → nearest stepper6px (Warmth) · 6px (Tint)
scrollWidth === clientWidthtrue (1280 / 1280)
smallest rendered font12px
readout contrast5.88:1
axes identical (twins)yes
AI-Enhanced badgepresent