first commit
This commit is contained in:
281
design-md/expo/DESIGN.md
Normal file
281
design-md/expo/DESIGN.md
Normal file
@@ -0,0 +1,281 @@
|
||||
# Design System: Expo
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
|
||||
Expo's interface is a luminous, confidence-radiating developer platform built on the premise that tools for building apps should feel as polished as the apps themselves. The entire experience lives on a bright, airy canvas — a cool-tinted off-white (`#f0f0f3`) that gives the page a subtle technological coolness without the starkness of pure white. This is a site that breathes: enormous vertical spacing between sections creates a gallery-like pace where each feature gets its own "room."
|
||||
|
||||
The design language is decisively monochromatic — pure black (`#000000`) headlines against the lightest possible backgrounds, with a spectrum of cool blue-grays (`#60646c`, `#b0b4ba`, `#555860`) handling all secondary communication. Color is almost entirely absent from the interface itself; when it appears, it's reserved for product screenshots, app icons, and the React universe illustration — making the actual content burst with life against the neutral canvas.
|
||||
|
||||
What makes Expo distinctive is its pill-shaped geometry. Buttons, tabs, video containers, and even images use generously rounded or fully pill-shaped corners (24px–9999px), creating an organic, approachable feel that contradicts the typical sharp-edged developer tool aesthetic. Combined with tight letter-spacing on massive headlines (-1.6px to -3px at 64px), the result is a design that's simultaneously premium and friendly — like an Apple product page reimagined for developers.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Luminous cool-white canvas (`#f0f0f3`) with gallery-like vertical spacing
|
||||
- Strictly monochromatic: pure black headlines, cool blue-gray body text, no decorative color
|
||||
- Pill-shaped geometry everywhere — buttons, tabs, containers, images (24px–9999px radius)
|
||||
- Massive display headlines (64px) with extreme negative letter-spacing (-1.6px to -3px)
|
||||
- Inter as the sole typeface, used at weights 400–900 for full expressive range
|
||||
- Whisper-soft shadows that barely lift elements from the surface
|
||||
- Product screenshots as the only source of color in the interface
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
|
||||
### Primary
|
||||
- **Expo Black** (`#000000`): The absolute anchor — used for primary headlines, CTA buttons, and the brand identity. Pure black on cool white creates maximum contrast without feeling aggressive.
|
||||
- **Near Black** (`#1c2024`): The primary text color for body content — a barely perceptible blue-black that's softer than pure #000 for extended reading.
|
||||
|
||||
### Secondary & Accent
|
||||
- **Link Cobalt** (`#0d74ce`): The standard link color — a trustworthy, saturated blue that signals interactivity without competing with the monochrome hierarchy.
|
||||
- **Legal Blue** (`#476cff`): A brighter, more saturated blue for legal/footer links — slightly more attention-grabbing than Link Cobalt.
|
||||
- **Widget Sky** (`#47c2ff`): A light, friendly cyan-blue for widget branding elements — the brightest accent in the system.
|
||||
- **Preview Purple** (`#8145b5`): A rich violet used for "preview" or beta feature indicators — creating clear visual distinction from standard content.
|
||||
|
||||
### Surface & Background
|
||||
- **Cloud Gray** (`#f0f0f3`): The primary page background — a cool off-white with the faintest blue-violet tint. Not warm, not sterile — precisely technological.
|
||||
- **Pure White** (`#ffffff`): Card surfaces, button backgrounds, and elevated content containers. Creates a clear "lifted" distinction from Cloud Gray.
|
||||
- **Widget Dark** (`#1a1a1a`): Dark surface for dark-theme widgets and overlay elements.
|
||||
- **Banner Dark** (`#171717`): The darkest surface variant, used for promotional banners and high-contrast containers.
|
||||
|
||||
### Neutrals & Text
|
||||
- **Slate Gray** (`#60646c`): The workhorse secondary text color (305 instances). A cool blue-gray that's authoritative without being heavy.
|
||||
- **Mid Slate** (`#555860`): Slightly darker than Slate, used for emphasized secondary text.
|
||||
- **Silver** (`#b0b4ba`): Tertiary text, placeholders, and de-emphasized metadata. Comfortably readable but clearly receded.
|
||||
- **Pewter** (`#999999`): Accordion icons and deeply de-emphasized UI elements in dark contexts.
|
||||
- **Light Silver** (`#cccccc`): Arrow icons and decorative elements in dark contexts.
|
||||
- **Dark Slate** (`#363a3f`): Borders on dark surfaces, switch tracks, and emphasized containment.
|
||||
- **Charcoal** (`#333333`): Dark mode switch backgrounds and deep secondary surfaces.
|
||||
|
||||
### Semantic & Accent
|
||||
- **Warning Amber** (`#ab6400`): A warm, deep amber for warning states — deliberately not bright yellow, conveying seriousness.
|
||||
- **Destructive Rose** (`#eb8e90`): A soft pink-coral for disabled destructive actions — gentler than typical red, reducing alarm fatigue.
|
||||
- **Border Lavender** (`#e0e1e6`): Standard card/container borders — a cool lavender-gray that's visible without being heavy.
|
||||
- **Input Border** (`#d9d9e0`): Button and form element borders — slightly warmer/darker than card borders for interactive elements.
|
||||
- **Dark Focus Ring** (`#2547d0`): Deep blue for keyboard focus indicators in dark theme contexts.
|
||||
|
||||
### Gradient System
|
||||
- The design is notably **gradient-free** in the interface layer. Visual richness comes from product screenshots, the React universe illustration, and careful shadow layering rather than color gradients. This absence IS the design decision — gradients would undermine the clinical precision.
|
||||
|
||||
## 3. Typography Rules
|
||||
|
||||
### Font Family
|
||||
- **Primary**: `Inter`, with fallbacks: `-apple-system, system-ui`
|
||||
- **Monospace**: `JetBrains Mono`, with fallback: `ui-monospace`
|
||||
- **System Fallback**: `system-ui, Segoe UI, Roboto, Helvetica, Arial, Apple Color Emoji, Segoe UI Emoji`
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-------|
|
||||
| Display / Hero | Inter | 64px (4rem) | 700–900 | 1.10 (tight) | -1.6px to -3px | Maximum impact, extreme tracking |
|
||||
| Section Heading | Inter | 48px (3rem) | 600 | 1.10 (tight) | -2px | Feature section anchors |
|
||||
| Sub-heading | Inter | 20px (1.25rem) | 600 | 1.20 (tight) | -0.25px | Card titles, feature names |
|
||||
| Body Large | Inter | 18px (1.13rem) | 400–500 | 1.40 | normal | Intro paragraphs, section descriptions |
|
||||
| Body / Button | Inter | 16px (1rem) | 400–700 | 1.25–1.40 | normal | Standard text, nav links, buttons |
|
||||
| Caption / Label | Inter | 14px (0.88rem) | 400–600 | 1.00–1.40 | normal | Descriptions, metadata, badge text |
|
||||
| Tag / Small | Inter | 12px (0.75rem) | 500 | 1.00–1.60 | normal | Smallest sans-serif text, badges |
|
||||
| Code Body | JetBrains Mono | 16px (1rem) | 400–600 | 1.40 | normal | Inline code, terminal commands |
|
||||
| Code Caption | JetBrains Mono | 14px (0.88rem) | 400–600 | 1.40 | normal | Code snippets, technical labels |
|
||||
| Code Small | JetBrains Mono | 12px (0.75rem) | 400 | 1.60 | normal | Uppercase tech tags |
|
||||
|
||||
### Principles
|
||||
- **One typeface, full expression**: Inter is the only sans-serif, used from weight 400 (regular) through 900 (black). This gives the design a unified voice while still achieving dramatic contrast between whisper-light body text and thundering display headlines.
|
||||
- **Extreme negative tracking at scale**: Headlines at 64px use -1.6px to -3px letter-spacing, creating ultra-dense text blocks that feel like logotypes. This aggressive compression is the signature typographic move.
|
||||
- **Weight as hierarchy**: 700–900 for display, 600 for headings, 500 for emphasis, 400 for body. The jumps are decisive — no ambiguous in-between weights.
|
||||
- **Consistent 1.40 body line-height**: Nearly all body and UI text shares 1.40 line-height, creating a rhythmic vertical consistency.
|
||||
|
||||
## 4. Component Stylings
|
||||
|
||||
### Buttons
|
||||
|
||||
**Primary (White on border)**
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Text: Near Black (`#1c2024`)
|
||||
- Padding: 0px 12px (compact, content-driven height)
|
||||
- Border: thin solid Input Border (`1px solid #d9d9e0`)
|
||||
- Radius: subtly rounded (6px)
|
||||
- Shadow: subtle combined shadow on hover
|
||||
- The understated default — clean, professional, unheroic
|
||||
|
||||
**Primary Pill**
|
||||
- Same as Primary but with pill-shaped radius (9999px)
|
||||
- Used for hero CTAs and high-emphasis actions
|
||||
- The extra roundness signals "start here"
|
||||
|
||||
**Dark Primary**
|
||||
- Background: Expo Black (`#000000`)
|
||||
- Text: Pure White (`#ffffff`)
|
||||
- Pill-shaped (9999px) or generously rounded (32–36px)
|
||||
- No border (black IS the border)
|
||||
- The maximum-emphasis CTA — reserved for primary conversion actions
|
||||
|
||||
### Cards & Containers
|
||||
- Background: Pure White (`#ffffff`) — clearly lifted from Cloud Gray page
|
||||
- Border: thin solid Border Lavender (`1px solid #e0e1e6`) for standard cards
|
||||
- Radius: comfortably rounded (8px) for standard cards; generously rounded (16–24px) for featured containers
|
||||
- Shadow Level 1: Whisper (`rgba(0,0,0,0.08) 0px 3px 6px, rgba(0,0,0,0.07) 0px 2px 4px`) — barely perceptible lift
|
||||
- Shadow Level 2: Standard (`rgba(0,0,0,0.1) 0px 10px 20px, rgba(0,0,0,0.05) 0px 3px 6px`) — clear floating elevation
|
||||
- Hover: likely subtle shadow deepening or background shift
|
||||
|
||||
### Inputs & Forms
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Text: Near Black (`#1c2024`)
|
||||
- Border: thin solid Input Border (`1px solid #d9d9e0`)
|
||||
- Padding: 0px 12px (inline with button sizing)
|
||||
- Radius: subtly rounded (6px)
|
||||
- Focus: blue ring shadow via CSS custom property
|
||||
|
||||
### Navigation
|
||||
- Sticky top nav on transparent/blurred background
|
||||
- Logo: Expo wordmark in black
|
||||
- Links: Near Black (`#1c2024`) or Slate Gray (`#60646c`) at 14–16px Inter weight 500
|
||||
- CTA: Black pill button ("Sign Up") on the right
|
||||
- GitHub star badge as social proof
|
||||
- Status indicator ("All Systems Operational") with green dot
|
||||
|
||||
### Image Treatment
|
||||
- Product screenshots and device mockups are the visual heroes
|
||||
- Generously rounded corners (24px) on video and image containers
|
||||
- Screenshots shown in realistic device frames
|
||||
- Dark UI screenshots provide contrast against the light canvas
|
||||
- Full-bleed within rounded containers
|
||||
|
||||
### Distinctive Components
|
||||
|
||||
**Universe React Logo**
|
||||
- Animated/illustrated React logo as the visual centerpiece
|
||||
- Connects Expo's identity to the React ecosystem
|
||||
- The only illustrative element on an otherwise photographic page
|
||||
|
||||
**Device Preview Grid**
|
||||
- Multiple device types (phone, tablet, web) shown simultaneously
|
||||
- Demonstrates cross-platform capability visually
|
||||
- Each device uses realistic device chrome
|
||||
|
||||
**Status Badge**
|
||||
- "All Systems Operational" pill in the nav
|
||||
- Green dot + text — compact trust signal
|
||||
- Pill-shaped (36px radius)
|
||||
|
||||
## 5. Layout Principles
|
||||
|
||||
### Spacing System
|
||||
- Base unit: 8px
|
||||
- Scale: 1px, 2px, 4px, 8px, 12px, 16px, 24px, 32px, 40px, 48px, 64px, 80px, 96px, 144px
|
||||
- Button padding: 0px 12px (unusually compact — height driven by line-height)
|
||||
- Card internal padding: approximately 24–32px
|
||||
- Section vertical spacing: enormous (estimated 96–144px between major sections)
|
||||
- Component gap: 16–24px between sibling elements
|
||||
|
||||
### Grid & Container
|
||||
- Max container width: approximately 1200–1400px, centered
|
||||
- Hero: centered single-column with massive breathing room
|
||||
- Feature sections: alternating layouts (image left/right, full-width showcases)
|
||||
- Card grids: 2–3 column for feature highlights
|
||||
- Full-width sections with contained inner content
|
||||
|
||||
### Whitespace Philosophy
|
||||
- **Gallery-like pacing**: Each section feels like its own exhibit, surrounded by vast empty space. This creates a premium, unhurried browsing experience.
|
||||
- **Breathing room is the design**: The generous whitespace IS the primary design element — it communicates confidence, quality, and that each feature deserves individual attention.
|
||||
- **Content islands**: Sections float as isolated "islands" in the white space, connected by scrolling rather than visual continuation.
|
||||
|
||||
### Border Radius Scale
|
||||
- Nearly squared (4px): Small inline elements, tags
|
||||
- Subtly rounded (6px): Buttons, form inputs, combo boxes — the functional interactive radius
|
||||
- Comfortably rounded (8px): Standard content cards, containers
|
||||
- Generously rounded (16px): Feature tabs, content panels
|
||||
- Very rounded (24px): Buttons, video/image containers, tabpanels — the signature softness
|
||||
- Highly rounded (32–36px): Hero CTAs, status badges, nav buttons
|
||||
- Pill-shaped (9999px): Primary action buttons, tags, avatars — maximum friendliness
|
||||
|
||||
## 6. Depth & Elevation
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Flat (Level 0) | No shadow | Cloud Gray page background, inline text |
|
||||
| Surface (Level 1) | White bg, no shadow | Standard white cards on Cloud Gray |
|
||||
| Whisper (Level 2) | `rgba(0,0,0,0.08) 0px 3px 6px` + `rgba(0,0,0,0.07) 0px 2px 4px` | Subtle card lift, hover states |
|
||||
| Elevated (Level 3) | `rgba(0,0,0,0.1) 0px 10px 20px` + `rgba(0,0,0,0.05) 0px 3px 6px` | Feature showcases, product screenshots |
|
||||
| Modal (Level 4) | Dark overlay (`--dialog-overlay-background-color`) + heavy shadow | Dialogs, overlays |
|
||||
|
||||
**Shadow Philosophy**: Expo uses shadows as gentle whispers rather than architectural statements. The primary depth mechanism is **background color contrast** — white cards floating on Cloud Gray — rather than shadow casting. When shadows appear, they're soft, diffused, and directional (downward), creating the feeling of paper hovering millimeters above a desk.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use Cloud Gray (`#f0f0f3`) as the page background and Pure White (`#ffffff`) for elevated cards — the two-tone light system is essential
|
||||
- Keep display headlines at extreme negative letter-spacing (-1.6px to -3px at 64px) for the signature compressed look
|
||||
- Use pill-shaped (9999px) radius for primary CTA buttons — the organic shape is core to the identity
|
||||
- Reserve black (`#000000`) for headlines and primary CTAs — it carries maximum authority on the light canvas
|
||||
- Use Slate Gray (`#60646c`) for secondary text — it's the precise balance between readable and receded
|
||||
- Maintain enormous vertical spacing between sections (96px+) — the gallery pacing defines the premium feel
|
||||
- Use product screenshots as the primary visual content — the interface stays monochrome, the products bring color
|
||||
- Apply Inter at the full weight range (400–900) — weight contrast IS the hierarchy
|
||||
|
||||
### Don't
|
||||
- Don't introduce decorative colors into the interface chrome — the monochromatic palette is intentional
|
||||
- Don't use sharp corners (border-radius < 6px) on interactive elements — the pill/rounded geometry is the signature
|
||||
- Don't reduce section spacing below 64px — the breathing room is the design
|
||||
- Don't use heavy drop shadows — depth comes from background contrast and whisper-soft shadows
|
||||
- Don't mix in additional typefaces — Inter handles everything from display to caption
|
||||
- Don't use letter-spacing wider than -0.25px on body text — extreme tracking is reserved for display only
|
||||
- Don't use borders heavier than 2px — containment is subtle, achieved through background color and gentle borders
|
||||
- Don't add gradients to the interface — visual richness comes from content, not decoration
|
||||
- Don't use saturated colors outside of semantic contexts — the palette is strictly grayscale + functional blue
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile | <640px | Single column, hamburger nav, stacked cards, hero text scales to ~36px |
|
||||
| Tablet | 640–1024px | 2-column grids, condensed nav, medium hero text |
|
||||
| Desktop | >1024px | Full multi-column layout, expanded nav, massive hero (64px) |
|
||||
|
||||
*Only one explicit breakpoint detected (640px), suggesting a fluid, container-query or min()/clamp()-based responsive system rather than fixed breakpoint snapping.*
|
||||
|
||||
### Touch Targets
|
||||
- Buttons use generous radius (24–36px) creating large, finger-friendly surfaces
|
||||
- Navigation links spaced with adequate gap
|
||||
- Status badge sized for touch (36px radius)
|
||||
- Minimum recommended: 44x44px
|
||||
|
||||
### Collapsing Strategy
|
||||
- **Navigation**: Full horizontal nav with CTA collapses to hamburger on mobile
|
||||
- **Feature sections**: Multi-column → stacked single column
|
||||
- **Hero text**: 64px → ~36px progressive scaling
|
||||
- **Device previews**: Grid → stacked/carousel
|
||||
- **Cards**: Side-by-side → vertical stacking
|
||||
- **Spacing**: Reduces proportionally but maintains generous rhythm
|
||||
|
||||
### Image Behavior
|
||||
- Product screenshots scale proportionally
|
||||
- Device mockups may simplify or show fewer devices on mobile
|
||||
- Rounded corners maintained at all sizes
|
||||
- Lazy loading for below-fold content
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Primary CTA / Headlines: "Expo Black (#000000)"
|
||||
- Page Background: "Cloud Gray (#f0f0f3)"
|
||||
- Card Surface: "Pure White (#ffffff)"
|
||||
- Body Text: "Near Black (#1c2024)"
|
||||
- Secondary Text: "Slate Gray (#60646c)"
|
||||
- Borders: "Border Lavender (#e0e1e6)"
|
||||
- Links: "Link Cobalt (#0d74ce)"
|
||||
- Tertiary Text: "Silver (#b0b4ba)"
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create a hero section on Cloud Gray (#f0f0f3) with a massive headline at 64px Inter weight 700, line-height 1.10, letter-spacing -3px. Text in Expo Black (#000000). Below, add a subtitle in Slate Gray (#60646c) at 18px. Place a black pill-shaped CTA button (9999px radius) beneath."
|
||||
- "Design a feature card on Pure White (#ffffff) with a 1px solid Border Lavender (#e0e1e6) border and comfortably rounded corners (8px). Title in Near Black (#1c2024) at 20px Inter weight 600, description in Slate Gray (#60646c) at 16px. Add a whisper shadow (rgba(0,0,0,0.08) 0px 3px 6px)."
|
||||
- "Build a navigation bar with Expo logo on the left, text links in Near Black (#1c2024) at 14px Inter weight 500, and a black pill CTA button on the right. Background: transparent with blur backdrop. Bottom border: 1px solid Border Lavender (#e0e1e6)."
|
||||
- "Create a code block using JetBrains Mono at 14px on a Pure White surface with Border Lavender border and 8px radius. Code in Near Black, keywords in Link Cobalt (#0d74ce)."
|
||||
- "Design a status badge pill (9999px radius) with a green dot and 'All Systems Operational' text in Inter 12px weight 500. Background: Pure White, border: 1px solid Input Border (#d9d9e0)."
|
||||
|
||||
### Iteration Guide
|
||||
1. Focus on ONE component at a time
|
||||
2. Reference specific color names and hex codes — "use Slate Gray (#60646c)" not "make it gray"
|
||||
3. Use radius values deliberately — 6px for buttons, 8px for cards, 24px for images, 9999px for pills
|
||||
4. Describe the "feel" alongside measurements — "enormous breathing room with 96px section spacing"
|
||||
5. Always specify Inter and the exact weight — weight contrast IS the hierarchy
|
||||
6. For shadows, specify "whisper shadow" or "standard elevation" from the elevation table
|
||||
7. Keep the interface monochrome — let product content be the color
|
||||
25
design-md/expo/README.md
Normal file
25
design-md/expo/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Expo — Design System
|
||||
|
||||
> Design.md extracted from the public [expo](https://expo.dev/) website. This is not the official design system. Colors, fonts, and spacing may not be 100% accurate. But it's a good starting point for building something similar.
|
||||
|
||||
## Files
|
||||
|
||||
| File | Description |
|
||||
|------|-------------|
|
||||
| `DESIGN.md` | Complete design system documentation (9 sections) |
|
||||
| `preview.html` | Interactive design token catalog (light) |
|
||||
| `preview-dark.html` | Interactive design token catalog (dark) |
|
||||
|
||||
## Usage
|
||||
|
||||
Open `DESIGN.md` to use as a reference for AI agents (Claude, Cursor, Stitch) to generate UI that matches the Expo design language.
|
||||
|
||||
## Preview
|
||||
|
||||
A sample landing page built with DESIGN.md. It shows the actual colors, typography, buttons, cards, spacing, and elevation, all in one page.
|
||||
|
||||
### Dark Mode
|
||||

|
||||
|
||||
### Light Mode
|
||||

|
||||
536
design-md/expo/preview-dark.html
Normal file
536
design-md/expo/preview-dark.html
Normal file
@@ -0,0 +1,536 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Design System Preview: Expo (Dark)</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
--color-expo-black: #000000;
|
||||
--color-near-black: #1c2024;
|
||||
--color-link-cobalt: #0d74ce;
|
||||
--color-legal-blue: #476cff;
|
||||
--color-widget-sky: #47c2ff;
|
||||
--color-preview-purple: #8145b5;
|
||||
--color-cloud-gray: #f0f0f3;
|
||||
--color-pure-white: #ffffff;
|
||||
--color-widget-dark: #1a1a1a;
|
||||
--color-banner-dark: #171717;
|
||||
--color-slate-gray: #60646c;
|
||||
--color-mid-slate: #555860;
|
||||
--color-silver: #b0b4ba;
|
||||
--color-pewter: #999999;
|
||||
--color-light-silver: #cccccc;
|
||||
--color-dark-slate: #363a3f;
|
||||
--color-charcoal: #333333;
|
||||
--color-warning: #ab6400;
|
||||
--color-destructive: #eb8e90;
|
||||
--color-border-lavender: #e0e1e6;
|
||||
--color-input-border: #d9d9e0;
|
||||
--color-focus-ring: #2547d0;
|
||||
--font-body: 'Inter', -apple-system, system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
--font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
||||
/* Dark mode */
|
||||
--bg-page: var(--color-banner-dark);
|
||||
--bg-card: var(--color-widget-dark);
|
||||
--bg-nav: rgba(23,23,23,0.92);
|
||||
--text-primary: var(--color-pure-white);
|
||||
--text-secondary: var(--color-silver);
|
||||
--text-muted: var(--color-pewter);
|
||||
--border-color: var(--color-dark-slate);
|
||||
--border-subtle: rgba(54,58,63,0.5);
|
||||
--section-label-color: var(--color-pure-white);
|
||||
}
|
||||
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
|
||||
body {
|
||||
background: var(--bg-page);
|
||||
color: var(--text-primary);
|
||||
font-family: var(--font-body);
|
||||
font-size: 16px;
|
||||
line-height: 1.4;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
/* NAV */
|
||||
.nav {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 16px 40px;
|
||||
background: var(--bg-nav);
|
||||
backdrop-filter: blur(12px);
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
}
|
||||
.nav-brand { font-family: var(--font-body); font-size: 18px; font-weight: 700; letter-spacing: -0.3px; display: flex; align-items: center; gap: 8px; color: var(--color-pure-white); }
|
||||
.nav-brand svg { width: 24px; height: 24px; }
|
||||
.nav-links { display: flex; gap: 32px; align-items: center; }
|
||||
.nav-links a { color: var(--color-silver); text-decoration: none; font-size: 14px; font-weight: 500; transition: color 0.2s; }
|
||||
.nav-links a:hover { color: var(--color-pure-white); }
|
||||
.nav-cta {
|
||||
background: var(--color-pure-white);
|
||||
color: var(--color-expo-black);
|
||||
padding: 8px 20px;
|
||||
border: none;
|
||||
border-radius: 9999px;
|
||||
font-size: 14px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
.nav-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--color-silver);
|
||||
background: var(--bg-card);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 9999px;
|
||||
padding: 4px 12px 4px 8px;
|
||||
}
|
||||
.nav-status-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
background: #22c55e;
|
||||
}
|
||||
|
||||
/* HERO */
|
||||
.hero {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
padding: 120px 40px 100px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.hero h1 {
|
||||
font-family: var(--font-body);
|
||||
font-size: 60px;
|
||||
font-weight: 700;
|
||||
line-height: 1.10;
|
||||
letter-spacing: -3px;
|
||||
margin-bottom: 24px;
|
||||
color: var(--color-pure-white);
|
||||
position: relative;
|
||||
}
|
||||
.hero p {
|
||||
color: var(--text-secondary);
|
||||
font-size: 18px;
|
||||
line-height: 1.4;
|
||||
margin-bottom: 40px;
|
||||
position: relative;
|
||||
}
|
||||
.hero-buttons { display: flex; gap: 16px; justify-content: center; position: relative; }
|
||||
.btn-primary-pill {
|
||||
background: var(--color-pure-white);
|
||||
color: var(--color-expo-black);
|
||||
padding: 12px 28px;
|
||||
border: none;
|
||||
border-radius: 9999px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn-standard {
|
||||
background: var(--bg-card);
|
||||
color: var(--text-primary);
|
||||
padding: 12px 24px;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 6px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* SECTIONS */
|
||||
.section {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 96px 40px;
|
||||
}
|
||||
.section-title {
|
||||
font-family: var(--font-body);
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2.52px;
|
||||
color: var(--section-label-color);
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.section-heading {
|
||||
font-family: var(--font-body);
|
||||
font-size: 48px;
|
||||
font-weight: 600;
|
||||
line-height: 1.10;
|
||||
letter-spacing: -2px;
|
||||
margin-bottom: 48px;
|
||||
color: var(--color-pure-white);
|
||||
}
|
||||
.section-divider {
|
||||
border: none;
|
||||
border-top: 1px solid var(--border-subtle);
|
||||
margin: 0 40px;
|
||||
max-width: 1200px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/* COLOR PALETTE */
|
||||
.color-group { margin-bottom: 40px; }
|
||||
.color-group-title { font-size: 20px; font-weight: 600; line-height: 1.2; margin-bottom: 20px; color: var(--text-secondary); }
|
||||
.color-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 16px; }
|
||||
.color-swatch { border: 1px solid var(--border-color); border-radius: 8px; overflow: hidden; }
|
||||
.color-swatch-block { height: 80px; }
|
||||
.color-swatch-info { padding: 12px; background: var(--bg-card); }
|
||||
.color-swatch-name { font-size: 13px; font-weight: 600; margin-bottom: 2px; }
|
||||
.color-swatch-hex { font-family: var(--font-mono); font-size: 12px; color: var(--text-muted); margin-bottom: 4px; }
|
||||
.color-swatch-role { font-size: 12px; color: var(--text-muted); line-height: 1.4; }
|
||||
|
||||
/* TYPOGRAPHY */
|
||||
.type-sample { margin-bottom: 32px; padding-bottom: 32px; border-bottom: 1px solid var(--border-subtle); }
|
||||
.type-sample:last-child { border-bottom: none; }
|
||||
.type-sample-text { margin-bottom: 8px; }
|
||||
.type-sample-label { font-family: var(--font-mono); font-size: 12px; color: var(--text-muted); }
|
||||
|
||||
/* BUTTONS */
|
||||
.button-row { display: flex; flex-wrap: wrap; gap: 20px; align-items: flex-start; }
|
||||
.button-demo { text-align: center; }
|
||||
.button-demo-label { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); margin-top: 10px; text-transform: uppercase; letter-spacing: 0.55px; }
|
||||
.btn-dark-pill {
|
||||
background: var(--color-pure-white);
|
||||
color: var(--color-expo-black);
|
||||
padding: 12px 28px;
|
||||
border: none;
|
||||
border-radius: 9999px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn-white-standard {
|
||||
background: var(--bg-card);
|
||||
color: var(--text-primary);
|
||||
padding: 12px 24px;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 6px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn-dark-rounded {
|
||||
background: var(--color-pure-white);
|
||||
color: var(--color-expo-black);
|
||||
padding: 12px 24px;
|
||||
border: none;
|
||||
border-radius: 32px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* CARDS */
|
||||
.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px; }
|
||||
.card { background: var(--bg-card); border-radius: 8px; padding: 28px; }
|
||||
.card-standard { border: 1px solid var(--border-color); }
|
||||
.card-elevated { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.3) 0px 3px 6px, rgba(0,0,0,0.2) 0px 2px 4px; }
|
||||
.card-glow { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.4) 0px 10px 20px, rgba(0,0,0,0.2) 0px 3px 6px; border-radius: 16px; }
|
||||
.card h3 { font-family: var(--font-body); font-size: 20px; font-weight: 600; line-height: 1.20; letter-spacing: -0.25px; margin-bottom: 12px; color: var(--color-pure-white); }
|
||||
.card p { color: var(--text-secondary); font-size: 16px; line-height: 1.40; }
|
||||
.card-label { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.55px; color: var(--color-pure-white); margin-bottom: 16px; }
|
||||
|
||||
/* CODE BLOCK */
|
||||
.code-block {
|
||||
background: var(--color-expo-black);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 8px;
|
||||
padding: 20px 24px;
|
||||
margin-top: 24px;
|
||||
font-family: var(--font-mono);
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
color: #f2f2f2;
|
||||
overflow-x: auto;
|
||||
}
|
||||
.code-block .keyword { color: var(--color-widget-sky); }
|
||||
.code-block .string { color: #22c55e; }
|
||||
.code-block .comment { color: var(--color-pewter); }
|
||||
|
||||
/* SPACING */
|
||||
.spacing-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; }
|
||||
.spacing-item { text-align: center; }
|
||||
.spacing-box { background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12); border-radius: 2px; margin-bottom: 8px; }
|
||||
.spacing-label { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); }
|
||||
|
||||
/* RADIUS */
|
||||
.radius-row { display: flex; flex-wrap: wrap; gap: 20px; align-items: center; }
|
||||
.radius-item { text-align: center; }
|
||||
.radius-box { width: 80px; height: 80px; background: var(--bg-card); border: 1px solid var(--border-color); margin-bottom: 8px; }
|
||||
.radius-label { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); }
|
||||
.radius-context { font-size: 11px; color: var(--text-muted); margin-top: 2px; }
|
||||
|
||||
/* ELEVATION */
|
||||
.elevation-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 24px; }
|
||||
.elevation-card { background: var(--bg-card); border-radius: 8px; padding: 24px; min-height: 140px; display: flex; flex-direction: column; justify-content: space-between; }
|
||||
.elevation-flat { border: none; background: var(--bg-page); }
|
||||
.elevation-surface { border: none; background: var(--bg-card); }
|
||||
.elevation-whisper { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.3) 0px 3px 6px, rgba(0,0,0,0.2) 0px 2px 4px; }
|
||||
.elevation-elevated { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.4) 0px 10px 20px, rgba(0,0,0,0.2) 0px 3px 6px; }
|
||||
.elevation-modal { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.5) 0px 20px 40px, rgba(0,0,0,0.3) 0px 8px 16px; }
|
||||
.elevation-name { font-size: 16px; font-weight: 600; margin-bottom: 8px; }
|
||||
.elevation-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.5; }
|
||||
.elevation-level { font-family: var(--font-mono); font-size: 11px; color: var(--color-pure-white); text-transform: uppercase; letter-spacing: 0.55px; margin-top: 12px; }
|
||||
|
||||
/* RESPONSIVE */
|
||||
@media (max-width: 768px) {
|
||||
.nav { padding: 12px 20px; }
|
||||
.nav-links a:not(.nav-cta-wrapper) { display: none; }
|
||||
.nav-status { display: none; }
|
||||
.hero { padding: 80px 20px 60px; }
|
||||
.hero h1 { font-size: 36px; letter-spacing: -1.5px; }
|
||||
.section { padding: 60px 20px; }
|
||||
.section-heading { font-size: 28px; letter-spacing: -1px; }
|
||||
.color-grid { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); }
|
||||
.card-grid { grid-template-columns: 1fr; }
|
||||
.hero-buttons { flex-direction: column; align-items: center; }
|
||||
.button-row { flex-direction: column; align-items: flex-start; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- NAV -->
|
||||
<nav class="nav">
|
||||
<div class="nav-brand">
|
||||
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
Expo
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="#colors">Colors</a>
|
||||
<a href="#typography">Typography</a>
|
||||
<a href="#buttons">Buttons</a>
|
||||
<a href="#cards">Cards</a>
|
||||
<a href="#spacing">Spacing</a>
|
||||
<a href="#elevation">Elevation</a>
|
||||
<div class="nav-status"><span class="nav-status-dot"></span> All Systems Operational</div>
|
||||
<button class="nav-cta">Sign Up</button>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- HERO -->
|
||||
<section class="hero">
|
||||
<h1>Design System Preview:<br>Expo</h1>
|
||||
<p>Auto-generated design token catalog from DESIGN.md</p>
|
||||
<div class="hero-buttons">
|
||||
<button class="btn-primary-pill">Explore Tokens</button>
|
||||
<button class="btn-standard">View Source</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- COLORS -->
|
||||
<section class="section" id="colors">
|
||||
<div class="section-title">01 / Color Palette</div>
|
||||
<h2 class="section-heading">Color Palette & Roles</h2>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Primary</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #000000; border-bottom: 1px solid #363a3f;"></div><div class="color-swatch-info"><div class="color-swatch-name">Expo Black</div><div class="color-swatch-hex">#000000</div><div class="color-swatch-role">Primary headlines, CTA buttons, brand anchor</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #1c2024; border-bottom: 1px solid #363a3f;"></div><div class="color-swatch-info"><div class="color-swatch-name">Near Black</div><div class="color-swatch-hex">#1c2024</div><div class="color-swatch-role">Body text, softer than pure black for reading</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Secondary & Accent</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #0d74ce;"></div><div class="color-swatch-info"><div class="color-swatch-name">Link Cobalt</div><div class="color-swatch-hex">#0d74ce</div><div class="color-swatch-role">Standard links, interactive signals</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #476cff;"></div><div class="color-swatch-info"><div class="color-swatch-name">Legal Blue</div><div class="color-swatch-hex">#476cff</div><div class="color-swatch-role">Footer/legal links, brighter accent</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #47c2ff;"></div><div class="color-swatch-info"><div class="color-swatch-name">Widget Sky</div><div class="color-swatch-hex">#47c2ff</div><div class="color-swatch-role">Widget branding, lightest accent</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #8145b5;"></div><div class="color-swatch-info"><div class="color-swatch-name">Preview Purple</div><div class="color-swatch-hex">#8145b5</div><div class="color-swatch-role">Beta/preview feature indicators</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Surface & Background</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #f0f0f3;"></div><div class="color-swatch-info"><div class="color-swatch-name">Cloud Gray</div><div class="color-swatch-hex">#f0f0f3</div><div class="color-swatch-role">Primary page background (light mode)</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #ffffff;"></div><div class="color-swatch-info"><div class="color-swatch-name">Pure White</div><div class="color-swatch-hex">#ffffff</div><div class="color-swatch-role">Card surfaces, elevated containers</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #1a1a1a; border-bottom: 1px solid #363a3f;"></div><div class="color-swatch-info"><div class="color-swatch-name">Widget Dark</div><div class="color-swatch-hex">#1a1a1a</div><div class="color-swatch-role">Dark theme card surfaces</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #171717; border-bottom: 1px solid #363a3f;"></div><div class="color-swatch-info"><div class="color-swatch-name">Banner Dark</div><div class="color-swatch-hex">#171717</div><div class="color-swatch-role">Dark theme page background</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Neutrals & Text</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #60646c;"></div><div class="color-swatch-info"><div class="color-swatch-name">Slate Gray</div><div class="color-swatch-hex">#60646c</div><div class="color-swatch-role">Secondary text (305 instances)</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #555860;"></div><div class="color-swatch-info"><div class="color-swatch-name">Mid Slate</div><div class="color-swatch-hex">#555860</div><div class="color-swatch-role">Emphasized secondary text</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #b0b4ba;"></div><div class="color-swatch-info"><div class="color-swatch-name">Silver</div><div class="color-swatch-hex">#b0b4ba</div><div class="color-swatch-role">Tertiary text, placeholders, metadata</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #363a3f;"></div><div class="color-swatch-info"><div class="color-swatch-name">Dark Slate</div><div class="color-swatch-hex">#363a3f</div><div class="color-swatch-role">Borders on dark surfaces, switch tracks</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Semantic</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #ab6400;"></div><div class="color-swatch-info"><div class="color-swatch-name">Warning Amber</div><div class="color-swatch-hex">#ab6400</div><div class="color-swatch-role">Warning states, deep amber for seriousness</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #eb8e90;"></div><div class="color-swatch-info"><div class="color-swatch-name">Destructive Rose</div><div class="color-swatch-hex">#eb8e90</div><div class="color-swatch-role">Disabled destructive actions, gentle alarm</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #e0e1e6;"></div><div class="color-swatch-info"><div class="color-swatch-name">Border Lavender</div><div class="color-swatch-hex">#e0e1e6</div><div class="color-swatch-role">Standard card/container borders</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #d9d9e0;"></div><div class="color-swatch-info"><div class="color-swatch-name">Input Border</div><div class="color-swatch-hex">#d9d9e0</div><div class="color-swatch-role">Buttons, form elements, interactive borders</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- TYPOGRAPHY -->
|
||||
<section class="section" id="typography">
|
||||
<div class="section-title">02 / Typography Scale</div>
|
||||
<h2 class="section-heading">Typography Rules</h2>
|
||||
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 60px; font-weight: 700; line-height: 1.10; letter-spacing: -3px;">Display Hero</div><div class="type-sample-label">Display / Hero — 64px / 700–900 / 1.10 / -3px — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 48px; font-weight: 600; line-height: 1.10; letter-spacing: -2px;">Section Heading</div><div class="type-sample-label">Section Heading — 48px / 600 / 1.10 / -2px — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 20px; font-weight: 600; line-height: 1.20; letter-spacing: -0.25px;">Sub-heading</div><div class="type-sample-label">Sub-heading — 20px / 600 / 1.20 / -0.25px — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 18px; font-weight: 400; line-height: 1.40; color: var(--text-secondary);">Body large text for intro paragraphs and section descriptions with comfortable reading rhythm.</div><div class="type-sample-label">Body Large — 18px / 400–500 / 1.40 / normal — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 16px; font-weight: 400; line-height: 1.40;">Standard body text for paragraphs, navigation links, and button labels. Inter provides geometric precision at every weight.</div><div class="type-sample-label">Body / Button — 16px / 400–700 / 1.25–1.40 / normal — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 14px; font-weight: 500; line-height: 1.40; color: var(--text-secondary);">Caption text for descriptions and metadata labels</div><div class="type-sample-label">Caption / Label — 14px / 400–600 / 1.00–1.40 / normal — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 12px; font-weight: 500; line-height: 1.00; color: var(--text-muted);">Tag / Small Badge</div><div class="type-sample-label">Tag / Small — 12px / 500 / 1.00–1.60 / normal — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-mono); font-size: 16px; font-weight: 400; line-height: 1.40;">npx create-expo-app@latest my-app</div><div class="type-sample-label">Code Body — 16px / 400–600 / 1.40 / normal — JetBrains Mono</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-mono); font-size: 14px; font-weight: 400; line-height: 1.40;">import { Camera } from "expo-camera";</div><div class="type-sample-label">Code Caption — 14px / 400–600 / 1.40 / normal — JetBrains Mono</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-mono); font-size: 12px; font-weight: 400; line-height: 1.60; text-transform: uppercase; color: var(--text-muted);">REACT NATIVE</div><div class="type-sample-label">Code Small / Tag — 12px / 400 / 1.60 / uppercase — JetBrains Mono</div></div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- BUTTONS -->
|
||||
<section class="section" id="buttons">
|
||||
<div class="section-title">03 / Button Variants</div>
|
||||
<h2 class="section-heading">Buttons</h2>
|
||||
|
||||
<div class="button-row">
|
||||
<div class="button-demo"><button class="btn-dark-pill">Get Started</button><div class="button-demo-label">Primary Pill (Light)</div></div>
|
||||
<div class="button-demo"><button class="btn-white-standard">View Docs</button><div class="button-demo-label">Standard (Surface)</div></div>
|
||||
<div class="button-demo"><button class="btn-dark-rounded">Sign Up Free</button><div class="button-demo-label">Rounded (32px)</div></div>
|
||||
</div>
|
||||
|
||||
<div class="code-block" style="margin-top: 40px;">
|
||||
<span class="comment">// Get started with Expo</span><br>
|
||||
<span class="keyword">$</span> npx create-expo-app@latest my-app
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- CARDS -->
|
||||
<section class="section" id="cards">
|
||||
<div class="section-title">04 / Card Examples</div>
|
||||
<h2 class="section-heading">Cards & Containers</h2>
|
||||
|
||||
<div class="card-grid">
|
||||
<div class="card card-standard">
|
||||
<div class="card-label">Standard Card</div>
|
||||
<h3>Dark Slate Border</h3>
|
||||
<p>Standard content card with 1px Dark Slate border and 8px radius. Widget Dark surface on Banner Dark background.</p>
|
||||
</div>
|
||||
<div class="card card-elevated">
|
||||
<div class="card-label">Elevated (Whisper)</div>
|
||||
<h3>Whisper Shadow Lift</h3>
|
||||
<p>Subtle card elevation with soft shadow. Barely perceptible lift for hover states and highlighted content.</p>
|
||||
</div>
|
||||
<div class="card card-glow">
|
||||
<div class="card-label">Featured (Glow)</div>
|
||||
<h3>Standard Elevation</h3>
|
||||
<p>Clear floating elevation with generous 16px radius. For feature showcases, product screenshots, and hero content containers.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- SPACING -->
|
||||
<section class="section" id="spacing">
|
||||
<div class="section-title">05 / Spacing Scale</div>
|
||||
<h2 class="section-heading">Spacing System</h2>
|
||||
<p style="color: var(--text-secondary); margin-bottom: 32px;">Base unit: 8px. Scale builds from 1px to 144px.</p>
|
||||
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 4px; height: 4px;"></div><div class="spacing-label">1px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 8px; height: 8px;"></div><div class="spacing-label">2px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 16px; height: 16px;"></div><div class="spacing-label">4px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 32px; height: 32px;"></div><div class="spacing-label">8px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 48px; height: 48px;"></div><div class="spacing-label">12px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 64px; height: 64px;"></div><div class="spacing-label">16px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 96px; height: 96px;"></div><div class="spacing-label">24px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 128px; height: 128px;"></div><div class="spacing-label">32px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 160px; height: 160px;"></div><div class="spacing-label">40px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 192px; height: 192px;"></div><div class="spacing-label">48px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 256px; height: 256px;"></div><div class="spacing-label">64px</div></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- BORDER RADIUS -->
|
||||
<section class="section">
|
||||
<div class="section-title">06 / Border Radius Scale</div>
|
||||
<h2 class="section-heading">Border Radius</h2>
|
||||
|
||||
<div class="radius-row">
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 4px;"></div><div class="radius-label">4px</div><div class="radius-context">Nearly squared</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 6px;"></div><div class="radius-label">6px</div><div class="radius-context">Buttons, inputs</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 8px;"></div><div class="radius-label">8px</div><div class="radius-context">Standard cards</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 16px;"></div><div class="radius-label">16px</div><div class="radius-context">Feature panels</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 24px;"></div><div class="radius-label">24px</div><div class="radius-context">Images, videos</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 32px;"></div><div class="radius-label">32px</div><div class="radius-context">Hero CTAs</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 9999px;"></div><div class="radius-label">9999px</div><div class="radius-context">Pill-shaped</div></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- ELEVATION -->
|
||||
<section class="section" id="elevation">
|
||||
<div class="section-title">07 / Elevation & Depth</div>
|
||||
<h2 class="section-heading">Depth & Elevation</h2>
|
||||
|
||||
<div class="elevation-grid">
|
||||
<div class="elevation-card elevation-flat">
|
||||
<div><div class="elevation-name">Flat</div><div class="elevation-desc">No shadow. Banner Dark page background, inline text.</div></div>
|
||||
<div class="elevation-level">Level 0</div>
|
||||
</div>
|
||||
<div class="elevation-card elevation-surface">
|
||||
<div><div class="elevation-name">Surface</div><div class="elevation-desc">Widget Dark bg, no shadow. Standard cards on Banner Dark.</div></div>
|
||||
<div class="elevation-level">Level 1</div>
|
||||
</div>
|
||||
<div class="elevation-card elevation-whisper">
|
||||
<div><div class="elevation-name">Whisper</div><div class="elevation-desc">Soft shadow. Subtle card lift, hover states.</div></div>
|
||||
<div class="elevation-level">Level 2</div>
|
||||
</div>
|
||||
<div class="elevation-card elevation-elevated">
|
||||
<div><div class="elevation-name">Elevated</div><div class="elevation-desc">Standard floating shadow. Feature showcases, screenshots.</div></div>
|
||||
<div class="elevation-level">Level 3</div>
|
||||
</div>
|
||||
<div class="elevation-card elevation-modal">
|
||||
<div><div class="elevation-name">Modal</div><div class="elevation-desc">Heavy shadow with dark overlay. Dialogs, overlays.</div></div>
|
||||
<div class="elevation-level">Level 4</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div style="height: 80px;"></div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
536
design-md/expo/preview.html
Normal file
536
design-md/expo/preview.html
Normal file
@@ -0,0 +1,536 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Design System Preview: Expo (Light)</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
--color-expo-black: #000000;
|
||||
--color-near-black: #1c2024;
|
||||
--color-link-cobalt: #0d74ce;
|
||||
--color-legal-blue: #476cff;
|
||||
--color-widget-sky: #47c2ff;
|
||||
--color-preview-purple: #8145b5;
|
||||
--color-cloud-gray: #f0f0f3;
|
||||
--color-pure-white: #ffffff;
|
||||
--color-widget-dark: #1a1a1a;
|
||||
--color-banner-dark: #171717;
|
||||
--color-slate-gray: #60646c;
|
||||
--color-mid-slate: #555860;
|
||||
--color-silver: #b0b4ba;
|
||||
--color-pewter: #999999;
|
||||
--color-light-silver: #cccccc;
|
||||
--color-dark-slate: #363a3f;
|
||||
--color-charcoal: #333333;
|
||||
--color-warning: #ab6400;
|
||||
--color-destructive: #eb8e90;
|
||||
--color-border-lavender: #e0e1e6;
|
||||
--color-input-border: #d9d9e0;
|
||||
--color-focus-ring: #2547d0;
|
||||
--font-body: 'Inter', -apple-system, system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
--font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
||||
/* Light mode */
|
||||
--bg-page: var(--color-cloud-gray);
|
||||
--bg-card: var(--color-pure-white);
|
||||
--bg-nav: rgba(240,240,243,0.92);
|
||||
--text-primary: var(--color-near-black);
|
||||
--text-secondary: var(--color-slate-gray);
|
||||
--text-muted: var(--color-silver);
|
||||
--border-color: var(--color-border-lavender);
|
||||
--border-subtle: rgba(224,225,230,0.5);
|
||||
--section-label-color: var(--color-expo-black);
|
||||
}
|
||||
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
|
||||
body {
|
||||
background: var(--bg-page);
|
||||
color: var(--text-primary);
|
||||
font-family: var(--font-body);
|
||||
font-size: 16px;
|
||||
line-height: 1.4;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
/* NAV */
|
||||
.nav {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 16px 40px;
|
||||
background: var(--bg-nav);
|
||||
backdrop-filter: blur(12px);
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
}
|
||||
.nav-brand { font-family: var(--font-body); font-size: 18px; font-weight: 700; letter-spacing: -0.3px; display: flex; align-items: center; gap: 8px; color: var(--color-expo-black); }
|
||||
.nav-brand svg { width: 24px; height: 24px; }
|
||||
.nav-links { display: flex; gap: 32px; align-items: center; }
|
||||
.nav-links a { color: var(--text-secondary); text-decoration: none; font-size: 14px; font-weight: 500; transition: color 0.2s; }
|
||||
.nav-links a:hover { color: var(--color-near-black); }
|
||||
.nav-cta {
|
||||
background: var(--color-expo-black);
|
||||
color: var(--color-pure-white);
|
||||
padding: 8px 20px;
|
||||
border: none;
|
||||
border-radius: 9999px;
|
||||
font-size: 14px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
.nav-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--text-secondary);
|
||||
background: var(--color-pure-white);
|
||||
border: 1px solid var(--color-input-border);
|
||||
border-radius: 9999px;
|
||||
padding: 4px 12px 4px 8px;
|
||||
}
|
||||
.nav-status-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
background: #22c55e;
|
||||
}
|
||||
|
||||
/* HERO */
|
||||
.hero {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
padding: 120px 40px 100px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.hero h1 {
|
||||
font-family: var(--font-body);
|
||||
font-size: 60px;
|
||||
font-weight: 700;
|
||||
line-height: 1.10;
|
||||
letter-spacing: -3px;
|
||||
margin-bottom: 24px;
|
||||
color: var(--color-expo-black);
|
||||
position: relative;
|
||||
}
|
||||
.hero p {
|
||||
color: var(--text-secondary);
|
||||
font-size: 18px;
|
||||
line-height: 1.4;
|
||||
margin-bottom: 40px;
|
||||
position: relative;
|
||||
}
|
||||
.hero-buttons { display: flex; gap: 16px; justify-content: center; position: relative; }
|
||||
.btn-primary-pill {
|
||||
background: var(--color-expo-black);
|
||||
color: var(--color-pure-white);
|
||||
padding: 12px 28px;
|
||||
border: none;
|
||||
border-radius: 9999px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn-standard {
|
||||
background: var(--color-pure-white);
|
||||
color: var(--color-near-black);
|
||||
padding: 12px 24px;
|
||||
border: 1px solid var(--color-input-border);
|
||||
border-radius: 6px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* SECTIONS */
|
||||
.section {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 96px 40px;
|
||||
}
|
||||
.section-title {
|
||||
font-family: var(--font-body);
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2.52px;
|
||||
color: var(--section-label-color);
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.section-heading {
|
||||
font-family: var(--font-body);
|
||||
font-size: 48px;
|
||||
font-weight: 600;
|
||||
line-height: 1.10;
|
||||
letter-spacing: -2px;
|
||||
margin-bottom: 48px;
|
||||
color: var(--color-expo-black);
|
||||
}
|
||||
.section-divider {
|
||||
border: none;
|
||||
border-top: 1px solid var(--border-subtle);
|
||||
margin: 0 40px;
|
||||
max-width: 1200px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/* COLOR PALETTE */
|
||||
.color-group { margin-bottom: 40px; }
|
||||
.color-group-title { font-size: 20px; font-weight: 600; line-height: 1.2; margin-bottom: 20px; color: var(--text-secondary); }
|
||||
.color-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 16px; }
|
||||
.color-swatch { border: 1px solid var(--border-color); border-radius: 8px; overflow: hidden; }
|
||||
.color-swatch-block { height: 80px; }
|
||||
.color-swatch-info { padding: 12px; background: var(--bg-card); }
|
||||
.color-swatch-name { font-size: 13px; font-weight: 600; margin-bottom: 2px; }
|
||||
.color-swatch-hex { font-family: var(--font-mono); font-size: 12px; color: var(--text-muted); margin-bottom: 4px; }
|
||||
.color-swatch-role { font-size: 12px; color: var(--text-muted); line-height: 1.4; }
|
||||
|
||||
/* TYPOGRAPHY */
|
||||
.type-sample { margin-bottom: 32px; padding-bottom: 32px; border-bottom: 1px solid var(--border-subtle); }
|
||||
.type-sample:last-child { border-bottom: none; }
|
||||
.type-sample-text { margin-bottom: 8px; }
|
||||
.type-sample-label { font-family: var(--font-mono); font-size: 12px; color: var(--text-muted); }
|
||||
|
||||
/* BUTTONS */
|
||||
.button-row { display: flex; flex-wrap: wrap; gap: 20px; align-items: flex-start; }
|
||||
.button-demo { text-align: center; }
|
||||
.button-demo-label { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); margin-top: 10px; text-transform: uppercase; letter-spacing: 0.55px; }
|
||||
.btn-dark-pill {
|
||||
background: var(--color-expo-black);
|
||||
color: var(--color-pure-white);
|
||||
padding: 12px 28px;
|
||||
border: none;
|
||||
border-radius: 9999px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn-white-standard {
|
||||
background: var(--color-pure-white);
|
||||
color: var(--color-near-black);
|
||||
padding: 12px 24px;
|
||||
border: 1px solid var(--color-input-border);
|
||||
border-radius: 6px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn-dark-rounded {
|
||||
background: var(--color-expo-black);
|
||||
color: var(--color-pure-white);
|
||||
padding: 12px 24px;
|
||||
border: none;
|
||||
border-radius: 32px;
|
||||
font-size: 16px;
|
||||
font-family: var(--font-body);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* CARDS */
|
||||
.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px; }
|
||||
.card { background: var(--bg-card); border-radius: 8px; padding: 28px; }
|
||||
.card-standard { border: 1px solid var(--border-color); }
|
||||
.card-elevated { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.08) 0px 3px 6px, rgba(0,0,0,0.07) 0px 2px 4px; }
|
||||
.card-glow { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.1) 0px 10px 20px, rgba(0,0,0,0.05) 0px 3px 6px; border-radius: 16px; }
|
||||
.card h3 { font-family: var(--font-body); font-size: 20px; font-weight: 600; line-height: 1.20; letter-spacing: -0.25px; margin-bottom: 12px; color: var(--color-near-black); }
|
||||
.card p { color: var(--text-secondary); font-size: 16px; line-height: 1.40; }
|
||||
.card-label { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.55px; color: var(--color-expo-black); margin-bottom: 16px; }
|
||||
|
||||
/* CODE BLOCK */
|
||||
.code-block {
|
||||
background: var(--color-near-black);
|
||||
border: 1px solid var(--color-dark-slate);
|
||||
border-radius: 8px;
|
||||
padding: 20px 24px;
|
||||
margin-top: 24px;
|
||||
font-family: var(--font-mono);
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
color: #f2f2f2;
|
||||
overflow-x: auto;
|
||||
}
|
||||
.code-block .keyword { color: var(--color-link-cobalt); }
|
||||
.code-block .string { color: #22c55e; }
|
||||
.code-block .comment { color: var(--color-pewter); }
|
||||
|
||||
/* SPACING */
|
||||
.spacing-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; }
|
||||
.spacing-item { text-align: center; }
|
||||
.spacing-box { background: rgba(0,0,0,0.06); border: 1px solid rgba(0,0,0,0.12); border-radius: 2px; margin-bottom: 8px; }
|
||||
.spacing-label { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); }
|
||||
|
||||
/* RADIUS */
|
||||
.radius-row { display: flex; flex-wrap: wrap; gap: 20px; align-items: center; }
|
||||
.radius-item { text-align: center; }
|
||||
.radius-box { width: 80px; height: 80px; background: var(--bg-card); border: 1px solid var(--border-color); margin-bottom: 8px; }
|
||||
.radius-label { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); }
|
||||
.radius-context { font-size: 11px; color: var(--text-muted); margin-top: 2px; }
|
||||
|
||||
/* ELEVATION */
|
||||
.elevation-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 24px; }
|
||||
.elevation-card { background: var(--bg-card); border-radius: 8px; padding: 24px; min-height: 140px; display: flex; flex-direction: column; justify-content: space-between; }
|
||||
.elevation-flat { border: none; background: var(--bg-page); }
|
||||
.elevation-surface { border: none; background: var(--bg-card); }
|
||||
.elevation-whisper { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.08) 0px 3px 6px, rgba(0,0,0,0.07) 0px 2px 4px; }
|
||||
.elevation-elevated { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.1) 0px 10px 20px, rgba(0,0,0,0.05) 0px 3px 6px; }
|
||||
.elevation-modal { border: 1px solid var(--border-color); box-shadow: rgba(0,0,0,0.15) 0px 20px 40px, rgba(0,0,0,0.08) 0px 8px 16px; }
|
||||
.elevation-name { font-size: 16px; font-weight: 600; margin-bottom: 8px; }
|
||||
.elevation-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.5; }
|
||||
.elevation-level { font-family: var(--font-mono); font-size: 11px; color: var(--color-expo-black); text-transform: uppercase; letter-spacing: 0.55px; margin-top: 12px; }
|
||||
|
||||
/* RESPONSIVE */
|
||||
@media (max-width: 768px) {
|
||||
.nav { padding: 12px 20px; }
|
||||
.nav-links a:not(.nav-cta-wrapper) { display: none; }
|
||||
.nav-status { display: none; }
|
||||
.hero { padding: 80px 20px 60px; }
|
||||
.hero h1 { font-size: 36px; letter-spacing: -1.5px; }
|
||||
.section { padding: 60px 20px; }
|
||||
.section-heading { font-size: 28px; letter-spacing: -1px; }
|
||||
.color-grid { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); }
|
||||
.card-grid { grid-template-columns: 1fr; }
|
||||
.hero-buttons { flex-direction: column; align-items: center; }
|
||||
.button-row { flex-direction: column; align-items: flex-start; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- NAV -->
|
||||
<nav class="nav">
|
||||
<div class="nav-brand">
|
||||
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
Expo
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="#colors">Colors</a>
|
||||
<a href="#typography">Typography</a>
|
||||
<a href="#buttons">Buttons</a>
|
||||
<a href="#cards">Cards</a>
|
||||
<a href="#spacing">Spacing</a>
|
||||
<a href="#elevation">Elevation</a>
|
||||
<div class="nav-status"><span class="nav-status-dot"></span> All Systems Operational</div>
|
||||
<button class="nav-cta">Sign Up</button>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- HERO -->
|
||||
<section class="hero">
|
||||
<h1>Design System Preview:<br>Expo</h1>
|
||||
<p>Auto-generated design token catalog from DESIGN.md</p>
|
||||
<div class="hero-buttons">
|
||||
<button class="btn-primary-pill">Explore Tokens</button>
|
||||
<button class="btn-standard">View Source</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- COLORS -->
|
||||
<section class="section" id="colors">
|
||||
<div class="section-title">01 / Color Palette</div>
|
||||
<h2 class="section-heading">Color Palette & Roles</h2>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Primary</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #000000;"></div><div class="color-swatch-info"><div class="color-swatch-name">Expo Black</div><div class="color-swatch-hex">#000000</div><div class="color-swatch-role">Primary headlines, CTA buttons, brand anchor</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #1c2024;"></div><div class="color-swatch-info"><div class="color-swatch-name">Near Black</div><div class="color-swatch-hex">#1c2024</div><div class="color-swatch-role">Body text, softer than pure black for reading</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Secondary & Accent</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #0d74ce;"></div><div class="color-swatch-info"><div class="color-swatch-name">Link Cobalt</div><div class="color-swatch-hex">#0d74ce</div><div class="color-swatch-role">Standard links, interactive signals</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #476cff;"></div><div class="color-swatch-info"><div class="color-swatch-name">Legal Blue</div><div class="color-swatch-hex">#476cff</div><div class="color-swatch-role">Footer/legal links, brighter accent</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #47c2ff;"></div><div class="color-swatch-info"><div class="color-swatch-name">Widget Sky</div><div class="color-swatch-hex">#47c2ff</div><div class="color-swatch-role">Widget branding, lightest accent</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #8145b5;"></div><div class="color-swatch-info"><div class="color-swatch-name">Preview Purple</div><div class="color-swatch-hex">#8145b5</div><div class="color-swatch-role">Beta/preview feature indicators</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Surface & Background</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #f0f0f3; border-bottom: 1px solid #e0e1e6;"></div><div class="color-swatch-info"><div class="color-swatch-name">Cloud Gray</div><div class="color-swatch-hex">#f0f0f3</div><div class="color-swatch-role">Primary page background</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #ffffff; border-bottom: 1px solid #e0e1e6;"></div><div class="color-swatch-info"><div class="color-swatch-name">Pure White</div><div class="color-swatch-hex">#ffffff</div><div class="color-swatch-role">Card surfaces, elevated containers</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #1a1a1a;"></div><div class="color-swatch-info"><div class="color-swatch-name">Widget Dark</div><div class="color-swatch-hex">#1a1a1a</div><div class="color-swatch-role">Dark theme widgets, overlays</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #171717;"></div><div class="color-swatch-info"><div class="color-swatch-name">Banner Dark</div><div class="color-swatch-hex">#171717</div><div class="color-swatch-role">Promo banners, high-contrast surfaces</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Neutrals & Text</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #60646c;"></div><div class="color-swatch-info"><div class="color-swatch-name">Slate Gray</div><div class="color-swatch-hex">#60646c</div><div class="color-swatch-role">Secondary text (305 instances)</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #555860;"></div><div class="color-swatch-info"><div class="color-swatch-name">Mid Slate</div><div class="color-swatch-hex">#555860</div><div class="color-swatch-role">Emphasized secondary text</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #b0b4ba;"></div><div class="color-swatch-info"><div class="color-swatch-name">Silver</div><div class="color-swatch-hex">#b0b4ba</div><div class="color-swatch-role">Tertiary text, placeholders, metadata</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #363a3f;"></div><div class="color-swatch-info"><div class="color-swatch-name">Dark Slate</div><div class="color-swatch-hex">#363a3f</div><div class="color-swatch-role">Borders on dark surfaces, switch tracks</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color-group">
|
||||
<h3 class="color-group-title">Semantic</h3>
|
||||
<div class="color-grid">
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #ab6400;"></div><div class="color-swatch-info"><div class="color-swatch-name">Warning Amber</div><div class="color-swatch-hex">#ab6400</div><div class="color-swatch-role">Warning states, deep amber for seriousness</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #eb8e90;"></div><div class="color-swatch-info"><div class="color-swatch-name">Destructive Rose</div><div class="color-swatch-hex">#eb8e90</div><div class="color-swatch-role">Disabled destructive actions, gentle alarm</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #e0e1e6;"></div><div class="color-swatch-info"><div class="color-swatch-name">Border Lavender</div><div class="color-swatch-hex">#e0e1e6</div><div class="color-swatch-role">Standard card/container borders</div></div></div>
|
||||
<div class="color-swatch"><div class="color-swatch-block" style="background: #d9d9e0;"></div><div class="color-swatch-info"><div class="color-swatch-name">Input Border</div><div class="color-swatch-hex">#d9d9e0</div><div class="color-swatch-role">Buttons, form elements, interactive borders</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- TYPOGRAPHY -->
|
||||
<section class="section" id="typography">
|
||||
<div class="section-title">02 / Typography Scale</div>
|
||||
<h2 class="section-heading">Typography Rules</h2>
|
||||
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 60px; font-weight: 700; line-height: 1.10; letter-spacing: -3px; color: var(--color-expo-black);">Display Hero</div><div class="type-sample-label">Display / Hero — 64px / 700–900 / 1.10 / -3px — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 48px; font-weight: 600; line-height: 1.10; letter-spacing: -2px; color: var(--color-expo-black);">Section Heading</div><div class="type-sample-label">Section Heading — 48px / 600 / 1.10 / -2px — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 20px; font-weight: 600; line-height: 1.20; letter-spacing: -0.25px;">Sub-heading</div><div class="type-sample-label">Sub-heading — 20px / 600 / 1.20 / -0.25px — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 18px; font-weight: 400; line-height: 1.40; color: var(--text-secondary);">Body large text for intro paragraphs and section descriptions with comfortable reading rhythm.</div><div class="type-sample-label">Body Large — 18px / 400–500 / 1.40 / normal — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 16px; font-weight: 400; line-height: 1.40;">Standard body text for paragraphs, navigation links, and button labels. Inter provides geometric precision at every weight.</div><div class="type-sample-label">Body / Button — 16px / 400–700 / 1.25–1.40 / normal — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 14px; font-weight: 500; line-height: 1.40; color: var(--text-secondary);">Caption text for descriptions and metadata labels</div><div class="type-sample-label">Caption / Label — 14px / 400–600 / 1.00–1.40 / normal — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-body); font-size: 12px; font-weight: 500; line-height: 1.00; color: var(--text-muted);">Tag / Small Badge</div><div class="type-sample-label">Tag / Small — 12px / 500 / 1.00–1.60 / normal — Inter</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-mono); font-size: 16px; font-weight: 400; line-height: 1.40;">npx create-expo-app@latest my-app</div><div class="type-sample-label">Code Body — 16px / 400–600 / 1.40 / normal — JetBrains Mono</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-mono); font-size: 14px; font-weight: 400; line-height: 1.40;">import { Camera } from "expo-camera";</div><div class="type-sample-label">Code Caption — 14px / 400–600 / 1.40 / normal — JetBrains Mono</div></div>
|
||||
<div class="type-sample"><div class="type-sample-text" style="font-family: var(--font-mono); font-size: 12px; font-weight: 400; line-height: 1.60; text-transform: uppercase; color: var(--text-muted);">REACT NATIVE</div><div class="type-sample-label">Code Small / Tag — 12px / 400 / 1.60 / uppercase — JetBrains Mono</div></div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- BUTTONS -->
|
||||
<section class="section" id="buttons">
|
||||
<div class="section-title">03 / Button Variants</div>
|
||||
<h2 class="section-heading">Buttons</h2>
|
||||
|
||||
<div class="button-row">
|
||||
<div class="button-demo"><button class="btn-dark-pill">Get Started</button><div class="button-demo-label">Primary Pill (Dark)</div></div>
|
||||
<div class="button-demo"><button class="btn-white-standard">View Docs</button><div class="button-demo-label">Standard (White)</div></div>
|
||||
<div class="button-demo"><button class="btn-dark-rounded">Sign Up Free</button><div class="button-demo-label">Dark Rounded (32px)</div></div>
|
||||
</div>
|
||||
|
||||
<div class="code-block" style="margin-top: 40px;">
|
||||
<span class="comment">// Get started with Expo</span><br>
|
||||
<span class="keyword">$</span> npx create-expo-app@latest my-app
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- CARDS -->
|
||||
<section class="section" id="cards">
|
||||
<div class="section-title">04 / Card Examples</div>
|
||||
<h2 class="section-heading">Cards & Containers</h2>
|
||||
|
||||
<div class="card-grid">
|
||||
<div class="card card-standard">
|
||||
<div class="card-label">Standard Card</div>
|
||||
<h3>Border Lavender Container</h3>
|
||||
<p>Standard content card with 1px Border Lavender border and 8px radius. White surface clearly lifted from Cloud Gray page background.</p>
|
||||
</div>
|
||||
<div class="card card-elevated">
|
||||
<div class="card-label">Elevated (Whisper)</div>
|
||||
<h3>Whisper Shadow Lift</h3>
|
||||
<p>Subtle card elevation with whisper-soft shadow. Barely perceptible lift for hover states and highlighted content.</p>
|
||||
</div>
|
||||
<div class="card card-glow">
|
||||
<div class="card-label">Featured (Glow)</div>
|
||||
<h3>Standard Elevation</h3>
|
||||
<p>Clear floating elevation with generous 16px radius. For feature showcases, product screenshots, and hero content containers.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- SPACING -->
|
||||
<section class="section" id="spacing">
|
||||
<div class="section-title">05 / Spacing Scale</div>
|
||||
<h2 class="section-heading">Spacing System</h2>
|
||||
<p style="color: var(--text-secondary); margin-bottom: 32px;">Base unit: 8px. Scale builds from 1px to 144px.</p>
|
||||
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 4px; height: 4px;"></div><div class="spacing-label">1px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 8px; height: 8px;"></div><div class="spacing-label">2px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 16px; height: 16px;"></div><div class="spacing-label">4px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 32px; height: 32px;"></div><div class="spacing-label">8px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 48px; height: 48px;"></div><div class="spacing-label">12px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 64px; height: 64px;"></div><div class="spacing-label">16px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 96px; height: 96px;"></div><div class="spacing-label">24px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 128px; height: 128px;"></div><div class="spacing-label">32px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 160px; height: 160px;"></div><div class="spacing-label">40px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 192px; height: 192px;"></div><div class="spacing-label">48px</div></div>
|
||||
<div class="spacing-item"><div class="spacing-box" style="width: 256px; height: 256px;"></div><div class="spacing-label">64px</div></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- BORDER RADIUS -->
|
||||
<section class="section">
|
||||
<div class="section-title">06 / Border Radius Scale</div>
|
||||
<h2 class="section-heading">Border Radius</h2>
|
||||
|
||||
<div class="radius-row">
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 4px;"></div><div class="radius-label">4px</div><div class="radius-context">Nearly squared</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 6px;"></div><div class="radius-label">6px</div><div class="radius-context">Buttons, inputs</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 8px;"></div><div class="radius-label">8px</div><div class="radius-context">Standard cards</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 16px;"></div><div class="radius-label">16px</div><div class="radius-context">Feature panels</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 24px;"></div><div class="radius-label">24px</div><div class="radius-context">Images, videos</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 32px;"></div><div class="radius-label">32px</div><div class="radius-context">Hero CTAs</div></div>
|
||||
<div class="radius-item"><div class="radius-box" style="border-radius: 9999px;"></div><div class="radius-label">9999px</div><div class="radius-context">Pill-shaped</div></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- ELEVATION -->
|
||||
<section class="section" id="elevation">
|
||||
<div class="section-title">07 / Elevation & Depth</div>
|
||||
<h2 class="section-heading">Depth & Elevation</h2>
|
||||
|
||||
<div class="elevation-grid">
|
||||
<div class="elevation-card elevation-flat">
|
||||
<div><div class="elevation-name">Flat</div><div class="elevation-desc">No shadow. Cloud Gray page background, inline text.</div></div>
|
||||
<div class="elevation-level">Level 0</div>
|
||||
</div>
|
||||
<div class="elevation-card elevation-surface">
|
||||
<div><div class="elevation-name">Surface</div><div class="elevation-desc">White bg, no shadow. Standard white cards on Cloud Gray.</div></div>
|
||||
<div class="elevation-level">Level 1</div>
|
||||
</div>
|
||||
<div class="elevation-card elevation-whisper">
|
||||
<div><div class="elevation-name">Whisper</div><div class="elevation-desc">Whisper-soft shadow. Subtle card lift, hover states.</div></div>
|
||||
<div class="elevation-level">Level 2</div>
|
||||
</div>
|
||||
<div class="elevation-card elevation-elevated">
|
||||
<div><div class="elevation-name">Elevated</div><div class="elevation-desc">Standard floating shadow. Feature showcases, screenshots.</div></div>
|
||||
<div class="elevation-level">Level 3</div>
|
||||
</div>
|
||||
<div class="elevation-card elevation-modal">
|
||||
<div><div class="elevation-name">Modal</div><div class="elevation-desc">Heavy shadow with dark overlay. Dialogs, overlays.</div></div>
|
||||
<div class="elevation-level">Level 4</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div style="height: 80px;"></div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user