Skip to content

/whatsthat: fix oversized starburst + swap accent to an AA-verified navy against the orange bg - #91

Merged
WilfordGrimley merged 2 commits into
masterfrom
claude/starburst-oversize-fix
Jul 18, 2026
Merged

/whatsthat: fix oversized starburst + swap accent to an AA-verified navy against the orange bg#91
WilfordGrimley merged 2 commits into
masterfrom
claude/starburst-oversize-fix

Conversation

@WilfordGrimley

@WilfordGrimley WilfordGrimley commented Jul 18, 2026

Copy link
Copy Markdown

Description

Two related /whatsthat visual fixes from the same investigation, both landing on this branch (same page area, owner's call on bundling):

1. Oversized starburst (original commit)

BurstSvg's width: 140% was relative to CardPanel's own rendered width, carried over "verbatim" from the pre-redesign PrintingTagQueue.tsx, where the card column was Col md={4} (33% of the row). The queue redesign widened the card column to Col md={7} (58%) without re-tuning the percentage, so the burst grew large enough to visually collide with the page's own heading and stats text. Reduced to 55%, verified at desktop (1280px) and mobile (390px).

2. Accent color swap (this update)

The #ff4719 orange background stays — owner-ratified as the page's deliberate loud identity. But the site-wide theme accent (#4c9be8, blue) measures 1.16:1 contrast against it — far under WCAG AA's 4.5:1 for text, so links/buttons genuinely drown into the background as reported.

No light tint of any hue clears AA against this orange — even pure white only reaches 3.41:1 (orange's own luminance sits in a mid-range no light color beats by enough margin). Derived a new accent from Superhero's own info/cyan (#5bc0de) by uniform darkening (preserves hue/saturation, only reduces luminance) until AA-for-text clears:

Pair Contrast WCAG AA
#12262c (new accent) vs #ff4719 (page bg) 4.60:1 ✅ passes 4.5:1 (normal text)
white vs #12262c (button text on new accent) 15.68:1 ✅ passes 4.5:1 easily
(reference) old accent #4c9be8 vs #ff4719 1.16:1 ❌ fails
(reference) pure white vs #ff4719 3.41:1 ❌ still fails

Scope: applied directly on StarburstBackground (the element whose own background is the orange) — specifically not the sibling Footer, which sits on the page's standard dark body background where the original blue accent already has good contrast and must stay unchanged. Covers: links (--bs-link-color-rgb), the "Filter by attribute" toggle (.btn-link), Level 3's "Confirm & continue" (.btn-primary), and the moderator tab switcher's active pill (.nav-pills). Semantic colors (success/danger/warning) and the attribute chips' polarity fills are untouched, per the explicit scope.

Real bug found along the way: overriding --bs-primary/custom properties alone doesn't reach .btn-primary's background — bootswatch's Superhero theme hardcodes a literal background-color on .btn-primary (not var(--bs-btn-bg)), at equal specificity and later in the compiled source order than Bootstrap's own custom-property-driven rule, so it wins regardless of what the custom property resolves to. Fixed by setting background-color/border-color directly (specificity alone wins the cascade, no !important needed) in addition to the custom properties. .btn-link isn't affected by this — bootswatch's hardcoding loop only covers $theme-colors, not the link variant.

Verified zero leakage: computed styles confirmed via live render — /whatsthat's footer links and a completely different page's (/editor) nav link colors are both unchanged. Screenshots (before/after at desktop + mobile, plus the other-page-unchanged proof) attached to the accompanying chat report.

Checklist

  • I have updated any related tests for code I modified or added new tests where appropriate.
    • No existing test asserts the burst's exact size or the accent color; nothing to update. Verified manually via live computed-style queries (see report) rather than adding a new automated test, since this is a visual/design judgment call the owner may want to further tune.
  • I have manually tested my changes as follows:
    • npx tsc --noEmit: clean except one pre-existing, unrelated error in DisplayPage.tsx (from a concurrent session's PR Proposal H, Step 1: /display route shell behind a feature flag #87, confirmed via git log/git show not caused by either change here).
    • npx jest --runInBand: 32 suites / 345 tests passing.
    • npx eslint + npx prettier --check: clean on all touched files.
    • Live Playwright/MSW render at desktop (1280px) and mobile (390px), reaching Level 3 to verify the primary button, plus a second page to prove zero leakage.
  • I have updated any relevant documentation or created new documentation where appropriate.
    • No feature doc covers /whatsthat's color rationale beyond inline code comments (already detailed in this diff); nothing further needed.

BurstSvg's width was 140% of CardPanel's own rendered width - a value
carried over "verbatim" from the pre-redesign PrintingTagQueue.tsx, whose
card column was Col md={4} (33% of the row). The queue redesign widened
the card column to md={7} (58%) without correspondingly adjusting the
burst's own percentage, so on both desktop and mobile the starburst now
renders large enough to visually collide with the "What's That Card?"
page heading and the "Still need help with N cards" stats line above it
- content that didn't exist in the old component's layout and was never
accounted for in the 140% figure.

Reduced to 55%, verified via local screenshot at desktop (1280px) and
mobile (390px) widths: the burst now reads as a contained dramatic
accent behind the card without reaching into the heading/stats text.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014dB7mGPQyoML2Ri5ZrprdK
…gainst the orange bg

The orange background (#ff4719) stays - owner-ratified as the page's
deliberate identity. But the site-wide theme accent (#4c9be8, used for
links/primary buttons/nav-pills active state) measures 1.16:1 contrast
against it - nowhere near WCAG AA's 4.5:1 for text, and elements
genuinely do drown into the background as reported.

No light tint of any hue can fix this against this specific orange:
even pure white only reaches 3.41:1 (orange's own luminance sits in a
mid-range no light color clears by enough). Derived a new accent from
Superhero's own info/cyan (#5bc0de) by uniform darkening (preserves
hue/saturation) until AA-for-text is cleared: #12262c measures 4.60:1
against the orange (passes AA-normal-text), with white button text on
it at 15.68:1.

Scoped to StarburstBackground specifically (the element whose own
background IS the orange) - NOT the sibling Footer, which sits on the
standard dark body background where the original blue accent already
has good contrast and must stay unchanged. Verified via live computed
styles: the "Filter by attribute" link and Level 3's "Confirm &
continue" button both now render the new navy; the footer's own links
and a different page's nav links are confirmed unchanged.

Real finding along the way: overriding --bs-primary/--bs-link-color-rgb
alone doesn't reach .btn-primary's background - bootswatch's Superhero
theme hardcodes a literal background-color on .btn-primary (not
var(--bs-btn-bg)), at equal specificity and later in source order than
Bootstrap's own custom-property-driven rule, so it wins regardless of
what the custom property resolves to. Fixed by setting background-color/
border-color directly (specificity, not !important, wins the cascade)
in addition to the custom properties. .btn-link (the "Filter by
attribute" toggle) isn't affected by this - bootswatch's hardcoding
loop only covers $theme-colors, not the link variant.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014dB7mGPQyoML2Ri5ZrprdK
@WilfordGrimley WilfordGrimley changed the title Fix oversized /whatsthat starburst overlapping page heading/stats text /whatsthat: fix oversized starburst + swap accent to an AA-verified navy against the orange bg Jul 18, 2026
@WilfordGrimley
WilfordGrimley merged commit 5bd50a3 into master Jul 18, 2026
6 checks passed
@WilfordGrimley
WilfordGrimley deleted the claude/starburst-oversize-fix branch July 18, 2026 22:56
WilfordGrimley pushed a commit that referenced this pull request Jul 18, 2026
- "A value carried verbatim out of its old context can silently stop
  meaning what it meant": generalizes PR #91's starburst width%
  (relative to a column width that changed under it) together with
  PR #78's existing "extracts X verbatim" entry as two instances of
  the same class.
- "Bootswatch Superhero hardcodes some component colors as literal
  properties, not CSS custom-property references": PR #91's
  .btn-primary background-color finding — verify computed styles on a
  live element, not just that a --bs-* custom property resolved
  correctly.

Neither was captured in docs/lessons.md by PR #91 itself (checked: its
diff only touched cardPanel.tsx and whatsthat.tsx).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHfxN9bbWAWHs8rfzVtBWt
WilfordGrimley added a commit that referenced this pull request Jul 18, 2026
…tions (#100)

* Consolidate today's conventions into CLAUDE.md; fix proposal docs

CLAUDE.md:
- Report-relay: replies must carry the full GitHub blob URL to the
  pushed report, not just branch+path.
- New merge-duty rule: never delete a branch in the same action as
  merging its PR; precondition `gh pr list --base <branch>` empty
  before deleting (this is how PR #88 was lost to the stacked-PR
  base-deletion trap).
- New rule: search for an existing recovery before rebuilding a
  lost/auto-closed PR (two sessions rebuilt #88 in parallel; #95
  duplicated #94's already-shipped recovery).

docs/proposals/proposal-b-bleed-normalization.md:
- Correct decision 4's stale pre-PR-2 persistence note: the shipped
  mechanism is identifier-keyed localStorage (device-local, mirroring
  favoritesSlice), not SavedDeck/project-cloud state, matching
  proposal-g's own §5 description of the same mechanism.
- Genericize "Proxxied"/"Steam Deck" design-reference mentions.

docs/proposals/proposal-c-context-menu-restyle.md:
- Mark Part (b) (solid-color utilitarian restyle) SUPERSEDED by
  Proposal H, which absorbs the restyle direction.
- Genericize a "Proxxied" design-reference mention.

docs/proposals/proposal-g-user-accounts-saved-decks.md:
- Genericize a "Proxxied" design-reference mention.

docs/proposals/proposal-h-unified-display-page.md:
- Correct alex-taxiera/proxy-print's license label from MIT to
  AGPL-3.0 (verified against its actual GitHub license metadata);
  acoreyj/proxies-at-home remains correctly MIT.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHfxN9bbWAWHs8rfzVtBWt

* Add docs/lessons.md entries for PR #91's two findings

- "A value carried verbatim out of its old context can silently stop
  meaning what it meant": generalizes PR #91's starburst width%
  (relative to a column width that changed under it) together with
  PR #78's existing "extracts X verbatim" entry as two instances of
  the same class.
- "Bootswatch Superhero hardcodes some component colors as literal
  properties, not CSS custom-property references": PR #91's
  .btn-primary background-color finding — verify computed styles on a
  live element, not just that a --bs-* custom property resolved
  correctly.

Neither was captured in docs/lessons.md by PR #91 itself (checked: its
diff only touched cardPanel.tsx and whatsthat.tsx).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHfxN9bbWAWHs8rfzVtBWt

---------

Co-authored-by: Claude <noreply@anthropic.com>
WilfordGrimley added a commit that referenced this pull request Jul 18, 2026
…ce in the display rail (#102)

Wires EditorSearchResponse.degradedQueries end to end for the first time on the
frontend (previously captured by the API but discarded before reaching Redux):
APIEditorSearch now returns {results, degradedQueries} instead of discarding the
latter, searchResultsSlice accumulates degradedQueryHashKeys across paginated
search requests, and a new selectIsSearchQueryDegraded selector answers "did this
printing-filtered query get retried unfiltered" for a given slot's query.

The display rail's always-visible header consumes that selector: the requested-
printing badge switches from bg-secondary to a bg-warning degraded style (plus a
warning icon and explanatory title) when the backend reports the filter as
degraded, per the design doc's §2/§5. Bootswatch's Superhero theme is known to
hardcode some component colors past the CSS-variable layer (see PR #91), so the
new Playwright test verifies actual computed background-color, not just the class
name, to confirm the degraded state really renders distinctly.

The header also mounts the real DeckbuilderConfirmAffordance - the same component
CardSlot.tsx already mounts, adapted only via its onOpenGridSelector prop: the
rail has no modal to open, so N expands (or keeps expanded) the Choose Image
accordion section instead of opening GridSelectorModal.


Claude-Session: https://claude.ai/code/session_01MHapYojTkT5wenrQwGbGYk

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants