@@ -450,10 +450,20 @@ export function LivingSwarmGrid(props: LivingSwarmGridProps) {
450450 if ( ! reducedMotion ) tickGol ( gol ) ;
451451 }
452452 }
453- // Higher alpha (0.65) so the chunky tiles read as the primary
454- // visual texture. Color follows side tint — amber for A, teal
455- // for B — so the two panels stay distinguishable at a glance.
456- drawGol ( ctx , gol , size . w , size . h , resolvedSide , 0.65 ) ;
453+ // Conway tiles paint with the actor's sideColor at variable alpha.
454+ // In dark mode 0.65 is the right intensity for the chunky tiles to
455+ // read as the primary visual texture. In light mode the sideColor
456+ // tokens are deliberately darker (amber #6b4700 vs dark-mode
457+ // #e8b44a) to clear WCAG contrast on cream, so 0.65 painted across
458+ // every alive tile in every cohort panel cumulatively reads as a
459+ // heavy dark wash — that's the "dark gradient" complaint on viz
460+ // cached-run loads, where every panel paints the steady-state
461+ // tile pattern in one frame instead of streaming in. Drop the
462+ // light-mode intensity to 0.22 so tiles still register but don't
463+ // dominate.
464+ const isLightTheme = typeof document !== 'undefined'
465+ && document . documentElement . classList . contains ( 'light' ) ;
466+ drawGol ( ctx , gol , size . w , size . h , resolvedSide , isLightTheme ? 0.22 : 0.65 ) ;
457467 // DEATHS filter: gray hollow tombstone squares with an X at each
458468 // dead colonist's historical position. BIRTHS filter: green filled
459469 // squares with a "+" glyph at each native-born colonist's position.
0 commit comments