The Dark Side of Mint Green

I followed a swatch (green, not white) through Gmail's dark mode and tested four color-mapping methods to see what sticks

A friend sent me an email that spun me down the most wondrous rabbit hole, early on a Wednesday morning. I was very interested in the content, of course, but what caught my attention was how the text, in dark mode in the Gmail app on my iPhone, was the most peculiar shade of muted mint green.

riverrun, past Eve and Adam's, from swerve of shore to bend of bay, brings us by a commodius vicus of recirculation back to Howth Castle and Environs. Sir Tristram, violer d'amores, fr'over the short sea, had passen- core rearrived from North Armorica on this side the scraggy isthmus of Europe Minor to wielderfight his penisolate war: nor had topsawyer's rocks by the stream Oconee exaggerated themselse to Laurens County's gorgios while they went doublin their mumper all the time: nor avoice from afire bellowsed mishe mishe to tauftauf thuartpeatrick: not yet, though venissoon after, had a kidscad buttended a bland old isaac: not yet, though all's fair in vanessy, were sosie sesthers wroth with twone nathandjoe. Rot a peck of pa's malt had Jhem or Shen brewed by arclight and rory end to the regginbrow was to be seen ringsome on the aquaface.

How, though was the text that color? It was immediately obvious that the case was interesting, bridging insomnia with my swatch-collector nature. I needed to know more.

I wondered if it was even possible to use that specific shade of green (#BDDAA4 / rgb(189, 218, 164)) to compose an email in Gmail:

  • On iOS, Google does not include the option to select the text color – or it's very well hidden.
  • You can't choose that exact color in a browser, either. Gmail's support for dark mode is still clunky: even when using a dark theme, it only partly applies, and the Compose window stays light. You can force dark in Chrome (chrome://flags/#enable-force-dark), but the results are still rough. Hardly anybody could use that for work, especially for a symmetry-loving person like the email's sender.
  • Perhaps the mint green was picked in Gmail while in light mode, even though the type would be barely visible on a white background. Yet the swatches available in the Gmail app do not include #BDDAA4. Google offers similar greens, but not the same. The lightest shade in the palette is #D9EAD3 / rgb(217, 234, 211), and the step after that is #B6D7A8 / rgb(182, 215, 168): very, very close, but not identical.
  • It is technically possible to hack formatting in an outgoing email by tweaking the HTML in Chrome's inspector, but it's niche and brittle and again seems like a long-shot possibility.
  • Gmail on Android comes with a color picker for text, but that too does not include #BDDAA4 (which also covers the possibility that I simply didn’t look hard enough for the formatting options on iOS)
  • Because the headers are Gmail-specific (Message-ID ends in @mail.gmail.com and I could see X-Gm-Message-State, X-Gm-Features, and X-Google-DKIM-Signature/X-Google-Smtp-Source) and there's no User-Agent/X-Mailer from Outlook or Apple Mail, this was sent via Gmail's web interface, not a third-party client. I googled all that.
Background color
Text color
"It has been argued by me, the defense, that two sets of guys met up at the Sac-O-Suds, at the same time, driving identical metallic mint-green 1964 Buick Skylark convertibles… Now, can you tell us if the defense's case holds water?"
"No, the defense is wrong."

I checked how the text looks in a desktop browser in light mode: still green, but a deep, dark shade, #274E13 / rgb(39, 78, 19). This time it was one from Google's palette, the darkest green (between teal and mustard).

Then I checked computed CSS in the Gmail app on iOS with Chrome's flag force-enabled. As expected, even though I was seeing the muted mint green on a dark gray background, the inspector listed the color as #274E13 (the dark one). So, as I suspected, the muted mint was a product of algorithmic color remapping.

I still had to figure out how and why the color shifts from #274E13 to #BDDAA4. While I was at it, I was curious how the rest of the dark colors in Google's palette would map in dark mode, so I sent the following email to myself.

This is #4c1130rgb(76, 17, 48);
This is #20124drgb(32, 18, 77);
This is #073763rgb(7, 55, 99);
This is #0c343drgb(12, 52, 61);
This is #274e13rgb(39, 78, 19);
This is #7f6000rgb(127, 96, 0);
This is #783F04rgb(120, 63, 4);
This is #660000rgb(102, 0, 0);

And this is what I was seeing in dark mode.

This is #4c1130rgb(76, 17, 48);
This is #20124drgb(32, 18, 77);
This is #073763rgb(7, 55, 99);
This is #0c343drgb(12, 52, 61);
This is #274e13rgb(39, 78, 19);
This is #7f6000rgb(127, 96, 0);
This is #783F04rgb(120, 63, 4);
This is #660000rgb(102, 0, 0);

After doing some digging, I learned that there are only a handful of ways developers usually handle the intricacies of dark and light modes. In Google's case there's no public spec for the exact remapping so we are free to guess and play.

Method 1: Simple RGB Invert

How it works. Like a photo negative: flip each channel (R, G, B) to 255 - x.

Result. For #274E13, you get a pale lavender, nowhere near mint.

Method 2: HSL "Flip Lightness"

How it works. Convert to HSL, mirror the L (lightness), keep H (hue), modestly temper S (saturation).

Result. Closer. You get a pale green in the right family, often too bright or candy-colored.

Method 3: Lab/OKLCH "Perceptual Flip"

How it works. Use a perceptual model; flip L* (lightness) and reduce chroma to avoid neon blow-outs.

Result. A natural-looking muted mint, visually convincing, but not contrast-aware.

Method 4: Contrast-Targeted Remap

How it works: This method prioritizes readability. It automatically adjusts the color's brightness until it achieves a specific contrast ratio against a dark background. While it adjusts the brightness, it tries to preserve the original color and soften its saturation.

Result. Practical and consistent. This lands #274E13 in the #B6C9A9–#BDDAA4 band: readable, minty, not harsh.

#4C1130
#4C1130
Contrast: 1.09:1
Original
#B3EECF
Contrast: 12.26:1
RGB invert (255 - x)
#F7AAD2
Contrast: 8.89:1
HSL flip (S×0.82)
#D9BBC7
Contrast: 9.08:1
Contrast remap (≥4.8:1, C×0.70.35, +20L*)
#DBBAC7
Contrast: 9.06:1
Slight saturation nudge after meeting WCAG
#f7e2f8
Contrast: 13.13:1
Target color in Google's algorithm
#20124D
#20124D
Contrast: 1.04:1
Original
#DFEDB2
Contrast: 12.91:1
RGB invert (255 - x)
#BBA9F6
Contrast: 7.73:1
HSL flip (S×0.82)
#CBBFDE
Contrast: 9.20:1
Contrast remap (≥4.8:1, C×0.70.35, +20L*)
#CCBEE1
Contrast: 9.18:1
Slight saturation nudge after meeting WCAG
#fcf3fd
Contrast: 14.80:1
Target color in Google's algorithm
#073763
#073763
Contrast: 1.33:1
Original
#F8C89C
Contrast: 10.49:1
RGB invert (255 - x)
#9FCCF5
Contrast: 9.50:1
HSL flip (S×0.82)
#B9C3DA
Contrast: 9.08:1
Contrast remap (≥4.8:1, C×0.70.35, +20L*)
#B8C3DC
Contrast: 9.07:1
Slight saturation nudge after meeting WCAG
#d1e3f8
Contrast: 12.27:1
Target color in Google's algorithm
#0C343D
#0C343D
Contrast: 1.20:1
Original
#F3CBC2
Contrast: 10.80:1
RGB invert (255 - x)
#BDEDF8
Contrast: 12.71:1
HSL flip (S×0.82)
#B7C6CA
Contrast: 9.13:1
Contrast remap (≥4.8:1, C×0.70.35, +20L*)
#B5C6CB
Contrast: 9.10:1
Slight saturation nudge after meeting WCAG
#d6eef7
Contrast: 13.32:1
Target color in Google's algorithm
#274E13
#274E13
Contrast: 1.67:1
Original
#D8B1EC
Contrast: 8.72:1
RGB invert (255 - x)
#C2F6A7
Contrast: 13.01:1
HSL flip (S×0.82)
#B8C8AC
Contrast: 9.09:1
Contrast remap (≥4.8:1, C×0.70.35, +20L*)
#B6C9A9
Contrast: 9.10:1
Slight saturation nudge after meeting WCAG
#bddaa4
Contrast: 10.49:1
Target color in Google's algorithm
#7F6000
#7F6000
Contrast: 2.73:1
Original
#809FFF
Contrast: 6.36:1
RGB invert (255 - x)
#F4DA8B
Contrast: 11.65:1
HSL flip (S×0.82)
#D6C099
Contrast: 9.06:1
Contrast remap (≥4.8:1, C×0.70.35, +20L*)
#D8BF94
Contrast: 9.01:1
Slight saturation nudge after meeting WCAG
#c7ab69
Contrast: 7.23:1
Target color in Google's algorithm
#783F04
#783F04
Contrast: 1.92:1
Original
#87C0FB
Contrast: 8.38:1
RGB invert (255 - x)
#F4C28E
Contrast: 9.90:1
HSL flip (S×0.82)
#E0BCA2
Contrast: 9.08:1
Contrast remap (≥4.8:1, C×0.70.35, +20L*)
#E3BB9E
Contrast: 9.07:1
Slight saturation nudge after meeting WCAG
#e9bc90
Contrast: 9.21:1
Target color in Google's algorithm
#660000
#660000
Contrast: 1.20:1
Original
#99FFFF
Contrast: 13.83:1
RGB invert (255 - x)
#F6A2A2
Contrast: 8.10:1
HSL flip (S×0.82)
#EAB7AC
Contrast: 9.07:1
Contrast remap (≥4.8:1, C×0.70.35, +20L*)
#EEB5AA
Contrast: 9.03:1
Slight saturation nudge after meeting WCAG
#f1d0bf
Contrast: 11.09:1
Target color in Google's algorithm
Final verdict

🥇 Contrast-targeted remap (Method 4) wins. It's the only one that reliably pushes #274E13 up to a readable, muted green in dark mode (landing in the #B6C9A9–#BDDAA4 band) because it optimizes for contrast while roughly preserving hue and softening saturation.

🥈 Runner-up: Lab/OKLCH flip (Method 3) plus a small chroma cut and a slight lightness lift can also hit #BDDAA4, but it isn't contrast-aware, so the result varies with background.

🥉 HSL flip (Method 2) is close but often too bright;

RGB invert (Method 1) lands in the wrong hue entirely.

Key takeaway

Method 4 is best for text (readability first), and Method 3 for swatches/UI accents where we get a satisfying mint but with no need to brighten it to accommodate text.

#EAD1DC
#EAD1DC
Contrast: 1.37:1
Original
#152E23
Contrast: 13.90:1
RGB invert (255 - x)
#2C1720
Contrast: 16.09:1
HSL flip (S×0.82)
#25121C
Contrast: 17.02:1
Lab flip (C×1.12, L−10)
#6D475A
Contrast: 7.45:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#D9D2E9
#D9D2E9
Contrast: 1.40:1
Original
#262D16
Contrast: 13.69:1
RGB invert (255 - x)
#1E182B
Contrast: 16.48:1
HSL flip (S×0.82)
#171528
Contrast: 17.13:1
Lab flip (C×1.12, L−10)
#544E72
Contrast: 7.42:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#CFE2F3
#CFE2F3
Contrast: 1.27:1
Original
#301D0C
Contrast: 15.40:1
RGB invert (255 - x)
#0F1F2D
Contrast: 16.04:1
HSL flip (S×0.82)
#051927
Contrast: 17.13:1
Lab flip (C×1.12, L−10)
#2F5571
Contrast: 7.57:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#D0E0E3
#D0E0E3
Contrast: 1.30:1
Original
#2F1F1C
Contrast: 15.09:1
RGB invert (255 - x)
#1E2B2D
Contrast: 13.98:1
HSL flip (S×0.82)
#0B1A1D
Contrast: 17.05:1
Lab flip (C×1.12, L−10)
#3A565B
Contrast: 7.56:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#D9EAD3
#D9EAD3
Contrast: 1.21:1
Original
#26152C
Contrast: 16.41:1
RGB invert (255 - x)
#1C2A17
Contrast: 14.44:1
HSL flip (S×0.82)
#0C1B03
Contrast: 17.14:1
Lab flip (C×1.12, L−10)
#3D5935
Contrast: 7.51:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#FFF2CC
#FFF2CC
Contrast: 1.07:1
Original
#000D33
Contrast: 18.20:1
RGB invert (255 - x)
#2E2405
Contrast: 14.68:1
HSL flip (S×0.82)
#221700
Contrast: 16.90:1
Lab flip (C×1.12, L−10)
#5D500C
Contrast: 7.68:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#FCE5CD
#FCE5CD
Contrast: 1.17:1
Original
#031A32
Contrast: 16.80:1
RGB invert (255 - x)
#2E1B07
Contrast: 15.77:1
HSL flip (S×0.82)
#251400
Contrast: 17.07:1
Lab flip (C×1.12, L−10)
#6A4C25
Contrast: 7.53:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#F4CCCC
#F4CCCC
Contrast: 1.40:1
Original
#0B3333
Contrast: 13.10:1
RGB invert (255 - x)
#2F0F0F
Contrast: 16.82:1
HSL flip (S×0.82)
#2C0F09
Contrast: 17.06:1
Lab flip (C×1.12, L−10)
#7A3F3E
Contrast: 7.71:1
Contrast remap (≥4.8:1, C×11.35, −12L*)

Turns out joining the dark side is much, much easier than the other way around. If we try to use the same algorithms to go from light text colors on a dark background to dark, saturated colors on a white background, well, we don't get much – especially from Method 4, which shoots the brightness up and produces barely visible swatches.

The problem is that the light swatches start with low chroma and often warm hues, so the darkening step (vs. white) must add saturation and subtly steer the hue to avoid brown or steel drift. That breaks the symmetry that made HSL flip, Lab flip with chroma damping, and contrast-targeted remap (which raised L* on dark backgrounds) work so well in the original block.

We tried chroma-gain ramps for Method 3; a WCAG-driven downward remap for Method 4 plus hue steering and a gamut-aware saturation push; and even RGB invert (Method 1) as a baseline. But they still match Gmail's deep tones far less consistently than the dark cases. More often than not, we end up with a muddy brown.

One assumption is that, in applying some variation of Method 4, Google may hard-code its eight colors so it doesn't need chroma or saturation in the initial light swatch. The system knows it's operating in the house of reds or the house of purples. In other words, a palette-aware post-step likely snaps the result to the nearest hue “rail” after it hits WCAG contrast, keeping a red recognizably red even when the math would drift toward brown. Methods 2 and 3 don't get close even with cheat mode on. It may not be a coincidence that the palette is relatively contained and that choosing just any color we want isn't encouraged.

And of course, all of this could be purely my imagination (isn't that the stuff rabbit holes are made of?).

#EAD1DC
#EAD1DC
Contrast: 1.37:1
Original
#152E23
Contrast: 13.90:1
RGB invert (255 - x)
#2C1720
Contrast: 16.09:1
HSL flip (S×0.82)
#25121C
Contrast: 17.02:1
Lab flip (C×1.12, L−10)
#6D475A
Contrast: 7.45:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#D9D2E9
#D9D2E9
Contrast: 1.40:1
Original
#262D16
Contrast: 13.69:1
RGB invert (255 - x)
#1E182B
Contrast: 16.48:1
HSL flip (S×0.82)
#171528
Contrast: 17.13:1
Lab flip (C×1.12, L−10)
#544E72
Contrast: 7.42:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#CFE2F3
#CFE2F3
Contrast: 1.27:1
Original
#301D0C
Contrast: 15.40:1
RGB invert (255 - x)
#0F1F2D
Contrast: 16.04:1
HSL flip (S×0.82)
#051927
Contrast: 17.13:1
Lab flip (C×1.12, L−10)
#2F5571
Contrast: 7.57:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#D0E0E3
#D0E0E3
Contrast: 1.30:1
Original
#2F1F1C
Contrast: 15.09:1
RGB invert (255 - x)
#1E2B2D
Contrast: 13.98:1
HSL flip (S×0.82)
#0B1A1D
Contrast: 17.05:1
Lab flip (C×1.12, L−10)
#3A565B
Contrast: 7.56:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#D9EAD3
#D9EAD3
Contrast: 1.21:1
Original
#26152C
Contrast: 16.41:1
RGB invert (255 - x)
#1C2A17
Contrast: 14.44:1
HSL flip (S×0.82)
#0C1B03
Contrast: 17.14:1
Lab flip (C×1.12, L−10)
#3D5935
Contrast: 7.51:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#FFF2CC
#FFF2CC
Contrast: 1.07:1
Original
#000D33
Contrast: 18.20:1
RGB invert (255 - x)
#2E2405
Contrast: 14.68:1
HSL flip (S×0.82)
#221700
Contrast: 16.90:1
Lab flip (C×1.12, L−10)
#5D500C
Contrast: 7.68:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#FCE5CD
#FCE5CD
Contrast: 1.17:1
Original
#031A32
Contrast: 16.80:1
RGB invert (255 - x)
#2E1B07
Contrast: 15.77:1
HSL flip (S×0.82)
#251400
Contrast: 17.07:1
Lab flip (C×1.12, L−10)
#6A4C25
Contrast: 7.53:1
Contrast remap (≥4.8:1, C×11.35, −12L*)
#F4CCCC
#F4CCCC
Contrast: 1.40:1
Original
#0B3333
Contrast: 13.10:1
RGB invert (255 - x)
#2F0F0F
Contrast: 16.82:1
HSL flip (S×0.82)
#2C0F09
Contrast: 17.06:1
Lab flip (C×1.12, L−10)
#7A3F3E
Contrast: 7.71:1
Contrast remap (≥4.8:1, C×11.35, −12L*)