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.

TokenLight · DarkValuesUse
--mf-bg
#f0f0f3#1c1c1ePage ground behind everything
--mf-bubble
#f7f7f9#202022Incoming bubbles, filled fields, quiet chips
--mf-float
#ffffff#242426Floating chrome: pills, menus, sheets
--mf-card
#ffffff#2a2a2cCards and panels on the ground
--mf-text
#1a1a1a#f0f0f0Primary ink
--mf-muted
#6e6e73#9a9aa0Secondary 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#f92855Errors and destructive actions
--mf-success
#2dc08e#2dc08eSuccess and live states
--mf-solid
#1a1a1a#f0f0f0The one ink button per screen
--mf-on-solid
#ffffff#1c1c1eWhat 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.

50
100
200
300
400
500
600
700
800
900
--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.

--mf-fill
ink at 6%
--mf-fill-2
ink at 10%
--mf-fill-3
ink at 16%

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.

--mf-chart-1
#e5307f · #e4448a
--mf-chart-2
#5b9a00 · #62a00e
--mf-chart-3
#0b8bd6 · #2a8fda
--mf-chart-4
#f07a10 · #d2701c
--mf-chart-5
#9b5de5 · #9f6ae4
--mf-chart-6
#00a896 · #0ea290

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.

--mf-hue-pink
#FF4F8B
--mf-hue-teal
#30B0C7
--mf-hue-gray
#8E8E93
--mf-hue-red
#FF453A
--mf-hue-purple
#AF52DE
--mf-hue-orange
#FF9F0A
--mf-hue-violet
#BF5AF2
--mf-hue-blue
#5E9EFF
--mf-hue-magenta
#FF2D9B
--mf-hue-green
#32D74B
--mf-hue-indigo
#7B68EE

Monogram avatars pick from their own six, by a hash of the username:

--mf-avatar-1
#E8694A
--mf-avatar-2
#E8A23D
--mf-avatar-3
#3DAE6E
--mf-avatar-4
#3D8FE8
--mf-avatar-5
#7B5BE8
--mf-avatar-6
#D14F8C

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.

Front of house
Same tokens, cream skin.
Get started
TokenLight · DarkValuesUse
--mf-bg
#FBF6EF#14120FPage 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#F4EEE4Primary 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#f92855Errors and destructive actions
--mf-success
#2ea06b#2ea06bSuccess and live states
--mf-solid
#16181A#FBF6EFThe one ink button per screen
--mf-on-solid
#FBF6EF#16181AWhat is written on it