The Kashew
design system.
The visual language behind Kashew — a native iOS money app for young adults. Restraint over decoration, greys over color, one warm accent. Every token here maps one-to-one to SwiftUI and Figma.
The mark
The Kashew glyph is an abstract K built from two leaf-like strokes — a quiet nod to growth. It is the primary identity: confident on its own, never crowded.
Mark on neutral · on ink · on gold. App icon pairs the gold mark on the ink background (or the reverse).
Clear space & sizing
Maintain clear space equal to the width of one stroke (≈ 25% of the mark height) on all sides. Minimum sizes: 20pt in a tab bar, 17pt inline, 1024px for the App Store icon. The mark always uses continuous, not stepped, scaling.
Wordmark
The written name “Kashew” is set in Bricolage Grotesque — reserved for marketing surfaces, landing headers and the splash. It is not used for in-app UI text.
Keep the mark monochrome — ink, white or gold. Give it room. Let it sit quietly.
Recolor with gradients, add shadows, rotate, stretch, or place the gold mark on light backgrounds where it loses contrast.
Mostly grey, deliberately gold
Kashew is a greyscale system with a single warm accent. Greys carry structure and hierarchy; gold appears only where attention is earned — a primary action, a selected state, a positive moment. Color is never decoration.
Brand core
Neutral ramp
A near-neutral, faintly-warm grey scale. grey-900 is the brand ink; everything in the UI is built from these eleven steps.
Semantic tokens
Mapped to Apple's roles (systemBackground, label, separator, fill …). Always reference the semantic token in code — never the raw ramp.
The gold rule
Gold is a fill, not a text color.
#FFD379 is light — it passes contrast only against the ink, not against white. Use it as a background with ink text on top (primary buttons, badges) or as an accent on dark surfaces. Never use gold for body text, links, or small icons on light backgrounds.
Functional accents (used sparingly)
Color is reinforcement, never the only signal — pair with an icon, sign, or label so the meaning survives color-blindness and grayscale.
Two voices: words & numbers
Three typefaces, three jobs. Bricolage Grotesque speaks the brand. SF Pro carries every word in the product. A monospaced face owns the numbers, so money always lines up.
Recommendation for the text font
SF Pro — it is free, ships on every device, supports Dynamic Type and accessibility sizing out of the box, and is the strongest possible HIG alignment. If you want cross-platform brand parity later (web + Android), Inter is the closest neighbour. For numbers, SF Mono is the native pick; Geist Mono or JetBrains Mono are warmer contemporary alternatives. The non-negotiable is tabular figures — see below.
Compare the candidates
Text — one face for all product UI.
Numbers — one face for monetary figures (all three support tabular figures).
SF Pro and SF Mono are Apple system fonts — they render true on Apple hardware and fall back to a system face elsewhere. Inter, Geist Mono and JetBrains Mono are loaded as webfonts, so they look identical on every device.
Why a separate number font
Proportional — digits drift ✗
Tabular — digits align ✓
Tabular figures keep decimal points in a column and stop balances from “jumping” when they animate. In SwiftUI: .monospacedDigit() or Font.system(.title, design: .monospaced).
Type scale → SwiftUI text styles
Sizes follow Apple's default Dynamic Type (Large). Always use the named text style so the app respects the user's accessibility size — avoid hard-coded point sizes for text.
Space, radius, depth
An 8-point grid with 4-point half-steps. Generous margins. Soft, continuous corners. Depth comes from layered surfaces and materials — not heavy shadows.
Spacing scale (4 / 8 grid)
Default screen margin: 16pt (compact) / 20pt. Content row height ≥ 44pt for tap targets.
Corner radius — continuous
xs · 8px
sm · 10px
md · 12px
lg · 16px
xl · 20px
2xl · 28px
pill · 40px
Always the iOS “squircle”: RoundedRectangle(cornerRadius: 16, style: .continuous).
Elevation & materials
flat — fill / border
elevation-1 — cards
elevation-2 — sheets
Prefer .regularMaterial / .thinMaterial for tab bars, sheets and overlays. In dark mode, lift surfaces with lighter greys rather than shadow.
SF Symbols, weight-matched
Use SF Symbols throughout — they scale with text, support Dynamic Type, and offer hierarchical rendering. Match symbol weight to adjacent text. Tint with the label color; reserve gold for the active or selected symbol only.
Illustrative glyphs shown — in-app, use the real SF Symbols set at scale .medium, weight .regular/.semibold.
The system, assembled
Tokens become UI. Every element is built only from the colors, type, spacing and radii defined above — here is a taste of the full library.
One source of truth
Token names are identical across Figma Variables and SwiftUI, so a value defined once reads the same in both worlds. Define colors in an Asset Catalog with Light/Dark appearances and reference them semantically.
SwiftUI — colors & theme
// Colors live in an Asset Catalog with Any/Dark appearances,
// named to match the design tokens exactly.
extension Color {
static let bgPrimary = Color("bg/primary")
static let bgSecondary = Color("bg/secondary")
static let surface = Color("surface")
static let labelPrimary = Color("label/primary")
static let labelSecondary = Color("label/secondary")
static let separator = Color("separator")
static let accent = Color("accent") // #FFD379
static let onAccent = Color("on-accent") // #212021 ink
}SwiftUI — type & numbers
extension Font {
// Text uses the system face → free Dynamic Type
static let bodyText = Font.system(.body)
static let headline = Font.system(.headline)
// Money: monospaced design + tabular digits
static func amount(_ style: Font.TextStyle = .title) -> Font {
.system(style, design: .monospaced).monospacedDigit()
}
}
Text("€ 4,820.17")
.font(.amount(.largeTitle))
.foregroundStyle(.labelPrimary)SwiftUI — spacing & radius
enum Space { static let x1=4.0, x2=8.0, x3=12.0, x4=16.0, x6=24.0, x8=32.0 }
enum Radius { static let sm=10.0, md=12.0, lg=16.0, xl=20.0 }
RoundedRectangle(cornerRadius: Radius.lg, style: .continuous)
.fill(Color.surface)
.padding(Space.x4)Figma ↔ SwiftUI parity
Create one Figma Variable collection with two modes (Light, Dark). Name variables identically to the asset-catalog colors. Text styles mirror Apple's text styles; spacing & radius are number variables.