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.
Editorial typography, on the page.
Six small things a good typesetter would notice — rendered live in the page you're reading, not described.
-
A line of body type wants room to breathe. Sufficient leading and well-mannered hyphenation keep long words from sprinting into the margin while shorter ones still walk at the pace of the rest of the paragraph.
Generous leading & hyphenation Reading Mode · Image Export
-
"The opening quote belongs in the margin, so the first real letter sits flush with the body text underneath it. The eye prefers it that way, even when it can't say why."
Hanging punctuation Reading Mode · Image Export
-
Two adjacent characters that get confused all the time — the em dash and the hyphen-minus — behave very differently in running text. Lanai uses the right one in display, every time.
Real em dashes Timeline cleanup · Tier 3
-
“It’s the smallest thing,” she said, “and the first thing I notice.” The keyboard gives you straight quotes; the page gives them back curly, with the apostrophes you'd write yourself if you had time.
Curly quotes & apostrophes Timeline cleanup · Tier 3
-
A reading surface is just a room that respects the words inside it.
Pull-quote treatment Reading Mode · Image Export
-
- Posted11:14 AM
- Reply11:47 AM
- Quote2:08 PM
Tabular numerals Everywhere a column of figures meets a column of figures
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.