Visual Theme & Atmosphere
Expo's marketing site reads like a quietly-confident React-Native developer platform. The base canvas is pure white ({colors.canvas} — #ffffff) with a soft sky-blue gradient atmospheric wash behind the hero band. Near-black ink {colors.ink} (#171717) carries body and display alike. The single brand voltage is pure black ({colors.primary} — #000000) for primary CTAs — minimal and editorial-feeling. A small blue text-link accent ({colors.text-link} — #0d74ce) is reserved for inline body links, never as a CTA.
Type runs Inter as the single sans family at modest weights (display 600, body 400). JetBrains Mono carries every code surface. No custom typeface — the brand trusts Inter's editorial neutrality.
...
Key Characteristics:
- Pure white canvas with sky-blue gradient atmospheric backdrop in hero only.
- ...
Live Visual Theme Representation:
Visual Theme Example
Color Palette & Roles
Brand & Accent
- Black (
{colors.primary}— #000000): Primary CTA fill. Used scarcely. - Black Active (
{colors.primary-active}— #1a1a1a): Press state. - ...
Surface
- Canvas (
{colors.canvas}— #ffffff): Pure white page floor. - Canvas Soft (
{colors.canvas-soft}— #fafafa): Subtle alternating band. - ...
Atmospheric Backdrop
- Sky Light (
{colors.gradient-sky-light}— #cfe7ff) + Sky Mid ({colors.gradient-sky-mid}— #a8c8e8): The soft sky-blue gradient wash behind the homepage hero only. Not a brand action color.
Hairlines
- Hairline (
{colors.hairline}— #f0f0f3): Default 1px divider. - Hairline Soft (
{colors.hairline-soft}— #f5f5f7): Lighter divider. - ...
Text
- Ink (
{colors.ink}— #171717): Display, body emphasis. - Body (
{colors.body}— #60646c): Default running-text — slightly cool gray. - ...
Semantic
- Warning (
{colors.accent-warning}— #ab6400): Warning text inside docs callouts. - Preview (
{colors.accent-preview}— #8145b5): "Preview" tag color. - ...
Typography Rules
Font Family
Inter is the single sans family across every text role. JetBrains Mono carries every code surface. Fallback:-apple-system, system-ui, sans-serif.
Hierarchy
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|---|---|---|---|---|---|
| ... | ... | ... | ... | ... | ... |
Principles
- Display weight stays at 600 — confident but not bombastic. Inter at 600 reads cleaner than 700.
- Negative letter-spacing on display — -0.5px to -1.92px tracking.
- ...
Note on Font Substitutes
Inter and JetBrains Mono are both freely available — the system uses them directly.Layout Principles
Spacing System
- Base unit: 4px.
- Tokens:
{spacing.xxs}4px ·{spacing.xs}8px ·{spacing.sm}12px ·{spacing.base}16px ·{spacing.md}20px ·{spacing.lg}24px ·{spacing.xl}32px ·{spacing.xxl}48px ·{spacing.section}96px. - ...
Grid & Container
- Max content width: ~1200px.
- Editorial body: 12-column grid.
- ...
Whitespace Philosophy
Generous editorial pacing. The white canvas does not compete with the hero's gradient sky wash; cards inside dense workflow sections sit close (16-24px gap).Grid Layout Wireframe Mockup:
Layout Grid Example
Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| ... | ... | ... |
Decorative Depth
- Sky-blue gradient backdrop in the hero only — atmospheric depth without claiming to be a brand color.
- Device mockup composite as page chrome — MacBook + iPhone showing real Expo dev surfaces.
Elevation Level Showcase:
Elevation Level Example
Used for background layers, sidebar headers, or baseline borders.
Used for floating product elements, cards, and hover states.
Used for modals, select menus, code editor tooltips, and overlay headers.
Border Radius & Shape Scale:
Component Stylings
Border Radius Scale
| Token | Value | Use |
|---|---|---|
| ... | ... | ... |
Top Navigation
top-nav — Background {colors.canvas}, text {colors.ink}, height 64px. Layout: Expo wordmark left, primary horizontal menu (Tools / Workflows / EAS / Pricing / Docs / Showcase), Sign In + Get started CTA right.
Buttons
button-primary — Pure black pill. Background {colors.primary}, text {colors.on-primary}, type {typography.button} (14px / 500), padding 10px × 18px, height 40px, rounded {rounded.md} (8px).
button-primary-active — Press state. Background {colors.primary-active}.
button-secondary — White card with 1px hairline-strong border. Background {colors.surface-card}, text {colors.ink}, 1px {colors.hairline-strong} border.
button-tertiary-text — Inline blue text link. Background transparent, text {colors.text-link}.
Hero & Device Mockup
hero-band — Background {colors.canvas} with a soft sky-blue gradient wash behind the centered headline. Display headline in {typography.display-mega} (64px / 600 / -1.92px), subhead in {typography.body-md}, single primary CTA, then below — the device mockup composite.
device-mockup-card — A layered MacBook + iPhone composite showing real Expo dev surfaces. Background {colors.surface-card}, rounded {rounded.xl}. The MacBook holds the EAS dashboard or Expo Studio screenshot; the iPhone overlay shows the running app in Expo Go. This is the page chrome.
Cards
feature-card — Background {colors.surface-card}, text {colors.ink}, type {typography.title-md}, rounded {rounded.lg}, padding 24px, 1px {colors.hairline-strong} border.
feature-card-dark — Dark variant. Background {colors.surface-dark}, text {colors.on-dark}. Same shape, dark inversion.
workflow-step-card — Step in the "Get your app on every device" workflow row. Background {colors.surface-card}, text {colors.body}, rounded {rounded.lg}, padding 20px. Layout: 32px square {component.workflow-step-icon} + step number + label + body.
workflow-step-icon — Square plate. Background {colors.surface-strong}, rounded {rounded.md}, 32px size.
testimonial-card — Quote card. Background {colors.surface-card}, text {colors.body}, rounded {rounded.lg}, padding 24px.
Code & IDE
code-block — Inline code block. Background {colors.surface-dark}, text {colors.on-dark} in {typography.code} (JetBrains Mono 13px), rounded {rounded.lg}, padding 20px. White text on dark.
ide-mockup-card — Stylized IDE mockup. Background {colors.surface-dark}, rounded {rounded.lg}. Multi-pane editor + terminal preview.
Pricing
pricing-tier-card — Standard pricing tier. Background {colors.surface-card}, rounded {rounded.lg}, padding 32px, 1px {colors.hairline-strong} border.
pricing-tier-featured — Featured tier. Background {colors.surface-dark}, text {colors.on-dark}. Same shape, dark inversion.
Ecosystem
ecosystem-tile — Square logo plate for ecosystem partner logos (TypeScript, React, Sentry, etc.). Background {colors.surface-card}, rounded {rounded.md}, 64px size, 1px {colors.hairline} border.
Forms & Tags
text-input — Background {colors.surface-card}, text {colors.ink}, rounded {rounded.md} (8px), padding 12px × 16px, height 44px, 1px {colors.hairline-strong} border. Focus thickens border to 2px ink.
badge-pill — Small uppercase pill. Background {colors.surface-strong}, text {colors.ink}, type {typography.caption-uppercase}, rounded {rounded.pill}, padding 4px × 10px.
CTA / Footer
cta-band — Pre-footer band. Background {colors.canvas}, centered display headline in {typography.display-lg}, single black pill CTA. 96px padding.
footer-light — Closing white footer. Background {colors.canvas}, text {colors.body}. 5-column link list. 64×48px padding.
footer-link — Background transparent, text {colors.body}, type {typography.body-sm}.
Interactive Component Demonstrations:
Component Interactive Example
Do's and Don'ts
Do
- Reserve
{colors.primary}(black) for primary CTAs. - Use
{colors.text-link}(blue) for inline body links only — never on CTAs or buttons. - Set every CTA at
{rounded.md}(8px) — developer dialect. - Use Inter at weight 600 for display, 400 for body.
- Render every code surface in JetBrains Mono.
- Pair the hero with the device-mockup composite — it's the page chrome.
Don't
- Don't introduce a saturated brand action color. Black is the only CTA fill.
- Don't use blue (
{colors.text-link}) on a CTA. Inline links only. - Don't drop display below weight 600 or above 700.
- Don't use full pills on CTAs — pills are for badges only.
- Don't replicate the sky-blue gradient backdrop outside the hero.
- Don't extract a CTA color from a third-party widget (cookie consent, OneTrust). The brand's CTA is what appears on actual page CTAs.
- Reserve
{colors.primary}(black) for primary CTAs. - Use
{colors.text-link}(blue) for inline body links only — never on CTAs or buttons. - Set every CTA at
{rounded.md}(8px) — developer dialect. - Use Inter at weight 600 for display, 400 for body.
- Render every code surface in JetBrains Mono.
- Pair the hero with the device-mockup composite — it's the page chrome.
- Don't introduce a saturated brand action color. Black is the only CTA fill.
- Don't use blue (
{colors.text-link}) on a CTA. Inline links only. - Don't drop display below weight 600 or above 700.
- Don't use full pills on CTAs — pills are for badges only.
- Don't replicate the sky-blue gradient backdrop outside the hero.
- Don't extract a CTA color from a third-party widget (cookie consent, OneTrust). The brand's CTA is what appears on actual page CTAs.
Responsive Behavior
Breakpoints
| Name | Width | Key Changes |
|---|---|---|
| ... | ... | ... |
Touch Targets
- Primary CTA at 40px height — at WCAG AA, padded for AAA.
- Search input 44px — at AAA.
Collapsing Strategy
- Top nav switches to hamburger below 768px.
- Device mockup MacBook + iPhone collapses to a single iPhone preview on mobile.
- ...
Responsive Adaptation Note:
Responsive Behavior Example
Agent Prompt Guide
1. Focus on a single component at a time.
2. CTAs default to {rounded.md} (8px). Cards use {rounded.lg} (12px).
- ...
Copyable Agent Integration Prompt:
Prompt Guide Copy Box
Full System Design Tokens
The parsed design tokens extracted from the core stylesheet of this design system:
| Design Token | Hex Value | System Palette Role |
|---|---|---|
| --primary | #000000 | System color representation for primary |
| --primary-active | #1a1a1a | System color representation for primary-active |
| --text-link | #0d74ce | System color representation for text-link |
| --text-link-secondary | #476cff | System color representation for text-link-secondary |
| --ink | #171717 | System color representation for ink |
| --body | #60646c | System color representation for body |
| --body-strong | #171717 | System color representation for body-strong |
| --muted | #999999 | System color representation for muted |
| --muted-soft | #cccccc | System color representation for muted-soft |
| --hairline | #f0f0f3 | System color representation for hairline |
| --hairline-soft | #f5f5f7 | System color representation for hairline-soft |
| --hairline-strong | #dcdee0 | System color representation for hairline-strong |
| --canvas | #ffffff | System color representation for canvas |
| --canvas-soft | #fafafa | System color representation for canvas-soft |
| --surface-card | #ffffff | System color representation for surface-card |
| --surface-strong | #f0f0f3 | System color representation for surface-strong |
| --surface-dark | #171717 | System color representation for surface-dark |
| --surface-dark-elevated | #1a1a1a | System color representation for surface-dark-elevated |
| --on-primary | #ffffff | System color representation for on-primary |
| --on-dark | #ffffff | System color representation for on-dark |
| --on-dark-soft | #b0b4ba | System color representation for on-dark-soft |
| --gradient-sky-light | #cfe7ff | System color representation for gradient-sky-light |
| --gradient-sky-mid | #a8c8e8 | System color representation for gradient-sky-mid |
| --accent-warning | #ab6400 | System color representation for accent-warning |
| --accent-preview | #8145b5 | System color representation for accent-preview |
| --accent-link-bright | #47c2ff | System color representation for accent-link-bright |
| --semantic-error | #eb8e90 | System color representation for semantic-error |
| --semantic-success | #16a34a | System color representation for semantic-success |