Design system
The tokens, in public.
Lanai's design system is the same across iOS, iPadOS, macOS, Vision Pro,
and the marketing site. The tokens you see below are the ones the app
uses. The source of truth is the SwiftUI DesignSystem
package; the web mirrors it through CSS custom properties named
--ds-*. The deep-dive
accessibility as design
and the synced
DESIGN_SYSTEM.md
hold the longer version.
Tokens
Every visual decision in the app routes through a named token. Colors,
type, spacing, motion, radii, shadows. The Swift names and the CSS
names match deliberately — DesignSystem.Colors.textPrimary
in the app is --ds-color-textPrimary on the web. A change
in one is a change in both.
Typography
Three families. Three weights you'll see often. A ramp that holds up from the smallest Dynamic Type size to AX5. Body type is anchored at 17pt — the iOS minimum we treat as a floor rather than an aspiration.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Pull up a chair. The kettle is on.
Color
Five themes, designed at equal polish. Every theme's primary text token on its primary canvas meets APCA Lc≥75 — the body-text floor. The High Contrast theme targets Lc≥105. Values below are computed at build time from the canonical hex values; the same numbers ship in the app.
Day
The default. A porch in late morning.
Dusk
Dark mode default. A porch at twilight.
Miami
Warm cream. Mid-century light.
Late Night
OLED black. A single muted-gold accent.
High Contrast
Maximum legibility. As crafted as the others.
Motion
Long, gentle transitions. Crossfades over snaps. Easing curves that
decelerate into rest. Three duration tokens cover almost every motion
in the app. prefers-reduced-motion is honored at every
site — springs become crossfades, durations collapse to near-zero, the
visual rhythm survives.
-
--ds-motion-quick250 ms Default transitions; hover lift; toggles -
--ds-motion-comfortable350 ms View changes; sheet present/dismiss -
--ds-motion-reflective600 ms Celebratory moments only
The easing curve is cubic-bezier(0.25, 0.1, 0.25, 1) — Apple's
iOS 17+ smooth curve, slightly easier than easeInOut. No
bouncy springs in v1.0; the porch is calm.
Accessibility
Body type starts at 17 pt and only goes up. Touch targets are 44 pt at default, 56 pt at AX3 and above. Default contrast clears APCA Lc≥75 in every theme; High Contrast targets Lc≥105. Hyperlegible mode swaps the body and display typefaces for Atkinson Hyperlegible Next. Every animation has a reduced-motion path built in from the start.
The longer essay is at
accessibility as design.
The synced engineering spec is
src/content/engineering-source/design-system.md; this page
is its public mirror.