Nzinga mosaic in magenta, flame and Volt
Design
/
Foundations

Foundations

The tokens every screen is built from, copied from the app's source. Change a token in the code first; this page follows.

Phone App
Expo SDK 58
01

Colour Tokens

Source
apps/mobile/utils/color-theme.ts · app/contexts/ThemeColors.tsx · tailwind.config.js (Tailwind classes) (JS values)

Each token is a CSS variable behind a Tailwind class (bg-background, text-subtext, border-border) and a matching value from useThemeColors(). The two files must change together.

Token
Dark (default)
Light
Use

The last five rows exist only as JS values in ThemeColors.tsx. brand in color-theme.ts holds the raw values for gradients.

02

Type Scale

Source
apps/mobile/tailwind.config.js fontSize

A compact scale: every text-* class in the app is smaller than Tailwind's default, because the default reads oversized on a phone. Text with no size class is 14pt.

Family
Class
Used for
Outfit Bold
font-outfit-bold
Display titles: greetings, setup titles, session titles
Outfit Regular
font-outfit
Defined, not used by any screen today
Platform font
(default)
Everything else: titles in font-bold, body, labels, numbers
03

Spacing

Source
tailwind.config.js · apps/mobile/CLAUDE.md spacing.global §3b

Tailwind's 4pt grid, plus one named step: global, the 20pt screen gutter. It sits between Luna's 16 and the 24 of Feedy and Walley.

Example
Live component
Token
Points
Where
px-global, p-global
20
Screen gutter; built into ThemedScroller, Header and ThemedFooter. Never add it again inside them.
-mx-global
−20
Full-bleed content inside a scroller, such as CardScroller.
gap-2
8
Between stat cards, chips and actions.
py-3
12
Buttons: 12 above and below a 20pt line gives 44pt.
py-5
20
Settings rows (ListLink) and Expandable rows.
04

Radius

Source
Tailwind defaults · apps/mobile/components as used across
Example
Live component
  • Buttons, chips, status badges and pills are fully round.
  • Inputs and code boxes use 8; tiles 12; choice rows and stat cards 16; tip cards, list groups and session panels 24.
  • This site uses tighter corners for its own chrome (8 to 12, large panels 16) so the app examples read as screens.
05

Elevation

Source
apps/mobile/utils/useShadow.ts shadowPresets

Four presets, from shadowPresets, spread into style. Never hand-written. In dark mode shadows barely show; surfaces separate by colour (secondary on background).

Example
Live component
small
0 1 / 2.5 · 0.2
card
0 2 / 3.84 · 0.2
medium
0 3 / 5 · 0.2
large
0 5 / 20.84 · 0.04

Offset y / blur radius · opacity. large is softer than it looks in code: it passes a translucent colour and an opacity, so the effective alpha is 0.04. Used on the record button.

06

Layout and Sizing

Source
apps/mobile/CLAUDE.md §3b and §4

44pt controls

Buttons and the welcome pills are 44pt tall (py-3), not the templates' 52pt.

14pt body

The compact scale throughout; titles in Title Case.

20pt gutter

px-global on every screen, from the shell components.

Text-only CTAs

Full-width calls to action carry words, not icons.

One-line choices

Each choice of who can use it is one line, with a short pay tag.

One accent

One live colour leads each screen.

The Screen Pattern

  1. Header: tabs without a back button, pushed screens with one.
  2. ThemedScroller for the body; it already has the gutter and a bottom spacer.
  3. ThemedFooter for sticky actions, padded for the home indicator.
  4. Placeholder for empty states, SkeletonLoader or PageLoader while loading.
  5. Horizontal scrolling is always CardScroller; bottom sheets are always ActionSheetThemed.
Example
Live component
Payout Method
Add a Payout Method
Where Nzinga sends your money. Kept on this phone only.
Mobile moneyBank account