Money O Money — Visual Design
Status
Brand identity locked (name, typeface, primary/secondary seed colors). Full Material 3 scheme below is generated from those seeds plus the confirmed tertiary seed — see brand-guidelines.adoc for the rationale. Screen-by-screen visual design (beyond the home-screen reference mockup) has not started.
Seed Colors
Generated with the same HCT tonal-palette script used for In My Head
(materialyoucolor), adapted with Money O Money’s seeds.
| Role | Seed hex | HCT (hue / chroma / tone) | Source |
|---|---|---|---|
Primary |
|
343.9 / 47.5 / 36.4 |
Deepest tone of the chosen Color Hunt palette |
Secondary |
|
336.3 / 38.8 / 47.2 |
Second tone of the same palette |
Tertiary |
|
222.5 / 33.8 / 49.4 |
Proposed — triadic to primary, avoids green/red |
Error stays the Material default red family (not derived from the brand palette), consistent with keeping error/alert states visually distinct from the brand’s own magenta/pink — same approach used for In My Head.
Light Scheme
| Role | Hex | Tone |
|---|---|---|
primary |
|
40 |
onPrimary |
|
100 |
primaryContainer |
|
90 |
onPrimaryContainer |
|
30 |
inversePrimary |
|
80 |
secondary |
|
40 |
onSecondary |
|
100 |
secondaryContainer |
|
90 |
onSecondaryContainer |
|
30 |
tertiary |
|
40 |
onTertiary |
|
100 |
tertiaryContainer |
|
90 |
onTertiaryContainer |
|
30 |
background |
|
98 |
onBackground |
|
10 |
surface |
|
98 |
onSurface |
|
10 |
surfaceVariant |
|
90 |
onSurfaceVariant |
|
30 |
surfaceTint |
|
40 |
surfaceBright |
|
98 |
surfaceDim |
|
87 |
surfaceContainerLowest |
|
100 |
surfaceContainerLow |
|
96 |
surfaceContainer |
|
94 |
surfaceContainerHigh |
|
92 |
surfaceContainerHighest |
|
90 |
inverseSurface |
|
20 |
inverseOnSurface |
|
95 |
error |
|
40 |
onError |
|
100 |
errorContainer |
|
90 |
onErrorContainer |
|
30 |
outline |
|
50 |
outlineVariant |
|
80 |
scrim |
|
0 |
Dark Scheme
| Role | Hex | Tone |
|---|---|---|
primary |
|
80 |
onPrimary |
|
20 |
primaryContainer |
|
30 |
onPrimaryContainer |
|
90 |
inversePrimary |
|
40 |
secondary |
|
80 |
onSecondary |
|
20 |
secondaryContainer |
|
30 |
onSecondaryContainer |
|
90 |
tertiary |
|
80 |
onTertiary |
|
20 |
tertiaryContainer |
|
30 |
onTertiaryContainer |
|
90 |
background |
|
6 |
onBackground |
|
90 |
surface |
|
6 |
onSurface |
|
90 |
surfaceVariant |
|
30 |
onSurfaceVariant |
|
80 |
surfaceTint |
|
80 |
surfaceBright |
|
24 |
surfaceDim |
|
6 |
surfaceContainerLowest |
|
4 |
surfaceContainerLow |
|
10 |
surfaceContainer |
|
12 |
surfaceContainerHigh |
|
17 |
surfaceContainerHighest |
|
22 |
inverseSurface |
|
90 |
inverseOnSurface |
|
20 |
error |
|
80 |
onError |
|
20 |
errorContainer |
|
30 |
onErrorContainer |
|
90 |
outline |
|
60 |
outlineVariant |
|
30 |
scrim |
|
0 |
Fixed Roles (identical in both schemes)
"Fixed" roles are used where a color needs to stay constant regardless of light/dark theme (e.g. a colored chip that shouldn’t flip tone).
| Role | Hex |
|---|---|
primaryFixed |
|
primaryFixedDim |
|
onPrimaryFixed |
|
onPrimaryFixedVariant |
|
secondaryFixed |
|
secondaryFixedDim |
|
onSecondaryFixed |
|
onSecondaryFixedVariant |
|
tertiaryFixed |
|
tertiaryFixedDim |
|
onTertiaryFixed |
|
onTertiaryFixedVariant |
|
Contrast Ratios
All text-bearing role pairs clear WCAG AA (4.5:1) in both schemes; most clear AAA (7:1).
| Pair | Light | Dark |
|---|---|---|
primary / onPrimary |
6.46:1 |
7.72:1 |
primaryContainer / onPrimaryContainer |
7.24:1 |
7.24:1 |
secondary / onSecondary |
6.46:1 |
7.72:1 |
secondaryContainer / onSecondaryContainer |
7.24:1 |
7.24:1 |
tertiary / onTertiary |
6.46:1 |
7.72:1 |
tertiaryContainer / onTertiaryContainer |
7.24:1 |
7.24:1 |
error / onError |
6.46:1 |
7.72:1 |
errorContainer / onErrorContainer |
7.24:1 |
7.24:1 |
background / onBackground |
16.31:1 |
14.35:1 |
surface / onSurface |
16.31:1 |
14.35:1 |
surfaceVariant / onSurfaceVariant |
7.24:1 |
5.49:1 |
surface / primary |
6.15:1 |
10.89:1 |
surface / outline |
4.27:1 |
5.85:1 |
surfaceVariant / outline |
3.47:1 |
2.95:1 |
inverseSurface / inverseOnSurface |
11.59:1 |
10.18:1 |
surfaceVariant/outline sits below 4.5:1 in both schemes — expected
and acceptable, since outline is a border/divider role, not text.
Reference Mockup
The home-screen layout used to compare the four candidate palettes
(money-o-money-palette-comparison.html) used a simplified subset of
these roles (primary, secondary, primary-container, secondary-container
only). It has not yet been updated to the full generated scheme above —
worth refreshing once the tertiary seed is confirmed.
Open Items
-
App icon / logo mark — not yet designed
-
Screen-by-screen visual design beyond the home-screen reference
Decisions Log
| Date | Decision | Rationale |
|---|---|---|
2026-08-02 |
Generated full M3 scheme via HCT tonal-palette script |
Same method used for In My Head; keeps token generation consistent across the app portfolio |
2026-08-02 |
Error role kept as Material default red, not brand-derived |
Keeps error/alert states visually distinct from the brand’s magenta/pink; matches In My Head’s approach |
2026-08-03 |
Tertiary seed confirmed via triadic relationship |
Primary/secondary are too close in hue to serve tertiary’s contrast role |