Color
Components read what a colour is for, never the colour itself. Light and dark, the reader's accent and the two skins all come from the same names.
Surfaces and ink
The product skin: the app, profiles, the garden, sign-in approval, and every card. These are the values the web and phone apps render today, held equal by a test.
| Token | Light · Dark | Values | Use |
|---|---|---|---|
--mf-bg | #f0f0f3#1c1c1e | Page ground behind everything | |
--mf-bubble | #f7f7f9#202022 | Incoming bubbles, filled fields, quiet chips | |
--mf-float | #ffffff#242426 | Floating chrome: pills, menus, sheets | |
--mf-card | #ffffff#2a2a2c | Cards and panels on the ground | |
--mf-text | #1a1a1a#f0f0f0 | Primary ink | |
--mf-muted | #6e6e73#9a9aa0 | Secondary ink: meta, hints, labels | |
--mf-subtle | rgba(0,0,0,0.35)rgba(255,255,255,0.22) | Tertiary ink: placeholders, disabled | |
--mf-border | rgba(0,0,0,0.12)rgba(255,255,255,0.10) | Hairlines and outlines | |
--mf-error | #f92855#f92855 | Errors and destructive actions | |
--mf-success | #2dc08e#2dc08e | Success and live states | |
--mf-solid | #1a1a1a#f0f0f0 | The one ink button per screen | |
--mf-on-solid | #ffffff#1c1c1e | What is written on it |
Accent
The accent belongs to the reader: they pick it in Appearance. Three variables carry it (--mf-accent, --mf-on-accent, --mf-accent-strong) and the ten steps below are mixed from the first. Low steps lean toward the card, high steps toward the ink, so the ramp reads in both schemes.
--mf-accent-100: color-mix(in oklab, var(--mf-accent) 12%, var(--mf-card));
--mf-accent-700: color-mix(in oklab, var(--mf-accent) 72%, var(--mf-text));Fills
Hover, pressed and quiet chips: the ink at low strength, so they work on any surface in either scheme.
Chart series
Six series colours in a fixed order that passes colour-blind checks for neighbouring series; the first three pass for every pair, so rings and three-part scores use those. Dark has its own steps. Slots 4 and 6 sit under 3:1 on white, so charts using them carry labels.
Glyph hues
One saturated colour per icon, never a tinted plate behind it. Small row icons may run a diagonal gradient from the accent to one of these.
Monogram avatars pick from their own six, by a hash of the username:
Front of house
The landing, the sign-in door, invites and onboarding wear a cream ground with four corner blooms. It is a skin, not a second palette: data-skin="front" re-maps the same names.
| Token | Light · Dark | Values | Use |
|---|---|---|---|
--mf-bg | #FBF6EF#14120F | Page ground behind everything | |
--mf-bubble | rgba(255, 255, 255, .56)rgba(255, 255, 255, .055) | Incoming bubbles, filled fields, quiet chips | |
--mf-float | rgba(255, 255, 255, .92)rgba(46, 42, 38, .94) | Floating chrome: pills, menus, sheets | |
--mf-card | rgba(255, 255, 255, .92)rgba(46, 42, 38, .94) | Cards and panels on the ground | |
--mf-text | #16181A#F4EEE4 | Primary ink | |
--mf-muted | rgba(22, 24, 26, .66)rgba(244, 238, 228, .68) | Secondary ink: meta, hints, labels | |
--mf-subtle | rgba(22, 24, 26, .44)rgba(244, 238, 228, .42) | Tertiary ink: placeholders, disabled | |
--mf-border | rgba(22, 24, 26, .10)rgba(244, 238, 228, .10) | Hairlines and outlines | |
--mf-error | #f92855#f92855 | Errors and destructive actions | |
--mf-success | #2ea06b#2ea06b | Success and live states | |
--mf-solid | #16181A#FBF6EF | The one ink button per screen | |
--mf-on-solid | #FBF6EF#16181A | What is written on it |