Darker again — matches ios!144

#C0A4EC to #5A8BCC, dark #170D2E to #050F1E. Same values, same commit.

🔴 Close to the floor for a light theme. One more step (bottom stop #477BC2)
puts ink itself at 4.65:1 and leaves secondary text unable to clear 4.5:1 even
at pure near-black. Below that, dark text on this ground fails and the answer is
a theme flip, not a darker shade.

⚠️ SecondaryText is now #1B1822, very close to Ink at #090710 — contrast is
satisfied and hierarchy is not. The palette test measures ratios; it cannot see
that two text colours have converged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Paul Hitt
2026-09-07 12:13:36 -04:00
co-authored by Claude Opus 5
parent 4444e7e8e2
commit 37143c5b6e
@@ -80,10 +80,10 @@ object Palette {
// the top and 8.4:1 at the bottom, secondary text 8.1:1 and 5.5:1 — the
// bottom stop binds, and it is where most of the explanatory copy sits.
// White cards lift off the bottom at 2.4:1, which keeps a card a card.
val GroundTop = Color(0xFFD6C2F4)
val GroundBottom = Color(0xFF82ABE0)
val NightGroundTop = Color(0xFF1C1036)
val NightGroundBottom = Color(0xFF071426)
val GroundTop = Color(0xFFC0A4EC)
val GroundBottom = Color(0xFF5A8BCC)
val NightGroundTop = Color(0xFF170D2E)
val NightGroundBottom = Color(0xFF050F1E)
val Teal = Color(0xFF3BD5B2) // success and presence
val Pink = Color(0xFFED497C) // the kit's alert accent
@@ -93,7 +93,7 @@ object Palette {
// ⚠️ Still needed where a gradient cannot go (a single Color parameter, a
// system bar tint). This is the gradient's mid-tone, so the two never read
// as different surfaces.
val Mist = Color(0xFFACB6EA) // the page ground, flat
val Mist = Color(0xFF8D97DC) // the page ground, flat
val SurfaceAlt = Color(0xFFF3F3F3) // received bubbles, pills, bands
val IncomingBubble = Color(0xFFF3F3F3)
// ⚠️ A blue-tinted grey rather than the flat #F3F3F3: an initials avatar
@@ -106,7 +106,11 @@ object Palette {
// on the old bottom stop and only 3.5:1 on the darker one — below AA, and
// most of the explanatory copy on these screens is set in it. Measured now:
// 8.4:1 at the top of the gradient, 5.6:1 at the bottom.
val SecondaryText = Color(0xFF332E3D)
// 🔴 Close to the floor: it has darkened at every step of the ground and
// is now very near Ink (#090710), so the difference between primary and
// secondary text is nearly gone. Contrast is satisfied; hierarchy is not,
// and no test catches that.
val SecondaryText = Color(0xFF1B1822)
// 🔴 **Dark mode had no secondary text colour at all**, and used the light
// one: #505C69 on the dark ground measures **2.41:1**, far below AA, and
// most of the explanatory copy on these screens is set in it. iOS has had
@@ -127,7 +131,7 @@ object Palette {
// Dark-mode grounds — these ARE the site's, since the site is dark.
val InkSurface = Color(0xFF121A2E) // --panel
val NightGround = Color(0xFF11122E) // --bg, the dark gradient's mid-tone
val NightGround = Color(0xFF0E0E26) // --bg, the dark gradient's mid-tone
}
/**