中
EN
Design System Hub
设计系统规范库
精选内容优先的网页设计系统规范与中文排版引擎。点击卡片可直接预览交互细节、设计规格及一键复制代码。
精选设计
社区克隆
全部
暗色
亮色
HTML Effectiveness
Ivory Editorial
HTML Effectiveness
复制
秉持温暖极简主义的文档级阅读设计系统,采用经典的 Serif / Sans / Mono 字体定位与极细实线修饰。
象牙黄与黏土红
单文件无依赖
人文报刊排版
--- version: alpha name: HTML Effectiveness description: A functional-minimalist reading design system with warm editorial style, featuring classic Serif/Sans/Mono typography and thin rules. colors: primary: "#d97757" primary-focus: "#b85c3e" canvas: "#FAF9F5" surface-card: "#FFFFFF" surface-soft: "#E3DACC" ink: "#141413" body: "#3D3D3A" muted: "#87867F" hairline: "#D1CFC5" typography: display-xl: fontSize: "38px" fontWeight: "500" lineHeight: "1.06" use: "Page Heading" body-md: fontSize: "16px" fontWeight: "400" lineHeight: "1.55" use: "Primary Body" --- # Design System — "The unreasonable effectiveness of HTML" Extracted from [thariqs.github.io/html-effectiveness](https://thariqs.github.io/html-effectiveness). A functional-minimalist, content-forward design language with editorial warmth. --- ## 1. Design Philosophy - **Content-forward & readable** — trades walls of markdown for spatial, scannable layouts - **Warm minimalism** — clean but not cold; ivory + clay + olive palette - **Editorial typography** — serif headings, sans body, mono labels create clear hierarchy - **Self-contained** — single-file HTML, no frameworks, system fonts only - **Subtle delight** — gentle rotations, hover lifts, smooth transitions (never gaudy) --- ## 2. Color Palette | Token | Hex | Role | |-----------|-----------|------| | `--ivory` | `#FAF9F5` | Page background | | `--paper` | `#FFFFFF` | Card / surface background | | `--slate` | `#141413` | Primary text (near-black) | | `--clay` | `#D97757` | Primary accent, links, highlights | | `--clay-d`| `#B85C3E` | Darker accent (hover) | | `--oat` | `#E3DACC` | Secondary surface, decorative, hover thumb bg | | `--olive` | `#788C5D` | Secondary accent (charts, diagrams) | | `--g100` | `#F0EEE6` | Light gray surface, thumb bg | | `--g200` | `#E6E3DA` | Light border | | `--g300` | `#D1CFC5` | Default border | | `--g500` | `#87867F` | Secondary / muted text | | `--g700` | `#3D3D3A` | Body text | **Usage rules:** - Warm neutrals throughout; never pure black or pure gray - Clay is the only warm accent — used sparingly for emphasis - Olive is a cool counterpoint, used only in decorative SVG graphics - Text hierarchy: slate (headings) → g700 (body) → g500 (muted/captions) --- ## 3. Typography ### Font Stack | Token | Stack | |-----------|-------| | `--serif` | `ui-serif, Georgia, "Times New Roman", Times, serif` | | `--sans` | `system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif` | | `--mono` | `ui-monospace, "SF Mono", Menlo, Monaco, Consolas, monospace` | ### Type Scale | Element | Font | Size | Weight | Line-height | Letter-spacing | Notes | |---------|------|------|--------|-------------|----------------|-------| | h1 | serif | `clamp(38px, 5.4vw, 62px)` | 500 | 1.06 | -0.018em | Max 17ch width | | h1 em | serif | inherit | italic | — | — | Clay color | | h2 | serif | 27px | 500 | — | -0.012em | Section headings | | .intro | sans | 16.5px | 400 | — | — | Max 620px width | | .sec-intro | sans | 14.5px | 400 | — | — | Max 700px width | | .title (card) | serif | 19px | 500 | 1.22 | -0.008em | Card heading | | .desc (card) | sans | 13.5px | 400 | 1.5 | — | Card description | | .eyebrow | mono | 12px | 400 | — | 0.12em | Uppercase | | .file | mono | 11px | 400 | — | — | File path label | | .idx | mono | 13px | 600 | — | — | Section number | | nav.toc a | sans | 12.5px | 400 | — | — | Nav pills | | .tag | mono | 9.5px | 400 | — | 0.08em | Uppercase badges | **Rules:** - Serif for headings and editorial moments only - Sans for all body copy - Mono for metadata, labels, file names, section numbers - Never bold; use weight 500–600 for emphasis - Body line-height: 1.55 --- ## 4. Spacing System | Token | Value | Usage | |-------|-------|-------| | Page max-width | 1120px | `.wrap` | | Page horizontal padding | 32px | `.wrap` | | Page bottom padding | 140px | `.wrap` | | Section top margin | 72px | `section` | | Card grid gap | 20px | `.grid` | | Card internal padding | 18px 20px 16px | `.body` | | Hero pane padding | 14px | `.pane` | | Nav pill padding | 7px 14px | `nav.toc a` | | Masthead top padding | 80px | `header.masthead` | | Masthead bottom padding | 56px | `header.masthead` | **Rules:** - Generous whitespace; never cramped - Section dividers are 1.5px borders + margin (not heavy rules) - Cards use 14px border-radius with overflow hidden for consistent padding --- ## 5. Borders & Dividers - **Border width:** 1.5px (consistent everywhere — borders, dividers, strokes) - **Border colors:** `--g300` (default), `--g200` (light), `--slate` (emphasis/hover) - **No heavy rules or thick separators** --- ## 6. Border Radius | Element | Value | |---------|-------| | Cards | 14px | | Hero panes | 10px | | Tags / badges | 6px | | Nav pills, count badges | 999px (pill) | | SVG internal rects | 3–5px | --- ## 7. Shadows | Context | Value | |---------|-------| | Card hover | `0 10px 30px rgba(20, 20, 19, 0.10)` | | Hero HTML pane | `0 12px 32px rgba(20, 20, 19, 0.10)` | **Rules:** - Shadows only on hover or to establish depth hierarchy - Single shadow, warm tint (slate-based), subtle opacity (0.10) - No shadows on static cards — border alone defines them --- ## 8. Layout Patterns ### Page Wrapper ```css .wrap { max-width: 1120px; margin: 0 auto; padding: 0 32px 140px; } ``` ### Hero Grid ```css .hero-grid { display: grid; grid-template-columns: 1fr 340px; gap: 48px; } ``` Stacks to single column at 880px. ### Card Grid ```css .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(316px, 1fr)); gap: 20px; } ``` Fluid cards, 316px minimum. No media queries needed for most widths. ### Section Layout ``` [section#id] └── .sec-head (flex row, baseline aligned) │ ├── .idx (mono number, clay color, 34px fixed width) │ ├── h2 (serif heading) │ └── .count (pill badge) └── .sec-intro (sans paragraph, max 700px, 50px left indent) └── .grid (card grid, 50px left indent) ``` Left indent (50px) drops at 640px. ### Navigation (TOC) ```css nav.toc { display: flex; flex-wrap: wrap; gap: 8px; } ``` --- ## 9. Component Patterns ### Card ``` a.card (block-level link) ├── .thumb (132px tall, g100 bg, centered SVG) └── .body (flex column) ├── .title (serif, 19px) ├── .desc (sans, 13.5px) └── .file (mono, 11px, top-bordered, filename + → arrow) ``` Hover behavior: card lifts 3px, gains shadow, border darkens to slate, thumb bg shifts to oat, file text turns clay, arrow slides right 3px. ### Nav Pill ``` nav.toc a display: inline-flex border: 1.5px solid g300 border-radius: 999px padding: 7px 14px transition: border-color 120ms, color 120ms, background 120ms ``` ### Section Header ``` .sec-head (flex, baseline, gap 16px) .idx — "01", "02", etc. (mono, clay, 34px width) h2 — section title .count — "N demos" pill (mono, g500 on g100, 999px radius) ``` ### Eyebrow ``` .eyebrow (mono, 12px, uppercase, g500) ::before — 24px × 1.5px clay accent line ``` ### Hero Figure (Decorative) Two overlapping "panes" (.md and .html) rotated slightly: - `.md` — g100 bg, rotated -2.5deg, pushed down 6px - `.html` — paper bg, rotated 1.5deg, slate border, shadow - Each has a `.tag` badge positioned absolutely at top --- ## 10. Transitions & Motion | Element | Property | Duration | Easing | |---------|----------|----------|--------| | Nav pills | border-color, color, background | 120ms | (default) | | Cards | transform, box-shadow, border-color | 150ms | ease | | Card thumb bg | background | 150ms | ease | | Card arrow | transform | 150ms | ease | | Page scroll | scroll-behavior | — | smooth | **Rules:** - Fast transitions (120–150ms) — snappy, not sluggish - No opacity fades; changes are immediate or positional - Scroll is smooth between anchor links --- ## 11. Responsive Breakpoints | Width | Behavior | |-------|----------| | 880px | Hero grid stacks to single column | | 640px | Section intro + card grid lose 50px left indent | No breakpoint for the card grid itself — `auto-fill, minmax(316px, 1fr)` handles it. --- ## 12. Iconography - **No icon font or library** — all decorative elements are inline SVGs - SVG illustrations use the same design tokens (clay, olive, oat, slate fills/strokes) - `stroke-width: 2.5` consistently - Simple geometric shapes: rects, circles, lines with rounded caps - Dashed lines use `stroke-dasharray: 4 4` - SVGs change color on card hover (fills shift, clay becomes more prominent) --- ## 13. Code & Inline Elements - `<code>` uses the system mono stack (inherited from body or explicit) - Links: clay color with oat underline; on hover underline shifts to clay - `text-underline-offset: 3px` for better readability - No syntax highlighting — plain mono text ## Do's and Don'ts ### Do - Use warm-tinted neutrals throughout; never pure black or pure gray. - Set snappy transitions (120–150ms) for responsive hover states. - Rely on borders and spacing to define cards and layouts. ### Don't - Don't use bold weights above 600. - Don't apply drop shadows to static cards or containers. - Don't use background blurs, glassmorphism, or mesh gradients. - Don't load external fonts; rely strictly on system typography.
潮流周刊
Kaiti Editorial
潮流周刊 by Tw93
复制
专为中文长文排版打造的文学画报感设计系统,使用开源“霞鹜文楷”与红铜色点缀,并原生支持深色模式。
霞鹜文楷 Web Font
赫蹏中文排版
全自动暗色模式
--- version: alpha name: Trendy Weekly by Tw93 description: A literary-style CJK-optimized layout design system, using the open-source LXGW WenKai font and copper brown accents with native dark mode. colors: primary: "#a67c52" primary-focus: "#e8a15a" canvas: "#ffffff" surface-card: "#ffffff" surface-soft: "#f3f4f6" ink: "#262626" body: "#374151" muted: "#6b7280" hairline: "#e6e6e6" typography: display-xl: fontSize: "36px" fontWeight: "800" lineHeight: "1.11" use: "Article Title" body-md: fontSize: "16px" fontWeight: "400" lineHeight: "1.7" use: "Body Text" --- # Design System — 潮流周刊 (Trendy Weekly) by Tw93 Extracted from [weekly.tw93.fun/posts/268](https://weekly.tw93.fun/posts/268). A Chinese typography-first, clean reading design with warm accents and dark mode. --- ## 1. Design Philosophy - **Typography-first** — the open-source "LXGW WenKai" (霞鹜文楷) font defines the visual identity - **Clean reading** — high contrast, generous spacing, prose-optimized layout - **Quiet warmth** — warm brown accent on white; no flashy colors - **Dark mode native** — full light/dark color scheme built in - **Utility-powered** — Tailwind CSS + custom properties, Astro-generated static site - **Chinese-aware** — uses 赫蹏 (heti) library for CJK punctuation and spacing --- ## 2. Color Palette ### Light Mode | Token | Value | Role | |-------|-------|------| | `--theme-bg` | `#ffffff` | Page background | | `--theme-accent` | `#a67c52` | Accent (warm brown/copper) | | `--theme-text` | `#262626` | Primary text | | `--theme-divider` | `#e6e6e6` | Borders, dividers | | Link blue | `#1d9bf0` | Hyperlinks in content | | Gray muted | `#6b7280` | Secondary text (Tailwind gray-500) | | Gray light | `#9ca3af` | Placeholder text (Tailwind gray-400) | ### Dark Mode | Token | Value | Role | |-------|-------|------| | `--theme-bg` | `#21262b` | Page background | | `--theme-accent` | `#e8a15a` | Accent (lighter warm) | | `--theme-text` | `#e7e9ea` | Primary text | | `--theme-divider` | `#555555` | Borders, dividers | ### Tailwind Prose (Light) | Token | Value | |-------|-------| | `--tw-prose-body` | `#374151` | | `--tw-prose-headings` | `#111827` | | `--tw-prose-links` | `#111827` | | `--tw-prose-code` | `#111827` | | `--tw-prose-pre-bg` | `#1f2937` | | `--tw-prose-pre-code` | `#e5e7eb` | --- ## 3. Typography ### Font Stack | Role | Stack | |------|-------| | Body / headings | `LXGW WenKai`, `STKaiti`, `KaiTi`, system-ui fallback | | Mono / code | `SF Mono`, Consolas, Monaco, `Courier New`, monospace | **Key detail:** The primary font is **LXGW WenKai** (霞鹜文楷), an open-source Chinese font loaded via jsDelivr CDN. It evokes a refined, literary magazine aesthetic. ### Type Scale | Element | Size | Weight | Line-height | |---------|------|--------|-------------| | Base | 16px (`--font-size-base`) | 400 | 1.7 (`--line-height-normal`) | | Small | 14px (`--font-size-small`) | 400 | 1.6 | | `.prose` body | 1rem (16px) | 400 | 1.75 | | h1 (prose) | 2.25em | 800 | 1.11 | | h2 (prose) | 1.5em | 700 | 1.33 | | h3 (prose) | 1.25em | 600 | 1.6 | | Nav links | 14px | 500 | — | | Sidebar titles | 14px | 500 | — | ### Rendering - `-webkit-font-smoothing: subpixel-antialiased` (light mode) - `letter-spacing: 0.5px` on body text (CJK optimization) - `text-autospace: normal` (CJK punctuation spacing) - `hyphens: auto` with `overflow-wrap: break-word` --- ## 4. Spacing System | Token | Value | Usage | |-------|-------|-------| | `--space-1` | 4px | Tight gaps | | `--space-2` | 8px | Icon/text gaps | | `--space-3` | 12px | Internal padding | | `--space-4` | 16px | Standard padding | | `--space-5` | 20px | Card padding | | `--space-6` | 24px | Section gaps | | `--space-8` | 32px | Large section gaps | | `--doc-padding` | 32px | Document-level padding | | `--gutter` | 8px | Grid gutters | Content max-width: **864px** (on large screens), `calc(100% - 16px)` on mobile. --- ## 5. Borders & Radius - **Border radius:** `8px` (`--radius`) — consistent across images, cards, pre blocks - **Dividers:** 1px `--theme-divider` (`#e6e6e6` light / `#555` dark) - **Tailwind defaults:** `rounded-lg` (8px), `rounded-full` (9999px), `rounded` (4px) --- ## 6. Shadows Tailwind utility shadows: - `shadow` — `0 1px 3px 0 rgb(0,0,0,.1)` (card/button default) - `shadow-md` — `0 4px 6px -1px rgb(0,0,0,.1)` (elevated elements) - No custom shadow tokens defined --- ## 7. Layout Patterns ### Page Shell ``` .layout (CSS Grid) ├── Sidebar (left, sticky/fixed) │ ├── Logo + site title │ ├── Nav groups with links │ └── 268 issue archive list └── Main content (right) ├── Cover image (full-width) ├── Article title ├── .heti (prose content) └── Footer (prev/next, social links) ``` ### Responsive Breakpoints (Tailwind) | Prefix | Min-width | Usage | |--------|-----------|-------| | `sm` | 640px | Sidebar collapses | | `md` | 768px | Two-column layout, card grids (2-col) | | `lg` | 1080px | Wider content, card grids (3-col) | | `xl` | 1412px | Max-width 80rem, card grids (4-col) | ### Grid Layout - `grid-sidebar` class for the sidebar + main two-column layout - `.nav-groups` — flex column for sidebar navigation - `.nav-group` — each nav section with heading + links - `.nav-link` — individual issue links --- ## 8. Component Patterns ### Sidebar ``` nav (sticky, full-height) ├── .sidebar-header │ ├── Logo image (36-48px) │ └── Site title ├── Search (Pagefind UI) └── .nav-groups └── .nav-group ├── Nav heading └── .nav-link × N (dense list, min line-height) ``` ### Article Content ``` article ├── Cover image (full-width, rounded, WebP via Alibaba OSS) ├── h1 (article title) ├── [En] toggle link ├── .heti (prose content with CJK typography) │ ├── h2 section headings │ ├── p body text (28px margin-block) │ ├── img (max-width, rounded, gray bg placeholder) │ ├── pre > code (dark bg #1f2937, light text) │ └── hr (1px theme-divider, 28px margins) └── .post-footer ├── Prev / Next navigation ├── Social icons (Twitter, GitHub, RSS) └── "Buy me a cola" CTA ``` ### Navigation Pills (TOC/Archive) - Dense vertical list with min line-height - Font: 14px, weight 400 - Active item gets accent color highlight - Hover: color shift to accent --- ## 9. Transitions & Motion - **Base transition:** `0.2s ease` (`--transition-base`) - Applied to: link colors, hover states - Tailwind default: `transition-colors` (150ms) on interactive elements - No heavy animations; design trusts content over motion --- ## 10. Images - **Format:** WebP via Alibaba Cloud OSS on-the-fly processing (`x-oss-process=image/...`) - **Max-width:** 100% with auto height; max 2000px wide - **Border-radius:** 8px (`--radius`) - **Placeholder:** Gray background (`#f3f4f6` light / `#262626` dark) while loading - **Lightense:** Click-to-zoom via lightense.js with `rgba(230,230,230,.85)` backdrop ## Do's and Don'ts ### Do - Use LXGW WenKai as the distinctive font for both Latin and Chinese text. - Use the 赫蹏 (heti) library to ensure correct spacing for CJK punctuation. - Keep layout backgrounds light white (`#ffffff`) or matte dark gray (`#21262b`). ### Don't - Don't use standard sans-serif Latin fonts for body text or headlines. - Don't apply bold weights (use regular 400 for body text). - Don't use colors outside the warm brown (`#a67c52`) and link blue (`#1d9bf0`) palette. - Don't add heavy shadows or excessive card layouts.
Linear Project
Sleek Dark Mode
Linear Spec
复制
面向软件开发团队的暗色首选设计系统,以深邃星空蓝黑为底色,结合 Bento Grids 与动态光晕营造极客质感。
深色模式优先
Bento Grid 容器
发光紫色调
--- version: alpha name: Linear-design-analysis description: "A near-black product-focused marketing canvas built around #010102 (the deepest dark surface of any tool in this collection), light gray text (#f7f8f8), and the signature Linear lavender-blue (#5e6ad2) used as the single chromatic accent. The system reads as software-craft documentation: dense, technical, and quietly luxurious. Display type is set in the Linear custom sans (SF Pro Display fallback) at 500–700 with measured negative tracking. Cards live as charcoal panels (#0f1011) with hairline borders. The accent lavender appears on the brand mark, focus rings, and a few intentional CTAs — never decoratively. Page rhythm leans on product UI screenshots framed in dark panels rather than atmospheric color." colors: primary: "#5e6ad2" on-primary: "#ffffff" primary-hover: "#828fff" primary-focus: "#5e69d1" ink: "#f7f8f8" ink-muted: "#d0d6e0" ink-subtle: "#8a8f98" ink-tertiary: "#62666d" canvas: "#010102" surface-1: "#0f1011" surface-2: "#141516" surface-3: "#18191a" surface-4: "#191a1b" hairline: "#23252a" hairline-strong: "#34343a" hairline-tertiary: "#3e3e44" inverse-canvas: "#ffffff" inverse-surface-1: "#f5f6f6" inverse-surface-2: "#f6f7f7" inverse-ink: "#000000" brand-secure: "#7a7fad" semantic-success: "#27a644" semantic-overlay: "#000000" typography: display-xl: fontFamily: Linear Display fontSize: 80px fontWeight: 600 lineHeight: 1.05 letterSpacing: -3.0px display-lg: fontFamily: Linear Display fontSize: 56px fontWeight: 600 lineHeight: 1.10 letterSpacing: -1.8px display-md: fontFamily: Linear Display fontSize: 40px fontWeight: 600 lineHeight: 1.15 letterSpacing: -1.0px headline: fontFamily: Linear Display fontSize: 28px fontWeight: 600 lineHeight: 1.20 letterSpacing: -0.6px card-title: fontFamily: Linear Display fontSize: 22px fontWeight: 500 lineHeight: 1.25 letterSpacing: -0.4px subhead: fontFamily: Linear Display fontSize: 20px fontWeight: 400 lineHeight: 1.40 letterSpacing: -0.2px body-lg: fontFamily: Linear Text fontSize: 18px fontWeight: 400 lineHeight: 1.50 letterSpacing: -0.1px body: fontFamily: Linear Text fontSize: 16px fontWeight: 400 lineHeight: 1.50 letterSpacing: -0.05px body-sm: fontFamily: Linear Text fontSize: 14px fontWeight: 400 lineHeight: 1.50 letterSpacing: 0 caption: fontFamily: Linear Text fontSize: 12px fontWeight: 400 lineHeight: 1.40 letterSpacing: 0 button: fontFamily: Linear Text fontSize: 14px fontWeight: 500 lineHeight: 1.20 letterSpacing: 0 eyebrow: fontFamily: Linear Text fontSize: 13px fontWeight: 500 lineHeight: 1.30 letterSpacing: 0.4px mono: fontFamily: Linear Mono fontSize: 13px fontWeight: 400 lineHeight: 1.50 letterSpacing: 0 rounded: xs: 4px sm: 6px md: 8px lg: 12px xl: 16px xxl: 24px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 8px 14px button-primary-pressed: backgroundColor: "{colors.primary-focus}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" button-primary-hover: backgroundColor: "{colors.primary-hover}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" button-secondary: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 8px 14px button-tertiary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 8px 14px button-inverse: backgroundColor: "{colors.inverse-canvas}" textColor: "{colors.inverse-ink}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 8px 14px pricing-card: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.lg}" padding: 24px pricing-card-featured: backgroundColor: "{colors.surface-2}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.lg}" padding: 24px feature-card: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.lg}" padding: 24px product-screenshot-card: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xl}" padding: 24px testimonial-card: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body-lg}" rounded: "{rounded.lg}" padding: 32px customer-logo-tile: backgroundColor: "{colors.canvas}" textColor: "{colors.ink-subtle}" typography: "{typography.caption}" rounded: "{rounded.xs}" padding: 16px text-input: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: 8px 12px text-input-focused: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: 8px 12px pricing-tab-default: backgroundColor: "{colors.canvas}" textColor: "{colors.ink-subtle}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 6px 14px pricing-tab-selected: backgroundColor: "{colors.surface-2}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 6px 14px cta-banner: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.headline}" rounded: "{rounded.lg}" padding: 48px changelog-row: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xs}" padding: 24px 0 status-badge: backgroundColor: "{colors.surface-2}" textColor: "{colors.ink-muted}" typography: "{typography.caption}" rounded: "{rounded.pill}" padding: 2px 8px top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.xs}" height: 56px footer: backgroundColor: "{colors.canvas}" textColor: "{colors.ink-subtle}" typography: "{typography.caption}" rounded: "{rounded.xs}" padding: 64px 32px --- ## Overview Linear's marketing canvas is the deepest dark surface in this collection — `{colors.canvas}` is #010102, essentially pure black with a faint blue tint. On top sits a four-step surface ladder (`{colors.surface-1}` through `{colors.surface-4}`) for cards, panels, and lifted tiles, with hairline borders running from `{colors.hairline}` (#23252a) up through `{colors.hairline-strong}` and `{colors.hairline-tertiary}`. Light gray text (`{colors.ink}` #f7f8f8) carries the body and headlines. The single chromatic accent is **Linear lavender-blue** `{colors.primary}` (#5e6ad2) — used on the brand mark, focus rings, and the primary CTA button. A lighter hover state (`{colors.primary-hover}` #828fff) and a focus-tinted variant (`{colors.primary-focus}` #5e69d1) extend the same hue. Linear avoids saturated greens, oranges, reds, etc. on the marketing canvas — the only semantic color is `{colors.semantic-success}` (#27a644) for status pills and the rare success indicator. Display type runs Linear's custom sans (with `SF Pro Display` fallback) at weight 500–700 with negative letter-spacing scaling from -3.0px at 80px down to 0 at body. The body family is Linear's text cut, and a Linear Mono is reserved for code snippets in product screenshots. The page rhythm is **dense product screenshots** — Linear's marketing leads with high-fidelity captures of the product UI (issue list, project view, dashboard) framed in `{colors.surface-1}` panels with `{rounded.xl}` 16px corners. The chrome is intentionally minimal so the app screenshots can do the heavy lifting. **Key Characteristics:** - **Dark-canvas marketing system** — `{colors.canvas}` (#010102) is the deepest dark in this collection. - **Lavender-blue brand accent** (`{colors.primary}` #5e6ad2) — used scarcely on brand mark, focus, and the primary CTA. - Four-step surface ladder (canvas → surface-1 → surface-2 → surface-3 → surface-4) carries hierarchy without shadow. - Display tracking pulls aggressively negative (-3.0px at 80px); body holds at -0.05px. - Cards use `{rounded.lg}` 12px corners with 1px hairline borders — never pill, rarely 16px. - **Product UI screenshots** dominate the page. The marketing chrome is a dark frame for the app. - No second chromatic color. No atmospheric gradients. No spotlight cards. ## Colors > Source pages: linear.app (home), /intake, /pricing, /contact/sales, /build. ### Brand & Accent - **Lavender-Blue** ({colors.primary}): The signature Linear accent — primary CTA, brand mark, link emphasis. - **Lavender Hover** ({colors.primary-hover}): Lighter lavender (#828fff) — hovered state of the primary CTA. - **Lavender Focus** ({colors.primary-focus}): Focus-ring tint (#5e69d1) — focused inputs, focused buttons. - **Brand Secure** ({colors.brand-secure}): Muted lavender-gray (#7a7fad) — used in "Linear Security" surfaces. ### Surface - **Canvas** ({colors.canvas}): Default page background — #010102, near-pure black with a faint blue tint. - **Surface 1** ({colors.surface-1}): One step above canvas — feature cards, pricing cards, product screenshot panels. - **Surface 2** ({colors.surface-2}): Two steps above — featured pricing card, hovered cards. - **Surface 3** ({colors.surface-3}): Three steps above — line-tertiary backgrounds, sub-nav. - **Surface 4** ({colors.surface-4}): Four steps above — bg-level-3, deepest lifted surface. - **Hairline** ({colors.hairline}): 1px borders on cards and dividers. - **Hairline Strong** ({colors.hairline-strong}): Stronger 1px borders — input focus rings. - **Hairline Tertiary** ({colors.hairline-tertiary}): Tertiary borders for nested surfaces. - **Inverse Canvas** ({colors.inverse-canvas}): Pure white — surface of the inverse pill CTA on a small set of section openers. - **Inverse Surface 1** ({colors.inverse-surface-1}): One step above inverse canvas. - **Inverse Surface 2** ({colors.inverse-surface-2}): Two steps above inverse canvas. ### Text - **Ink** ({colors.ink}): All headlines and emphasized body type — light gray #f7f8f8. - **Ink Muted** ({colors.ink-muted}): Secondary type at #d0d6e0 — meta info on hero panels. - **Ink Subtle** ({colors.ink-subtle}): Tertiary type at #8a8f98 — deselected pricing tabs, footer columns. - **Ink Tertiary** ({colors.ink-tertiary}): Quaternary at #62666d — disabled, footnotes. ### Semantic - **Success Green** ({colors.semantic-success}): Status pills, success indicators. The only semantic color on marketing. - **Overlay** ({colors.semantic-overlay}): Pure black overlay scrim for modals. ## Typography ### Font Family - **Linear Display** — Linear's custom display sans; fallback `SF Pro Display, -apple-system, system-ui, Segoe UI, Roboto`. Carries display-xl through subhead. - **Linear Text** — Linear's custom text sans (a slightly different cut tuned for body sizes); same fallback stack. Carries body sizes, button labels, captions. - **Linear Mono** — Linear's custom mono; fallback `ui-monospace, SF Mono, Menlo`. Used for code snippets in product screenshots and for status / ID tokens. The marketing surface treats Display and Text as one continuous voice; the family change is silent. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 80px | 600 | 1.05 | -3.0px | Largest hero headline | | `{typography.display-lg}` | 56px | 600 | 1.10 | -1.8px | Section opener headlines | | `{typography.display-md}` | 40px | 600 | 1.15 | -1.0px | Sub-section headlines | | `{typography.headline}` | 28px | 600 | 1.20 | -0.6px | Pricing tier titles, CTA banner heading | | `{typography.card-title}` | 22px | 500 | 1.25 | -0.4px | Feature card title | | `{typography.subhead}` | 20px | 400 | 1.40 | -0.2px | Lead body, intro paragraphs | | `{typography.body-lg}` | 18px | 400 | 1.50 | -0.1px | Hero subhead, lead paragraphs | | `{typography.body}` | 16px | 400 | 1.50 | -0.05px | Default body | | `{typography.body-sm}` | 14px | 400 | 1.50 | 0 | Card body, footer columns | | `{typography.caption}` | 12px | 400 | 1.40 | 0 | Captions, meta, status | | `{typography.button}` | 14px | 500 | 1.20 | 0 | All button labels | | `{typography.eyebrow}` | 13px | 500 | 1.30 | 0.4px | Section eyebrow (slight positive tracking) | | `{typography.mono}` | 13px | 400 | 1.50 | 0 | Linear Mono for code in product screenshots | ### Principles - **Aggressive negative tracking on display** (-3.0px at 80px ≈ 4% of size). - **Single voice from display to body.** Display-xl at 600 → body at 400 — same family, narrower weights. - **Eyebrow uses positive tracking** (+0.4px) — contrast against the negative-tracked display marks the eyebrow as taxonomy. - **Mono only in code contexts.** Linear Mono lives inside product screenshots — not on marketing chrome. ### Note on Font Substitutes Linear's custom typeface isn't publicly distributed; the documented fallback `SF Pro Display, -apple-system, system-ui` is the recommended substitute on macOS. For cross-platform implementation, **Inter** at weight 500 / 600 / 700 is the closest free substitute. **Geist Sans** is also viable. For mono, **JetBrains Mono** or **Geist Mono** at weight 400 closely approximates Linear Mono. ## Layout ### Spacing System - **Base unit**: 4px. - **Tokens (front matter)**: `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px. - Card interior padding: `{spacing.lg}` 24px on feature/pricing cards; `{spacing.xl}` 32px on testimonial cards; `{spacing.xxl}` 48px on CTA banners. - Pill button padding: 8px vertical · 14px horizontal — Linear's compact button spec. - Form input padding: 8px vertical · 12px horizontal. ### Grid & Container - Max content width sits around 1280px. - Card grids are 3-up at desktop, 2-up at tablet, 1-up at mobile. - Pricing tier grid is 3-up; comparison strip below shows checkmarks per tier. - Product screenshot panels span full content width — they're the protagonist. ### Whitespace Philosophy The dark canvas IS the whitespace. Sections separate by lift onto surface-1 panels, not by gaps in white. Within a panel, generous `{spacing.lg}` 24px gaps between content blocks; `{spacing.section}` 96px between sections. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 (flat) | No shadow, no border | Default for body type, hero text, footer | | 1 (charcoal lift) | `{colors.surface-1}` background on canvas, 1px `{colors.hairline}` | Default cards, product panels | | 2 (surface-2 lift) | `{colors.surface-2}` background, 1px `{colors.hairline-strong}` | Featured pricing card, hovered cards | | 3 (surface-3 lift) | `{colors.surface-3}` background | Sub-nav, dropdown menus | | 4 (focus ring) | 2px `{colors.primary-focus}` outline at 50% opacity | Focused input, focused button | Linear's depth is carried by surface ladder + hairline borders. The brand resists drop shadows on dark almost entirely. ### Decorative Depth - **Product UI screenshots** dominate as decorative depth. - **No atmospheric gradients, no spotlight cards.** - **Subtle white edge highlight** on the top edge of lifted panels — gives the dark surface a faint "pixel rendered" feel. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Small chips, status badges | | `{rounded.sm}` | 6px | Inline tags | | `{rounded.md}` | 8px | All buttons, form inputs | | `{rounded.lg}` | 12px | Pricing cards, feature cards, testimonial cards | | `{rounded.xl}` | 16px | Product screenshot panels | | `{rounded.xxl}` | 24px | Oversized CTA banners (rare) | | `{rounded.pill}` | 9999px | Pricing tab toggles, status pills | | `{rounded.full}` | 9999px | Avatar circles | ### Photography & Illustration Geometry - Product UI screenshots dominate; they sit in `{rounded.xl}` 16px tiles with `{spacing.lg}` 24px outer padding. - Customer logo tiles render at small sizes (~24px logo height) on `{colors.canvas}` with no border. - Avatar circles in testimonial cards use `{rounded.full}` at 32–40px sizes. ## Components ### Buttons **`button-primary`** — Lavender CTA. The default primary CTA across all pages. - Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.button}`, padding 8px 14px, rounded `{rounded.md}`. - Pressed state lives in `button-primary-pressed` (background shifts to `{colors.primary-focus}`). - Hover state lives in `button-primary-hover` (background shifts to `{colors.primary-hover}` lighter lavender). **`button-secondary`** — Charcoal button. Used for secondary CTAs ("Sign in", "Read changelog"). - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.button}`, padding 8px 14px, rounded `{rounded.md}`. 1px `{colors.hairline}` border. **`button-tertiary`** — Plain text button. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 8px 14px. **`button-inverse`** — White-on-dark inverse CTA. - Background `{colors.inverse-canvas}`, text `{colors.inverse-ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 8px 14px. ### Pricing Tabs **`pricing-tab-default`** + **`pricing-tab-selected`** — Pill-toggle on `/pricing`. - Default: `{colors.canvas}` background, `{colors.ink-subtle}` text, rounded `{rounded.pill}`, padding 6px 14px. - Selected: `{colors.surface-2}` background, `{colors.ink}` text — selected = surface lift. ### Cards & Containers **`pricing-card`** — Each tier on `/pricing`. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px. 1px `{colors.hairline}` border. **`pricing-card-featured`** — Recommended tier — surface lift to surface-2. - Background `{colors.surface-2}`, otherwise identical structure. **`feature-card`** — Generic feature highlight tile. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px. **`product-screenshot-card`** — The dominant card type — frames a high-fidelity Linear app UI screenshot. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.xl}`, padding 24px. **`testimonial-card`** — Customer quote with avatar + name + role. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body-lg}`, rounded `{rounded.lg}`, padding 32px. **`customer-logo-tile`** — Small tile in the customer marquee. - Background `{colors.canvas}`, text `{colors.ink-subtle}`, type `{typography.caption}`, rounded `{rounded.xs}`, padding 16px. **`cta-banner`** — Closing CTA panel near page bottom. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.headline}`, rounded `{rounded.lg}`, padding 48px. ### Inputs & Forms **`text-input`** + **`text-input-focused`** — Form fields on `/contact/sales` and signup overlays. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.md}`, padding 8px 12px. - Focused state retains the same surface; the focus ring is a 2px `{colors.primary-focus}` outline at 50% opacity. ### Status & Build Page **`changelog-row`** — Each row in `/build` (changelog page) listing version, date, and changes. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.xs}`, padding 24px 0. 1px `{colors.hairline}` bottom rule. **`status-badge`** — Small status pill. - Background `{colors.surface-2}`, text `{colors.ink-muted}`, type `{typography.caption}`, rounded `{rounded.pill}`, padding 2px 8px. ### Navigation **`top-nav`** — Sticky dark bar with the Linear wordmark left, primary nav links centered, and a `button-secondary` ("Sign in") + `button-primary` ("Get started") pair right. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-sm}`, height 56px. ### Footer **`footer`** — Dense link grid on `{colors.canvas}` with the Linear wordmark left. - Background `{colors.canvas}`, text `{colors.ink-subtle}`, type `{typography.caption}`, padding 64px 32px. ## Do's and Don'ts ### Do - Reserve `{colors.canvas}` (#010102) as the system's anchor surface — the faint blue tint is intentional. - Use `{colors.primary}` lavender ONLY for: brand mark, primary CTA, focus ring, link emphasis. - Use the four-step surface ladder for hierarchy. Avoid skipping levels. - Pair display weight 600 with body weight 400 — Linear resists 700+ display weights. - Apply negative letter-spacing aggressively on display. - Use product UI screenshots as the protagonist of every section. - Compose CTAs as `{rounded.md}` 8px corners. ### Don't - Don't ship a light-mode marketing page. - Don't use lavender as a section background or card fill. - Don't introduce a second chromatic accent (orange, pink, green for marketing). - Don't add atmospheric gradients or spotlight cards. - Don't pill-round CTAs. - Don't use `#000000` true black as the canvas. - Don't combine multiple bright accents in product screenshot mockups. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Desktop-XL | 1440px | Default desktop layout | | Desktop | 1280px | Card grid 3-up maintained | | Tablet | 1024px | Card grid 3-up → 2-up | | Mobile-Lg | 768px | Pricing comparison becomes accordion; nav hamburger | | Mobile | 480px | Single-column; display-xl scales 80px → ~36px | ### Touch Targets - CTAs hold ≥40px tap height across viewports. - Pricing tab pills hold ≥36px tap height; touch viewports grow to ≥44px. - Form inputs hold ≥44px tap target on touch. ### Collapsing Strategy - **Top nav**: links collapse to hamburger below 768px. - **Card grids**: 3-up → 2-up at 1024px → 1-up below 768px. - **Pricing comparison**: per-tier accordion below 768px. - **Display type**: `{typography.display-xl}` 80px scales toward `{typography.display-md}` 40px on mobile. ### Image Behavior - Product UI screenshots maintain aspect ratio and never crop. - Customer logos in the marquee may collapse from 6-up to 3-up below 768px. ## Iteration Guide 1. Focus on ONE component at a time and reference it by its `components:` token name. 2. When introducing a section, decide first which surface lift it lives on. 3. Default body to `{typography.body}` at weight 400. 4. Run `npx @google/design.md lint DESIGN.md` after edits. 5. Add new variants as separate component entries. 6. Treat lavender as scarce: brand mark, primary CTA, focus, link emphasis. 7. Lead every section with a product UI screenshot. ## Known Gaps - The four-step surface ladder values are extracted directly from Linear's `--color-bg-level-3`, `--color-line-tint`, etc. CSS variables; they are Linear's canonical surface spec. - Form-field error and validation styling is not visible on the inspected pages. - Light mode is not documented because the marketing site does not ship a light theme. - Linear's actual product UI uses a richer color-tag palette (red, orange, yellow, green, blue, purple) for issue priorities and project labels — those colors live in the in-product surfaces shown in mockups. - The custom display, text, and mono families are proprietary; an open-source substitute is acceptable.
Apple.com Web Style
Clean Premium HIG
Apple Spec
复制
遵循苹果官方人机交互指南(HIG)的经典网页设计,强调极致的内容遵从、宽留白与优雅的毛玻璃层级。
San Francisco 字体
毛玻璃顶栏
宽幅留白
--- version: alpha name: Apple-design-analysis description: A photography-first interface that turns marketing into a museum gallery. Edge-to-edge product tiles alternate light and dark canvases, framed by SF Pro Display headlines with negative letter-spacing and a single Action Blue (#0066cc) interactive color. UI chrome recedes so the product can speak — no decorative gradients, no shadows on chrome, only the one signature drop-shadow under product imagery resting on a surface. colors: primary: "#0066cc" primary-focus: "#0071e3" primary-on-dark: "#2997ff" ink: "#1d1d1f" body: "#1d1d1f" body-on-dark: "#ffffff" body-muted: "#cccccc" ink-muted-80: "#333333" ink-muted-48: "#7a7a7a" divider-soft: "#f0f0f0" hairline: "#e0e0e0" canvas: "#ffffff" canvas-parchment: "#f5f5f7" surface-pearl: "#fafafc" surface-tile-1: "#272729" surface-tile-2: "#2a2a2c" surface-tile-3: "#252527" surface-black: "#000000" surface-chip-translucent: "#d2d2d7" on-primary: "#ffffff" on-dark: "#ffffff" typography: hero-display: fontFamily: "SF Pro Display, system-ui, -apple-system, sans-serif" fontSize: 56px fontWeight: 600 lineHeight: 1.07 letterSpacing: -0.28px display-lg: fontFamily: "SF Pro Display, system-ui, -apple-system, sans-serif" fontSize: 40px fontWeight: 600 lineHeight: 1.1 letterSpacing: 0 display-md: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 34px fontWeight: 600 lineHeight: 1.47 letterSpacing: -0.374px lead: fontFamily: "SF Pro Display, system-ui, -apple-system, sans-serif" fontSize: 28px fontWeight: 400 lineHeight: 1.14 letterSpacing: 0.196px lead-airy: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 24px fontWeight: 300 lineHeight: 1.5 letterSpacing: 0 tagline: fontFamily: "SF Pro Display, system-ui, -apple-system, sans-serif" fontSize: 21px fontWeight: 600 lineHeight: 1.19 letterSpacing: 0.231px body-strong: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 17px fontWeight: 600 lineHeight: 1.24 letterSpacing: -0.374px body: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 17px fontWeight: 400 lineHeight: 1.47 letterSpacing: -0.374px dense-link: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 17px fontWeight: 400 lineHeight: 2.41 letterSpacing: 0 caption: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.43 letterSpacing: -0.224px caption-strong: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 14px fontWeight: 600 lineHeight: 1.29 letterSpacing: -0.224px button-large: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 18px fontWeight: 300 lineHeight: 1.0 letterSpacing: 0 button-utility: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.29 letterSpacing: -0.224px fine-print: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 12px fontWeight: 400 lineHeight: 1.0 letterSpacing: -0.12px micro-legal: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 10px fontWeight: 400 lineHeight: 1.3 letterSpacing: -0.08px nav-link: fontFamily: "SF Pro Text, system-ui, -apple-system, sans-serif" fontSize: 12px fontWeight: 400 lineHeight: 1.0 letterSpacing: -0.12px rounded: none: 0px xs: 5px sm: 8px md: 11px lg: 18px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 17px lg: 24px xl: 32px xxl: 48px section: 80px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.body}" rounded: "{rounded.pill}" padding: 11px 22px button-primary-focus: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" rounded: "{rounded.pill}" button-primary-active: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" rounded: "{rounded.pill}" button-secondary-pill: backgroundColor: "{colors.canvas}" textColor: "{colors.primary}" typography: "{typography.body}" rounded: "{rounded.pill}" padding: 11px 22px button-dark-utility: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" typography: "{typography.button-utility}" rounded: "{rounded.sm}" padding: 8px 15px button-pearl-capsule: backgroundColor: "{colors.surface-pearl}" textColor: "{colors.ink-muted-80}" typography: "{typography.caption}" rounded: "{rounded.md}" padding: 8px 14px button-store-hero: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-large}" rounded: "{rounded.pill}" padding: 14px 28px button-icon-circular: backgroundColor: "{colors.surface-chip-translucent}" textColor: "{colors.ink}" rounded: "{rounded.full}" size: 44px text-link: backgroundColor: transparent textColor: "{colors.primary}" typography: "{typography.body}" text-link-on-dark: backgroundColor: transparent textColor: "{colors.primary-on-dark}" typography: "{typography.body}" global-nav: backgroundColor: "{colors.surface-black}" textColor: "{colors.on-dark}" typography: "{typography.nav-link}" height: 44px sub-nav-frosted: backgroundColor: "{colors.canvas-parchment}" textColor: "{colors.ink}" typography: "{typography.tagline}" height: 52px product-tile-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-lg}" rounded: "{rounded.none}" padding: 80px product-tile-parchment: backgroundColor: "{colors.canvas-parchment}" textColor: "{colors.ink}" typography: "{typography.display-lg}" rounded: "{rounded.none}" padding: 80px product-tile-dark: backgroundColor: "{colors.surface-tile-1}" textColor: "{colors.on-dark}" typography: "{typography.display-lg}" rounded: "{rounded.none}" padding: 80px product-tile-dark-2: backgroundColor: "{colors.surface-tile-2}" textColor: "{colors.on-dark}" rounded: "{rounded.none}" product-tile-dark-3: backgroundColor: "{colors.surface-tile-3}" textColor: "{colors.on-dark}" rounded: "{rounded.none}" store-utility-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-strong}" rounded: "{rounded.lg}" padding: 24px configurator-option-chip: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.caption}" rounded: "{rounded.pill}" padding: 12px 16px configurator-option-chip-selected: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.pill}" search-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.pill}" padding: 12px 20px height: 44px floating-sticky-bar: backgroundColor: "{colors.canvas-parchment}" textColor: "{colors.ink}" typography: "{typography.body}" height: 64px padding: 12px 32px environment-quote-card: backgroundColor: "{colors.surface-tile-1}" textColor: "{colors.on-dark}" typography: "{typography.display-lg}" rounded: "{rounded.none}" padding: 80px footer: backgroundColor: "{colors.canvas-parchment}" textColor: "{colors.ink-muted-80}" typography: "{typography.fine-print}" padding: 64px --- ## Overview Apple's web presence is a masterclass in **reverent product photography framed by near-invisible UI**. Every page is a stack of edge-to-edge product "tiles" — alternating light and dark canvases, each centered on a hero headline, a one-line tagline, two tiny blue pill CTAs, and an impossibly crisp product render. Nothing competes with the product. Typography is confident but quiet; color is either pure white, an off-white parchment, or a near-black tile; interactive elements are a single, quiet blue. Density is unusually low even by contemporary SaaS standards. Each tile occupies roughly one viewport, and there is no decorative chrome — no borders, no gradients, no decorative frames, no shadows on headlines. Elevation appears only when a product image rests on a surface (a single soft `rgba(0, 0, 0, 0.22) 3px 5px 30px` drop for visual weight). The result is a catalog that feels more like a museum gallery: the wall disappears and the artifact takes over. Store and shop surfaces retain the same chassis but switch modes. The product configurator (iPhone 17 Pro, accessories grid) introduces a tight grid of white utility cards at `{rounded.lg}` (18px) radius with a thin border, paired with a persistent thin sub-nav strip. The environment page leans darker and more editorial. Across all five surfaces the typographic system, spacing rhythm, and the single blue accent are consistent — this is one design language expressed at different volumes. **Key Characteristics:** - Photography-first presentation; UI recedes so the product can speak. - Alternating full-bleed tile sections: white/parchment ↔ near-black, with the color change itself acting as the section divider. - Single blue accent (`{colors.primary}` — #0066cc) carries every interactive element. No second brand color exists. - Two button grammars: tiny blue pill CTAs (`{rounded.pill}`) and compact utility rects (`{rounded.sm}`). - SF Pro Display + SF Pro Text — negative letter-spacing at display sizes for the signature "Apple tight" headline feel. - Whisper-soft elevation used only when a product image needs to breathe — exactly one drop-shadow in the entire system. - Tight two-row nav: slim `{component.global-nav}` + product-specific `{component.sub-nav-frosted}` with persistent right-aligned primary CTA. - Section rhythm across multiple pages: light hero → dark product tile → light utility tile → dark tile → parchment footer — a predictable pulse. ## Colors > **Source pages analyzed:** homepage, environment, store, iPhone 17 Pro buy page, accessories index. The color system is identical across all five surfaces; only the surface-mode mix differs. ### Brand & Accent - **Action Blue** (`{colors.primary}` — #0066cc): The single brand-level interactive color. All text links, all blue pill CTAs ("Learn more", "Buy"), and the focus ring root. This is Apple's quiet but universal "click me" signal. Press state shifts to a slightly darker variant via the active scale transform rather than a hex change. - **Focus Blue** (`{colors.primary-focus}` — #0071e3): A marginally brighter sibling of Action Blue, reserved for the keyboard focus ring on buttons (`outline: 2px solid`). - **Sky Link Blue** (`{colors.primary-on-dark}` — #2997ff): A brighter blue used on dark surfaces for in-copy links and inline callouts, where Action Blue would disappear against the tile background. ### Surface - **Pure White** (`{colors.canvas}` — #ffffff): The dominant canvas. Content, utility cards, store tiles, configurator grids. - **Parchment** (`{colors.canvas-parchment}` — #f5f5f7): The signature Apple off-white. Used for alternating light tiles, footer region, and the default page canvas in store utility sections. Just different enough from white to create rhythm. - **Pearl Button** (`{colors.surface-pearl}` — #fafafc): A near-white used as the fill for secondary "ghost" buttons — lighter than the parchment canvas so the button still reads as a button against `{colors.canvas-parchment}`. - **Near-Black Tile 1** (`{colors.surface-tile-1}` — #272729): The primary dark-tile surface on the homepage product grid. - **Near-Black Tile 2** (`{colors.surface-tile-2}` — #2a2a2c): A micro-step lighter — used where a dark tile sits directly above or below Tile 1 to create the faintest separation. - **Near-Black Tile 3** (`{colors.surface-tile-3}` — #252527): A micro-step darker — used at the bottom of the stack and in embedded video/player frames. - **Pure Black** (`{colors.surface-black}` — #000000): Reserved for true void — video player backgrounds, edge-to-edge photographic overlays, the global nav bar background. - **Translucent Chip Gray** (`{colors.surface-chip-translucent}` — #d2d2d7): The base hex of the translucent gray chip used over photography for circular control buttons. In production, applied at ~64% alpha as `rgba(210, 210, 215, 0.64)`. ### Text - **Near-Black Ink** (`{colors.ink}` — #1d1d1f): The voice of every headline, every body paragraph, and the dark utility button's fill. Chosen instead of pure black to keep the page feeling photographic rather than printed. - **Body** (`{colors.body}` — #1d1d1f): Same hex as ink — Apple uses one near-black tone for all text on light surfaces. - **Body On Dark** (`{colors.body-on-dark}` — #ffffff): All text on dark tiles and on the global nav bar. - **Body Muted** (`{colors.body-muted}` — #cccccc): Secondary copy on dark tiles where pure white would be too loud. - **Ink Muted 80** (`{colors.ink-muted-80}` — #333333): Body text on the white Pearl Button surface — slightly softer than pure black. - **Ink Muted 48** (`{colors.ink-muted-48}` — #7a7a7a): Disabled button text and legal fine-print. ### Hairlines & Borders - **Divider Soft** (`{colors.divider-soft}` — #f0f0f0): The "border" tone on secondary buttons — functions as a ring shadow rather than a hard line. In production, often applied as `rgba(0, 0, 0, 0.04)`. - **Hairline** (`{colors.hairline}` — #e0e0e0): The 1px hairline border on store utility cards and configurator chips. ### Brand Gradient **No decorative gradients.** Atmospheric depth on product photography (the iPhone 17 Pro camera plate, the Apple Watch bands, AirPods reflections) is inherent to the imagery, not a CSS gradient overlay. The environment page's hero uses photographic atmosphere (mountain vista at dawn) but no gradient tokens are defined. Apple is the rare luxury-brand site with zero gradient-based design tokens. ## Typography ### Font Family - **Display**: `SF Pro Display, system-ui, -apple-system, sans-serif` — Apple's proprietary display face, optimized for sizes ≥ 19px. Defines the voice of every headline. - **Body / UI**: `SF Pro Text, system-ui, -apple-system, sans-serif` — the text-optimized variant used for body copy, captions, buttons, and links below 20px. - **OpenType features**: `font-variant-numeric: numerator` is enabled on numeric links (pricing tables, spec sheets). Display sizes rely on tight tracking rather than contextual ligatures. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.hero-display}` | 56px | 600 | 1.07 | -0.28px | Hero headline; the signature "Apple tight" tracking | | `{typography.display-lg}` | 40px | 600 | 1.10 | 0 | Tile headlines atop every product tile | | `{typography.display-md}` | 34px | 600 | 1.47 | -0.374px | Section heads (SF Pro Text at display proportions) | | `{typography.lead}` | 28px | 400 | 1.14 | 0.196px | Product tile subcopy | | `{typography.lead-airy}` | 24px | 300 | 1.5 | 0 | Environment-page lead paragraphs (the rare weight 300) | | `{typography.tagline}` | 21px | 600 | 1.19 | 0.231px | Sub-tile tagline; sub-nav category name | | `{typography.body-strong}` | 17px | 600 | 1.24 | -0.374px | Inline strong emphasis | | `{typography.body}` | 17px | 400 | 1.47 | -0.374px | Default paragraph | | `{typography.dense-link}` | 17px | 400 | 2.41 | 0 | Footer / store utility link lists (relaxed leading) | | `{typography.caption}` | 14px | 400 | 1.43 | -0.224px | Secondary captions, button text | | `{typography.caption-strong}` | 14px | 600 | 1.29 | -0.224px | Emphasized captions | | `{typography.button-large}` | 18px | 300 | 1.0 | 0 | Store hero CTAs (the rare weight 300) | | `{typography.button-utility}` | 14px | 400 | 1.29 | -0.224px | Utility/nav button labels | | `{typography.fine-print}` | 12px | 400 | 1.0 | -0.12px | Fine-print, footer body | | `{typography.micro-legal}` | 10px | 400 | 1.3 | -0.08px | Micro legal disclaimers | | `{typography.nav-link}` | 12px | 400 | 1.0 | -0.12px | Global nav menu items | ### Principles - **Negative letter-spacing at display sizes.** Every headline at 17px and up carries a slight tracking tighten (`-0.12 → -0.374px`). This produces the iconic "Apple tight" headline cadence. Never used at 12px or below. - **Body copy at 17px, not 16px.** Apple breaks the SaaS convention and runs paragraph text at 17px. The extra pixel gives the page an unmistakable "reading, not scanning" pace. - **Weight 300 is real and rare.** Used deliberately on a handful of large-size reads (`{typography.button-large}` at 18px/300 and `{typography.lead-airy}` at 24px/300). It's not an accident — it's a light-atmosphere cue reserved for moments where the content should feel airy. - **Weight 600, not 700, for headlines.** Apple's headlines sit at weight 600. Weight 700 is used sparingly for `{typography.tagline}` (21px) when a touch more assertion is needed. - **Line-height is context-specific.** Display sizes use 1.07–1.19 (tight). Body uses 1.47. Utility link stacks in the footer/store use an unusually relaxed 2.41 (`{typography.dense-link}`). The 2.41 is not a bug — it's how the footer's dense link columns breathe. - **Weight 500 is deliberately absent.** The ladder is 300 / 400 / 600 / 700. Mid-weight readings always use 600. ### Note on Font Substitutes SF Pro is Apple's proprietary system font. When building off-system: - Use `system-ui, -apple-system, BlinkMacSystemFont` as the first stack entry — on macOS/iOS/Safari this resolves to the real SF Pro. - For non-Apple platforms, **Inter** (Google Fonts, variable) is the closest open-source equivalent. Inter at weight 600 with `font-feature-settings: "ss03"` approximates SF Pro's rounded "a" character. - Nudge `letter-spacing` down by `-0.01em` on display sizes to re-create the Apple tight feel; Inter's default tracking runs slightly wider than SF Pro. - For body text, tighten line-height by `0.03` (from 1.47 → 1.44) when substituting Inter — Inter's taller x-height needs less leading. ## Layout ### Spacing System - **Base unit:** 8px. Sub-base values (2, 4, 5, 6, 7) are used for tight typographic adjustments; structural layout snaps to 8/12/16/20/24. - **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 17px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 80px. - **Section vertical padding:** `{spacing.section}` (80px) inside a product tile; tiles stack edge-to-edge with 0 gap (the color change provides the break). - **Card padding:** `{spacing.lg}` (24px) inside utility grid cards. - **Button padding:** 8–11px vertical, 15–22px horizontal. - **Universal rhythm constants:** the 17px body line-height multiplier (~25px line) and 21px tagline size show up on every analyzed page. ### Grid & Container - **Max content width:** ~980px on text-heavy sections (environment), ~1440px on product grids (store, accessories), full-bleed for product tiles (homepage). - **Column patterns:** 3 to 5 column utility card grid on store/accessories; 2-column side-by-side tiles on homepage occasional sections; single-column centered stack on product tile heroes. - **Gutters:** 20–24px between cards in a utility grid. ### Whitespace Philosophy Apple's whitespace is the product's pedestal. Every tile begins with at least 64px of air above its headline and 48–64px below. Product renders are never crowded; the nearest content to a product image is at least 40px away. The footer is the only area that breaks this — there, Apple goes deliberately dense to make the full information architecture visible at a glance. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat | No shadow, no border | Full-bleed tiles, global nav, footer, body sections | | Soft hairline | 1px `rgba(0, 0, 0, 0.08)` border | Utility cards, sub-nav frosted-glass separator | | Backdrop blur | `backdrop-filter: blur(N)` on Parchment 80% | Sub-nav and the iPhone buy floating sticky bar | | Product shadow | `rgba(0, 0, 0, 0.22) 3px 5px 30px 0` | Product renders resting on a surface (the only true "shadow" in the system) | **Shadow philosophy.** Apple uses **exactly one** drop-shadow, and it is applied to photographic product imagery — never to cards, never to buttons, never to text. Elevation in the UI comes from (a) surface-color change (light tile ↔ dark tile) and (b) backdrop-blur on sticky bars. The single shadow is about giving the product weight, not about UI hierarchy. ### Decorative Depth - **Atmospheric imagery** on the environment page (photographic vista) supplies mood; no CSS gradient involved. - **Edge-to-edge tile alternation** creates rhythm without borders or shadows — the color change itself is the divider. - **Backdrop-filter blur** on `{component.sub-nav-frosted}` and `{component.floating-sticky-bar}` creates a "floating over content" effect that's functional, not decorative. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Full-bleed product tiles (no corner rounding) | | `{rounded.xs}` | 5px | Inline links when styled as subtle chips (rare) | | `{rounded.sm}` | 8px | Dark utility buttons (Sign In, Bag), inline card imagery | | `{rounded.md}` | 11px | White Pearl Button capsules | | `{rounded.lg}` | 18px | Store utility cards, accessories grid cards | | `{rounded.pill}` | 9999px | Primary blue pill CTAs, sub-nav buy button, configurator option chips, search input — the signature Apple pill | | `{rounded.full}` | 9999px / 50% | Circular control chips floating over photography | ### Photography Geometry - **Hero imagery**: full-bleed, 21:9 or taller on the homepage; 16:9 on environment and shop pages. Product renders are photographic-realistic, often shot on a tinted surface that becomes the tile background. - **Product renders**: PNG/WebP with transparency; rest on a surface tile and pick up the system shadow. - **Accessory grid**: square 1:1 crops at `{rounded.lg}` (18px) radius, light neutral backgrounds, product centered with 20–40px internal padding. - **No rounded imagery in hero tiles** — images are full-bleed rectangular. Rounding (`{rounded.sm}`, `{rounded.lg}`) appears only on inline card imagery. - Lazy-loading via responsive `srcset` and `sizes` across all breakpoints; CDN-optimized WebP. ## Components ### Top Navigation **`global-nav`** — Persistent, ultra-thin black nav bar pinned to the top of every page. Background `{colors.surface-black}`, height 44px, text `{colors.on-dark}` in `{typography.nav-link}` (12px / 400 / -0.12px tracking). Links are quiet, spaced ~20px apart, running edge-to-edge across the top. Right-aligned cluster: Search, Bag icons — always visible. On mobile, collapses to hamburger at ~834px and the Apple logo centers. **`sub-nav-frosted`** — Surface-specific nav that sticks below the global nav. Background `{colors.canvas-parchment}` at 80% opacity with backdrop-filter blur, creating a frosted-glass effect. Height 52px. Content on left: product category name ("iPhone", "Store", "Accessories") in `{typography.tagline}` (21px / 600). Content right: inline nav links in `{typography.button-utility}` (14px), ending in a persistent `{component.button-primary}` ("Buy") or a utility link. ### Buttons **`button-primary`** — The signature Apple action. Background `{colors.primary}` (Action Blue #0066cc), text `{colors.on-primary}` in `{typography.body}` (SF Pro Text 17px / 400), rounded `{rounded.pill}` (full pill — capsule-shaped), padding 11px × 22px. The full-pill radius IS the brand action signal. - Active state: `{component.button-primary-active}` — `transform: scale(0.95)` (the system-wide micro-interaction). - Focus state: `{component.button-primary-focus}` — 2px solid `{colors.primary-focus}` outline. **`button-secondary-pill`** — Used as the second CTA when two blue pills appear together ("Learn more" / "Buy"). Background transparent, text `{colors.primary}`, 1px solid `{colors.primary}` border, rounded `{rounded.pill}`, padding 11px × 22px. Reads as a "ghost pill." **`button-dark-utility`** — Global nav actions (Sign In, Bag, language selector). Background `{colors.ink}` (#1d1d1f), text `{colors.on-dark}` in `{typography.button-utility}` (14px / 400 / -0.224px tracking), rounded `{rounded.sm}` (8px), padding 8px × 15px. Active state shrinks via `transform: scale(0.95)`. **`button-pearl-capsule`** — Product-card secondary button. Background `{colors.surface-pearl}` (#fafafc), text `{colors.ink-muted-80}` in `{typography.caption}` (14px), 3px solid `{colors.divider-soft}` border (functions as a soft ring rather than a visible line), rounded `{rounded.md}` (11px), padding 8px × 14px. **`button-store-hero`** — A larger primary CTA used on store hero surfaces. Same Action Blue + Paper White as `{component.button-primary}`, but with `{typography.button-large}` (18px / 300 — note the rare weight 300) and slightly more padding (14px × 28px). Used sparingly on the store landing. **`button-icon-circular`** — Floats over photography. 44 × 44px, background `{colors.surface-chip-translucent}` at ~64% alpha, icon in `{colors.ink}`, rounded `{rounded.full}`. Used for carousel controls, close buttons, and in-image controls (product image thumbnails on the iPhone buy page). **`text-link`** — Inline body links in `{colors.primary}` (Action Blue). Underlined or non-underlined per context. **`text-link-on-dark`** — Inline body links on dark tiles in `{colors.primary-on-dark}` (Sky Link Blue #2997ff) — Action Blue would disappear against `{colors.surface-tile-1}`. ### Cards & Containers **`product-tile-light`** — Full-bleed light tile. Background `{colors.canvas}` (white), text `{colors.ink}`, rounded `{rounded.none}` (0 — tiles touch edges), vertical padding `{spacing.section}` (80px). Centered stack: product name in `{typography.display-lg}` (40px / 600) → one-line tagline in `{typography.lead}` (28px / 400) → two `{component.button-primary}` CTAs ("Learn more" / "Buy") → product render resting on the surface with the system shadow. **`product-tile-parchment`** — Same as `{component.product-tile-light}` but on `{colors.canvas-parchment}` (#f5f5f7). Used to break two consecutive white tiles. **`product-tile-dark`** — Full-bleed dark tile. Background `{colors.surface-tile-1}` (#272729), text `{colors.on-dark}`, rounded `{rounded.none}`, vertical padding `{spacing.section}` (80px). Same content stack as the light tile but with `{component.text-link-on-dark}` for inline copy and `{component.button-primary}` (Action Blue still works on the dark surface). Used on the homepage product grid as the alternating dark band. **`product-tile-dark-2`** — Variant on `{colors.surface-tile-2}` (#2a2a2c). Used where a dark tile sits directly above or below `{component.product-tile-dark}` to create the faintest separation through micro-step lightness change. **`product-tile-dark-3`** — Variant on `{colors.surface-tile-3}` (#252527). Used at the bottom of the stack and in embedded video/player frames. **`store-utility-card`** — Used in store grid and accessories grid. Background `{colors.canvas}` (white), 1px solid `{colors.hairline}` border, rounded `{rounded.lg}` (18px), padding `{spacing.lg}` (24px). Top: product image (1:1 crop with `{rounded.sm}` (8px) inner image radius). Below: product name in `{typography.body-strong}` (17px / 600), price in `{typography.body}` (17px / 400), and a `{component.text-link}` ("Buy" or "Learn more"). No shadow by default; product render itself carries the system product-shadow. **`configurator-option-chip`** — Pill-shaped tappable cell used in the iPhone 17 Pro buy page. Background `{colors.canvas}`, text `{colors.ink}` in `{typography.caption}`, rounded `{rounded.pill}`, padding 12px × 16px. Contains a small product thumbnail + label + price delta. Arranged in a grid of 4–5 options per row. **`configurator-option-chip-selected`** — Selected state. Border upgrades to 2px solid `{colors.primary-focus}`. Same shape, same content. **`environment-quote-card`** — A photographic-canvas hero specific to the environment page. Dark photographic backdrop (mountain vista at dawn) with `{colors.surface-tile-1}` as the fallback color, centered white-text headline in `{typography.display-lg}` (40px), small green "Apple 2030" pictographic logo above the headline, single `{component.button-primary}` below. Padding `{spacing.section}` (80px). **`floating-sticky-bar`** — Floats at the bottom of the viewport on the iPhone 17 Pro buy page during scroll. Background `{colors.canvas-parchment}` at 80% opacity with `backdrop-filter: blur(N)`, height 64px, padding 12px × 32px. Left: running price total in `{typography.body}`. Right: `{component.button-primary}` ("Add to Bag"). ### Inputs & Forms **`search-input`** — The accessories search input. Background `{colors.canvas}`, text `{colors.ink}` in `{typography.body}` (17px), 1px solid `rgba(0, 0, 0, 0.08)` border, rounded `{rounded.pill}` (full pill — search is also pill-shaped, matching the CTA grammar), padding 12px × 20px, height 44px. Leading icon: search glyph at 14px, muted tint. Error and validation states were not surfaced in the analyzed pages. ### Footer **`footer`** — Background `{colors.canvas-parchment}` (#f5f5f7), text `{colors.ink-muted-80}`. Link columns in `{typography.dense-link}` (17px / 400 / 2.41 line-height — the relaxed leading is what makes the dense columns scannable). Column headings in `{typography.caption-strong}` (14px / 600). Legal row at the very bottom in `{typography.fine-print}` (12px / 400) with `{colors.ink-muted-48}` text. Vertical padding 64px. ## Do's and Don'ts ### Do - Use `{colors.primary}` (Action Blue #0066cc) for every interactive element — links, pill CTAs, focus signals — and nothing else. The single accent is non-negotiable. - Set headlines in `{typography.hero-display}` or `{typography.display-lg}` with negative letter-spacing (`-0.28 → -0.374px`) to get the signature "Apple tight" cadence. - Run body copy at `{typography.body}` (17px / 400 / 1.47 / -0.374px) — not 16px. The extra pixel defines the brand's reading pace. - Alternate `{component.product-tile-light}` (or parchment) and `{component.product-tile-dark}` for full-bleed section rhythm. The color change IS the divider. - Reserve `{rounded.pill}` for the primary blue CTA and any other element that should read as an "action" (configurator chips, search input, sticky bar CTA). - Apply the single product-shadow (`rgba(0, 0, 0, 0.22) 3px 5px 30px`) only to product renders resting on a surface — never on cards, buttons, or text. - Use `transform: scale(0.95)` as the active/press state on every button — it's the system-wide micro-interaction. - Keep the global nav `{colors.surface-black}` (true black) — it's the only place pure black appears on most pages. ### Don't - Don't introduce a second accent color; every "click me" signal is `{colors.primary}` (Action Blue). - Don't add shadows to cards, buttons, or text — shadow is reserved for product imagery. - Don't use gradients as decorative backgrounds; atmosphere comes from photography. - Don't set body copy at weight 500 — Apple's ladder is 300 / 400 / 600 / 700, with 500 deliberately absent. Body is always 400; strong inline is 600; display is 600. - Don't round full-bleed tiles — tiles are rectangular and edge-to-edge; the color change is the divider. - Don't tighten line-height below 1.47 for body copy — the editorial leading is part of the brand. - Don't mix radii grammars — use `{rounded.sm}` for compact utility, `{rounded.lg}` for utility cards, `{rounded.pill}` for pills, and nothing in between (except the rare `{rounded.md}` Pearl Button). - Don't use `{colors.primary-on-dark}` (Sky Link Blue) on light surfaces — it's the dark-tile-only variant. Action Blue is for light surfaces. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Small phone | ≤ 419px | Single-column tiles; sub-nav collapses to category name + primary CTA only; hero typography drops to 28px | | Phone | 420–640px | Single-column stack; product renders scale to 80% of tile width; hero h1 drops to 34px | | Large phone | 641–735px | Tiles transition to tighter padding (48px vertical vs 80px); fine-print wraps | | Tablet portrait | 736–833px | Global nav collapses to hamburger; sub-nav hides category chips, keeps primary CTA | | Tablet landscape | 834–1023px | Global nav returns fully expanded; 3-column utility grids become 2-column | | Small desktop | 1024–1068px | Product tiles use 2/3 width with margin gutters; hero h1 stays at 40px | | Desktop | 1069–1440px | Full layout; 4–5 column store grids; 1440px content max | | Wide desktop | ≥ 1441px | Content locks at 1440px, margins absorb extra width | The structural breakpoints that matter for agents: 1440px (content lock), 1068px (small-desktop), 833px (tablet landscape switch), 734px (tablet portrait), 640px (phone), 480px (small phone). ### Touch Targets - Minimum 44 × 44px. `{component.button-primary}` lands at ~44 × 100px (with the full-pill radius making the visible hit area more generous than the label suggests). - `{component.button-icon-circular}` is exactly 44 × 44px. - Global nav utility links are smaller (~32 × 80px) — they deliberately sit at a tighter target because they're precision desktop actions, and the mobile hamburger replaces them at ≤ 833px. ### Collapsing Strategy - **Global nav**: full horizontal link row on desktop → collapses to Apple logo + hamburger + bag icon at 834px and below. - **Sub-nav**: category name + inline links + primary CTA → category name + primary CTA only at mobile; inline links move into a hamburger tray. - **Product tiles**: stack from 2-column to 1-column at 834px; vertical padding tightens from 80px → 48px at small-phone. - **Utility grids** (store, accessories): 5-col → 4-col (1440px) → 3-col (1068px) → 2-col (834px) → 1-col (640px). - **Hero typography**: `{typography.hero-display}` (56px) → `{typography.display-lg}` (40px) at 1068px → 34px at 640px → 28px at 419px. ### Image Behavior - All product imagery uses responsive `srcset` with breakpoint-matched crops. - Hero photography may switch art direction at mobile (e.g., the environment page's vista crops to a taller aspect ratio on mobile, framing the subject differently). - Product renders maintain their 1:1 or 4:3 aspect ratios across breakpoints; only scale changes. - Lazy-loading is default; the above-fold hero loads eagerly. ## Iteration Guide 1. Focus on ONE component at a time. Reference its YAML key directly (`{component.product-tile-dark}`, `{component.search-input}`). 2. Variants of an existing component (`-active`, `-focus`, `-2`, `-3`) live as separate entries in `components:`. 3. Use `{token.refs}` everywhere — never inline hex. 4. Never document hover. Default and Active/Pressed states only. 5. Display headlines stay SF Pro Display 600 with negative letter-spacing. Body stays SF Pro Text 400 at 17px. The boundary is unbreakable. 6. The single drop-shadow (`rgba(0, 0, 0, 0.22) 3px 5px 30px`) is reserved for product photography only. 7. When in doubt about emphasis: alternate surface (light → dark tile) before adding chrome. ## Known Gaps - Form validation and error states were not surfaced on the analyzed pages; only the neutral search input is documented. - The homepage's embedded video/player frame uses `{colors.surface-black}`; interior player controls are not documented (they're a platform widget, not a web-design token). - Some component imagery is dynamic (rotating product hero) and its specific copy varies per surface — component specs name the structure, not the rotating content. - Dark-mode counterparts for store and accessories utility cards were not surfaced on the analyzed pages; the system documented is the daytime/light-dominant variant Apple ships by default. - Atmospheric photography (environment page mountain vista) is a content asset, not a design token; the documented `{component.environment-quote-card}` describes the structural surface only. - The exact backdrop-filter blur radius on `{component.sub-nav-frosted}` and `{component.floating-sticky-bar}` is platform-dependent; production CSS uses `saturate(180%) blur(20px)` as a typical baseline but the value isn't formalized as a token.
flex items-center
Utility-First
Tailwind CSS
复制
以实用优先为核心的现代响应式工具链,基于 Indigo 靛蓝与丰富且高对比的原子化色板。
Indigo & Sky
原子化间距
响应式前缀
--- version: alpha name: Tailwind CSS description: A modern, utility-first CSS framework prioritizing strict design system scales, indigo/sky color palettes, and responsive prefixes. colors: primary: "#38bdf8" primary-focus: "#6366f1" canvas: "#ffffff" surface-card: "#f8fafc" surface-soft: "#f1f5f9" ink: "#0f172a" body: "#334155" muted: "#94a3b8" hairline: "#e2e8f0" typography: display-xl: fontSize: "30px" fontWeight: "800" lineHeight: "1.2" use: "Section Heading" body-md: fontSize: "16px" fontWeight: "400" lineHeight: "1.5" use: "Primary Body" --- # Design System — Tailwind CSS (Utility-First) Extracted and adapted from [tailwindcss.com](https://tailwindcss.com). A modern, utility-first CSS design framework prioritizing customizability, high-density utility scales, and clean component composition. --- ## 1. Design Philosophy - **Utility-first composition** — build custom designs directly in markup using low-level utility classes rather than pre-designed components - **Strict constraints** — colors, font sizes, spacing, and border radius scales are locked in to ensure visual consistency - **Mobile-first responsive flow** — layout adaptivity is designed from screen size zero upward, utilizing clean media query prefixes - **Vibrant & cohesive colors** — built-in harmonious palettes covering 22 color families with 10 shades each (from 50 to 950) - **Zero runtime overhead** — compiler purges unused utilities, producing ultra-lightweight custom production css --- ## 2. Color Palette | Token | Hex | Role | |-------|-----|------| | `--bg-slate-900` | `#0f172a` | Dark mode main canvas background | | `--bg-slate-950` | `#020617` | Dark mode surface background | | `--text-slate-50` | `#f8fafc` | High contrast white for dark mode headings | | `--text-slate-400`| `#94a3b8` | Muted slate-gray for text descriptions | | `--indigo-500` | `#6366f1` | Primary interactive brand color | | `--indigo-600` | `#4f46e5` | Indigo hover state variant | | `--sky-400` | `#38bdf8` | Secondary vibrant cyan accent | | `--emerald-500` | `#10b981` | Success / Active status green | | `--amber-500` | `#f59e0b` | Warning status amber | | `--rose-500` | `#f43f5e` | Danger / Destructive status rose | **Usage rules:** - Neutrals are categorized into Slate (blue-gray), Zinc (clean gray), Neutral (pure gray), and Stone (warm gray). - Backgrounds are always clean white `#ffffff` in light mode or slate-navy `#0f172a` in dark mode. - Interactive components use `--indigo-500` for default call-to-actions, accompanied by focus rings and subtle scale transitions. --- ## 3. Typography ### Font Stack | Token | Stack | |-------|-------| | `--font-sans` | `Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif` | | `--font-serif` | `Georgia, Cambria, "Times New Roman", Times, serif` | | `--font-mono` | `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace` | ### Type Scale | Element | Size | Weight | Line-height | Letter-spacing | Notes | |---------|------|--------|-------------|----------------|-------| | `text-xs` | 12px (`0.75rem`) | 400 | 16px | 0.05em | Badges, captions | | `text-sm` | 14px (`0.875rem`) | 500 | 20px | — | UI controls, labels | | `text-base` | 16px (`1rem`) | 400 | 24px | — | Primary body text | | `text-lg` | 18px (`1.125rem`) | 600 | 28px | -0.01em | Subheadings | | `text-xl` | 20px (`1.25rem`) | 700 | 28px | -0.015em | Small section titles | | `text-3xl`| 30px (`1.875rem`)| 800 | 36px | -0.02em | Section headings | | `text-6xl`| 60px (`3.75rem`)| 800 | 60px | -0.025em | Main hero displays | --- ## 4. Spacing System Tailwind uses a proportional 4px layout scale (1 unit = 4px): | Token | Value | Usage | |-------|-------|-------| | `p-1` | 4px | Small item spacing | | `p-2` | 8px | Button inline gutters | | `p-4` | 16px | Card internal padding | | `p-6` | 24px | Major bento-grid cells padding | | `p-8` | 32px | Section gap or page margin padding | | `p-16` | 64px | Vertical section separation | --- ## 5. Borders & Dividers - **Border width:** `border-0` (0px), `border` (1px), `border-2` (2px), `border-4` (4px). - **Colors:** Default border uses light slate-gray `#e2e8f0` (light mode) or `#334155` (dark mode). - **Dividers:** Utility class `divide-y` or `divide-x` adds clean rules automatically between stacked items. --- ## 6. Border Radius | Token | Value | Element | |-------|-------|---------| | `rounded-sm` | 2px | Micro tags | | `rounded-md` | 6px | Input fields, small buttons | | `rounded-lg` | 8px | Cards, primary CTA buttons | | `rounded-xl` | 12px | Bento cells, modular overlays | | `rounded-2xl`| 16px | Banner frames, popovers | | `rounded-full`| 999px | Badges, tags, avatar rings | --- ## 7. Shadows - **`shadow-sm`**: `0 1px 2px 0 rgba(0, 0, 0, 0.05)` (highly subtle layout boundaries) - **`shadow`**: `0 1px 3px 0 rgba(0,0,0,0.1), 0 1px 2px -1px rgba(0,0,0,0.1)` (default card) - **`shadow-lg`**: `0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)` (interactive card hover) - **`shadow-xl`**: `0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)` (dropdown panels) --- ## 8. Layout Patterns ### Flexbox Row ```html <div class="flex items-center justify-between gap-4"> <span>Label</span> <button class="bg-indigo-500 text-white rounded-lg px-4 py-2">Action</button> </div> ``` ### Responsive Grid ```html <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> <div class="rounded-xl border border-slate-200 p-6">Card 1</div> <div class="rounded-xl border border-slate-200 p-6">Card 2</div> <div class="rounded-xl border border-slate-200 p-6">Card 3</div> </div> ``` --- ## 9. Component Patterns ### Button Component ``` .bg-indigo-500 + .hover:bg-indigo-600 + .text-white + .font-medium + .px-4 + .py-2 + .rounded-lg + .transition-all ``` --- ## 10. Transitions & Motion - **Speed:** `duration-150` (150ms) for snappy controls, `duration-300` (300ms) for slide-overs. - **Easing:** Default ease is `ease-in-out` (`cubic-bezier(0.4, 0, 0.2, 1)`). - **Dynamic Scale:** Hover triggers small scaling elements `hover:scale-105` combined with shadow lifts. --- ## 11. Responsive Breakpoints | Breakpoint | Prefix | Width | |------------|--------|-------| | Mobile Landscape | `sm:` | 640px | | Tablet | `md:` | 768px | | Laptop / Desktop | `lg:` | 1024px | | Large Desktop | `xl:` | 1280px | | Ultrawide | `2xl:`| 1536px | --- ## 12. Iconography - **Heroicons** are the default SVG companion - Sleek wireframe lines with standard `stroke-width="1.5"` or `stroke-width="2"` - SVG elements scale responsively with `w-5 h-5` (20px) or `w-6 h-6` (24px) --- ## 13. Code & Inline Elements - Inline code runs inside light purple/pink gray chips `bg-slate-100 text-pink-600 px-1 py-0.5 rounded` - Preformatted blocks use dark slate background `bg-slate-900 text-slate-100 p-4 rounded-xl font-mono` ## Do's and Don'ts ### Do - Tie all color usage strictly to semantic numerical tokens (e.g. `bg-slate-900`). - Resolve styles directly via utility class combinations rather than writing custom CSS rules. - Rely exclusively on CSS Flexbox and Grid for page structure layouts. ### Don't - Don't use absolute or hardcoded hex colors inline without mapping to tailwind variables. - Don't use traditional CSS floats or complex position hacks. - Don't introduce unconstrained font sizes outside the predefined `text-` scale prefixes.
📓 Notion Workspace
💡 Callout Block
Notion Spec
复制
秉持无干扰极简原则的块状文档搭建系统,强调单色黑白灰与温和的马卡龙色标。
无干扰黑白灰
块状组装结构
马卡龙高亮
--- version: alpha name: Notion-design-analysis description: Notion presents itself as the all-in-one workspace through a confident, illustration-rich brand voice — anchored by a deep navy hero band ({colors.brand-navy}) decorated with brand-colored sticky-note dots and mesh wire illustrations, a signature purple pill primary CTA ({colors.primary}), and a rich palette of pastel-tinted feature cards that echo the colorful database properties of the live product. The system uses a Notion-Sans (Inter-based) typeface across every UI surface, anchors a 4-tier pricing comparison (Free / Plus / Business / Enterprise), and presents the live workspace UI mockup directly inside the hero band. Coverage spans homepage, Enterprise, Product AI, Product Agents, Startups, and Pricing surfaces. colors: primary: "#5645d4" primary-pressed: "#4534b3" primary-deep: "#3a2a99" on-primary: "#ffffff" brand-navy: "#0a1530" brand-navy-deep: "#070f24" brand-navy-mid: "#1a2a52" link-blue: "#0075de" link-blue-pressed: "#005bab" brand-orange: "#dd5b00" brand-orange-deep: "#793400" brand-pink: "#ff64c8" brand-pink-deep: "#a02e6d" brand-purple: "#7b3ff2" brand-purple-300: "#d6b6f6" brand-purple-800: "#391c57" brand-teal: "#2a9d99" brand-green: "#1aae39" brand-yellow: "#f5d75e" brand-brown: "#523410" card-tint-peach: "#ffe8d4" card-tint-rose: "#fde0ec" card-tint-mint: "#d9f3e1" card-tint-lavender: "#e6e0f5" card-tint-sky: "#dcecfa" card-tint-yellow: "#fef7d6" card-tint-yellow-bold: "#f9e79f" card-tint-cream: "#f8f5e8" card-tint-gray: "#f0eeec" canvas: "#ffffff" surface: "#f6f5f4" surface-soft: "#fafaf9" hairline: "#e5e3df" hairline-soft: "#ede9e4" hairline-strong: "#c8c4be" ink-deep: "#000000" ink: "#1a1a1a" charcoal: "#37352f" slate: "#5d5b54" steel: "#787671" stone: "#a4a097" muted: "#bbb8b1" on-dark: "#ffffff" on-dark-muted: "#a4a097" semantic-success: "#1aae39" semantic-warning: "#dd5b00" semantic-error: "#e03131" typography: hero-display: fontFamily: Notion Sans fontSize: 80px fontWeight: 600 lineHeight: 1.05 letterSpacing: -2px display-lg: fontFamily: Notion Sans fontSize: 56px fontWeight: 600 lineHeight: 1.10 letterSpacing: -1px heading-1: fontFamily: Notion Sans fontSize: 48px fontWeight: 600 lineHeight: 1.15 letterSpacing: -0.5px heading-2: fontFamily: Notion Sans fontSize: 36px fontWeight: 600 lineHeight: 1.20 letterSpacing: -0.5px heading-3: fontFamily: Notion Sans fontSize: 28px fontWeight: 600 lineHeight: 1.25 heading-4: fontFamily: Notion Sans fontSize: 22px fontWeight: 600 lineHeight: 1.30 heading-5: fontFamily: Notion Sans fontSize: 18px fontWeight: 600 lineHeight: 1.40 subtitle: fontFamily: Notion Sans fontSize: 18px fontWeight: 400 lineHeight: 1.50 body-md: fontFamily: Notion Sans fontSize: 16px fontWeight: 400 lineHeight: 1.55 body-md-medium: fontFamily: Notion Sans fontSize: 16px fontWeight: 500 lineHeight: 1.55 body-sm: fontFamily: Notion Sans fontSize: 14px fontWeight: 400 lineHeight: 1.50 body-sm-medium: fontFamily: Notion Sans fontSize: 14px fontWeight: 500 lineHeight: 1.50 caption: fontFamily: Notion Sans fontSize: 13px fontWeight: 400 lineHeight: 1.40 caption-bold: fontFamily: Notion Sans fontSize: 13px fontWeight: 600 lineHeight: 1.40 micro: fontFamily: Notion Sans fontSize: 12px fontWeight: 500 lineHeight: 1.40 micro-uppercase: fontFamily: Notion Sans fontSize: 11px fontWeight: 600 lineHeight: 1.40 letterSpacing: 1px button-md: fontFamily: Notion Sans fontSize: 14px fontWeight: 500 lineHeight: 1.30 rounded: xs: 4px sm: 6px md: 8px lg: 12px xl: 16px xxl: 20px xxxl: 24px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 20px xl: 24px xxl: 32px xxxl: 40px section-sm: 48px section: 64px section-lg: 96px hero: 120px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 18px" button-primary-pressed: backgroundColor: "{colors.primary-pressed}" textColor: "{colors.on-primary}" button-primary-disabled: backgroundColor: "{colors.hairline}" textColor: "{colors.muted}" button-dark: backgroundColor: "{colors.ink-deep}" textColor: "{colors.on-dark}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 18px" button-secondary: backgroundColor: "transparent" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 18px" border: "1px solid {colors.hairline-strong}" button-on-dark: backgroundColor: "{colors.on-dark}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 18px" button-secondary-on-dark: backgroundColor: "transparent" textColor: "{colors.on-dark}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 18px" border: "1px solid {colors.on-dark-muted}" button-ghost: backgroundColor: "transparent" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.sm}" padding: "8px 12px" button-link: backgroundColor: "transparent" textColor: "{colors.link-blue}" typography: "{typography.body-sm-medium}" padding: "0" card-base: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xl}" border: "1px solid {colors.hairline}" card-feature: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.hairline}" card-feature-yellow-bold: backgroundColor: "{colors.card-tint-yellow-bold}" textColor: "{colors.charcoal}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-feature-peach: backgroundColor: "{colors.card-tint-peach}" textColor: "{colors.charcoal}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-feature-rose: backgroundColor: "{colors.card-tint-rose}" textColor: "{colors.charcoal}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-feature-mint: backgroundColor: "{colors.card-tint-mint}" textColor: "{colors.charcoal}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-feature-sky: backgroundColor: "{colors.card-tint-sky}" textColor: "{colors.charcoal}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-feature-lavender: backgroundColor: "{colors.card-tint-lavender}" textColor: "{colors.charcoal}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-feature-yellow: backgroundColor: "{colors.card-tint-yellow}" textColor: "{colors.charcoal}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-feature-cream: backgroundColor: "{colors.card-tint-cream}" textColor: "{colors.charcoal}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-agent-tile: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xl}" border: "1px solid {colors.hairline}" card-template: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.lg}" border: "1px solid {colors.hairline}" card-startup-perk: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xl}" border: "1px solid {colors.hairline}" pricing-card: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.hairline}" pricing-card-featured: backgroundColor: "{colors.surface}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "2px solid {colors.primary}" text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: "{spacing.sm} {spacing.md}" border: "1px solid {colors.hairline-strong}" height: 44px text-input-focused: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" border: "2px solid {colors.primary}" search-pill: backgroundColor: "{colors.surface}" textColor: "{colors.steel}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: "{spacing.sm} {spacing.md}" height: 44px border: "1px solid {colors.hairline}" pill-tab: backgroundColor: "transparent" textColor: "{colors.steel}" typography: "{typography.body-sm-medium}" rounded: "{rounded.full}" padding: "{spacing.xs} {spacing.md}" border: "1px solid {colors.hairline}" pill-tab-active: backgroundColor: "{colors.ink-deep}" textColor: "{colors.on-dark}" rounded: "{rounded.full}" border: "1px solid {colors.ink-deep}" segmented-tab: backgroundColor: "transparent" textColor: "{colors.steel}" typography: "{typography.body-sm-medium}" padding: "{spacing.sm} {spacing.md}" border: "0 0 2px transparent solid" segmented-tab-active: backgroundColor: "transparent" textColor: "{colors.ink}" typography: "{typography.body-sm-medium}" border: "0 0 2px {colors.ink} solid" badge-purple: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.caption-bold}" rounded: "{rounded.full}" padding: "4px 10px" badge-pink: backgroundColor: "{colors.brand-pink}" textColor: "{colors.on-primary}" typography: "{typography.caption-bold}" rounded: "{rounded.full}" padding: "4px 10px" badge-orange: backgroundColor: "{colors.brand-orange}" textColor: "{colors.on-primary}" typography: "{typography.caption-bold}" rounded: "{rounded.full}" padding: "4px 10px" badge-tag-purple: backgroundColor: "{colors.card-tint-lavender}" textColor: "{colors.brand-purple-800}" typography: "{typography.caption-bold}" rounded: "{rounded.sm}" padding: "2px 8px" badge-tag-orange: backgroundColor: "{colors.card-tint-peach}" textColor: "{colors.brand-orange-deep}" typography: "{typography.caption-bold}" rounded: "{rounded.sm}" padding: "2px 8px" badge-tag-green: backgroundColor: "{colors.card-tint-mint}" textColor: "{colors.brand-green}" typography: "{typography.caption-bold}" rounded: "{rounded.sm}" padding: "2px 8px" badge-popular: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.caption-bold}" rounded: "{rounded.full}" padding: "4px 10px" promo-banner: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.body-sm-medium}" padding: "{spacing.sm} {spacing.md}" hero-band-dark: backgroundColor: "{colors.brand-navy}" textColor: "{colors.on-dark}" rounded: "0" padding: "{spacing.hero}" workspace-mockup-card: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "0" border: "1px solid {colors.hairline}" shadow: "rgba(15, 15, 15, 0.2) 0px 24px 48px -8px" cta-banner-light: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" rounded: "{rounded.lg}" padding: "{spacing.section}" comparison-table: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.md}" border: "1px solid {colors.hairline}" comparison-row: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" padding: "{spacing.md} {spacing.lg}" border: "0 0 1px {colors.hairline-soft} solid" testimonial-card: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.hairline}" logo-wall-item: backgroundColor: "transparent" textColor: "{colors.steel}" typography: "{typography.body-md-medium}" padding: "{spacing.lg}" faq-accordion-item: backgroundColor: "{colors.canvas}" rounded: "{rounded.md}" padding: "{spacing.xl}" border: "0 0 1px {colors.hairline} solid" stat-row: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" rounded: "{rounded.lg}" padding: "{spacing.section-sm}" footer-region: backgroundColor: "{colors.canvas}" textColor: "{colors.charcoal}" typography: "{typography.body-sm}" padding: "{spacing.section} {spacing.xxl}" border: "1px solid {colors.hairline}" footer-link: backgroundColor: "transparent" textColor: "{colors.steel}" typography: "{typography.body-sm}" padding: "{spacing.xxs} 0" --- ## Overview Notion presents itself as the all-in-one workspace through a confident, illustration-rich brand voice. The homepage opens with **"Meet the night shift."** rendered centered over a deep navy hero band ({colors.brand-navy}), decorated with brand-colored sticky-note dots and mesh wire illustrations scattered around the headline. The signature **purple pill primary CTA** ({colors.primary}) "Get Notion free" sits at the visual center, paired with an outlined "Request a demo" secondary. Below the buttons, a real Notion workspace UI mockup card (the "Ramp HQ" kanban board) breaks out of the hero band with a deep diffuse drop shadow. Below the hero, the page cycles through a distinctive sequence of feature sections: a dense sticky-note "Keep work moving 24/7" panel with red/blue/green/purple/teal status icons; a **bold yellow** ({colors.card-tint-yellow-bold}) "Ask your on-demand assistants" banner card flanked by orange/rose/mint pastel feature tiles showing assistant UI mockups; and a "Bring all your work together" 3-column grid with brand-colored mockups (sky-blue tutorial card, light Notion calendar, brown/rust testimonial slate). The pricing page renders 4 tiers (Free / Plus / Business / Enterprise) horizontally with one tier featured (purple-bordered) and a dense feature comparison table running below. The system uses a Notion-Sans typeface (Inter-based) across every UI surface — humanist-geometric character that pairs naturally with the colorful illustrations. Buttons are `{rounded.md}` (8px) rectangles, NOT pills — distinguishing Notion's sober rectangular geometry from competitors that use pills universally. Cards use `{rounded.lg}` (12px) consistently. **Key Characteristics:** - Deep navy hero band ({colors.brand-navy}) with scattered sticky-note dots + mesh wire decorative illustrations - **Signature purple pill** ({colors.primary}) primary CTA — Notion's recognizable "Get Notion free" button color - Real Notion workspace UI mockup card embedded in the hero with deep drop shadow - Bold yellow feature banner ({colors.card-tint-yellow-bold}) for high-emphasis content sections - Pastel feature card palette (peach, rose, mint, lavender, sky, yellow) echoing the live product database properties - Notion-Sans (Inter-based) across every UI surface - 8px-rounded buttons (NOT pills), 12px-rounded cards — sober editorial geometry - 4-tier pricing comparison with dense feature table - Centered hero layout (different from the left-aligned norm of most B2B SaaS) ## Colors > Source pages: notion.com/ (homepage), /enterprise, /product/ai, /product/agents, /startups, /pricing. Token coverage was identical across all six pages. ### Brand & Primary - **Notion Purple** ({colors.primary}): Signature primary CTA color — the unmistakable "Get Notion free" pill button. Reserved for the dominant CTA only. - **Purple Pressed** ({colors.primary-pressed}): Pressed-state variant - **Purple Deep** ({colors.primary-deep}): Deeper variant for emphasis - **Brand Navy** ({colors.brand-navy}): Hero band background — deep navy - **Brand Navy Deep** ({colors.brand-navy-deep}): Deeper navy for promo banner - **Brand Navy Mid** ({colors.brand-navy-mid}): Mid-spectrum navy - **Link Blue** ({colors.link-blue}): Inline text link blue (NOT primary CTA) - **Link Blue Pressed** ({colors.link-blue-pressed}): Pressed-state link blue ### Brand Color Spectrum (echoes live product database properties) - **Brand Pink** ({colors.brand-pink}): Pink accent - **Brand Pink Deep** ({colors.brand-pink-deep}): Deeper pink - **Brand Orange** ({colors.brand-orange}): Orange accent - **Brand Orange Deep** ({colors.brand-orange-deep}): Deeper orange-rust - **Brand Purple** ({colors.brand-purple}): Purple accent variant - **Brand Purple 300** ({colors.brand-purple-300}): Light purple - **Brand Purple 800** ({colors.brand-purple-800}): Deep purple for tag text - **Brand Teal** ({colors.brand-teal}): Teal accent - **Brand Green** ({colors.brand-green}): Bright green - **Brand Yellow** ({colors.brand-yellow}): Soft yellow - **Brand Brown** ({colors.brand-brown}): Brand brown for "earthy" tints ### Card Tints (Pastel Feature Card Backgrounds) - **Tint Peach** ({colors.card-tint-peach}): Pale peach - **Tint Rose** ({colors.card-tint-rose}): Pale rose-pink - **Tint Mint** ({colors.card-tint-mint}): Pale mint-green - **Tint Lavender** ({colors.card-tint-lavender}): Pale lavender - **Tint Sky** ({colors.card-tint-sky}): Pale sky-blue - **Tint Yellow** ({colors.card-tint-yellow}): Pale yellow - **Tint Yellow Bold** ({colors.card-tint-yellow-bold}): Bold yellow for high-emphasis feature banners ("Ask your on-demand assistants") - **Tint Cream** ({colors.card-tint-cream}): Cream tint - **Tint Gray** ({colors.card-tint-gray}): Neutral surface ### Surface - **Canvas White** ({colors.canvas}): Page background and primary card surface - **Surface** ({colors.surface}): Subtle section backgrounds, search-pill rest, featured pricing tier - **Surface Soft** ({colors.surface-soft}): Quieter section divisions - **Hairline** ({colors.hairline}): 1px borders and primary dividers - **Hairline Soft** ({colors.hairline-soft}): Quieter dividers - **Hairline Strong** ({colors.hairline-strong}): Stronger 1px border for inputs ### Text - **Ink Deep** ({colors.ink-deep}): Pure black for emphasis - **Ink** ({colors.ink}): Primary headlines and body text - **Charcoal** ({colors.charcoal}): Body emphasis (Notion's signature warm-charcoal) - **Slate** ({colors.slate}): Secondary text - **Steel** ({colors.steel}): Tertiary, footer links - **Stone** ({colors.stone}): Muted labels - **Muted** ({colors.muted}): Disabled, placeholders - **On Dark** ({colors.on-dark}): White text on dark surfaces - **On Dark Muted** ({colors.on-dark-muted}): Reduced-opacity white ### Semantic - **Success** ({colors.semantic-success}): Confirmation green - **Warning** ({colors.semantic-warning}): Mid-priority alerts (orange) - **Error** ({colors.semantic-error}): Validation errors (red) ## Typography ### Font Family **Notion Sans** (primary): Notion's custom Inter-based variable typeface. Fallbacks: Inter, -apple-system, system-ui, 'Segoe UI', Helvetica, sans-serif. Humanist-geometric character used across every UI surface. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.hero-display}` | 80px | 600 | 1.05 | -2px | Hero ("Meet the night shift") | | `{typography.display-lg}` | 56px | 600 | 1.10 | -1px | Section openers | | `{typography.heading-1}` | 48px | 600 | 1.15 | -0.5px | Page-level headlines ("Try for free") | | `{typography.heading-2}` | 36px | 600 | 1.20 | -0.5px | Subsection headlines ("Keep work moving 24/7") | | `{typography.heading-3}` | 28px | 600 | 1.25 | 0 | Card titles | | `{typography.heading-4}` | 22px | 600 | 1.30 | 0 | Feature tile titles | | `{typography.heading-5}` | 18px | 600 | 1.40 | 0 | FAQ questions | | `{typography.subtitle}` | 18px | 400 | 1.50 | 0 | Hero subtitle | | `{typography.body-md}` | 16px | 400 | 1.55 | 0 | Primary body text | | `{typography.body-md-medium}` | 16px | 500 | 1.55 | 0 | Body emphasis | | `{typography.body-sm}` | 14px | 400 | 1.50 | 0 | Secondary body | | `{typography.body-sm-medium}` | 14px | 500 | 1.50 | 0 | Active sidebar, button labels | | `{typography.caption-bold}` | 13px | 600 | 1.40 | 0 | Badge labels | | `{typography.button-md}` | 14px | 500 | 1.30 | 0 | Button labels | ### Principles - Tight hero leading (1.05) on 80px display - Negative letter-spacing on display sizes (-2px to -0.5px) - Generous body leading (1.55) for documentation readability - 600 weight for headlines + 500 for buttons; 400 body ## Layout ### Spacing System - **Base unit**: 4px (8px primary increment) - **Tokens**: `{spacing.xxs}` (4px) through `{spacing.hero}` (120px) - **Section rhythm**: Marketing pages use `{spacing.section-lg}` (96px); pricing tightens to `{spacing.section}` (64px) ### Grid & Container - 1280px max-width with 32px gutters - Pricing: 4-tier card row at desktop with dense comparison table - Homepage: centered hero with workspace mockup below buttons; alternating colorful feature card sections ### Whitespace Philosophy Marketing surfaces use generous breathing room between feature card bands. Workspace mockup card on hero gets full-width treatment with deep drop shadow. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 (flat) | No shadow; `{colors.hairline}` border | Default cards, table rows | | 1 (subtle) | `rgba(15, 15, 15, 0.04) 0px 1px 2px 0px` | Hover-elevated tiles | | 2 (card) | `rgba(15, 15, 15, 0.08) 0px 4px 12px 0px` | Feature cards | | 3 (mockup) | `rgba(15, 15, 15, 0.20) 0px 24px 48px -8px` | Hero workspace mockup card | | 4 (modal) | `rgba(15, 15, 15, 0.16) 0px 16px 48px -8px` | Modals, dropdowns | ### Decorative Depth - Hero workspace mockup card uses deep diffuse drop shadow (Level 3) — significant elevation against the navy band - Pastel feature cards carry their own visual weight via tint backgrounds - Sticky-note dot illustrations and mesh wires add atmospheric decoration to navy hero ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Tag chips | | `{rounded.sm}` | 6px | Type badges | | `{rounded.md}` | 8px | Buttons, inputs, search-pill | | `{rounded.lg}` | 12px | Cards, pricing tiers, agent tiles, workspace mockup | | `{rounded.xl}` | 16px | Larger feature panels | | `{rounded.xxl}` | 20px | Featured product showcases | | `{rounded.xxxl}` | 24px | Larger feature cards | | `{rounded.full}` | 9999px | Status badges, pill tabs (NOT regular buttons) | Notion's geometry is sober-editorial — `{rounded.md}` (8px) buttons distinguish it from pill-button-everywhere brands. ## Components > Per the no-hover policy, hover states are NOT documented. ### Buttons **`button-primary`** — Signature purple rectangular primary CTA, the dominant action. - Background `{colors.primary}`, text `{colors.on-primary}`, typography `{typography.button-md}`, padding `10px 18px`, rounded `{rounded.md}`. - Pressed state `button-primary-pressed` deepens to `{colors.primary-pressed}`. - Disabled state uses `{colors.hairline}` background. **`button-dark`** — Black rectangular CTA on light backgrounds. - Background `{colors.ink-deep}`, text `{colors.on-dark}`, typography `{typography.button-md}`, padding `10px 18px`, rounded `{rounded.md}`. **`button-secondary`** — Outlined rectangular for secondary actions ("Request a demo"). - Background transparent, text `{colors.ink}`, border `1px solid {colors.hairline-strong}`, typography `{typography.button-md}`, padding `10px 18px`, rounded `{rounded.md}`. **`button-on-dark`** — White button on dark hero bands. - Background `{colors.on-dark}`, text `{colors.ink}`, typography `{typography.button-md}`, padding `10px 18px`, rounded `{rounded.md}`. **`button-secondary-on-dark`** — Outlined button on dark. - Background transparent, text `{colors.on-dark}`, border `1px solid {colors.on-dark-muted}`, typography `{typography.button-md}`, padding `10px 18px`, rounded `{rounded.md}`. **`button-ghost`** — Quieter ghost button. - Background transparent, text `{colors.ink}`, typography `{typography.button-md}`, padding `8px 12px`, rounded `{rounded.sm}`. **`button-link`** — Inline blue text link (NOT primary purple). - Background transparent, text `{colors.link-blue}`, typography `{typography.body-sm-medium}`, padding `0`. ### Cards & Containers **`card-base`** — Standard content card. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xl}`, border `1px solid {colors.hairline}`. **`card-feature`** — Feature card with larger padding. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid {colors.hairline}`. **`card-feature-yellow-bold`** — Bold yellow feature banner for high-emphasis content ("Ask your on-demand assistants"). - Background `{colors.card-tint-yellow-bold}`, text `{colors.charcoal}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`. **`card-feature-peach`** + **`card-feature-rose`** + **`card-feature-mint`** + **`card-feature-sky`** + **`card-feature-lavender`** + **`card-feature-yellow`** + **`card-feature-cream`** — Pastel-tinted feature cards. - Each variant uses its corresponding `card-tint-*` color as background, text `{colors.charcoal}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`. **`card-agent-tile`** — Agent assistant tile. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xl}`, border `1px solid {colors.hairline}`. **`card-template`** — Template thumbnail card. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.lg}`, border `1px solid {colors.hairline}`. **`card-startup-perk`** — Startup-program perk grid item. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xl}`, border `1px solid {colors.hairline}`. **`pricing-card`** — Standard pricing tier card. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid {colors.hairline}`. **`pricing-card-featured`** — Featured pricing tier (Plus or Business — purple-bordered). - Background `{colors.surface}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `2px solid {colors.primary}`. ### Inputs & Forms **`text-input`** — Standard text field. - Background `{colors.canvas}`, text `{colors.ink}`, border `1px solid {colors.hairline-strong}`, rounded `{rounded.md}`, padding `{spacing.sm} {spacing.md}`, height 44px. **`text-input-focused`** — Activated state. - Border switches to `2px solid {colors.primary}` (purple). **`search-pill`** — Search bar. - Background `{colors.surface}`, text `{colors.steel}`, typography `{typography.body-md}`, rounded `{rounded.md}`, height 44px, border `1px solid {colors.hairline}`. ### Tabs **`pill-tab`** + **`pill-tab-active`** — Pill-style tab nav for top-level switching. - Inactive: text `{colors.steel}`, border `1px solid {colors.hairline}`, padding `{spacing.xs} {spacing.md}`, rounded `{rounded.full}`. - Active: background `{colors.ink-deep}`, text `{colors.on-dark}`. **`segmented-tab`** + **`segmented-tab-active`** — Underline-style tab navigation. - Inactive: text `{colors.steel}`, no border. Active: text `{colors.ink}`, 2px bottom border in `{colors.ink}`. ### Badges & Status **`badge-purple`** — Purple status badge (matches primary CTA). - Background `{colors.primary}`, text `{colors.on-primary}`, typography `{typography.caption-bold}`, rounded `{rounded.full}`, padding `4px 10px`. **`badge-pink`** — Pink accent badge. - Background `{colors.brand-pink}`, text `{colors.on-primary}`, typography `{typography.caption-bold}`, rounded `{rounded.full}`, padding `4px 10px`. **`badge-orange`** — Orange accent badge. - Background `{colors.brand-orange}`, text `{colors.on-primary}`, typography `{typography.caption-bold}`, rounded `{rounded.full}`, padding `4px 10px`. **`badge-tag-purple`** — Soft-purple feature tag chip. - Background `{colors.card-tint-lavender}`, text `{colors.brand-purple-800}`, typography `{typography.caption-bold}`, rounded `{rounded.sm}`, padding `2px 8px`. **`badge-tag-orange`** — Soft-orange feature tag. - Background `{colors.card-tint-peach}`, text `{colors.brand-orange-deep}`, typography `{typography.caption-bold}`, rounded `{rounded.sm}`, padding `2px 8px`. **`badge-tag-green`** — Soft-mint feature tag. - Background `{colors.card-tint-mint}`, text `{colors.brand-green}`, typography `{typography.caption-bold}`, rounded `{rounded.sm}`, padding `2px 8px`. **`badge-popular`** — "Most Popular" tier indicator. - Background `{colors.primary}`, text `{colors.on-primary}`, typography `{typography.caption-bold}`, rounded `{rounded.full}`, padding `4px 10px`. **`promo-banner`** — Light surface promo strip ABOVE the top nav. - Background `{colors.surface}`, text `{colors.ink}`, typography `{typography.body-sm-medium}`, padding `{spacing.sm} {spacing.md}`. ("Developers: Get a first look at our new Developer Platform on May 13.") ### Tables **`comparison-table`** — Pricing feature comparison table. - Background `{colors.canvas}`, text `{colors.ink}`, typography `{typography.body-sm}`, rounded `{rounded.md}`, border `1px solid {colors.hairline}`. **`comparison-row`** — Individual feature row. - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md} {spacing.lg}`, bottom border `1px solid {colors.hairline-soft}`. ### Documentation Components **`workspace-mockup-card`** — Embedded Notion workspace UI mockup on hero band ("Ramp HQ" kanban board). - Background `{colors.canvas}`, rounded `{rounded.lg}`, border `1px solid {colors.hairline}`, deep shadow `rgba(15, 15, 15, 0.20) 0px 24px 48px -8px`. Carries actual Notion product UI mock. **`testimonial-card`** — Customer testimonial card. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid {colors.hairline}`. **`logo-wall-item`** — Customer logo wordmark cell. - Background transparent, text `{colors.steel}`, typography `{typography.body-md-medium}`, padding `{spacing.lg}`. **`faq-accordion-item`** — FAQ panel. - Background `{colors.canvas}`, rounded `{rounded.md}`, padding `{spacing.xl}`, bottom border `1px solid {colors.hairline}`. **`stat-row`** — Stats strip with bar chart visualization ("More productivity. Fewer tools."). - Background `{colors.surface}`, text `{colors.ink}`, rounded `{rounded.lg}`, padding `{spacing.section-sm}`. **`cta-banner-light`** — Light surface CTA banner. - Background `{colors.surface}`, text `{colors.ink}`, rounded `{rounded.lg}`, padding `{spacing.section}`. ### Navigation **Top Navigation (Marketing)** — Sticky white bar. - Background `{colors.canvas}`, height ~64px, bottom border `1px solid {colors.hairline}`. - Left: Notion "N" logo + "Product / AI / Solutions / Resources / Enterprise / Pricing / Request a demo" links. - Right: "Get Notion free" purple button + "Log in" link. ### Signature Components **`hero-band-dark`** — Deep navy hero band with embedded workspace mockup and decorative dots/wires. - Background `{colors.brand-navy}`, text `{colors.on-dark}`, padding `{spacing.hero}`. - Layout: centered headline `{typography.hero-display}`, subtitle, button row (`button-primary` purple + `button-secondary-on-dark`), `workspace-mockup-card` below. - Atmospheric decoration: scattered colorful sticky-note dots and mesh wire illustrations around the hero content (NOT a literal pattern fill — handled per-page via SVG/illustration). **`footer-region`** — Multi-column light footer. - Background `{colors.canvas}`, padding `{spacing.section} {spacing.xxl}`, top border `1px solid {colors.hairline}`. - 6-column link grid (Product / Download / Resources / Notion for / Company / Legal). **`footer-link`** — Individual footer link. - Background transparent, text `{colors.steel}`, typography `{typography.body-sm}`, padding `{spacing.xxs} 0`. ## Do's and Don'ts ### Do - Use `{colors.primary}` (purple) as the dominant CTA across all surfaces — it's the brand's recognizable signal - Pair deep navy hero bands ({colors.brand-navy}) with the purple button + decorative sticky-note dots - Use pastel feature card tints (peach, rose, mint, lavender, sky, yellow) generously - Use `{colors.card-tint-yellow-bold}` for high-emphasis "Ask the assistant"-style banner cards - Apply `{rounded.md}` (8px) to buttons consistently — Notion uses rectangles, not pills - Apply `{rounded.lg}` (12px) to all card families - Maintain Notion-Sans across every UI surface - Use the workspace mockup card on hero bands to show actual product UI ### Don't - Don't use the purple for body text or large background surfaces - Don't use pill-shaped buttons; Notion's geometry is rectangular-sober - Don't mix link-blue ({colors.link-blue}) with primary-purple ({colors.primary}) — they have distinct roles - Don't apply heavy shadows on flat documentation cards - Don't replace Notion-Sans with a generic Inter ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile (small) | < 480px | Single column. Hero 36px. Pricing 1-up. | | Mobile (large) | 480 – 767px | Feature cards 2-up. Hero 48px. | | Tablet | 768 – 1023px | 2-column feature grids. Hero 56px. | | Desktop | 1024 – 1279px | 4-tier pricing card row. Hero 72px. | | Wide Desktop | ≥ 1280px | Full 80px hero presentation. | ### Touch Targets - Buttons render at 40–44px effective height - Form inputs render at 44px height - Pill tabs ~32px → 44px on mobile ### Collapsing Strategy - **Promo banner** stays full-width; truncates at < 480px - **Top nav** below 1024px collapses to hamburger - **Hero band**: workspace mockup card moves below text/buttons on mobile - **Pricing tiers**: 4-column → 2-column tablet → 1-column mobile - **Feature cards**: 3-up desktop → 2-up tablet → 1-up mobile - **Hero typography**: 80px → 56px → 48px → 36px - **Footer**: 6-column desktop → 3-column tablet → accordion mobile ### Image Behavior - Workspace mockup card maintains aspect ratio - Pastel illustrations inside feature cards scale proportionally - Customer logo wall: wordmarks at consistent 60–80px height ## Iteration Guide 1. Focus on ONE component at a time 2. Reference component names and tokens directly 3. Run `npx @google/design.md lint DESIGN.md` after edits 4. Add new variants as separate `components:` entries 5. Default to `{typography.body-md}` for body 6. Keep `{colors.primary}` (purple) as the primary CTA — distinct from `{colors.link-blue}` for inline links 7. Use `{rounded.md}` for buttons (rectangles), `{rounded.lg}` for cards, `{rounded.full}` for pill tabs/badges only ## Known Gaps - Specific dark-mode token values not surfaced beyond hero bands - Animation/transition timings not extracted; recommend 150–200ms ease - Form validation success state not explicitly captured - Pastel-tint mapping (which feature uses which tint) is observation-based — the actual brand library may have more entries
Progressive Web
VitePress Theme
Vue.js progressive docs
复制
基于 VitePress 驱动的现代渐进式文档设计系统,融合翡翠绿与深邃碳灰,以及标志性的提示框容器。
Vue 翡翠绿
渐进式提示框
系统字阶
--- version: alpha name: Vue.js progressive docs description: A progressive documentation system driving modern web libraries, combining vibrant Vue Green, deep carbon gray, and semantic callouts. colors: primary: "#42b883" primary-focus: "#338a60" canvas: "#ffffff" surface-card: "#f6f6f7" surface-soft: "#f6f6f7" ink: "#2c3e50" body: "#2c3e50" muted: "#476582" hairline: "#e2e2e3" typography: display-xl: fontSize: "38px" fontWeight: "700" lineHeight: "1.2" use: "Page Heading" body-md: fontSize: "16px" fontWeight: "400" lineHeight: "1.6" use: "Primary Body" --- # Design System — Vue.js (VitePress Documentation Style) Extracted and adapted from [cn.vuejs.org](https://cn.vuejs.org) and [vuejs.org](https://vuejs.org). A content-first, developer-friendly documentation design system characterized by vibrant Vue Green accents, soft semantic highlights, progressive layout flow, and exceptionally legible dark-theme code blocks. --- ## 1. Design Philosophy - **Progressive Disclosure** — simple by default, advanced when needed. The design system is optimized to organize and present documentation layers progressively. - **Deference to Technical Content** — typography and layout are crafted to prioritize readability of technical guides, API documentation tables, and nested lists. - **Developer-Centric Semantics** — visual hierarchy relies heavily on custom callout containers (Tips, Warnings, Danger notes) and syntax-highlighted code blocks. - **Vibrant Emerald Accents** — Vue Green serves as the primary visual anchor for brand identification, link states, active navigation elements, and badges. --- ## 2. Color Palette | Token | Hex | Role | |-------|-----|------| | `--vp-c-brand` | `#42b883` | Primary brand accent (Vue Green) | | `--vp-c-brand-dark` | `#338a60` | Hover state brand green | | `--vp-c-text-1` | `#2c3e50` | Primary slate-charcoal text (light mode) | | `--vp-c-text-dark` | `#ebebeb` | High-contrast text (dark mode) | | `--vp-c-bg` | `#ffffff` | Primary light mode canvas background | | `--vp-c-bg-dark` | `#1b1b1f` | Deep matte gray canvas background (dark mode) | | `--vp-c-bg-alt` | `#f6f6f7` | Sidebar and alert backgrounds (light mode) | | `--vp-c-bg-alt-dark`| `#202024` | Sidebar and alert backgrounds (dark mode) | | `--vp-c-border` | `#e2e2e3` | Faint divider and table borders | | `--vp-c-navy` | `#35495e` | Secondary brand color (classic Vue logo slate-blue) | ### Semantic Highlight Containers: - **Tip (Info)**: Left border `#42b883`, background `#f0f9eb` (light) / `rgba(66, 184, 131, 0.08)` (dark). - **Warning**: Left border `#e7c000` (amber), background `#fffdf4` (light) / `rgba(231, 192, 0, 0.08)` (dark). - **Danger**: Left border `#c00` (red), background `#fdf3f3` (light) / `rgba(204, 0, 0, 0.08)` (dark). --- ## 3. Typography ### Font Stack | Stack Option | Font Family List | |--------------|------------------| | Default Sans | `Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif` | | Code Monospace| `ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace` | ### Sizing and Weights | Role | Size | Weight | Line-height | Letter-spacing | |------|------|--------|-------------|----------------| | Page Heading (H1) | 38px | 700 (Bold) | 1.2 | -0.02em | | Section Title (H2) | 24px | 600 (Semibold) | 1.25 | -0.01em | | Subsection (H3) | 19px | 600 (Semibold) | 1.3 | — | | Primary Body | 16px | 400 (Regular) | 1.6 | — | | Navigation Link | 14px | 500 (Medium) | 1.4 | — | | API Table Labels | 13px | 600 (Semibold) | 1.4 | — | --- ## 4. Spacing System Layout rules align to standard document grid offsets: - **Max Content Width**: `960px` (optimized reading line length). - **Paragraph Spacing**: `margin-bottom: 16px`. - **Heading Margins**: `margin-top: 36px` to separate conceptual blocks. - **Custom Callout Padding**: `16px 24px` for balanced internal breathing room. - **Inner Code Margin**: `8px` padding for code blocks, `4px` side margins for inline tags. --- ## 5. Custom Containers (Alert Callouts) VitePress custom container blocks highlight tips, warnings, or danger guidelines. They feature a solid 4px left border and full-width background tints: ### Info / Tip Container ```html <div class="custom-block tip"> <p class="custom-block-title">提示</p> <p>这是一个提示性信息,用于引导开发人员注意关键的使用方法或最佳实践。</p> </div> ``` ### Warning Container ```html <div class="custom-block warning"> <p class="custom-block-title">警告</p> <p>不推荐的操作或者存在潜在问题的配置项。</p> </div> ``` --- ## 6. Code & Code Blocks - **Inline Code**: Faint gray background with crimson/green text: `bg: #f6f6f7`, `color: #476582` (light) / `#c8d6e2` (dark), `12px` size. - **Preformatted Blocks**: Styled with a dark grey backdrop (`#202024`) even in light mode, featuring soft syntax highlighting, rounded corners (`8px`), and a top-right language indicator tag (e.g. `js`, `html`, `css`). --- ## 7. Border Radius Scale - **Micro elements** (inline tags, checkboxes): `4px` - **Buttons, badges, inputs**: `8px` - **Callout boxes, code blocks**: `8px` - **Large banners, floating popovers**: `12px` --- ## 8. Layout Patterns ### Right-Side Outline (Table of Contents) A sticky right-side vertical menu (width: `224px`) displaying active page subsections. It updates in real-time as the user scrolls, styled with a fine `1px` border on the left: ``` ├── Main Content Grid (1fr) └── Page Outline Sidebar (224px) ├── "本页目录" heading (size: 11px, weight: 700) └── List of sub-anchors (hover color: --vp-c-brand) ``` ## Do's and Don'ts ### Do - Keep documentation layout flat and focused on readability. - Use monospaced fonts for paths, variables, and terminal commands. - Limit bright brand gradients to main logos and call-to-action cards. ### Don't - Don't use overly stylized buttons or elements that distract from raw documentation content. - Don't use heavy cards with deep blur box-shadows. - Don't mix bright brand gradients inside long reading blocks.
Codex Resets
Sticker Neo-Brutalism
Codex Resets
复制
贴纸纸张式新粗野主义:暖米色画布、粗圆标题、硬偏移阴影与黄粉蓝状态卡,把实时数据做成轻松而清晰的仪表界面。
贴纸新粗野主义
暖米色与亮橙
Baloo 2 粗圆体
Claude System
Humanist Editorial
Claude Spec
复制
Anthropic 推出的温暖人文学术风设计系统,以象牙奶油色纸张为底,辅以珊瑚红点缀与优美 Serif 衬线字体。
人文社论排版
奶油色与珊瑚红
Copernicus 衬线
--- version: alpha name: Claude-design-analysis description: A warm-canvas editorial interface for Anthropic's Claude product. The system anchors on a tinted cream canvas with serif display headlines, warm coral CTAs, and dark navy product surfaces (code editor mockups, model showcase cards). Brand voltage comes from the cream/coral pairing — deliberately warm and humanist where most AI brands use cool blue + slate. Type voice runs a slab-serif display ("Copernicus" / Tiempos Headline) for h1/h2 and a humanist sans for body. The signature Anthropic black-radial-spike mark anchors the wordmark. colors: primary: "#cc785c" primary-active: "#a9583e" primary-disabled: "#e6dfd8" ink: "#141413" body: "#3d3d3a" body-strong: "#252523" muted: "#6c6a64" muted-soft: "#8e8b82" hairline: "#e6dfd8" hairline-soft: "#ebe6df" canvas: "#faf9f5" surface-soft: "#f5f0e8" surface-card: "#efe9de" surface-cream-strong: "#e8e0d2" surface-dark: "#181715" surface-dark-elevated: "#252320" surface-dark-soft: "#1f1e1b" on-primary: "#ffffff" on-dark: "#faf9f5" on-dark-soft: "#a09d96" accent-teal: "#5db8a6" accent-amber: "#e8a55a" success: "#5db872" warning: "#d4a017" error: "#c64545" typography: display-xl: fontFamily: "Copernicus, Tiempos Headline, serif" fontSize: 64px fontWeight: 400 lineHeight: 1.05 letterSpacing: -1.5px display-lg: fontFamily: "Copernicus, Tiempos Headline, serif" fontSize: 48px fontWeight: 400 lineHeight: 1.1 letterSpacing: -1px display-md: fontFamily: "Copernicus, Tiempos Headline, serif" fontSize: 36px fontWeight: 400 lineHeight: 1.15 letterSpacing: -0.5px display-sm: fontFamily: "Copernicus, Tiempos Headline, serif" fontSize: 28px fontWeight: 400 lineHeight: 1.2 letterSpacing: -0.3px title-lg: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 22px fontWeight: 500 lineHeight: 1.3 letterSpacing: 0 title-md: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 18px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 title-sm: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 16px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 body-md: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.55 letterSpacing: 0 body-sm: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.55 letterSpacing: 0 caption: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 13px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 caption-uppercase: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 12px fontWeight: 500 lineHeight: 1.4 letterSpacing: 1.5px code: fontFamily: "JetBrains Mono, ui-monospace, monospace" fontSize: 14px fontWeight: 400 lineHeight: 1.6 letterSpacing: 0 button: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1 letterSpacing: 0 nav-link: fontFamily: "StyreneB, Inter, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 rounded: xs: 4px sm: 6px md: 8px lg: 12px xl: 16px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 20px height: 40px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.md}" button-primary-disabled: backgroundColor: "{colors.primary-disabled}" textColor: "{colors.muted}" rounded: "{rounded.md}" button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 20px height: 40px button-secondary-on-dark: backgroundColor: "{colors.surface-dark-elevated}" textColor: "{colors.on-dark}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 20px button-text-link: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.button}" button-icon-circular: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.full}" size: 36px text-link: backgroundColor: transparent textColor: "{colors.primary}" typography: "{typography.body-md}" top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.nav-link}" height: 64px hero-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-xl}" padding: 96px hero-illustration-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.xl}" feature-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 32px product-mockup-card-dark: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 32px code-window-card: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.code}" rounded: "{rounded.lg}" padding: 24px model-comparison-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 32px pricing-tier-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-lg}" rounded: "{rounded.lg}" padding: 32px pricing-tier-card-featured: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.title-lg}" rounded: "{rounded.lg}" padding: 32px callout-card-coral: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 32px connector-tile: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-sm}" rounded: "{rounded.lg}" padding: 20px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 10px 14px height: 40px text-input-focused: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.md}" cookie-consent-card: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.body-sm}" rounded: "{rounded.lg}" padding: 24px category-tab: backgroundColor: transparent textColor: "{colors.muted}" typography: "{typography.nav-link}" padding: 8px 14px rounded: "{rounded.md}" category-tab-active: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.nav-link}" rounded: "{rounded.md}" badge-pill: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.caption}" rounded: "{rounded.pill}" padding: 4px 12px badge-coral: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 12px cta-band-coral: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.display-sm}" rounded: "{rounded.lg}" padding: 64px cta-band-dark: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.display-sm}" rounded: "{rounded.lg}" padding: 64px footer: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark-soft}" typography: "{typography.body-sm}" padding: 64px --- ## Overview Claude.com is the warmest, most editorial interface in the AI-product category. The base atmosphere is a **tinted cream canvas** (`{colors.canvas}` — #faf9f5) — distinctly warm, deliberately not the cool gray-white that every other AI brand uses. Headlines run a **slab-serif display** ("Copernicus" / Tiempos Headline) at weight 400 with negative letter-spacing, paired with **StyreneB / Inter** body sans. The combination feels like a literary publication, not a SaaS marketing page. Brand voltage comes from the **cream + coral pairing** — coral (`{colors.primary}` — #cc785c) is the signature Anthropic accent, used on every primary CTA, on the brand wordmark, and on full-bleed callout cards. The coral is warm, slightly muted, never cyan/blue — a deliberate counter-positioning against OpenAI's cool slate, Google's saturated blue, and Microsoft's corporate cyan. The system has three surface modes that alternate page-by-page: 1. **Cream canvas** (`{colors.canvas}`) — default body floor 2. **Light cream cards** (`{colors.surface-card}`) — feature card backgrounds 3. **Dark navy product surfaces** (`{colors.surface-dark}`) — code editor mockups, model showcase cards, pre-footer CTAs, footer itself The dark surfaces are where Claude shows its product chrome — code blocks, terminal output, model comparison tables, agentic-flow diagrams. The cream-to-dark contrast is the page's pacing rhythm. **Key Characteristics:** - Warm cream canvas (`{colors.canvas}` — #faf9f5) with dark warm-ink text (`{colors.ink}` — #141413). The brand's defining color choice. - Coral primary CTA (`{colors.primary}` — #cc785c). Used scarcely on individual buttons, generously on full-bleed coral callout cards. - Slab-serif display headlines via Copernicus / Tiempos Headline at weight 400 with negative letter-spacing. Pairs with humanist sans body for a literary editorial voice. - Dark navy product mockup cards (`{colors.surface-dark}` — #181715) carrying code blocks, terminal panels, model comparison data — the brand shows the product chrome at scale rather than abstract marketing illustrations. - Light cream feature cards (`{colors.surface-card}` — #efe9de) — slightly darker than canvas, used for content-driven feature explanations. - Anthropic radial-spike mark — a small black asterisk-like glyph (4-spoke radial) — appears as the brand wordmark prefix and as a content marker. - Border radius is hierarchical: `{rounded.md}` (8px) for buttons + inputs, `{rounded.lg}` (12px) for content + product cards, `{rounded.xl}` (16px) for the hero illustration container, `{rounded.pill}` for badges. - Section rhythm `{spacing.section}` (96px) — modern-SaaS standard. Internal card padding stays generous at `{spacing.xl}` (32px). ## Colors ### Brand & Accent - **Coral / Primary** (`{colors.primary}` — #cc785c): The signature Anthropic warm coral. Used on every primary CTA background, on full-bleed coral callout cards, on the brand wordmark accent. The most-recognized Anthropic color outside of the spike-mark logo. - **Coral Active** (`{colors.primary-active}` — #a9583e): The press / hover-darker variant. - **Coral Disabled** (`{colors.primary-disabled}` — #e6dfd8): A desaturated cream-tinted disabled state. - **Accent Teal** (`{colors.accent-teal}` — #5db8a6): Used sparingly on secondary product surfaces (terminal status indicators, "active connection" dots in connectors page). - **Accent Amber** (`{colors.accent-amber}` — #e8a55a): A small companion warm-tone used on category badges and inline highlights. ### Surface - **Canvas** (`{colors.canvas}` — #faf9f5): The default page floor. Tinted cream — warm, deliberately not pure white. - **Surface Soft** (`{colors.surface-soft}` — #f5f0e8): Section dividers, very-soft band backgrounds. - **Surface Card** (`{colors.surface-card}` — #efe9de): Feature cards, content cards. One step darker than canvas. - **Surface Cream Strong** (`{colors.surface-cream-strong}` — #e8e0d2): A strongest-cream variant used on selected category tabs and emphasized section bands. - **Surface Dark** (`{colors.surface-dark}` — #181715): Code editor mockups, model showcase cards, footer. The dominant dark surface. - **Surface Dark Elevated** (`{colors.surface-dark-elevated}` — #252320): Elevated cards inside dark bands (settings panels in mockups). - **Surface Dark Soft** (`{colors.surface-dark-soft}` — #1f1e1b): Slightly lighter dark, used for code block backgrounds inside larger dark cards. - **Hairline** (`{colors.hairline}` — #e6dfd8): The 1px border tone on cream surfaces. Same hex as `{colors.primary-disabled}` — borders feel like one elevation step rather than ink lines. - **Hairline Soft** (`{colors.hairline-soft}` — #ebe6df): Barely-visible divider used inside the same band. ### Text - **Ink** (`{colors.ink}` — #141413): All headlines and primary text. Warm dark, slightly off-pure-black. - **Body Strong** (`{colors.body-strong}` — #252523): Emphasized paragraphs, lead text. - **Body** (`{colors.body}` — #3d3d3a): Default running-text color. - **Muted** (`{colors.muted}` — #6c6a64): Sub-headings, breadcrumbs, footer-adjacent secondary text. - **Muted Soft** (`{colors.muted-soft}` — #8e8b82): Captions, fine-print, copyright lines. - **On Primary** (`{colors.on-primary}` — #ffffff): Text on coral buttons. - **On Dark** (`{colors.on-dark}` — #faf9f5): Cream-tinted white used on dark surfaces (echoes the canvas tone). - **On Dark Soft** (`{colors.on-dark-soft}` — #a09d96): Footer body text, secondary labels in dark mockups. ### Semantic - **Success** (`{colors.success}` — #5db872): Green status dots, "available" indicators. - **Warning** (`{colors.warning}` — #d4a017): Warning callouts (rare on marketing surfaces). - **Error** (`{colors.error}` — #c64545): Validation errors. ## Typography ### Font Family The system runs **Copernicus** (or **Tiempos Headline** as substitute) as the slab-serif display face for headlines, and **StyreneB** (or **Inter** as substitute) as the humanist sans for body, navigation, and UI labels. **JetBrains Mono** handles code blocks. The fallback stack walks `Tiempos Headline, Garamond, "Times New Roman", serif` for display and `Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif` for body. The display/body split is editorial: - Copernicus serif (weight 400, negative tracking) → h1, h2, h3, hero display - StyreneB sans (weight 400-500) → body, navigation, buttons, captions, labels - JetBrains Mono → all code blocks and terminal text ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 64px | 400 | 1.05 | -1.5px | Homepage h1 ("Meet your thinking partner") — Copernicus serif | | `{typography.display-lg}` | 48px | 400 | 1.1 | -1px | Section heads — Copernicus | | `{typography.display-md}` | 36px | 400 | 1.15 | -0.5px | Sub-section heads, model names — Copernicus | | `{typography.display-sm}` | 28px | 400 | 1.2 | -0.3px | Pricing tier names, callout headlines — Copernicus | | `{typography.title-lg}` | 22px | 500 | 1.3 | 0 | Pricing plan size labels — StyreneB | | `{typography.title-md}` | 18px | 500 | 1.4 | 0 | Feature card titles, intro paragraphs | | `{typography.title-sm}` | 16px | 500 | 1.4 | 0 | Connector tile titles, list labels | | `{typography.body-md}` | 16px | 400 | 1.55 | 0 | Default running-text — StyreneB | | `{typography.body-sm}` | 14px | 400 | 1.55 | 0 | Footer body, fine-print | | `{typography.caption}` | 13px | 500 | 1.4 | 0 | Badge labels, captions | | `{typography.caption-uppercase}` | 12px | 500 | 1.4 | 1.5px | Category tags, "NEW" badges | | `{typography.code}` | 14px | 400 | 1.6 | 0 | Code blocks — JetBrains Mono | | `{typography.button}` | 14px | 500 | 1.0 | 0 | Standard button labels | | `{typography.nav-link}` | 14px | 500 | 1.4 | 0 | Top-nav menu items | ### Principles Display sizes use weight 400 (regular), never bold. Negative letter-spacing (-0.3 to -1.5px) is essential — Copernicus without it reads as off-brand. The serif character is what gives Anthropic its literary, considered voice; switching to a sans-serif display would make Claude feel like every other AI tool. Body type stays at weight 400 for paragraphs, weight 500 for labels and emphasized phrases. The sans body is humanist (StyreneB) — never geometric. Inter is an acceptable substitute because of its similar humanist proportions; Helvetica or Arial would be too neutral and break the warm-editorial feel. ### Note on Font Substitutes If Copernicus / Tiempos Headline is unavailable, **Cormorant Garamond** at weight 500 with -0.02em letter-spacing is the closest open-source approximation. **EB Garamond** is a fallback. For StyreneB, **Inter** is the closest match — both are humanist sans designed for screen reading. **Söhne** is another close alternative if licensed. ## Layout ### Spacing System - **Base unit:** 4px. - **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px. - **Section padding:** `{spacing.section}` (96px) — modern-SaaS rhythm. - **Card internal padding:** `{spacing.xl}` (32px) for feature cards, pricing tier cards, model comparison cards; `{spacing.lg}` (24px) for code-window cards and connector tiles. - **Callout / CTA bands:** `{spacing.xxl}` (48px) inside coral callout cards; 64px inside the larger dark CTA band. ### Grid & Container - **Max content width:** ~1200px centered. - **Editorial body:** Single 12-column grid; hero often uses 6/6 split (h1 left, illustration right). - **Feature card grids:** 3-up at desktop, 2-up at tablet, 1-up at mobile. - **Connector tile grids:** 4-up or 6-up at desktop, 2-up at tablet, 1-up at mobile. - **Pricing grid:** 3-up at desktop (Free / Pro / Team / Enterprise often), 1-up at mobile. ### Whitespace Philosophy The cream canvas + serif display + generous internal padding create an editorial pacing — Claude reads like a long-form magazine column rather than a marketing template. Whitespace between bands stays uniform at 96px; whitespace inside cards is generous (32px), letting type breathe. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat | No shadow, no border | Body sections, top nav, hero bands | | Soft hairline | 1px `{colors.hairline}` border | Inputs, sub-nav, occasionally on cards | | Cream card | `{colors.surface-card}` background — no shadow | Feature cards, content cards | | Dark surface card | `{colors.surface-dark}` background — no shadow | Code editor mockups, model showcase cards | | Subtle drop shadow | Faint shadow at low alpha | Hover-elevated states (the system uses `0 1px 3px rgba(20,20,19,0.08)` rarely) | The elevation philosophy is **color-block first, shadow rare**. Most depth comes from the cream-vs-dark surface contrast. Shadows are minimal. The dark surface mockups have their own internal product chrome (code editor scrollbars, line numbers, syntax highlighting) which adds detail without needing external shadows. ### Decorative Depth - The Anthropic spike-mark glyph (4-spoke radial asterisk) appears as a small black mark in the brand wordmark and inline as a content marker. - Code editor mockups carry their own internal depth: syntax-highlighted text in muted blues / oranges / grays, line numbers in `{colors.muted-soft}`, status bars at the bottom in `{colors.surface-dark-elevated}`. - Some hero illustrations use simple line-art with coral and dark-navy strokes on cream — minimal, hand-drawn-feeling, never photorealistic. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Reserved for badge accents and tiny dropdowns | | `{rounded.sm}` | 6px | Small inline buttons, dropdown items | | `{rounded.md}` | 8px | Standard CTA buttons, text inputs, category tabs | | `{rounded.lg}` | 12px | Content cards (feature, pricing, code-window, model-comparison) | | `{rounded.xl}` | 16px | Hero illustration container, the larger marquee components | | `{rounded.pill}` | 9999px | Badge pills, "NEW" tags | | `{rounded.full}` | 9999px / 50% | Avatar substitutes, icon buttons | ### Photography & Illustrations Claude's hero rarely uses photography. Instead it uses: - Simple line-art illustrations with coral + dark-navy strokes on the cream canvas - Code editor mockups (the dominant "hero" treatment on developer-focused pages) - Terminal output mockups with monospace text on dark - Model comparison cards (Opus / Sonnet / Haiku) with abstract geometric thumbnails When photography is used (rare — mostly testimonials), avatars crop to perfect circles at 40px diameter. ## Components ### Top Navigation **`top-nav`** — Cream nav bar pinned to the top of every page. 64px tall, `{colors.canvas}` background. Carries the Anthropic spike-mark + "Claude" wordmark at left, primary horizontal menu (Product, Solutions, Use Cases, Pricing, Research, Company) center-left, right-side cluster with "Sign in" text-link, "Try Claude" `{component.button-primary}` (coral). Menu items in `{typography.nav-link}` (StyreneB 14px / 500). ### Buttons **`button-primary`** — The signature coral CTA. Background `{colors.primary}` (#cc785c), text `{colors.on-primary}` (white), type `{typography.button}` (StyreneB 14px / 500), padding 12px × 20px, height 40px, rounded `{rounded.md}` (8px). Active state `button-primary-active` darkens to `{colors.primary-active}` (#a9583e). **`button-secondary`** — Cream button with hairline outline. Background `{colors.canvas}`, text `{colors.ink}`, 1px hairline border, same padding + height + radius as primary. **`button-secondary-on-dark`** — Used over `{colors.surface-dark}` cards. Background `{colors.surface-dark-elevated}` (#252320), text `{colors.on-dark}`. Stays dark — the system never inverts to a light secondary on dark surfaces. **`button-text-link`** — Inline text button, no background. Used for "Sign in" in the top nav and inline CTA links. **`button-icon-circular`** — 36px circular icon button. Background `{colors.canvas}`, hairline border, ink-color icon. Used for carousel arrows, share, "view more". **`text-link`** — Inline body links in `{colors.primary}` (the coral). Underlined on press; the coral inline link is one of the system's most distinctive small details. ### Cards & Containers **`hero-band`** — Cream-canvas hero with a 6-6 grid: h1 + sub-headline + button row on the left, hero illustration card or product mockup card on the right. Vertical padding `{spacing.section}` (96px). **`hero-illustration-card`** — A larger card holding the hero's right-side artifact — sometimes a coral-stroke line illustration on cream background, sometimes a dark code editor mockup. Background `{colors.canvas}` or `{colors.surface-dark}` depending on context, rounded `{rounded.xl}` (16px). **`feature-card`** — Used in 3-up feature grids. Background `{colors.surface-card}` (#efe9de — slightly darker cream), rounded `{rounded.lg}` (12px), internal padding `{spacing.xl}` (32px). Carries a small icon at top, an `{typography.title-md}` headline, and a body description in `{typography.body-md}`. **`product-mockup-card-dark`** — Dark navy card showing actual Claude product chrome (chat interface, code editor, agent controls). Background `{colors.surface-dark}`, rounded `{rounded.lg}`, internal padding `{spacing.xl}` (32px). Carries text labels in `{colors.on-dark}` and product UI fragments below. **`code-window-card`** — A specialized dark card showing a code editor with line numbers, syntax-highlighted code in `{typography.code}` (JetBrains Mono), and sometimes a "Run" button or terminal output panel below. Background `{colors.surface-dark}` with `{colors.surface-dark-soft}` for the inner code block, rounded `{rounded.lg}`, padding `{spacing.lg}` (24px). The signature visual element of Claude Code product pages. **`model-comparison-card`** — Used on the homepage's "Which problem are you up against?" section comparing Opus / Sonnet / Haiku. Background `{colors.canvas}` with hairline border, rounded `{rounded.lg}`, internal padding `{spacing.xl}` (32px). Carries the model name, a short capability blurb, and a `{component.text-link}` to learn more. **`pricing-tier-card`** — Standard tier card. Background `{colors.canvas}` with hairline border, rounded `{rounded.lg}`, padding `{spacing.xl}` (32px). Carries the plan name in `{typography.title-lg}` (StyreneB), price in `{typography.display-sm}` (Copernicus serif!), feature checklist in `{typography.body-md}`, and a `{component.button-primary}` at the bottom. **`pricing-tier-card-featured`** — The featured tier (typically "Pro" or "Team"). Background flips to `{colors.surface-dark}`, text inverts to `{colors.on-dark}`. The dark surface IS the featured-tier signal. **`callout-card-coral`** — A full-bleed coral card carrying a major call-to-action. Background `{colors.primary}` (#cc785c), text `{colors.on-primary}` (white), rounded `{rounded.lg}`, padding `{spacing.xxl}` (48px). The coral surface IS the voltage; the CTA inside uses an inverted button style (cream/canvas button on coral). **`connector-tile`** — Used on the connectors page's integration grid. Background `{colors.canvas}` with hairline border, rounded `{rounded.lg}`, padding 20px. Each tile carries a logo at top, a `{typography.title-sm}` connector name, and a short description. ### Inputs & Forms **`text-input`** — Standard text input. Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-md}`, rounded `{rounded.md}` (8px), padding 10px × 14px, height 40px. 1px hairline border in `{colors.hairline}`. **`text-input-focused`** — Focus state. Border thickens or shifts to `{colors.primary}` (coral) for emphasis. Carries a 3px coral-at-15%-alpha outer ring. **`cookie-consent-card`** — Bottom-right floating dark cookie banner. Background `{colors.surface-dark}`, text `{colors.on-dark}`, rounded `{rounded.lg}`, padding `{spacing.lg}` (24px). One of the few places dark surface appears at small scale on cream pages. ### Tags / Badges **`badge-pill`** — Small pill label used for category tags. Background `{colors.surface-card}`, text `{colors.ink}`, type `{typography.caption}` (13px / 500), rounded `{rounded.pill}`, padding 4px × 12px. **`badge-coral`** — Coral-fill badge for "NEW", "BETA", featured highlights. Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.caption-uppercase}` (12px / 500 / 1.5px tracking), rounded `{rounded.pill}`, padding 4px × 12px. ### Tab / Filter **`category-tab`** + **`category-tab-active`** — Used in sub-nav rows on solutions / connectors pages. Inactive: transparent background, `{colors.muted}` text. Active: `{colors.surface-card}` background, `{colors.ink}` text. Padding 8px × 14px, rounded `{rounded.md}`. ### CTA / Footer **`cta-band-coral`** — A pre-footer "Try Claude" CTA card. Full-width coral fill, white type, rounded `{rounded.lg}`, padding 64px. Carries an h2 in `{typography.display-sm}` (still serif!), a sub-line, and a cream-button CTA. **`cta-band-dark`** — Alternative pre-footer band on developer-focused pages. Background `{colors.surface-dark}`, text `{colors.on-dark}`, rounded `{rounded.lg}`, padding 64px. Often pairs with a code-window card. **`footer`** — Dark navy footer that closes every page. Background `{colors.surface-dark}` (#181715), text `{colors.on-dark-soft}`. 4-column link list at desktop covering Product / Company / Resources / Legal. Vertical padding 64px. The Anthropic spike-mark + "Anthropic" wordmark sits at the top in `{colors.on-dark}`. The footer never inverts. ## Do's and Don'ts ### Do - Anchor every page on the cream canvas. Pure white reads as "any other AI tool"; the warm tint is the brand differentiator. - Use Copernicus serif for every display headline. Pair with StyreneB sans body. Negative letter-spacing on display sizes is non-negotiable. - Reserve `{colors.primary}` (coral) for primary CTAs and full-bleed `{component.callout-card-coral}` moments. Don't paint accent moments coral elsewhere. - Use `{component.product-mockup-card-dark}` and `{component.code-window-card}` to show actual Claude product chrome. Don't paint marketing illustrations of code when you can show real code. - Pair `{component.feature-card}` (cream) with `{component.product-mockup-card-dark}` (navy) in alternating bands. The cream-to-dark rhythm is the brand's pacing mechanism. - Use the Anthropic spike-mark glyph as the brand wordmark prefix. Never invert the mark to white-on-dark within the wordmark itself. - Apply `{spacing.section}` (96px) between major bands. ### Don't - Don't use cool grays or pure white for canvas. Cream is the brand. - Don't bold serif display weight. Copernicus at 700 reads as bombastic; the system stays at 400. - Don't use cool blue or saturated cyan as a brand accent. The coral is the brand voltage. - Don't put coral everywhere. The coral is scarce on individual elements and generous only on full-bleed coral callout cards. - Don't use Inter for display headlines. The serif character is the brand voice. - Don't repeat the same surface mode in two consecutive bands. The pacing alternates: cream → cream-card → dark-mockup → cream → coral-callout → dark-footer. - Don't add hover state styling beyond what the system already encodes — primary darkens on press; nothing else changes. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 768px | Hamburger nav; hero h1 64→32px; hero-illustration-card stacks below content; feature grids 1-up; connector tiles 2-up; pricing 1-up; footer 4 cols → 1 | | Tablet | 768–1024px | Top nav stays horizontal but tightens; feature cards 2-up; connector tiles 3-up; pricing 2-up | | Desktop | 1024–1440px | Full top-nav with all menu items; 3-up feature cards; 4-up or 6-up connector tiles; 3-up pricing tiers | | Wide | > 1440px | Same as desktop with more outer breathing room; max content width caps at 1200px | ### Touch Targets - `{component.button-primary}` at minimum 40 × 40px. - `{component.button-icon-circular}` at exactly 36 × 36 — slightly under WCAG 44 but visually centered. - `{component.text-input}` height is 40px. - Connector tile entire card area is tappable; effective tap area >> 44px. ### Collapsing Strategy - Top nav collapses to hamburger at < 768px; menu opens as a full-screen cream sheet. - Hero band's 6-6 grid collapses to single-column on mobile — h1 + sub-head + buttons first, then the illustration / mockup card below. - Feature grids reduce columns rather than scaling cards down. - Pricing tier cards collapse 4 → 2 → 1; featured-tier dark surface stays visually distinct at every breakpoint. - Code-window cards retain code legibility at every breakpoint by allowing horizontal scroll within the card rather than wrapping code lines. ### Image Behavior - Code blocks inside dark mockups stay at fixed font-size; horizontal scroll on mobile rather than wrapping. - Hero illustrations scale proportionally; line-art strokes thin slightly on mobile. - Avatar photos in testimonials crop to circles at every breakpoint. ## Iteration Guide 1. Focus on ONE component at a time. Reference its YAML key (`{component.feature-card}`, `{component.code-window-card}`). 2. Variants of an existing component (`-active`, `-disabled`, `-focused`) live as separate entries in `components:`. 3. Use `{token.refs}` everywhere — never inline hex. 4. Never document hover. Default and Active/Pressed states only. 5. Display headlines stay Copernicus serif 400 with negative tracking. Body stays StyreneB / Inter 400. The split is unbreakable. 6. Cream + coral + dark navy is the trinity. Don't introduce a fourth surface tone (no purple cards, no green sections). 7. When in doubt about emphasis: bigger Copernicus serif before bolder weight. ## Known Gaps - Copernicus and StyreneB are licensed Anthropic typefaces and not available as public web fonts. Substitutes (Tiempos Headline / Cormorant Garamond / EB Garamond for serif; Inter / Söhne for sans) are documented in the typography section. - The Anthropic radial-spike-mark is a brand glyph rendered as inline SVG; it's not formalized as a system token here. Treat it as a logo asset. - Animation and transition timings (chat message reveal, code block typewriter effect on the homepage, agentic-flow diagram animations) are not in scope. - Form validation states beyond `{component.text-input-focused}` are not extracted — error / success states would need a sign-up or feedback flow to confirm. - The actual Claude product surface (claude.ai chat interface) shares some tokens with the marketing site but adds many product-specific components (chat bubbles, message tools, file upload chips, conversation history sidebar) that are out of scope for this marketing-surface document. - The "agent" / "computer use" demo cards on certain pages display animated Claude controlling a browser — the static screenshot doesn't fully capture the animation chrome.
Cursor Editor
Confident AI
Cursor Spec
复制
面向人工智能辅助编程环境的温润奶油纸质质感营销网页系统,采用明亮醒目的 Cursor 橙进行功能引导。
AI 时间线配色
Cursor 橙
安静自信的极简
--- version: alpha name: Cursor-design-analysis description: An AI-first code editor whose marketing site reads like a quietly-confident developer-tools brand with a warm-cream editorial canvas (`#f7f7f4`) instead of the typical dark IDE atmosphere. Near-black warm ink (`#26251e`) carries body and display alike — display sits at weight 400 with negative letter-spacing for a magazine feel rather than a bold tech voice. The single brand voltage is **Cursor Orange** (`#f54e00`) reserved for primary CTAs and the wordmark. A signature pastel timeline palette (peach, mint, blue, lavender, gold) marks AI-action stages (Thinking / Reading / Editing / Grepping / Done) — only inside in-product timeline visualizations. Cards use minimal hairlines, no shadows, generous 80px section rhythm. CursorGothic for display/body, JetBrains Mono on every code surface (which is roughly half the page). colors: primary: "#f54e00" primary-active: "#d04200" ink: "#26251e" body: "#5a5852" body-strong: "#26251e" muted: "#807d72" muted-soft: "#a09c92" hairline: "#e6e5e0" hairline-soft: "#efeee8" hairline-strong: "#cfcdc4" canvas: "#f7f7f4" canvas-soft: "#fafaf7" surface-card: "#ffffff" surface-strong: "#e6e5e0" on-primary: "#ffffff" timeline-thinking: "#dfa88f" timeline-grep: "#9fc9a2" timeline-read: "#9fbbe0" timeline-edit: "#c0a8dd" timeline-done: "#c08532" semantic-error: "#cf2d56" semantic-success: "#1f8a65" typography: display-mega: fontFamily: "'CursorGothic', system-ui, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 72px fontWeight: 400 lineHeight: 1.1 letterSpacing: -2.16px display-lg: fontFamily: "'CursorGothic', sans-serif" fontSize: 36px fontWeight: 400 lineHeight: 1.2 letterSpacing: -0.72px display-md: fontFamily: "'CursorGothic', sans-serif" fontSize: 26px fontWeight: 400 lineHeight: 1.25 letterSpacing: -0.325px display-sm: fontFamily: "'CursorGothic', sans-serif" fontSize: 22px fontWeight: 400 lineHeight: 1.3 letterSpacing: -0.11px title-md: fontFamily: "'CursorGothic', sans-serif" fontSize: 18px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 title-sm: fontFamily: "'CursorGothic', sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 body-md: fontFamily: "'CursorGothic', sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 body-tracked: fontFamily: "'CursorGothic', sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0.08px body-sm: fontFamily: "'CursorGothic', sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 caption: fontFamily: "'CursorGothic', sans-serif" fontSize: 13px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 caption-uppercase: fontFamily: "'CursorGothic', sans-serif" fontSize: 11px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0.88px textTransform: uppercase code: fontFamily: "'JetBrains Mono', 'Fira Code', monospace" fontSize: 13px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 button: fontFamily: "'CursorGothic', sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.0 letterSpacing: 0 nav-link: fontFamily: "'CursorGothic', sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 rounded: none: 0px xs: 4px sm: 6px md: 8px lg: 12px xl: 16px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px base: 16px md: 20px lg: 24px xl: 32px xxl: 48px section: 80px components: top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.nav-link}" height: 64px button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 10px 18px height: 40px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.md}" button-secondary: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 9px 17px height: 40px button-tertiary-text: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.button}" button-download: backgroundColor: "{colors.ink}" textColor: "{colors.canvas}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 20px height: 44px hero-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-mega}" padding: 80px ide-mockup-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" rounded: "{rounded.lg}" padding: 0 ide-pane: backgroundColor: "{colors.canvas-soft}" textColor: "{colors.body}" typography: "{typography.code}" rounded: "{rounded.md}" padding: 16px feature-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 24px comparison-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 24px timeline-pill-thinking: backgroundColor: "{colors.timeline-thinking}" textColor: "{colors.ink}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 10px timeline-pill-grep: backgroundColor: "{colors.timeline-grep}" textColor: "{colors.ink}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 10px timeline-pill-read: backgroundColor: "{colors.timeline-read}" textColor: "{colors.ink}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 10px timeline-pill-edit: backgroundColor: "{colors.timeline-edit}" textColor: "{colors.ink}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 10px timeline-pill-done: backgroundColor: "{colors.timeline-done}" textColor: "{colors.on-primary}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 10px code-block: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.code}" rounded: "{rounded.lg}" padding: 20px pricing-tier-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px pricing-tier-featured: backgroundColor: "{colors.ink}" textColor: "{colors.canvas}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px text-input: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 12px 16px height: 44px badge-pill: backgroundColor: "{colors.surface-strong}" textColor: "{colors.ink}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 10px cta-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-lg}" padding: 96px testimonial-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.body}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 24px footer: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-sm}" padding: 64px 48px footer-link: backgroundColor: transparent textColor: "{colors.body}" typography: "{typography.body-sm}" --- ## Overview Cursor's marketing site reads as a quietly-confident developer brand that believes in editorial calm over IDE-darkness. The base canvas is **warm cream** (`{colors.canvas}` — #f7f7f4) holding warm near-black ink (`{colors.ink}` — #26251e) for body and display alike. The single brand voltage is **Cursor Orange** (`{colors.primary}` — #f54e00) reserved for primary CTAs and the wordmark — used scarcely. Type runs **CursorGothic** as the single sans family. Display sits at weight 400 with negative letter-spacing — a magazine-editorial voice rather than tech-bombastic. JetBrains Mono carries every code surface (and code surfaces are roughly half the page). The brand's strongest visual signature is the **AI-timeline pill palette**: five pastel pills (peach `{colors.timeline-thinking}`, mint `{colors.timeline-grep}`, blue `{colors.timeline-read}`, lavender `{colors.timeline-edit}`, gold `{colors.timeline-done}`) marking AI-action stages inside in-product timeline visualizations. Used only in product UI — never as system action colors. **Key Characteristics:** - Warm cream canvas, not white. Ink is warm (#26251e), not pure black. - Single CTA color: `{colors.primary}` (Cursor Orange #f54e00). Used scarcely. - Display weight stays at 400 — never bold. Magazine voice. - AI timeline pastels: 5 dedicated tokens for in-product agent action stages. - Compact 8px CTA radius — developer dialect. - Hairline-only depth; no drop shadows. - 80px section rhythm. ## Colors ### Brand & Accent - **Cursor Orange** (`{colors.primary}` — #f54e00): Primary CTA pills, wordmark, hero accent. Used scarcely. - **Cursor Orange Active** (`{colors.primary-active}` — #d04200): Press state. ### Surface - **Canvas** (`{colors.canvas}` — #f7f7f4): Warm cream page floor. - **Canvas Soft** (`{colors.canvas-soft}` — #fafaf7): IDE-pane background inside mockups. - **Surface Card** (`{colors.surface-card}` — #ffffff): Pure white card surface — slight contrast against the cream canvas. - **Surface Strong** (`{colors.surface-strong}` — #e6e5e0): Badges, tag pills. ### Hairlines - **Hairline** (`{colors.hairline}` — #e6e5e0): 1px divider. - **Hairline Soft** (`{colors.hairline-soft}` — #efeee8): Lighter divider. - **Hairline Strong** (`{colors.hairline-strong}` — #cfcdc4): Stronger panel outline. ### Text - **Ink** (`{colors.ink}` — #26251e): Display, body emphasis. Warm near-black. - **Body** (`{colors.body}` — #5a5852): Default running-text. - **Body Strong** (`{colors.body-strong}` — #26251e): Same as ink. - **Muted** (`{colors.muted}` — #807d72): Sub-titles. - **Muted Soft** (`{colors.muted-soft}` — #a09c92): Disabled text. - **On Primary** (`{colors.on-primary}` — #ffffff): White text on Cursor Orange. ### Timeline (AI-action signature) - **Thinking** (`{colors.timeline-thinking}` — #dfa88f): Peach. Used inside in-product agent timeline only. - **Grep** (`{colors.timeline-grep}` — #9fc9a2): Mint. - **Read** (`{colors.timeline-read}` — #9fbbe0): Pastel blue. - **Edit** (`{colors.timeline-edit}` — #c0a8dd): Lavender. - **Done** (`{colors.timeline-done}` — #c08532): Warm gold. ### Semantic - **Success** (`{colors.semantic-success}` — #1f8a65): Confirmation indicators. - **Error** (`{colors.semantic-error}` — #cf2d56): Validation errors. ## Typography ### Font Family **CursorGothic** is the licensed display + body family. Fallback: `system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif`. Code surfaces switch to **JetBrains Mono**. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-mega}` | 72px | 400 | 1.1 | -2.16px | Homepage hero h1 | | `{typography.display-lg}` | 36px | 400 | 1.2 | -0.72px | Section heads | | `{typography.display-md}` | 26px | 400 | 1.25 | -0.325px | Sub-section heads | | `{typography.display-sm}` | 22px | 400 | 1.3 | -0.11px | Card group titles | | `{typography.title-md}` | 18px | 600 | 1.4 | 0 | Component titles | | `{typography.title-sm}` | 16px | 600 | 1.4 | 0 | List labels | | `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Default body | | `{typography.body-tracked}` | 16px | 400 | 1.5 | 0.08px | Tracked editorial body | | `{typography.body-sm}` | 14px | 400 | 1.5 | 0 | Footer body | | `{typography.caption}` | 13px | 400 | 1.4 | 0 | Photo captions | | `{typography.caption-uppercase}` | 11px | 600 | 1.4 | 0.88px | Section labels, timeline pill labels | | `{typography.code}` | 13px | 400 | 1.5 | 0 | Code blocks — JetBrains Mono | | `{typography.button}` | 14px | 500 | 1.0 | 0 | CTA pill labels | | `{typography.nav-link}` | 14px | 500 | 1.4 | 0 | Top-nav menu | ### Principles - **Display weight stays at 400.** Magazine voice, never bold. - **Negative letter-spacing on display only.** -0.11px to -2.16px tracking. - **JetBrains Mono on every code surface.** ### Note on Font Substitutes CursorGothic is licensed. Open-source substitute: **Inter** at weight 400 with letter-spacing -1.5%. Or **GT Sectra** for a more editorial feel. ## Layout ### 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}` 80px. - **Section padding:** 80px. ### Grid & Container - Max content width: ~1200px. - Editorial body: 12-column grid. - Feature card grids: 2-up at desktop for splits, 3-up for benefits. - Footer: 5-column at desktop. ### Whitespace Philosophy Generous editorial pacing — closer to a print magazine than a tech site. The cream canvas has plenty of breathing room; cards within bands sit close (16-24px gap). ## Elevation & Depth The system uses **hairline-only depth**. No drop shadows, no elevation tiers. Cards float above the canvas via 1px hairlines and the slight white-on-cream contrast. | Level | Treatment | Use | |---|---|---| | Flat (canvas) | `{colors.canvas}` (#f7f7f4) | Body bands, footer | | Card | `{colors.surface-card}` (#ffffff) | Content cards | | Hairline border | 1px `{colors.hairline}` | Card outlines, dividers | | IDE pane | `{colors.canvas-soft}` (#fafaf7) | Inside IDE mockup cards | ### Decorative Depth - **IDE-mockup cards** are the only "elevated" element. White card on cream canvas with internal pane structure mimicking the actual Cursor editor. - **Timeline pastel pills** add chromatic depth without surface elevation. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Reserved | | `{rounded.xs}` | 4px | Inline tags | | `{rounded.sm}` | 6px | Compact rows | | `{rounded.md}` | 8px | CTA buttons, form inputs | | `{rounded.lg}` | 12px | Cards, IDE panes | | `{rounded.xl}` | 16px | Larger feature cards (rare) | | `{rounded.pill}` | 9999px | Timeline pills, badges | | `{rounded.full}` | 9999px | Avatars (rare) | ## Components ### Top Navigation **`top-nav`** — Background `{colors.canvas}`, text `{colors.ink}`, height 64px. Layout: Cursor wordmark left, primary horizontal menu (Pricing / Features / Enterprise / Blog / Forum / Careers), Sign In + Download primary CTA right. ### Buttons **`button-primary`** — The signature Cursor Orange CTA. 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 pill on cream canvas. Background `{colors.surface-card}`, text `{colors.ink}`, 1px `{colors.hairline-strong}` border. **`button-tertiary-text`** — Inline ink text link. **`button-download`** — Larger ink-canvas CTA. Background `{colors.ink}`, text `{colors.canvas}`, padding 12px × 20px, height 44px. Used for "Download for macOS" type CTAs. ### Hero & IDE Mockups **`hero-band`** — Background `{colors.canvas}`, full-width display headline in `{typography.display-mega}` (72px / 400 / -2.16px), subhead in `{typography.body-md}`, two CTAs (`button-download` + `button-tertiary-text`), and a centered IDE-mockup card below the hero copy. **`ide-mockup-card`** — A white card containing a multi-pane IDE mockup (sidebar + main editor + chat panel + terminal). Background `{colors.surface-card}`, rounded `{rounded.lg}` (12px), 1px `{colors.hairline}` border, no padding (panes fill the card edge-to-edge). **`ide-pane`** — Individual IDE pane inside the mockup. Background `{colors.canvas-soft}`, text `{colors.body}` in `{typography.code}` (JetBrains Mono 13px), rounded `{rounded.md}` (8px), padding 16px. ### Cards **`feature-card`** — Background `{colors.surface-card}`, text `{colors.ink}`, type `{typography.title-md}`, rounded `{rounded.lg}`, padding 24px. 1px `{colors.hairline}` border. **`comparison-card`** — Side-by-side "Cursor vs other tools" card. Same surface and rounding; internally split into 2 columns. **`testimonial-card`** — Quote card. Background `{colors.surface-card}`, text `{colors.body}`, rounded `{rounded.lg}`, padding 24px. ### AI Timeline (signature) **`timeline-pill-thinking`** — Peach pill. Background `{colors.timeline-thinking}`, text `{colors.ink}`, type `{typography.caption-uppercase}` (11px / 600 / 0.88px tracking, uppercase), rounded `{rounded.pill}`, padding 4px × 10px. Marks "Thinking" stage in product timeline. **`timeline-pill-grep`** — Mint pill. Same shape, background `{colors.timeline-grep}`. Marks "Grepping" stage. **`timeline-pill-read`** — Pastel-blue pill. Background `{colors.timeline-read}`. Marks "Reading" stage. **`timeline-pill-edit`** — Lavender pill. Background `{colors.timeline-edit}`. Marks "Editing" stage. **`timeline-pill-done`** — Gold pill. Background `{colors.timeline-done}`, text `{colors.on-primary}` white. Marks "Done" stage. ### Code **`code-block`** — Inline code block. Background `{colors.surface-card}`, text `{colors.ink}` in `{typography.code}`, rounded `{rounded.lg}`, padding 20px, 1px `{colors.hairline}` border. ### Pricing **`pricing-tier-card`** — Background `{colors.surface-card}`, rounded `{rounded.lg}`, padding 32px, 1px `{colors.hairline}` border. **`pricing-tier-featured`** — Featured tier inverts to ink. Background `{colors.ink}`, text `{colors.canvas}`. Same shape, dark inversion signals "highlighted" without colored ribbon. ### Forms & Tags **`text-input`** — Background `{colors.surface-card}`, text `{colors.ink}`, rounded `{rounded.md}` (8px), padding 12px × 16px, height 44px. **`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 "Try Cursor now" band. Background `{colors.canvas}`, centered display headline in `{typography.display-lg}`, single Cursor Orange CTA. 96px vertical padding. **`footer`** — Closing 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}`. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` (Cursor Orange) for primary CTAs and brand wordmark. - Keep display weight at 400. The editorial voice depends on this. - Use the cream `{colors.canvas}` page floor — never pure white. - Render every code surface (inline, blocks, IDE panes) in JetBrains Mono. - Use timeline pastels only inside in-product agent visualizations — never as system action colors. ### Don't - Don't introduce a secondary brand action color. Cursor Orange is the only one. - Don't drop display to bold weights (700+). Magazine voice depends on 400. - Don't add drop shadows. Hairlines + ink-on-cream contrast carry the depth. - Don't use timeline pastels on non-timeline UI. They're scoped to the agent timeline only. - Don't extract a CTA color from a third-party widget (cookie consent, OneTrust). The brand's CTA is what appears on actual product CTAs. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 640px | Hero h1 72→32px; IDE mockup collapses to single pane preview; feature grid 1-up; nav hamburger. | | Tablet | 640–1024px | Hero h1 56px; IDE mockup compresses; feature grid 2-up. | | Desktop | 1024–1280px | Full hero h1 72px; full multi-pane IDE mockup; feature grid 3-up. | | Wide | > 1280px | Content caps at 1200px. | ### Touch Targets - Primary CTA at 40px height — at WCAG AA, padded for AAA. - Download CTA at 44px — at AAA. ### Collapsing Strategy - Top nav switches to hamburger below 768px. - IDE mockup multi-pane collapses to a single primary pane preview on mobile. - Feature grid: 3-up → 2-up → 1-up. ## Iteration Guide 1. Focus on a single component at a time. 2. CTAs default to `{rounded.md}` (8px). Cards use `{rounded.lg}` (12px). 3. Variants live as separate entries inside `components:`. 4. Use `{token.refs}` everywhere — never inline hex. 5. Hover state never documented. 6. CursorGothic 400 for display, 400/500/600 for body. JetBrains Mono on every code surface. 7. Cursor Orange stays scarce. 8. Timeline pastels stay scoped to in-product agent visualizations. ## Known Gaps - CursorGothic is a licensed typeface; Inter is the substitute. - Animation timings (timeline pill entrance, IDE pane reveal) out of scope. - In-app surfaces (code editor, chat panel, agent timeline) only partially captured via marketing IDE mockups. - Form validation states beyond focus not visible on captured surfaces.
SELECT * FROM DB
Electric Yellow
ClickHouse Spec
复制
追求极致性能的大数据分析引擎品牌系统,在暗夜黑背景中仅以高能亮黄色作为信号指示,强调专业力量。
暗黑高反差
高能亮黄色
数据驱动版面
--- version: alpha name: ClickHouse-design-analysis description: A high-performance database interface anchored on near-pure black canvas with electric yellow as the brand voltage. White typography in confident sans, yellow CTAs, and yellow-text stat numbers carry the brand voice across every page. Code blocks and product UI fragments embed directly in dark cards. The yellow + black pairing (and yellow used scarcely as accent) is the system's signature — brand identity without atmospheric decoration. colors: primary: "#faff69" primary-active: "#e6eb52" primary-disabled: "#3a3a1f" ink: "#ffffff" body: "#cccccc" body-strong: "#e6e6e6" muted: "#888888" muted-soft: "#5a5a5a" hairline: "#2a2a2a" hairline-strong: "#3a3a3a" canvas: "#0a0a0a" surface-soft: "#121212" surface-card: "#1a1a1a" surface-elevated: "#242424" surface-yellow-band: "#faff69" on-primary: "#0a0a0a" on-dark: "#ffffff" on-yellow: "#0a0a0a" accent-emerald: "#22c55e" accent-rose: "#ef4444" accent-blue: "#3b82f6" success: "#22c55e" warning: "#f59e0b" error: "#ef4444" typography: display-xl: fontFamily: "Inter, sans-serif" fontSize: 72px fontWeight: 700 lineHeight: 1.05 letterSpacing: -2.5px display-lg: fontFamily: "Inter, sans-serif" fontSize: 56px fontWeight: 700 lineHeight: 1.1 letterSpacing: -2px display-md: fontFamily: "Inter, sans-serif" fontSize: 40px fontWeight: 700 lineHeight: 1.15 letterSpacing: -1.5px display-sm: fontFamily: "Inter, sans-serif" fontSize: 32px fontWeight: 700 lineHeight: 1.2 letterSpacing: -1px title-lg: fontFamily: "Inter, sans-serif" fontSize: 24px fontWeight: 700 lineHeight: 1.3 letterSpacing: -0.3px title-md: fontFamily: "Inter, sans-serif" fontSize: 18px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 title-sm: fontFamily: "Inter, sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 stat-display: fontFamily: "Inter, sans-serif" fontSize: 56px fontWeight: 700 lineHeight: 1.0 letterSpacing: -1.5px body-md: fontFamily: "Inter, sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.55 letterSpacing: 0 body-sm: fontFamily: "Inter, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.55 letterSpacing: 0 caption: fontFamily: "Inter, sans-serif" fontSize: 13px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 caption-uppercase: fontFamily: "Inter, sans-serif" fontSize: 12px fontWeight: 600 lineHeight: 1.4 letterSpacing: 1.5px code: fontFamily: "JetBrains Mono, ui-monospace, monospace" fontSize: 14px fontWeight: 400 lineHeight: 1.55 letterSpacing: 0 button: fontFamily: "Inter, sans-serif" fontSize: 14px fontWeight: 600 lineHeight: 1 letterSpacing: 0 nav-link: fontFamily: "Inter, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 rounded: xs: 4px sm: 6px md: 8px lg: 12px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 20px height: 40px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.md}" button-primary-disabled: backgroundColor: "{colors.primary-disabled}" textColor: "{colors.muted}" rounded: "{rounded.md}" button-secondary: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 20px height: 40px button-text-link: backgroundColor: transparent textColor: "{colors.on-dark}" typography: "{typography.button}" button-icon-circular: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" rounded: "{rounded.full}" size: 36px text-link: backgroundColor: transparent textColor: "{colors.primary}" typography: "{typography.body-md}" top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.on-dark}" typography: "{typography.nav-link}" height: 64px hero-band: backgroundColor: "{colors.canvas}" textColor: "{colors.on-dark}" typography: "{typography.display-xl}" padding: 96px hero-stat-card: backgroundColor: "{colors.canvas}" textColor: "{colors.primary}" typography: "{typography.stat-display}" feature-card-yellow: backgroundColor: "{colors.surface-yellow-band}" textColor: "{colors.on-yellow}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 32px feature-card-dark: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 32px code-window-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.code}" rounded: "{rounded.lg}" padding: 24px product-mockup-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 24px pricing-tier-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.title-lg}" rounded: "{rounded.lg}" padding: 32px pricing-tier-card-featured: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.title-lg}" rounded: "{rounded.lg}" padding: 32px stat-callout: backgroundColor: transparent textColor: "{colors.primary}" typography: "{typography.stat-display}" cta-band-yellow: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.display-md}" rounded: "{rounded.lg}" padding: 64px text-input: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 10px 14px height: 40px text-input-focused: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" rounded: "{rounded.md}" category-tab: backgroundColor: transparent textColor: "{colors.muted}" typography: "{typography.nav-link}" rounded: "{rounded.md}" padding: 8px 14px category-tab-active: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.nav-link}" rounded: "{rounded.md}" badge-pill: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.caption}" rounded: "{rounded.pill}" padding: 4px 12px badge-yellow: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 12px events-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.on-dark}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 24px customer-logo-strip: backgroundColor: "{colors.canvas}" textColor: "{colors.muted}" typography: "{typography.body-md}" padding: 32px footer: backgroundColor: "{colors.canvas}" textColor: "{colors.muted}" typography: "{typography.body-sm}" padding: 64px --- ## Overview ClickHouse's marketing surface is the highest-contrast interface in the database / data-platform category. The base atmosphere is **near-pure black canvas** (`{colors.canvas}` — #0a0a0a) with **electric yellow** (`{colors.primary}` — #faff69) as the singular brand voltage. The yellow handles every primary CTA, every stat-callout number, every "GET STARTED" badge — used scarcely on individual elements but generously on full-bleed yellow CTA cards. White typography in confident weight-700 sans-serif anchors the editorial body. The yellow + black pairing is what makes ClickHouse instantly recognizable. Where Snowflake uses cool blue gradients and Databricks uses red + slate, ClickHouse leans hard into one electric yellow that does all the brand work. Code blocks, terminal output, and product UI fragments embed directly in dark `{colors.surface-card}` (#1a1a1a) cards across every page. Type voice runs **Inter** at confident weights — 700 for display headlines (with negative letter-spacing -1 to -2.5px), 600 for sub-titles and buttons, 400 for body. The system has no display-serif counter-voice; everything is one geometric humanist sans, scaled and weighted for hierarchy. **Key Characteristics:** - Near-pure black canvas (`{colors.canvas}` — #0a0a0a) with white type. The system has no light-mode marketing surface. - Electric yellow primary (`{colors.primary}` — #faff69). Used on primary CTAs, large stat-callout numbers ("2.8k+", "74k+"), and full-bleed yellow CTA bands. - Inter at weight 700 for display, weight 600 for sub-titles + buttons, weight 400 for body. No serif counterpoint. - Dark surface cards (`{colors.surface-card}` — #1a1a1a) for feature cards, code windows, and product mockups. Cards barely lighter than canvas — color-block contrast is subtle. - Code blocks render in JetBrains Mono inside `{colors.surface-card}`. SQL syntax-highlighted in muted blues / yellows / grays. - Stat numbers in yellow + sans-700 + huge size carry the credibility moment ("779+", "2.8k+", "47k+" community / contributor / star counts). - Border radius is hierarchical: `{rounded.md}` (8px) for buttons, `{rounded.lg}` (12px) for content cards. No pill except in tag badges. - Section rhythm `{spacing.section}` (96px) between major editorial bands. ## Colors ### Brand & Accent - **Primary (Electric Yellow)** (`{colors.primary}` — #faff69): The signature brand color. All primary CTA backgrounds, large stat-callout numbers, full-bleed yellow CTA cards. The yellow is the brand. - **Primary Active** (`{colors.primary-active}` — #e6eb52): Press / hover-darker variant. - **Primary Disabled** (`{colors.primary-disabled}` — #3a3a1f): Desaturated dark-yellow on dark canvas. ### Surface - **Canvas** (`{colors.canvas}` — #0a0a0a): The default page floor. Near-pure black. - **Surface Soft** (`{colors.surface-soft}` — #121212): Section dividers, very-soft band tints. - **Surface Card** (`{colors.surface-card}` — #1a1a1a): Feature cards, code windows, product mockups, pricing tier cards. - **Surface Elevated** (`{colors.surface-elevated}` — #242424): Nested cards inside larger dark cards. - **Surface Yellow Band** (`{colors.surface-yellow-band}` — #faff69): The yellow CTA card / band fill — same hex as primary. - **Hairline** (`{colors.hairline}` — #2a2a2a): 1px borders on cards. - **Hairline Strong** (`{colors.hairline-strong}` — #3a3a3a): Heavier divider on input underlines and emphasis. ### Text - **Ink / On Dark** (`{colors.on-dark}` — #ffffff): All headline and primary text. - **Body** (`{colors.body}` — #cccccc): Default running-text color. - **Body Strong** (`{colors.body-strong}` — #e6e6e6): Emphasized paragraphs. - **Muted** (`{colors.muted}` — #888888): Footer links, captions, breadcrumbs. - **Muted Soft** (`{colors.muted-soft}` — #5a5a5a): Tertiary text — fine print. - **On Primary / On Yellow** (`{colors.on-primary}` / `{colors.on-yellow}` — #0a0a0a): Black text on yellow CTAs and yellow CTA bands. The high-contrast yellow + black combo is the brand action signal. ### Semantic / Accent - **Accent Emerald** (`{colors.accent-emerald}` — #22c55e): Success states, "active" status indicators in product UI. - **Accent Rose** (`{colors.accent-rose}` — #ef4444): Error states, "down" indicators. - **Accent Blue** (`{colors.accent-blue}` — #3b82f6): Info states, code-syntax highlighting. ## Typography ### Font Family The system runs **Inter** for everything — display, body, navigation, buttons, captions. **JetBrains Mono** handles code blocks. The fallback stack walks `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`. The single-family approach is deliberate: Inter at weight 700 + 600 + 400 covers the entire hierarchy without needing a serif or display counter-voice. The geometric humanist character of Inter at confident bold weight gives ClickHouse a precise, engineered feel that matches the database's performance-first positioning. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 72px | 700 | 1.05 | -2.5px | Homepage h1 ("The leading database for AI") | | `{typography.display-lg}` | 56px | 700 | 1.1 | -2px | Section heads | | `{typography.display-md}` | 40px | 700 | 1.15 | -1.5px | Sub-section heads, CTA-band heads | | `{typography.display-sm}` | 32px | 700 | 1.2 | -1px | Card titles, pricing tier prices | | `{typography.title-lg}` | 24px | 700 | 1.3 | -0.3px | Pricing plan names, larger feature titles | | `{typography.title-md}` | 18px | 600 | 1.4 | 0 | Card titles, intro paragraphs | | `{typography.title-sm}` | 16px | 600 | 1.4 | 0 | Small card titles, list labels | | `{typography.stat-display}` | 56px | 700 | 1.0 | -1.5px | Stat callouts ("779+", "47k+") — ALWAYS yellow | | `{typography.body-md}` | 16px | 400 | 1.55 | 0 | Default running-text | | `{typography.body-sm}` | 14px | 400 | 1.55 | 0 | Footer body, fine-print | | `{typography.caption}` | 13px | 500 | 1.4 | 0 | Badge labels, captions | | `{typography.caption-uppercase}` | 12px | 600 | 1.4 | 1.5px | Section labels, "NEW" badges | | `{typography.code}` | 14px | 400 | 1.55 | 0 | Code blocks — JetBrains Mono | | `{typography.button}` | 14px | 600 | 1.0 | 0 | Standard button labels | | `{typography.nav-link}` | 14px | 500 | 1.4 | 0 | Top-nav menu items | ### Principles Display weights stay at 700 across all sizes. Negative letter-spacing (-1 to -2.5px) is essential — Inter at weight 700 without negative tracking reads as too wide / Apple-marketing. The tightened tracking gives ClickHouse the precise, engineered feel. Body and labels stay at weights 400 / 500 / 600. The hierarchy is built on size + weight, not on family contrast. ### Note on Font Substitutes Inter is open-source and the documented choice. **Söhne** is a close commercial alternative if licensed. **Geist** is another modern alternative. ## Layout ### Spacing System - **Base unit:** 4px. - **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px. - **Section padding:** `{spacing.section}` (96px) between major bands. - **Card internal padding:** `{spacing.xl}` (32px) for feature cards, pricing tiers; `{spacing.lg}` (24px) for code-window cards and event cards. ### Grid & Container - **Max content width:** ~1280px centered. - **Editorial body:** Single 12-column grid; hero often uses 7/5 split (h1 left, code mockup right). - **Feature card grids:** 3-up at desktop, 2-up at tablet, 1-up at mobile. - **Pricing grid:** 3-4 up at desktop, 1-up at mobile. ### Whitespace Philosophy ClickHouse uses dense, slightly-compressed whitespace appropriate for a developer-tooling brand — generous enough to read editorially, tight enough to feel "engineering-grade" rather than "marketing-soft." Section rhythm at 96px is standard; card internal padding stays at 32px for feature cards. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat | No shadow, no border | Body sections, top nav, hero | | Soft hairline | 1px `{colors.hairline}` border | Code-window cards, content cards | | Surface card | `{colors.surface-card}` background — no shadow | Feature cards, pricing tiers, event cards | | Yellow band | `{colors.primary}` background — no shadow | Full-bleed yellow CTA cards / bands | The system uses no drop shadows. Depth comes from the contrast between black canvas and `{colors.surface-card}` (a barely-lighter-than-canvas tone) — the contrast is subtle, more like an "engineering-grade dim panel" than an "elevated card." ### Decorative Depth - Code-window cards carry their own internal product chrome — line numbers, syntax highlighting, status bars at the bottom — adding visual density without external shadows. - The yellow-on-black contrast does most of the elevation work for CTAs. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Reserved for badge accents | | `{rounded.sm}` | 6px | Small inline buttons | | `{rounded.md}` | 8px | Standard CTA buttons, text inputs | | `{rounded.lg}` | 12px | Content cards, code-window cards, pricing tiers | | `{rounded.pill}` | 9999px | Badge pills | | `{rounded.full}` | 9999px / 50% | Avatars, icon buttons | ## Components ### Top Navigation **`top-nav`** — Black nav bar pinned to top. 64px tall, `{colors.canvas}` background. Carries the ClickHouse logo + wordmark at left, primary horizontal menu (Product, Use Cases, Pricing, Resources, Customers) center-left, right-side cluster with "Sign in" + "Get Started" `{component.button-primary}` (yellow). Menu items in `{typography.nav-link}` (Inter 14px / 500). ### Buttons **`button-primary`** — The signature yellow CTA. Background `{colors.primary}` (#faff69), text `{colors.on-primary}` (black), type `{typography.button}` (Inter 14px / 600), padding 12px × 20px, height 40px, rounded `{rounded.md}` (8px). The yellow + black combination is iconic. **`button-secondary`** — Dark surface card button. Background `{colors.surface-card}`, text `{colors.on-dark}`, same shape as primary. **`button-text-link`** — Inline text button, no background. Used for "Sign in" and inline link CTAs. **`text-link`** — Inline body links in `{colors.primary}` (yellow on dark). Underlined. **`button-icon-circular`** — 36 × 36 circular icon button on dark. ### Cards & Containers **`hero-band`** — Black-canvas hero with 7-5 grid: h1 + sub-headline + button row on the left, code-window or product mockup on the right. Vertical padding `{spacing.section}` (96px). **`hero-stat-card`** — Yellow stat-display numbers ("779+", "47k+") inline on the canvas. No card surface — just yellow text in `{typography.stat-display}` (56px / 700). **`feature-card-yellow`** — Full-bleed yellow card ("Built for every modern data challenge"). Background `{colors.primary}`, text `{colors.on-yellow}` (black), rounded `{rounded.lg}` (12px), padding `{spacing.xl}` (32px). The yellow card IS the visual emphasis. **`feature-card-dark`** — Standard dark feature card. Background `{colors.surface-card}`, text `{colors.on-dark}`, rounded `{rounded.lg}`, padding `{spacing.xl}` (32px). **`code-window-card`** — Dark card showing a SQL code block. Background `{colors.surface-card}`, code in JetBrains Mono with syntax highlighting, rounded `{rounded.lg}`, padding `{spacing.lg}` (24px). Often the hero's right-side artifact on developer-focused pages. **`product-mockup-card`** — Card showing actual ClickHouse product UI (query editor, dashboard, monitoring panel). Same shape as `{component.feature-card-dark}` but with embedded product chrome inside. **`pricing-tier-card`** — Standard tier card. Background `{colors.surface-card}`, rounded `{rounded.lg}`, padding `{spacing.xl}` (32px). **`pricing-tier-card-featured`** — The featured tier flips to `{colors.primary}` (yellow). The yellow surface IS the featured signal. **`stat-callout`** — Inline yellow stat numbers ("779+", "2.8k+", "47k+"). Transparent background, text `{colors.primary}`, type `{typography.stat-display}`. Used as a flat layout block, not a card with surface. **`events-card`** — Used on /company/events. Dark card with event title, date in `{typography.caption-uppercase}`, location, and a "Register" CTA. Rounded `{rounded.lg}`, padding `{spacing.lg}`. **`customer-logo-strip`** — Horizontal monochrome customer-logo strip. Background `{colors.canvas}`, logos in `{colors.muted}`, vertical padding `{spacing.xl}` (32px). ### Inputs & Forms **`text-input`** — Dark text input. Background `{colors.surface-card}`, text `{colors.on-dark}`, rounded `{rounded.md}` (8px), padding 10px × 14px, height 40px. **`text-input-focused`** — Border thickens to `{colors.primary}` (yellow) for emphasis. ### Tags / Badges **`badge-pill`** — Small dark pill label. Background `{colors.surface-card}`, text `{colors.on-dark}`, type `{typography.caption}`, rounded `{rounded.pill}`. **`badge-yellow`** — Yellow pill for "NEW", "GET STARTED" emphasis. Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.caption-uppercase}`, rounded `{rounded.pill}`. ### Tab / Filter **`category-tab`** + **`category-tab-active`** — Dark tab navigation. Inactive: transparent + muted text. Active: surface-card background + on-dark text. Padding 8px × 14px, rounded `{rounded.md}`. ### CTA / Footer **`cta-band-yellow`** — A pre-footer "Deploy your way" CTA band. Full yellow fill, black type, rounded `{rounded.lg}`, padding 64px. Carries an h2 in `{typography.display-md}` and a CTA — usually a black-button on the yellow surface. **`footer`** — Black footer that closes every page. Background `{colors.canvas}`, text `{colors.muted}`. 4-column link list at desktop covering Product / Use Cases / Resources / Company. Vertical padding 64px. The ClickHouse wordmark sits at the top in `{colors.on-dark}`. ## Do's and Don'ts ### Do - Anchor every page on the black canvas. The yellow + black pairing is the brand voltage. - Reserve `{colors.primary}` (yellow) for primary CTAs, stat-callout numbers, and full-bleed yellow CTA bands. The yellow's scarcity at the element level + abundance at the band level is what makes it powerful. - Use Inter at weight 700 for every display headline, with -1 to -2.5px letter-spacing. - Show actual SQL code blocks inside `{component.code-window-card}` — ClickHouse is a database; show the query, don't paint marketing illustrations of queries. - Use `{component.stat-callout}` numbers to establish credibility (community size, contributors, performance benchmarks). The yellow stat numbers are signature. - Anchor every band with `{spacing.section}` (96px) vertical rhythm. ### Don't - Don't introduce a second brand color. ClickHouse is monochromatic + yellow. - Don't bold display weight beyond 700 or use weight 500 for headlines. The hierarchy depends on size, not on weight gradation. - Don't use yellow for body text or large surface fills outside of intentional yellow cards. - Don't use rounded buttons / pills outside of small badges. The standard button radius is 8px (md). - Don't repeat the same surface mode in two consecutive bands. Black canvas → dark feature card → yellow CTA card → black canvas → code-window card. - Don't replace SQL code mockups with abstract illustrations. The code IS the marketing voltage. - Don't add hover state styling beyond what the system already encodes. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 768px | Hamburger nav; hero h1 72→36px; code-window-card stacks below; feature grids 1-up; pricing 1-up | | Tablet | 768–1024px | Top nav tightens; feature cards 2-up; pricing 2-up | | Desktop | 1024–1440px | Full top-nav; 3-up feature cards; 3-4 up pricing tiers | | Wide | > 1440px | Same as desktop with more breathing room; max content 1280px | ### Touch Targets - `{component.button-primary}` at minimum 40 × 40px. - `{component.button-icon-circular}` at exactly 36 × 36 — slightly under WCAG 44, visually centered. - `{component.text-input}` height is 40px. ### Collapsing Strategy - Top nav collapses to hamburger at < 768px. - Hero 7-5 grid → single-column on mobile. - Feature card grids reduce columns rather than scaling. - Code-window cards retain font-size; horizontal scroll inside the card on mobile. - Pricing tier cards collapse 4 → 2 → 1; featured tier yellow stays distinct. ### Image Behavior - Code blocks inside dark mockups stay at fixed font-size; horizontal scroll on mobile rather than wrapping. - Customer logos in monochrome strip retain native widths; row wraps on mobile. ## Iteration Guide 1. Focus on ONE component at a time. Reference its YAML key (`{component.code-window-card}`, `{component.pricing-tier-card-featured}`). 2. Variants of an existing component (`-active`, `-disabled`, `-focused`) live as separate entries. 3. Use `{token.refs}` everywhere — never inline hex. 4. Never document hover. Default and Active/Pressed states only. 5. Display headlines stay Inter 700 with negative letter-spacing. Body stays Inter 400. 6. The yellow + black pairing is the brand contract. Don't soften with secondary accents. 7. When in doubt about emphasis: bigger Inter 700 before adding color. ## Known Gaps - The exact yellow hex (#faff69) was sampled from the screenshot; ClickHouse may publish an official brand color slightly differently. - Inter weight axis values beyond 400 / 500 / 600 / 700 are not formalized — only the static weights observed are documented. - Animation and transition timings (code typewriter effects, stat counter animations) are not in scope. - Form validation states beyond `{component.text-input-focused}` are not extracted. - The actual ClickHouse Cloud product surface (query console, monitoring dashboards, table browser) shares some tokens with the marketing site but adds many product-specific components that are out of scope. - The customer logo strip's exact opacity / treatment varies — the muted gray is approximate.
📅 Cal Calendar
SaaS Minimalist
Cal.com Spec
复制
开源预约系统的高级极简主义设计,采用锋利而清晰的无衬线标题字体与扁平粗实的表单框架。
Cal Sans 字体
宽幅留白
极简预约卡片
--- version: alpha name: Cal.com-design-analysis description: A clean, calendar-software-first interface anchored on white canvas with black primary CTAs and custom Cal Sans display typography. The system reads as friendly modern SaaS — generous whitespace, soft-rounded cards (~12px), product UI fragments shown directly inside cards, and a dark navy footer that visually closes long-scroll pages. Brand voltage comes from the Cal Sans display headline (a custom geometric face) and from product UI artifacts shown in-card rather than from accent colors. colors: primary: "#111111" primary-active: "#242424" primary-disabled: "#e5e7eb" ink: "#111111" body: "#374151" muted: "#6b7280" muted-soft: "#898989" hairline: "#e5e7eb" hairline-soft: "#f3f4f6" canvas: "#ffffff" surface-soft: "#f8f9fa" surface-card: "#f5f5f5" surface-strong: "#e5e7eb" surface-dark: "#101010" surface-dark-elevated: "#1a1a1a" on-primary: "#ffffff" on-dark: "#ffffff" on-dark-soft: "#a1a1aa" brand-accent: "#3b82f6" success: "#10b981" warning: "#f59e0b" error: "#ef4444" badge-orange: "#fb923c" badge-pink: "#ec4899" badge-violet: "#8b5cf6" badge-emerald: "#34d399" typography: display-xl: fontFamily: "Cal Sans, Inter, sans-serif" fontSize: 64px fontWeight: 600 lineHeight: 1.05 letterSpacing: -2px display-lg: fontFamily: "Cal Sans, Inter, sans-serif" fontSize: 48px fontWeight: 600 lineHeight: 1.1 letterSpacing: -1.5px display-md: fontFamily: "Cal Sans, Inter, sans-serif" fontSize: 36px fontWeight: 600 lineHeight: 1.15 letterSpacing: -1px display-sm: fontFamily: "Cal Sans, Inter, sans-serif" fontSize: 28px fontWeight: 600 lineHeight: 1.2 letterSpacing: -0.5px title-lg: fontFamily: "Inter, sans-serif" fontSize: 22px fontWeight: 600 lineHeight: 1.3 letterSpacing: -0.3px title-md: fontFamily: "Inter, sans-serif" fontSize: 18px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 title-sm: fontFamily: "Inter, sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 body-md: fontFamily: "Inter, sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 body-sm: fontFamily: "Inter, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 caption: fontFamily: "Inter, sans-serif" fontSize: 13px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 code: fontFamily: "JetBrains Mono, ui-monospace, monospace" fontSize: 14px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 button: fontFamily: "Inter, sans-serif" fontSize: 14px fontWeight: 600 lineHeight: 1 letterSpacing: 0 nav-link: fontFamily: "Inter, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 rounded: xs: 4px sm: 6px md: 8px lg: 12px xl: 16px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 20px height: 40px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.md}" button-primary-disabled: backgroundColor: "{colors.primary-disabled}" textColor: "{colors.muted}" rounded: "{rounded.md}" button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 20px height: 40px button-icon-circular: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.full}" size: 36px button-text-link: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.button}" text-link: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.body-md}" top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.nav-link}" height: 64px nav-pill-group: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ink}" typography: "{typography.nav-link}" rounded: "{rounded.pill}" padding: 6px hero-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-xl}" padding: 96px hero-app-mockup-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.xl}" feature-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 32px feature-icon-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-sm}" rounded: "{rounded.lg}" padding: 24px product-mockup-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.lg}" padding: 24px testimonial-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 24px pricing-tier-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-lg}" rounded: "{rounded.lg}" padding: 32px pricing-tier-card-featured: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.title-lg}" rounded: "{rounded.lg}" padding: 32px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 10px 14px height: 40px text-input-focused: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.md}" category-tab: backgroundColor: transparent textColor: "{colors.muted}" typography: "{typography.nav-link}" padding: 8px 14px rounded: "{rounded.md}" category-tab-active: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.nav-link}" rounded: "{rounded.md}" avatar-circle: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" rounded: "{rounded.full}" size: 36px badge-pill: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.caption}" rounded: "{rounded.pill}" padding: 4px 12px rating-stars: backgroundColor: transparent textColor: "{colors.badge-orange}" typography: "{typography.caption}" cta-band-light: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.display-sm}" rounded: "{rounded.lg}" padding: 48px footer: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark-soft}" typography: "{typography.body-sm}" padding: 64px --- ## Overview Cal.com's marketing surface is a clean, friendly modern-SaaS interface — white canvas (`{colors.canvas}` — #ffffff) with black primary CTAs (`{colors.primary}` — #111111), custom **Cal Sans** display typography, and `{colors.surface-card}` (#f5f5f5) light-gray cards holding product UI fragments. The system reads as confidently engineered without trying to impress — every band has clear hierarchy, generous whitespace, and a single primary action. Type voice splits cleanly into two roles: **Cal Sans** (the brand's custom geometric display face — used for h1, h2, h3, and hero headlines) and **Inter** (used for everything else — body, buttons, nav, captions). Cal Sans uses weight 600 with negative letter-spacing (-0.5px to -2px depending on size) — it feels modern, slightly condensed, distinctly Cal.com. Component voltage comes from **product UI fragments shown directly inside cards** — calendar widgets, scheduling forms, automation diagrams, integration tiles. Cal.com doesn't paint marketing illustrations of the product; it shows the actual product chrome at small scale embedded in the marketing flow. The footer flips to `{colors.surface-dark}` (#101010) — a deep near-black that visually closes every long-scroll page. The footer is the only dark surface in the system; everything above stays white-with-light-gray-cards. **Key Characteristics:** - White canvas with black primary CTA (`{colors.primary}` — #111111). Buttons are `{rounded.md}` (8px) with confident weight-600 labels. Standard friendly-SaaS button. - Custom `Cal Sans` display typeface for headlines (substituted with Inter weight 600 here). Negative letter-spacing on display sizes — geometric, precise, slightly condensed. - Light-gray card surfaces (`{colors.surface-card}` — #f5f5f5) for feature cards, testimonials, and pricing tiers (non-featured). The featured pricing tier flips to `{colors.surface-dark}` (the only dark card on light pages). - Product UI fragments embedded directly in cards — Cal.com shows real schedule pickers, calendar widgets, integration grids inside its marketing cards. Brand voltage from real product chrome at small scale. - Nav-pill-group (`{component.nav-pill-group}`) — a small pill-radius wrapper around grouped nav segments (e.g., the sub-nav switcher between product views). The pill wrapper is one of the system's signature interactive components. - Avatars are circular (`{rounded.full}`), 36px diameter, used in testimonial rows and team-listing surfaces. - Footer is dark navy (`{colors.surface-dark}` — #101010) with light text (`{colors.on-dark-soft}` — #a1a1aa). The dark footer closes every page even though the body above is white. - Spacing rhythm is `{spacing.section}` (96px) between major bands — tight enough to feel modern-SaaS but generous enough to breathe. - Border radius is hierarchical: `{rounded.md}` (8px) for buttons + inputs, `{rounded.lg}` (12px) for content cards, `{rounded.xl}` (16px) for the hero app-mockup container, `{rounded.pill}` for nav-pill-group + badges, `{rounded.full}` for avatars + icon buttons. ## Colors ### Brand & Accent - **Primary** (`{colors.primary}` — #111111): The dominant action color. All primary CTAs, h1/h2 display type. Press state shifts to `{colors.primary-active}` (#242424). - **Brand Accent** (`{colors.brand-accent}` — #3b82f6): Used sparely on inline links and on a small badge / "Customer story" highlight. Cal.com is a near-monochrome brand — the blue appears rarely. - **Badge Pastels** — A small pastel set for category badges and avatar fills: `{colors.badge-orange}` (#fb923c), `{colors.badge-pink}` (#ec4899), `{colors.badge-violet}` (#8b5cf6), `{colors.badge-emerald}` (#34d399). These appear on tag pills and small accent moments inside product UI fragments — never on hero CTAs. ### Surface - **Canvas** (`{colors.canvas}` — #ffffff): The default page floor. - **Surface Soft** (`{colors.surface-soft}` — #f8f9fa): Nav-pill-group background, very-soft section dividers. - **Surface Card** (`{colors.surface-card}` — #f5f5f5): Feature cards, testimonial cards, badge pills, default avatar fills. - **Surface Strong** (`{colors.surface-strong}` — #e5e7eb): Hairline border alternative; disabled button background. - **Surface Dark** (`{colors.surface-dark}` — #101010): The footer background — the only dark surface on every page. Also used for the featured pricing tier card. - **Surface Dark Elevated** (`{colors.surface-dark-elevated}` — #1a1a1a): Used for nested cards inside the dark footer or featured pricing card. - **Hairline** (`{colors.hairline}` — #e5e7eb): The 1px border tone on light surfaces. Used on input borders, table dividers, content card outlines (sometimes). - **Hairline Soft** (`{colors.hairline-soft}` — #f3f4f6): A barely-visible divider used between sections that share the white canvas. ### Text - **Ink** (`{colors.ink}` — #111111): All headlines and primary text. - **Body** (`{colors.body}` — #374151): Default running-text color. - **Muted** (`{colors.muted}` — #6b7280): Secondary text — sub-headings, breadcrumbs, footer body. - **Muted Soft** (`{colors.muted-soft}` — #898989): Tertiary text — captions, fine-print, copyright lines. - **On Primary / On Dark** (`{colors.on-primary}` / `{colors.on-dark}` — #ffffff): Text on primary buttons and dark footer. - **On Dark Soft** (`{colors.on-dark-soft}` — #a1a1aa): Footer body text — slightly muted white for the link rows. ### Semantic - **Success** (`{colors.success}` — #10b981): Confirmation states, success badges in product UI. - **Warning** (`{colors.warning}` — #f59e0b): Warning callouts. - **Error** (`{colors.error}` — #ef4444): Validation errors. ## Typography ### Font Family The system runs **Cal Sans** for display + brand wordmark and **Inter** for everything else. Cal Sans is Cal.com's custom geometric display typeface — slightly condensed, weight 600, negative letter-spacing. Inter handles body, buttons, navigation, captions, and tabular code blocks. The fallback stack walks `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif` for both families. The split is functional: - Cal Sans (display, 600 weight, -0.5 to -2px tracking) — h1, h2, h3 - Inter (body + UI, 400-600 weight, 0 letter-spacing) — paragraphs, labels, buttons, nav ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 64px | 600 | 1.05 | -2px | Homepage h1 ("The better way to schedule your meetings") — Cal Sans | | `{typography.display-lg}` | 48px | 600 | 1.1 | -1.5px | Section heads ("Your all-purpose scheduling app") — Cal Sans | | `{typography.display-md}` | 36px | 600 | 1.15 | -1px | Sub-section heads, card titles — Cal Sans | | `{typography.display-sm}` | 28px | 600 | 1.2 | -0.5px | CTA-band heads, pricing tier prices — Cal Sans | | `{typography.title-lg}` | 22px | 600 | 1.3 | -0.3px | Pricing plan names — Inter | | `{typography.title-md}` | 18px | 600 | 1.4 | 0 | Feature card titles, intro paragraphs | | `{typography.title-sm}` | 16px | 600 | 1.4 | 0 | Small card titles, list labels | | `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Default running-text | | `{typography.body-sm}` | 14px | 400 | 1.5 | 0 | Footer body, fine-print | | `{typography.caption}` | 13px | 500 | 1.4 | 0 | Badge labels, captions | | `{typography.code}` | 14px | 400 | 1.5 | 0 | Code snippets, API examples — JetBrains Mono | | `{typography.button}` | 14px | 600 | 1.0 | 0 | Standard button labels | | `{typography.nav-link}` | 14px | 500 | 1.4 | 0 | Top-nav menu items | ### Principles Cal Sans is the brand voice — every display headline uses it. Inter handles the supporting type. The boundary is strict: never put body copy in Cal Sans, never put a display headline in Inter. Cal Sans without negative letter-spacing reads as off-brand — the -0.5 to -2px tracking is part of the voice. Display weight stays at 600 across all sizes — never 700, never 500. The middle weight is what makes Cal Sans feel modern and confident without becoming bombastic. ### Note on Font Substitutes If Cal Sans is unavailable, **Inter** at weight 600 with -0.04em letter-spacing is a usable approximation. The geometric character of Cal Sans differs from Inter's humanist forms, but the substitution preserves the weight + tracking signature. **Manrope** at weight 700 is another close alternative. ## Layout ### Spacing System - **Base unit:** 4px. - **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px. - **Section padding:** `{spacing.section}` (96px) — the universal vertical rhythm between editorial bands. - **Card internal padding:** `{spacing.xl}` (32px) for feature cards and pricing tier cards; `{spacing.lg}` (24px) for testimonial and product-mockup cards. - **Gutters:** `{spacing.lg}` (24px) between cards in 3-up grids; `{spacing.md}` (16px) inside footer columns. ### Grid & Container - **Max content width:** ~1200px centered on marketing pages. - **Editorial body:** Single 12-column grid; hero band often uses 7/5 split (h1 left, app mockup card right). - **Feature card grids:** 3-up at desktop, 2-up at tablet, 1-up at mobile. - **Pricing grid:** 4-up at desktop, 2-up at tablet, 1-up at mobile. - **Footer:** 4-column link list at desktop, wrapping to 2-up at tablet, 1-up at mobile. ### Whitespace Philosophy Cal.com uses generous but not excessive whitespace — section padding sits at 96px (modern-SaaS standard), and card internal padding stays at 32px. The rhythm is calibrated for fast scanning: every band has a single h1 + h2 + supporting cards, never densely packed lists. The result reads as confident-not-shouting. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat | No shadow, no border | Body sections, top nav, hero bands | | Soft hairline | 1px `{colors.hairline}` border | Inputs, table dividers, occasionally on cards | | Card surface | `{colors.surface-card}` background — no shadow | Feature cards, testimonials | | Subtle drop shadow | Faint shadow at low alpha | Pricing tier cards, hover-elevated states (the system uses `0 1px 2px rgba(0,0,0,0.05)` and `0 4px 12px rgba(0,0,0,0.08)`) | | Featured tier | `{colors.surface-dark}` background, no shadow needed | The featured pricing tier inverts to dark surface — color contrast does the elevation work | The elevation philosophy is **soft and modern** — small drop shadows on elevated cards, color-block contrast for emphasis. No heavy shadows, no neumorphism, no glassmorphism. ### Decorative Depth - Calendar widgets and product UI fragments embedded inside marketing cards carry their own internal shadows from the product UI itself — these are not system tokens, they're product chrome shown as content. - Avatar circles in testimonial sections sometimes carry pastel fill colors (`{colors.badge-orange}`, `{colors.badge-pink}`, etc.) — adds a small chromatic flourish without breaking the monochrome brand voice. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Almost no use — reserved for badge accents | | `{rounded.sm}` | 6px | Small inline buttons, dropdown items | | `{rounded.md}` | 8px | Standard CTA buttons, text inputs, category tabs | | `{rounded.lg}` | 12px | Content cards (feature cards, testimonial cards, pricing tier cards) | | `{rounded.xl}` | 16px | Hero app-mockup card (a slightly larger radius for the marquee component) | | `{rounded.pill}` | 9999px | Nav-pill-group, badge pills | | `{rounded.full}` | 9999px / 50% | Avatars, icon buttons | ### Photography Geometry Avatar photos use `{rounded.full}` (perfect circles) at 36px or 40px. Product UI fragments inside marketing cards retain their native chrome (which often has its own internal radii — e.g., calendar grid cells, button rows). Hero illustration zones use 16:9 or 4:3 ratios with `{rounded.xl}` corners. ## Components ### Top Navigation **`top-nav`** — White nav bar pinned to the top of every page. 64px tall, `{colors.canvas}` background. Carries the Cal.com wordmark + logo at left (the lowercase "Cal.com" with the brand circle), primary horizontal menu (Product, Solutions, Resources, Pricing, Enterprise) center, right-side cluster with "Sign in" text-link, "Sign up free" `{component.button-primary}`, and a sometimes-visible language selector. Menu items in `{typography.nav-link}` (Inter 14px / 500). **`nav-pill-group`** — A small pill-radius wrapper around 2-3 sub-nav segments (e.g., the product-mode switcher between "Personal" / "Teams" / "Enterprise"). Background `{colors.surface-soft}` with internal padding 6px, rounded `{rounded.pill}`. Active segment renders as a white-canvas pill with a subtle drop shadow inside the wrapper. The pill-in-pill treatment is one of Cal.com's signature interactive components. ### Buttons **`button-primary`** — The signature primary CTA. Background `{colors.primary}` (#111111), text `{colors.on-primary}`, type `{typography.button}` (Inter 14px / 600), padding 12px × 20px, height 40px, rounded `{rounded.md}` (8px). Active state `button-primary-active` shifts to `{colors.primary-active}` (#242424). **`button-secondary`** — White button with hairline outline. Background `{colors.canvas}`, text `{colors.ink}`, 1px hairline border, same padding + height + radius as primary. **`button-icon-circular`** — 36 × 36px circular icon button. Background `{colors.canvas}`, hairline border, ink-color icon. Used for share, "view more", carousel arrows. **`button-text-link`** — Inline text button, no background. Used for "Sign in" in the top nav and inline CTA links inside cards. **`text-link`** — Inline body links in `{colors.ink}` (the brand keeps inline links monochrome). Underlined on hover (not documented per the no-hover policy, but mentioned for context). ### Cards & Containers **`hero-band`** — White-canvas hero with a 7-5 grid: h1 + sub-headline + button row on the left, `{component.hero-app-mockup-card}` on the right. Vertical padding `{spacing.section}` (96px). **`hero-app-mockup-card`** — A larger product-UI mockup card showing the actual Cal.com booking widget with calendar grid, time slots, and a primary "Confirm" button inside. Background `{colors.canvas}`, 1px hairline border, rounded `{rounded.xl}` (16px), subtle drop shadow. Used as the hero's right-side artifact. **`feature-card`** — Used in 3-up feature grids ("With us, appointment scheduling is easy"). Background `{colors.surface-card}` (#f5f5f5), rounded `{rounded.lg}` (12px), internal padding `{spacing.xl}` (32px). Carries a small icon at top, an `{typography.title-md}` headline, and a body description in `{typography.body-md}`. **`feature-icon-card`** — A simpler card variant used in 4-up feature grids on lower-density bands. Background `{colors.canvas}` with hairline border, rounded `{rounded.lg}`, padding `{spacing.lg}` (24px). Carries a small icon, `{typography.title-sm}` title, short description. **`product-mockup-card`** — A card showing actual Cal.com product UI fragments (workflow editor, calendar grid, integration grid, automation flow). Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.lg}` (24px). The product UI inside has its own internal chrome — these cards display the product, they don't decorate around it. **`testimonial-card`** — Used in customer-quote grids. Background `{colors.surface-card}`, rounded `{rounded.lg}`, padding `{spacing.lg}` (24px). Top row carries a `{component.avatar-circle}` + name + role; below sits the testimonial quote in `{typography.body-md}`. **`pricing-tier-card`** — Standard tier card. Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xl}` (32px). Carries the plan name in `{typography.title-lg}`, price in `{typography.display-sm}`, feature checklist in `{typography.body-md}`, and a `{component.button-primary}` at the bottom. **`pricing-tier-card-featured`** — The featured tier (typically "Teams"). Background flips to `{colors.surface-dark}` (#101010), text inverts to `{colors.on-dark}`. The dark surface IS the featured-tier signal — no accent border, no badge, no scale shift. ### Inputs & Forms **`text-input`** — Standard text input. Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-md}`, rounded `{rounded.md}` (8px), padding 10px × 14px, height 40px. 1px hairline border in `{colors.hairline}`. **`text-input-focused`** — Focus state. Border thickens or shifts to `{colors.ink}` for emphasis. ### Tags / Badges **`badge-pill`** — Small pill label used for category tags ("Product", "Article", "New") and pastel-fill avatar substitutes. Background `{colors.surface-card}` or one of the badge pastels (`{colors.badge-orange}`, `{colors.badge-pink}`, etc.), text `{colors.ink}`, type `{typography.caption}` (13px / 500), rounded `{rounded.pill}`, padding 4px × 12px. **`avatar-circle`** — 36px diameter, rounded `{rounded.full}`. Either holds a photo or a pastel fill with initials in `{typography.caption}`. **`rating-stars`** — Inline star rating in `{colors.badge-orange}` (#fb923c). Used near testimonial avatars to display a 5-star satisfaction score. ### Tab / Filter **`category-tab`** + **`category-tab-active`** — Used inside the nav-pill-group. Inactive: transparent background, `{colors.muted}` text. Active: `{colors.canvas}` background, `{colors.ink}` text, subtle drop shadow inside the pill-group wrapper. Padding 8px × 14px, rounded `{rounded.md}`. ### CTA / Footer **`cta-band-light`** — A pre-footer "Smarter, simpler scheduling" CTA card. Background `{colors.surface-card}`, rounded `{rounded.lg}`, padding `{spacing.xxl}` (48px). Carries an h2 in `{typography.display-sm}`, a sub-line, and a `{component.button-primary}` centered. **`footer`** — Dark navy footer that closes every page. Background `{colors.surface-dark}` (#101010), text `{colors.on-dark-soft}`. 4-column link list at desktop covering Product / Solutions / Company / Resources. Vertical padding 64px. The Cal.com wordmark sits at the top-left in `{colors.on-dark}`. The footer is the only dark surface on every page — the deliberate inversion visually closes the page. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` (#111111) for primary CTAs and h1/h2 type. Cal.com's button is near-black, not blue. - Use Cal Sans for every display headline. Pair with Inter body. Never blur the boundary. - Apply negative letter-spacing on display sizes (-0.5 to -2px). Cal Sans without it reads as off-brand. - Use `{component.feature-card}` (light gray) and `{component.product-mockup-card}` (white with chrome) deliberately — the gray cards signal "abstract feature claim", white cards signal "look at the actual product". - Embed real product UI fragments inside marketing cards. Don't paint marketing illustrations of the product when you can show the product itself. - Keep avatar circles at 36px, perfect circles, sometimes with pastel fills. Avatars are the only place where badge pastels appear. - Use `{component.nav-pill-group}` for grouped sub-nav segments. The pill-in-pill treatment is signature. - End every page with the dark footer. The light-to-dark transition is part of the editorial rhythm. ### Don't - Don't use accent colors (`{colors.brand-accent}`, badge pastels) on primary CTAs. The system is monochrome at the action layer. - Don't bold display weight beyond 600. Cal Sans at 700 reads as bombastic. - Don't use rounded radius beyond `{rounded.xl}` (16px) on cards. Larger radii read as consumer-app, not professional booking software. - Don't put dark surface cards anywhere except the footer and the featured pricing tier. The dark surface is a deliberate, scarce signal. - Don't repeat the same surface mode in two consecutive bands. Cal.com's pacing alternates white → light-gray → white → product-mockup-card → white → dark-footer. - Don't add hover state styling beyond what the system already encodes — primary darkens on press; nothing else changes. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 768px | Hamburger nav; hero h1 64→32px; hero-app-mockup-card stacks below content; feature grids 1-up; pricing 1-up; footer 4 cols → 1 | | Tablet | 768–1024px | Top nav stays horizontal but tightens; nav-pill-group wraps; feature cards 2-up; pricing 2-up | | Desktop | 1024–1440px | Full top-nav with all menu items; 3-up feature cards; 4-up pricing tiers | | Wide | > 1440px | Same as desktop with more outer breathing room; max content width caps at 1200px | ### Touch Targets - `{component.button-primary}` at minimum 40 × 40px. - `{component.button-icon-circular}` at exactly 36 × 36 — slightly under WCAG's 44 × 44 but the centered icon and full-circle silhouette compensate. - `{component.text-input}` height is 40px. - `{component.category-tab}` rendered inside nav-pill-group has 8 × 14 padding; effective tap area meets 44px+ with the surrounding pill. ### Collapsing Strategy - Top nav collapses to hamburger at < 768px; menu opens as a full-screen sheet. - Hero band's 7-5 grid collapses to single-column on mobile — h1 + sub-head + buttons first, then the app-mockup card below. - Feature grids reduce columns rather than scaling cards down. - Pricing tier cards collapse 4 → 2 → 1; featured-tier dark surface stays visually distinct at every breakpoint. - Nav-pill-group wraps to multi-row on tablet if the segments don't fit horizontally. - Avatar + testimonial card layouts stay grid-aligned at every breakpoint. ### Image Behavior - Product UI fragments inside cards retain native aspect ratios; the cards themselves resize. - Avatar photos crop to circles at every breakpoint. - Hero app-mockup card scales proportionally on mobile — the calendar grid stays legible. ## Iteration Guide 1. Focus on ONE component at a time. Reference its YAML key directly (`{component.feature-card}`, `{component.pricing-tier-card-featured}`). 2. Variants of an existing component (`-active`, `-disabled`, `-focused`) live as separate entries in `components:`. 3. Use `{token.refs}` everywhere — never inline hex. 4. Never document hover. Default and Active/Pressed states only. 5. Display headlines stay Cal Sans 600 with negative letter-spacing. Body stays Inter 400. The trinity does not blur. 6. The dark footer is the only dark surface on most pages. Don't add other dark cards casually. 7. When in doubt about emphasis: bigger Cal Sans before bolder Cal Sans. ## Known Gaps - The dembrandt frequency analyzer captured `Buttons: 0 variants` — Cal.com renders most CTAs as styled `<a>` link elements rather than `<button>` tags, which dembrandt's button selector doesn't capture. Button styles are documented from screenshot ground-truth + standard Cal Sans / Inter baselines. - Cal Sans is licensed to Cal.com and not available as a public web font; substitutes are documented in the typography section. - The badge pastel set (orange / pink / violet / emerald) is documented from observed avatar fill colors; exact hex values may shift seasonally. - Animation and transition timings (calendar slot picker, schedule confirmation, integration grid hover-reveal) are not in scope. - Form validation states beyond `{component.text-input-focused}` are not extracted — error / success states would need a sign-up or booking flow to confirm. - The actual booking widget surface (cal.com/{username}) is the product, not a marketing surface; its spec is out of scope. - Avatar photos in testimonial sections sometimes carry pastel circular fills with initials instead of photographs; both treatments coexist on the same page.
📋 Airtable Base
Workflow Grid
Airtable Spec
复制
为数据协作设计的端庄社论表格风界面,在黑白底噪中以五彩斑斓的标志性重点区块增添活力。
Haas Grotesk 字体
多彩功能区块
无阴影扁平线框
--- version: alpha name: Airtable-design-analysis description: A sober, editorial workflow-software interface anchored on white canvas and dark-ink type, where brand voltage comes from full-bleed signature cards in coral, dark green, peach, and dark navy that punctuate long-scroll explainer pages. Primary actions use a near-black pill CTA; secondary actions sit in a white outlined button. Type runs Haas Grotesk in modest weights — never bold for its own sake. colors: primary: "#181d26" primary-active: "#0d1218" ink: "#181d26" body: "#333840" muted: "#41454d" hairline: "#dddddd" border-strong: "#9297a0" canvas: "#ffffff" surface-soft: "#f8fafc" surface-strong: "#e0e2e6" surface-dark: "#181d26" surface-dark-elevated: "#1d1f25" signature-coral: "#aa2d00" signature-forest: "#0a2e0e" signature-cream: "#f5e9d4" signature-peach: "#fcab79" signature-mint: "#a8d8c4" signature-yellow: "#f4d35e" signature-mustard: "#d9a441" on-primary: "#ffffff" on-dark: "#ffffff" link: "#1b61c9" link-active: "#1a3866" info: "#254fad" info-border: "#458fff" success: "#006400" success-border: "#39bf45" pricing-ink: "#1d1f25" typography: display-xl: fontFamily: "Haas Groot Disp, Haas, sans-serif" fontSize: 48px fontWeight: 500 lineHeight: 1.1 letterSpacing: 0 display-lg: fontFamily: "Haas Groot Disp, Haas, sans-serif" fontSize: 40px fontWeight: 400 lineHeight: 1.2 letterSpacing: 0 display-md: fontFamily: "Haas Groot Disp, Haas, sans-serif" fontSize: 32px fontWeight: 400 lineHeight: 1.2 letterSpacing: 0 title-lg: fontFamily: "Haas, sans-serif" fontSize: 24px fontWeight: 400 lineHeight: 1.35 letterSpacing: 0.12px title-md: fontFamily: "Haas Groot Disp, Haas, sans-serif" fontSize: 20px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 title-sm: fontFamily: "Haas, sans-serif" fontSize: 18px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 label-md: fontFamily: "Haas, sans-serif" fontSize: 16px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 button: fontFamily: "Haas, sans-serif" fontSize: 16px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 body-md: fontFamily: "Haas, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.25 letterSpacing: 0 caption: fontFamily: "Haas, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.35 letterSpacing: 0.16px legal: fontFamily: "Haas, sans-serif" fontSize: 13.12px fontWeight: 600 lineHeight: 1.2 letterSpacing: 0 pricing-display: fontFamily: "Inter Display, system-ui, sans-serif" fontSize: 44.8px fontWeight: 475 lineHeight: 1.1 letterSpacing: 0 pricing-section: fontFamily: "Inter Display, system-ui, sans-serif" fontSize: 28px fontWeight: 475 lineHeight: 1.2 letterSpacing: 0 pricing-card-title: fontFamily: "Inter Display, system-ui, sans-serif" fontSize: 20px fontWeight: 475 lineHeight: 1.3 letterSpacing: 0 rounded: xs: 2px sm: 6px md: 10px lg: 12px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.lg}" padding: 16px 24px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.lg}" button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.lg}" padding: 16px 24px button-secondary-on-dark: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.lg}" padding: 16px 24px button-legal: backgroundColor: "{colors.link}" textColor: "{colors.on-primary}" typography: "{typography.legal}" rounded: "{rounded.xs}" padding: 12px 10px button-icon-circular: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.full}" size: 40px button-pricing-pill: backgroundColor: "{colors.canvas}" textColor: "{colors.pricing-ink}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 12px 24px text-link: backgroundColor: transparent textColor: "{colors.link}" typography: "{typography.body-md}" top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" height: 64px hero-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-lg}" padding: 96px signature-coral-card: backgroundColor: "{colors.signature-coral}" textColor: "{colors.on-primary}" typography: "{typography.display-md}" rounded: "{rounded.lg}" padding: 48px signature-forest-card: backgroundColor: "{colors.signature-forest}" textColor: "{colors.on-primary}" typography: "{typography.display-md}" rounded: "{rounded.lg}" padding: 48px hero-card-dark: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.display-md}" rounded: "{rounded.lg}" padding: 48px feature-card-tabbed: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ink}" typography: "{typography.title-lg}" rounded: "{rounded.lg}" padding: 32px cream-callout-card: backgroundColor: "{colors.signature-cream}" textColor: "{colors.ink}" typography: "{typography.title-lg}" rounded: "{rounded.md}" padding: 24px demo-grid-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.label-md}" rounded: "{rounded.md}" padding: 16px logo-strip: backgroundColor: "{colors.canvas}" textColor: "{colors.muted}" typography: "{typography.body-md}" padding: 32px article-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-sm}" rounded: "{rounded.md}" padding: 16px topic-filter-rail: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-md}" width: 240px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.sm}" padding: 12px 16px height: 44px text-input-focus: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.sm}" pricing-tier-card: backgroundColor: "{colors.canvas}" textColor: "{colors.pricing-ink}" typography: "{typography.pricing-card-title}" rounded: "{rounded.md}" padding: 32px pricing-tier-card-featured: backgroundColor: "{colors.surface-soft}" textColor: "{colors.pricing-ink}" typography: "{typography.pricing-card-title}" rounded: "{rounded.md}" padding: 32px pricing-comparison-row: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-md}" padding: 12px cta-band-light: backgroundColor: "{colors.surface-strong}" textColor: "{colors.ink}" typography: "{typography.display-md}" rounded: "{rounded.lg}" padding: 48px footer: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-md}" padding: 64px --- ## Overview Airtable's marketing surfaces are quietly editorial. The base atmosphere is white canvas, dark ink type, generous whitespace, and a near-black pill CTA — nothing is fighting for attention until a section needs to. The brand voltage doesn't come from gradient washes or accent walls; it comes from **full-bleed signature cards** in `{colors.signature-coral}`, `{colors.signature-forest}`, and `{colors.surface-dark}` that punctuate long-scroll explainer pages every two or three screens. Between those signature bands, the page reads like a print magazine: a headline, supporting copy, a small image cluster, then breathing room. Type voice is Haas Grotesk at modest weights (400 for display, 500 for sub-titles and buttons). Display headlines never go bolder than 500 — emphasis comes from size and color contrast, not from weight. Body copy stays at 14px / 400 throughout. The pricing surface runs its own dialect: **Inter Display** at unusual mid-weights (475 / 575) and **pill-shaped buttons** (`{rounded.pill}`) that don't appear on any other page — a deliberate sub-system signaling "this page is about commercial precision." **Key Characteristics:** - Primary CTA is `{colors.primary}` (near-black ink) with white text and a `{rounded.lg}` (12px) corner — it reads as confident and final, never decorative. - Secondary CTA is a `{colors.canvas}` button with `{colors.ink}` text and a hairline outline. The two together form Airtable's signature button pair. - Hero is white canvas. There is no atmospheric gradient, no mesh, no background flourish. The brand strength comes from the type and the buttons sitting in clean whitespace. - Brand voltage lives in **signature surface cards**: `{colors.signature-coral}`, `{colors.signature-forest}`, and `{colors.surface-dark}` carry full-bleed product callouts every few screens. - Demo-card grids carry product UI fragments on `{colors.signature-peach}`, `{colors.signature-mint}`, `{colors.signature-cream}` and other warm pastel surfaces. - Section rhythm: white canvas → coral signature card → white body → cream callout band → dark navy CTA → light gray CTA banner → footer. The canvas resets between every signature surface. - Border radius is hierarchical: `{rounded.lg}` (12px) for primary CTAs and large signature cards, `{rounded.md}` (10px) for content cards and demo grids, `{rounded.sm}` (6px) for inputs, `{rounded.full}` for icon buttons. Pricing buttons jump to `{rounded.pill}` to mark themselves as a separate dialect. - Vertical rhythm is `{spacing.section}` (96px) between major bands — universal across every page. ## Colors ### Brand & Accent - **Primary** (`{colors.primary}` — #181d26): The dominant brand color. Used for the primary CTA background, h1/h2 display type, and the `{component.surface-dark}` band. Not "blue, then black" — black IS the primary throughout the marketing system. - **Primary Active** (`{colors.primary-active}` — #0d1218): The press state on primary buttons. ### Surface - **Canvas** (`{colors.canvas}` — #ffffff): The default page surface; the floor of every editorial body. - **Surface Soft** (`{colors.surface-soft}` — #f8fafc): Tabbed feature cards and the featured pricing tier. - **Surface Strong** (`{colors.surface-strong}` — #e0e2e6): The light gray "Start building with Airtable" CTA banner near the footer. - **Surface Dark** (`{colors.surface-dark}` — #181d26): The dark navy CTA cards used mid-page (for example "The path to 10× every person in your organization"). - **Surface Dark Elevated** (`{colors.surface-dark-elevated}` — #1d1f25): The articles-page hero base behind the rainbow-stripe overlay. - **Hairline** (`{colors.hairline}` — #dddddd): The 1px border tone for input outlines, table dividers, secondary-button outlines. ### Text - **Ink** (`{colors.ink}` — #181d26): The strongest text — h1/h2 display type and primary button text-on-light. Same hex as `{colors.primary}` because they are the same role expressed at type and button layers. - **Body** (`{colors.body}` — #333840): The default running-text color. - **Muted** (`{colors.muted}` — #41454d): Footer links, breadcrumbs, captions. - **Border Strong** (`{colors.border-strong}` — #9297a0): The 1px outline color on disabled secondary buttons. - **On Primary / On Dark** (`{colors.on-primary}` — #ffffff): The text color on primary buttons and dark surfaces. ### Signature Card Surfaces These are the colors that carry Airtable's brand voltage. They appear as full-bleed, full-card surfaces — never as accents on a small element. - **Coral** (`{colors.signature-coral}` — #aa2d00): The largest signature card on the homepage ("Production apps in prototype speed"). Full-bleed dark coral with white type. - **Forest** (`{colors.signature-forest}` — #0a2e0e): A deep-green signature card used in the homepage demo-grid cluster. - **Cream** (`{colors.signature-cream}` — #f5e9d4): The cream callout band ("The path to 10× every person in your organization") — a soft beige surface holding dark type and product UI fragments. - **Peach** (`{colors.signature-peach}` — #fcab79), **Mint** (`{colors.signature-mint}` — #a8d8c4), **Yellow** (`{colors.signature-yellow}` — #f4d35e), **Mustard** (`{colors.signature-mustard}` — #d9a441): Demo-card surfaces that carry small product UI fragments inside the multi-card grid sections. ### Semantic - **Link** (`{colors.link}` — #1b61c9): Inline body links and anchor text. Darker on press to `{colors.link-active}` (#1a3866). Despite the `--theme_button-background-primary` CSS-variable name, this color is **not** the primary button color — it is the link color. - **Info** (`{colors.info}` — #254fad) and **Info Border** (`{colors.info-border}` — #458fff): Inline info badges and focused-input outline. - **Success** (`{colors.success}` — #006400) and **Success Border** (`{colors.success-border}` — #39bf45): Confirmation states. ## Typography ### Font Family The system runs **Haas / Haas Groot Disp** (Airtable's licensed display + text type). Haas Groot Disp covers display sizes (h1 / h2); Haas Grotesk covers everything 24px and below. The fallback stack walks `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif`. The pricing surface runs a separate **Inter Display** stack at mid-weights (475 / 575) — a deliberate sub-system signaling commercial precision. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 48px | 500 | 1.1 | 0 | Articles page h2 — second-tier editorial headline | | `{typography.display-lg}` | 40px | 400 | 1.2 | 0 | Homepage h1 hero | | `{typography.display-md}` | 32px | 400 | 1.2 | 0 | Platform-page h2 — feature-section headlines | | `{typography.title-lg}` | 24px | 400 | 1.35 | 0.12px | Section titles | | `{typography.title-md}` | 20px | 400 | 1.5 | 0 | Sub-section titles in tabbed feature cards | | `{typography.title-sm}` | 18px | 500 | 1.4 | 0 | Article-card titles | | `{typography.label-md}` | 16px | 500 | 1.4 | 0 | Demo-card titles, list labels | | `{typography.button}` | 16px | 500 | 1.4 | 0 | Standard CTA button labels | | `{typography.body-md}` | 14px | 400 | 1.25 | 0 | Body copy, footer links, top-nav items | | `{typography.caption}` | 14px | 500 | 1.35 | 0.16px | Light captions and meta text | | `{typography.legal}` | 13.12px | 600 | 1.2 | 0 | Cookie/legal CTA buttons | | `{typography.pricing-display}` | 44.8px | 475 | 1.1 | 0 | Pricing-page h1 | | `{typography.pricing-section}` | 28px | 475 | 1.2 | 0 | Pricing-page section heads | | `{typography.pricing-card-title}` | 20px | 475 | 1.3 | 0 | Pricing tier card plan name | ### Principles The Haas system prefers weight 400 for display sizes — a 40px h1 is **not** bold. Visual emphasis is delegated to size, color contrast, and the signature surface cards. Where the system does want weight, it pivots to 500 (sub-titles, buttons, article titles), never 600 or 700 in the editorial body. The only true bold (600) lives in `{typography.legal}` — a sign that boldness is reserved for terms-of-service surfaces, not marketing. The pricing-page sub-system uses Inter Display at `font-weight: 475` — a custom mid-weight between regular (400) and medium (500), shipped as a variable font. ### Note on Font Substitutes If Haas Groot Disp and Haas Grotesk are unavailable, **Inter Display** (variable) is the closest open-source substitute for both — adjust line-height down by ~5% to match Haas's tighter cap-height. For the pricing sub-system, use Inter Display directly. On macOS / iOS, **system-ui** is sufficient; on Windows, the chain falls through to Segoe UI, which is a usable but slightly cooler substitute. ## Layout ### Spacing System - **Base unit:** 4px (all spacing snaps to 4-multiples). - **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px. - **Section padding (vertical):** `{spacing.section}` (96px) is the universal vertical rhythm constant — every major editorial band on every page uses 96px top + 96px bottom internal padding. - **Card internal padding:** `{spacing.xl}` (32px) for tabbed feature cards and pricing tier cards; `{spacing.xxl}` (48px) inside signature coral / forest / dark cards; `{spacing.lg}` (24px) for cream callouts and demo-grid cards. - **Gutters:** `{spacing.lg}` (24px) between cards in 3-up grids; `{spacing.md}` (16px) inside denser logo strips and footer column gutters. ### Grid & Container - **Max content width:** ~1280px centered, with `{spacing.xxl}` (48px) horizontal breathing room. - **Editorial body:** Single 8/12-column at large breakpoints, collapsing to single-column on mobile. - **Demo-card grids:** 3 or 4 columns at desktop, 2 at tablet, 1 at mobile. Card sizes are deliberately uneven within the grid to dodge a uniform "spec sheet" feel. - **Logo strip:** 6 monochrome partner logos in a single row at desktop; wraps to 3-up on mobile. ### Whitespace Philosophy Airtable uses whitespace as the dominant atmospheric tool. Hero sections sit in 96px+ of pure whitespace above and below the headline + sub-headline pair, with no decoration in that whitespace. The hero is intentionally calm — there is no gradient, no aurora, no atmospheric mesh behind the type. The system trusts whitespace alone to do the framing. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat | No shadow, no border | Body sections, top nav, footer | | Soft hairline | 1px `{colors.hairline}` border | Inputs, sub-nav rails, comparison-table dividers, secondary buttons | | Button rest | Soft drop with subtle blue-tinted glow at low alpha | Primary CTA buttons (the blue tint is a holdover from the link color and reads as a faint accent under the dark button) | | Button focus | Outer 2px blue ring at higher alpha | Keyboard focus state on primary buttons | | Card flat | No shadow; relies on color contrast against the surface band | Signature coral / forest / dark cards, cream callouts, demo-grid cards | The elevation philosophy is **color-block first, shadow second**. Shadows are minimal; depth is delegated to the contrast between white canvas and signature surface cards. There is no soft-glow / atmospheric-shadow / heavy-elevation language anywhere in the marketing system. ### Decorative Depth - **Vertical rainbow stripes** appear on the articles hero only — multi-color vertical bands sitting on `{colors.surface-dark-elevated}`. This is a single-page treatment, not a system-wide signature. - **Photography-as-depth** in the demo-card grid: every card carries a real product UI screenshot or mockup, contributing depth through legible artifact density rather than decorative effects. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 2px | Cookie-consent and legal CTA buttons — system-required surfaces | | `{rounded.sm}` | 6px | Text inputs, small inline buttons | | `{rounded.md}` | 10px | Secondary content cards, article cards, cream callouts | | `{rounded.lg}` | 12px | Primary CTA buttons, signature surface cards, tabbed feature cards | | `{rounded.pill}` | 9999px | Pricing-page CTA buttons (sub-system only) | | `{rounded.full}` | 9999px / 50% | Circular icon buttons, avatar surfaces | ### Photography Geometry Product UI screenshots inside demo-card grids retain native aspect ratios (typically 4:3 or 16:10) and crop into `{rounded.md}` containers. Hero illustrations bleed full-width with no rounding. Article-card thumbnails use 16:9 with `{rounded.md}` corners. Avatars in testimonials use `{rounded.full}` (perfect circles). Pricing comparison table images stay rectangular with no rounding. ## Components > **No hover states documented.** Per the global no-hover policy (Step 6), every component spec below documents only Default and Active/Pressed states. Variants live as separate entries in the `components:` front matter. **`top-nav`** — A 64px-tall white bar pinned to the top of every page. Airtable wordmark sits at left; primary horizontal menu (Platform, Solutions, Resources, Enterprise, Pricing) sits center-left in `{typography.body-md}`; the right cluster carries a "Book Demo" outline link, "Sign up for free" `{component.button-primary}`, and "Log In" text link. The nav stays light on every page — Airtable does not invert the nav over dark sections. ### Buttons **`button-primary`** — The signature primary CTA. Background `{colors.primary}` (near-black), text `{colors.on-primary}`, type `{typography.button}`, padding 16px × 24px, rounded `{rounded.lg}` (12px). This is the "Get started for free" / "Sign up for free" button visible on every hero. It reads as confident and final — not decorative — which is why the system uses it sparingly (one per viewport). - Active state: `button-primary-active` darkens to `{colors.primary-active}` (#0d1218). **`button-secondary`** — White outline button (e.g. "Book demo"). Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.lg}` (12px), 1px hairline outline. Sits next to `{component.button-primary}` as the "less-committed" choice. **`button-secondary-on-dark`** — Same shape as `{component.button-secondary}` but used on signature coral / forest / dark surfaces. Background `{colors.canvas}`, text `{colors.ink}` — the white button stays white over dark surfaces because the system never inverts to a translucent on-dark style on the marketing site. **`button-pricing-pill`** — The pricing-page CTA family. Background `{colors.canvas}`, text `{colors.pricing-ink}`, rounded `{rounded.pill}` (9999px), padding 12px × 24px. The only place pill-shape appears in the marketing system. Treat it as part of the pricing sub-system signaling. **`button-legal`** — Cookie-consent and legal-banner CTAs. Background `{colors.link}`, text `{colors.on-primary}`, type `{typography.legal}` (13.12px / 600), rounded `{rounded.xs}` (2px), padding 12px × 10px. The 2px corner radius and 600 weight signal "this is a required system surface," not a designed brand surface. **`button-icon-circular`** — 40px × 40px circular button with `{colors.canvas}` background, hairline border, and `{colors.ink}` icon. Used for carousel controls, "share", and "back" affordances. **`text-link`** — Inline body links in `{colors.link}` (#1b61c9, the actual link blue). No underline by default. Type inherits `{typography.body-md}`. ### Cards & Containers **`hero-band`** — The full-page-width white-canvas hero. No surface card, no border, no shadow, no atmospheric gradient — just the headline, sub-headline, and primary + secondary button pair sitting in 96px of whitespace. Vertical padding `{spacing.section}` (96px). **`signature-coral-card`** — The large full-bleed coral card on the homepage ("Production apps in prototype speed"). Background `{colors.signature-coral}` (#aa2d00, a dark coral / oxide red), text `{colors.on-primary}`, rounded `{rounded.lg}` (12px), internal padding `{spacing.xxl}` (48px). Carries an h2 in `{typography.display-md}`, supporting copy in `{typography.body-md}`, and `{component.button-secondary-on-dark}` as the CTA. **`signature-forest-card`** — A deep green signature card (`{colors.signature-forest}` — #0a2e0e) used as a demo-grid sibling to the coral card on the homepage. **`hero-card-dark`** — The dark navy mid-page CTA card (e.g. "The path to 10× every person in your organization"). Background `{colors.surface-dark}` (#181d26), text `{colors.on-dark}`, rounded `{rounded.lg}` (12px), internal padding `{spacing.xxl}` (48px). The same color as `{colors.primary}` because the system uses ink as both type color and signature dark surface. **`feature-card-tabbed`** — Light-cream cards (e.g. the "Coke / Pelosi / Conde Nast / Time Inc" tabbed feature card on the homepage). Background `{colors.surface-soft}`, rounded `{rounded.lg}` (12px), internal padding `{spacing.xl}` (32px). Left rail carries vertically-stacked tab labels in `{typography.title-md}`; right pane shows the active tab's content (illustration + body copy + small CTA). **`cream-callout-card`** — Beige callout cards (`{colors.signature-cream}`). Rounded `{rounded.md}` (10px), internal padding `{spacing.lg}` (24px). Carry product UI fragments or stat callouts — softer than the dark/coral signature cards but still a deliberate brand surface. **`demo-grid-card`** — Used in multi-card grids that punctuate every page. Background `{colors.canvas}` or one of the demo-grid surfaces (`{colors.signature-peach}`, `{colors.signature-mint}`, `{colors.signature-yellow}`, `{colors.signature-mustard}`), rounded `{rounded.md}` (10px), internal padding `{spacing.md}` (16px). Each card frames a product UI fragment. Card heights vary deliberately to dodge a uniform "spec sheet" feel. **`logo-strip`** — Horizontal monochrome partner-logo row (HBO, Netflix, Amazon, Time, Conde Nast). Logos render in `{colors.muted}`, surface is `{colors.canvas}`, vertical padding `{spacing.xl}` (32px). 6 logos at desktop, 3 at mobile. **`article-card`** — The trending-stories grid on the articles page. Background `{colors.canvas}`, rounded `{rounded.md}` (10px), internal padding `{spacing.md}` (16px). Each card carries a colorful illustrated thumbnail (16:9), a small uppercase category tag, an `{typography.title-sm}` title, and a meta line. 3-up at desktop. **`topic-filter-rail`** — The left rail on the articles page. 240px wide, `{colors.canvas}` background, `{typography.body-md}`, vertically grouped category headings ("Marketing", "Product", "Project management", "Operations") with sub-bullets. Active item carries a small numeric count badge. ### Inputs & Forms **`text-input`** — Standard text input. Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-md}`, rounded `{rounded.sm}` (6px), padding 12px × 16px, height 44px. 1px hairline border in `{colors.hairline}`. **`text-input-focus`** — Focus state. Border thickens or recolors to `{colors.info-border}`. ### Pricing Sub-System **`pricing-tier-card`** — Standard tier card. Background `{colors.canvas}`, text `{colors.pricing-ink}`, type `{typography.pricing-card-title}` for the plan name, rounded `{rounded.md}` (10px), internal padding `{spacing.xl}` (32px). Carries the plan name, a price block in `{typography.pricing-display}` (44.8px / 475), feature checklist, and a `{component.button-pricing-pill}` at the bottom. **`pricing-tier-card-featured`** — The featured tier (typically "Team" or "Business"). Background shifts to `{colors.surface-soft}`. No accent border, no badge — the background tone shift is the only signal. **`pricing-comparison-row`** — Each row of the long comparison table at the bottom of the pricing page. Labels in the left column; checkmarks or values across 4 plan columns. 12px vertical padding per row, hairline divider between rows. ### Navigation Variants **`footer`** — Light surface (`{colors.canvas}`), 6-column link list at desktop covering Platform / Solutions / Resources / Learn / Company sub-trees. Vertical padding `{spacing.section}` divided across upper link block and lower legal row. Type `{typography.body-md}`. **`cta-band-light`** — The light gray "Start building with Airtable" CTA strip near the footer. Background `{colors.surface-strong}` (#e0e2e6), text `{colors.ink}`, rounded `{rounded.lg}` (12px), padding `{spacing.xxl}` (48px). Carries an h2 in `{typography.display-md}` and a `{component.button-primary}`. ### Signature Components **Articles Vertical Rainbow Stripe Hero** — The articles-page hero treatment. Multi-color vertical bands at varying widths sitting on `{colors.surface-dark-elevated}`. The h1 + sub-head + CTA cluster sits center-left on top of the stripes. This is a single-page hero treatment, not a system-wide signature — do not promote it to a multi-page pattern. ## Do's and Don'ts ### Do - Keep `{component.button-primary}` near-black. The brand's primary CTA is `{colors.primary}`, not the link blue. Mixing them up turns a confident hero into a confused one. - Reserve `{component.button-primary}` for one primary action per viewport. The system is designed for scarcity at the brand-action layer. - Use `{component.button-secondary}` (white with hairline outline) as the natural pair with `{component.button-primary}`. The two together form Airtable's signature button row. - Trust whitespace as the hero atmosphere. Hero bands are intentionally calm — no gradient, no mesh, no atmospheric backdrop. Going against this reads as off-brand. - Use `{component.signature-coral-card}`, `{component.signature-forest-card}`, and `{component.hero-card-dark}` to break editorial monotony. These are the brand's voltage moments. - Keep `{component.demo-grid-card}` heights uneven within a grid. Uniform heights feel like a spec sheet. - Treat the pricing surface as its own dialect: keep `{typography.pricing-display}`, `{typography.pricing-card-title}`, and `{component.button-pricing-pill}` together. Mixing them with Haas Grotesk button type breaks the sub-system's voice. - Anchor every editorial band with `{spacing.section}` (96px) vertical padding. ### Don't - Don't make `{colors.link}` (#1b61c9) the primary button color. It is the link color. The primary button is `{colors.primary}` (#181d26, near-black). Treating link-blue as the brand action is the most common mistake when reading Airtable's CSS variables. - Don't add a gradient backdrop to the hero. Airtable's hero is white, full stop. Mesh, aurora, spotlight gradients all read as "another SaaS template" — not Airtable. - Don't bold display-weight type. `{typography.display-xl}` and `{typography.display-lg}` are intentionally weight 400 / 500 — going to 700 reads as marketing-page-template. - Don't use `{rounded.pill}` outside the pricing surface. It's a sub-system signal, not a general radius option. - Don't repeat the same surface mode in two consecutive bands. The editorial pacing depends on rhythm: white → signature card → white → cream → dark → white. Two whites in a row read as a typography blog. - Don't add hover state styling beyond what the system already encodes. The system documents Default and Active/Pressed only. - Don't introduce additional accent colors beyond the documented signature card palette. The system's voltage already uses coral, forest, dark navy, cream, peach, mint, yellow, and mustard. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 768px | Single-column body; top nav collapses to hamburger; demo-grid drops to 1-up; signature cards stay full-bleed; logo strip wraps to 2 rows; footer collapses to single-column | | Tablet | 768–1024px | 2-up demo-grid; top nav stays horizontal but tightens; cream-callout cards stack 2-up; pricing comparison table becomes horizontally scrollable | | Desktop | 1024–1440px | 3-up demo-grid (and 4-up for tighter content); full top-nav with all menu items visible; pricing tier cards render 4-across | | Wide | > 1440px | Same as Desktop with more outer breathing room; max content width caps at ~1280px and the page adds outer margin rather than scaling type up | ### Touch Targets - `{component.button-primary}` and siblings render at 48 × 48px minimum (16px vertical padding + 16px line-height) — comfortably above WCAG AAA's 44 × 44. - `{component.button-icon-circular}` is exactly 40 × 40px — slightly under WCAG's recommended 44, but the centered icon and dot-radius compensate visually. - `{component.text-input}` height is 44px. ### Collapsing Strategy - Top nav collapses to a hamburger at < 768px; the menu opens as a full-screen sheet rather than a dropdown. - Card grids reduce columns rather than scaling cards down. - The `{component.feature-card-tabbed}` re-stacks the tab rail above the content pane on mobile. - The pricing comparison table converts to horizontally-scrollable swipe at < 1024px; the four plan headers stay visible while body rows scroll. ### Image Behavior - Demo-card UI screenshots crop to fit their container rather than scaling up. - Hero illustrations bleed full-width on mobile, losing horizontal margin. - Signature card images (inside coral / forest / dark cards) compress to their card width without cropping. ## Iteration Guide 1. Focus on ONE component at a time. Reference its YAML key directly (`{component.button-primary}`, `{component.signature-coral-card}`). 2. When adding a new component, decide first which sub-system it belongs to: the main editorial system (Haas, `{rounded.lg}`/`{rounded.md}`) or the pricing sub-system (Inter Display, `{rounded.pill}`). 3. Variants of an existing component (`-active`, `-disabled`, `-focus`) live as separate entries in `components:` — never as nested state objects. 4. Use `{token.refs}` everywhere prose mentions a color, a radius, a typography role, or a spacing value. Hex codes appear at most once next to the reference. 5. Never document hover. The system documents Default and Active/Pressed states only. 6. Run `npx @google/design.md lint DESIGN.md` after edits — `broken-ref`, `contrast-ratio`, and `orphaned-tokens` warnings flag issues automatically. 7. When in doubt about emphasis: bigger type before bolder type, signature surface card before solid accent. ## Known Gaps - The exact hex values of pastel demo-grid surfaces (`{colors.signature-peach}`, `{colors.signature-mint}`, `{colors.signature-yellow}`, `{colors.signature-mustard}`) are inferred from screenshot pixel sampling. Some product launches may swap these surfaces seasonally. - Hover behavior across all components is not documented (per global no-hover policy). - Animation and transition timings are not in scope. - Form validation states beyond `text-input-focus` are not extracted — error and success states for inputs would need a dedicated form page to confirm. - The pricing comparison table's checkmark glyph and column-divider widths are described structurally but not formalized as tokens. - The CSS variable `--theme_button-background-primary: #1b61c9` exists at `:root` but is not used as the primary CTA color anywhere on the marketing site. It maps to the link/info color role instead. Documented here so future extractions don't re-trip over the misleading variable name.
🪙 Binance Exchange
Financial Urgency
Binance Spec
复制
极具交易急迫感与金融信心的专业币圈设计,以深空墨黑承载极具电压感的高饱和度币安黄。
币安标志黄
交易红绿双向指示
BinanceNova 字体
--- version: alpha name: Binance-design-analysis description: A confident financial-platform interface anchored on a deep near-black canvas, where Binance's iconic yellow (#FCD535) carries every primary CTA, brand accent, and value-claim moment. Type runs Binance's custom BinanceNova / BinancePlex stack at modest weights — the system trusts size and yellow voltage over bold weight. Marketing and product surfaces default to the dark theme; transactional surfaces (buy crypto, deposit, exchange) flip to a light theme that shares the same yellow CTAs and gray-blue hairlines. Trading green (up) and red (down) accents thread through both modes for price-direction signals. colors: primary: "#fcd535" primary-active: "#f0b90b" primary-disabled: "#3a3a1f" ink: "#181a20" body: "#eaecef" body-on-light: "#181a20" muted: "#707a8a" muted-strong: "#929aa5" hairline-on-light: "#eaecef" hairline-on-dark: "#2b3139" border-strong: "#cdd1d6" canvas-light: "#ffffff" canvas-dark: "#0b0e11" surface-card-dark: "#1e2329" surface-elevated-dark: "#2b3139" surface-soft-light: "#fafafa" surface-strong-light: "#f5f5f5" on-primary: "#181a20" on-dark: "#ffffff" trading-up: "#0ecb81" trading-down: "#f6465d" accent-turquoise: "#2dbdb6" info: "#3b82f6" info-ring: "#3b82f6" typography: hero-display: fontFamily: "BinanceNova, -apple-system, BlinkMacSystemFont, sans-serif" fontSize: 64px fontWeight: 700 lineHeight: 1.1 letterSpacing: -1px display-lg: fontFamily: "BinanceNova, sans-serif" fontSize: 48px fontWeight: 700 lineHeight: 1.1 letterSpacing: -0.5px display-md: fontFamily: "BinanceNova, sans-serif" fontSize: 40px fontWeight: 600 lineHeight: 1.15 letterSpacing: -0.3px display-sm: fontFamily: "BinanceNova, sans-serif" fontSize: 32px fontWeight: 600 lineHeight: 1.2 letterSpacing: 0 title-lg: fontFamily: "BinanceNova, sans-serif" fontSize: 24px fontWeight: 600 lineHeight: 1.3 letterSpacing: 0 title-md: fontFamily: "BinanceNova, sans-serif" fontSize: 20px fontWeight: 600 lineHeight: 1.35 letterSpacing: 0 title-sm: fontFamily: "BinanceNova, sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 number-display: fontFamily: "BinancePlex, BinanceNova, sans-serif" fontSize: 40px fontWeight: 700 lineHeight: 1.1 letterSpacing: -0.3px number-md: fontFamily: "BinancePlex, BinanceNova, sans-serif" fontSize: 16px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 number-sm: fontFamily: "BinancePlex, BinanceNova, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 body-md: fontFamily: "BinanceNova, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 body-sm: fontFamily: "BinanceNova, sans-serif" fontSize: 13px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 caption: fontFamily: "BinanceNova, sans-serif" fontSize: 12px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 button: fontFamily: "BinanceNova, sans-serif" fontSize: 14px fontWeight: 600 lineHeight: 1 letterSpacing: 0 nav-link: fontFamily: "BinanceNova, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 rounded: xs: 2px sm: 4px md: 6px lg: 8px xl: 12px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 80px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 24px height: 40px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.md}" button-primary-disabled: backgroundColor: "{colors.primary-disabled}" textColor: "{colors.muted}" rounded: "{rounded.md}" button-primary-pill: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 14px 32px button-secondary-on-dark: backgroundColor: "{colors.surface-card-dark}" textColor: "{colors.on-dark}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 24px button-secondary-on-light: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 12px 24px button-tertiary-text: backgroundColor: transparent textColor: "{colors.body}" typography: "{typography.button}" button-trading-up: backgroundColor: "{colors.trading-up}" textColor: "{colors.on-dark}" typography: "{typography.button}" rounded: "{rounded.sm}" padding: 8px 20px button-trading-down: backgroundColor: "{colors.trading-down}" textColor: "{colors.on-dark}" typography: "{typography.button}" rounded: "{rounded.sm}" padding: 8px 20px button-subscribe: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.sm}" padding: 6px 16px height: 28px text-link: backgroundColor: transparent textColor: "{colors.primary}" typography: "{typography.body-md}" top-nav-dark: backgroundColor: "{colors.canvas-dark}" textColor: "{colors.on-dark}" typography: "{typography.nav-link}" height: 64px top-nav-light: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.nav-link}" height: 64px hero-band-dark: backgroundColor: "{colors.canvas-dark}" textColor: "{colors.on-dark}" typography: "{typography.hero-display}" padding: 80px stat-callout-card: backgroundColor: transparent textColor: "{colors.primary}" typography: "{typography.number-display}" trust-badge: backgroundColor: "{colors.surface-card-dark}" textColor: "{colors.on-dark}" typography: "{typography.title-sm}" rounded: "{rounded.lg}" padding: 16px 20px markets-table-card: backgroundColor: "{colors.surface-card-dark}" textColor: "{colors.on-dark}" typography: "{typography.body-md}" rounded: "{rounded.xl}" padding: 24px markets-row: backgroundColor: transparent textColor: "{colors.on-dark}" typography: "{typography.number-md}" padding: 12px 0 price-up-cell: backgroundColor: transparent textColor: "{colors.trading-up}" typography: "{typography.number-md}" price-down-cell: backgroundColor: transparent textColor: "{colors.trading-down}" typography: "{typography.number-md}" search-input-on-dark: backgroundColor: "{colors.surface-card-dark}" textColor: "{colors.on-dark}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 10px 16px height: 40px text-input-on-light: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 10px 16px height: 40px funds-safu-band: backgroundColor: "{colors.canvas-dark}" textColor: "{colors.primary}" typography: "{typography.display-lg}" padding: 80px feature-photo-card: backgroundColor: "{colors.surface-card-dark}" textColor: "{colors.on-dark}" rounded: "{rounded.xl}" qr-promo-card: backgroundColor: "{colors.surface-card-dark}" textColor: "{colors.on-dark}" typography: "{typography.title-md}" rounded: "{rounded.xl}" padding: 32px faq-row: backgroundColor: transparent textColor: "{colors.on-dark}" typography: "{typography.title-sm}" rounded: "{rounded.md}" padding: 20px 0 cta-band-dark: backgroundColor: "{colors.surface-card-dark}" textColor: "{colors.on-dark}" typography: "{typography.display-sm}" rounded: "{rounded.xl}" padding: 48px arena-hero-gradient: backgroundColor: "{colors.canvas-dark}" textColor: "{colors.primary}" typography: "{typography.display-lg}" padding: 80px cookie-consent-card: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.lg}" padding: 16px buy-crypto-amount-card: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.number-display}" rounded: "{rounded.lg}" padding: 24px steps-card: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.title-sm}" rounded: "{rounded.lg}" padding: 24px price-chart-card: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 24px conversion-cell: backgroundColor: transparent textColor: "{colors.body-on-light}" typography: "{typography.body-md}" trader-row: backgroundColor: transparent textColor: "{colors.on-dark}" typography: "{typography.body-md}" padding: 12px 0 footer-light: backgroundColor: "{colors.surface-soft-light}" textColor: "{colors.body-on-light}" typography: "{typography.body-md}" padding: 64px --- ## Overview Binance reads like a financial trading platform that wants to feel both authoritative and energetic. The base atmosphere is **deep near-black canvas** (`{colors.canvas-dark}` — #0b0e11) holding white type and a single, ubiquitous accent: **Binance Yellow** (`{colors.primary}` — #FCD535). That yellow does almost all of the brand's heavy lifting — it carries every primary CTA, every value-claim headline ("FUNDS ARE SAFU"), every "Sign Up" pill, every featured tier indicator, and the wordmark itself. There is no secondary brand color. The system trusts the yellow voltage to do the brand work, and it carries it. Type runs Binance's custom **BinanceNova** (display + body) and **BinancePlex** (numerical / financial display) stack. BinanceNova carries display headlines, section titles, and body copy. BinancePlex appears on price tickers, large stat numbers (transaction volumes, user counts, prize pools) — anywhere a number wants to feel "tabular and reliable." Both run at modest weights — display sizes use weight 600-700 (bolder than typical marketing because trading platforms need numbers to read at a glance), body stays at 400. The product is **multi-theme**: marketing surfaces (homepage, smart-money, futures arena) default to dark, while transactional surfaces (buy crypto, deposit, withdraw) flip to a light theme. The same yellow CTAs and gray-blue hairlines (`{colors.hairline-on-light}` — #eaecef) thread through both — only canvas, surface, and text tones flip. Trading **green** (`{colors.trading-up}` — #0ecb81) and **red** (`{colors.trading-down}` — #f6465d) signal price direction in tables, charts, and price tickers across both modes. **Key Characteristics:** - Single accent color: `{colors.primary}` (#FCD535) does all brand voltage — primary CTAs, hero headlines, brand mark, badges. Used scarcely on dark for emphasis, ubiquitously on transactional dialogs. - Custom type stack: `BinanceNova` (display + body) and `BinancePlex` (numbers, prices, financial data). Big stat numbers always render in BinancePlex for tabular consistency. - Multi-theme: marketing pages default dark (`{colors.canvas-dark}`); transactional pages flip light (`{colors.canvas-light}`). Yellow CTAs and trading green/red are shared across both. - Light footer on dark body: the homepage uses `{colors.surface-soft-light}` (#fafafa) for the footer even when the body above it is dark — a deliberate inversion that visually closes the page. - Trading semantics: green up / red down (`{colors.trading-up}` / `{colors.trading-down}`) for price changes, applied as text color rather than badge background. - Card surfaces: `{colors.surface-card-dark}` (#1e2329) for elevated cards on dark; `{colors.canvas-light}` for cards on light. No gradient surfaces, no atmospheric backdrops — flat color blocks throughout. - Border radius is small to medium: `{rounded.md}` (6px) for primary buttons, `{rounded.lg}` (8px) for inputs and content cards, `{rounded.xl}` (12px) for elevated card containers, `{rounded.pill}` for prominent feature CTAs. - Spacing follows a 4-multiple scale; major editorial bands sit at `{spacing.section}` (80px) — slightly tighter than typical marketing-only sites because product pages need denser layouts. ## Colors ### Brand & Accent - **Binance Yellow** (`{colors.primary}` — #FCD535): The single brand color. Used for primary CTA backgrounds, the wordmark, brand-claim headlines ("FUNDS ARE SAFU"), trust badges ("No.1 Trading Volume"), large stat numbers in `{component.stat-callout-card}`, and inline links. - **Binance Yellow Active** (`{colors.primary-active}` — #f0b90b): The press / hover-darker variant. Slightly more saturated yellow. - **Binance Yellow Disabled** (`{colors.primary-disabled}` — #3a3a1f): A desaturated dark-yellow used on disabled CTAs over dark canvas. - **Accent Turquoise** (`{colors.accent-turquoise}` — #2dbdb6): A small secondary accent used very sparingly on Smart Money's "Check Now" CTA over dark surfaces. Treat as a single-product accent, not a system color. ### Surface The system has two canvas modes that map to product context: **Dark mode (marketing default):** - **Canvas Dark** (`{colors.canvas-dark}` — #0b0e11): The primary page floor. Near-black with a slight warm tint — never pure black. - **Surface Card Dark** (`{colors.surface-card-dark}` — #1e2329): Cards, navigation dropdowns, secondary buttons over dark canvas, markets table. - **Surface Elevated Dark** (`{colors.surface-elevated-dark}` — #2b3139): One step lighter, used for nested cards, hovered nav items, and chart background panels. **Light mode (transactional):** - **Canvas Light** (`{colors.canvas-light}` — #ffffff): The page floor on transactional pages (buy crypto, deposit forms, account dialogs). - **Surface Soft Light** (`{colors.surface-soft-light}` — #fafafa): Footer surface and disabled states. - **Surface Strong Light** (`{colors.surface-strong-light}` — #f5f5f5): Form input backgrounds in muted contexts. ### Hairlines & Borders - **Hairline on Light** (`{colors.hairline-on-light}` — #eaecef): The 1px border tone on light surfaces. Dembrandt's frequency analysis confirms this as the highest-count token (1022 occurrences) — Binance uses hairlines liberally. - **Hairline on Dark** (`{colors.hairline-on-dark}` — #2b3139): The 1px border tone on dark surfaces. Same hex as `{colors.surface-elevated-dark}` — borders feel like surface steps, not ink lines. - **Border Strong** (`{colors.border-strong}` — #cdd1d6): A heavier border tone used on disabled secondary buttons. ### Text - **Ink** (`{colors.ink}` — #181a20): The strongest text on light surfaces. Display headlines on transactional pages. - **Body on Dark** (`{colors.body}` — #eaecef): Default running-text on dark canvas — deliberately not pure white, slightly cooler. - **Body on Light** (`{colors.body-on-light}` — #181a20): Same as ink — light-mode body text reuses the ink token. - **Muted** (`{colors.muted}` — #707a8a): Footer links, breadcrumbs, captions, table column headers. Works on both light and dark canvas. - **Muted Strong** (`{colors.muted-strong}` — #929aa5): A second-tier muted for emphasized labels. - **On Primary** (`{colors.on-primary}` — #181a20): Black text on yellow primary CTAs. - **On Dark** (`{colors.on-dark}` — #ffffff): Pure white for high-contrast headlines on dark canvas. ### Trading Semantics - **Trading Up** (`{colors.trading-up}` — #0ecb81): Price-up green, used as text color in tables, charts, and inline ticker arrows. Never as a button background. - **Trading Down** (`{colors.trading-down}` — #f6465d): Price-down red. Same usage rules as trading-up. ### Info / Focus - **Info** (`{colors.info}` — #3b82f6): Inline info badges and the focus-ring base. The Tailwind `--tw-ring-color` token surfaced by dembrandt — used on input focus. ## Typography ### Font Family The system runs **BinanceNova** for display and body, and **BinancePlex** for numerical / financial data. Both are licensed Binance custom typefaces. The fallback stack walks `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`. The split is functional, not decorative: - BinanceNova → editorial type (headlines, paragraphs, button labels, nav) - BinancePlex → tabular numerical type (prices, volumes, percentages, stat counters, prize pools) Mixing them is not optional — BinanceNova on a price ticker would lose the trading-platform character; BinancePlex on a paragraph would feel monospace-cold. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.hero-display}` | 64px | 700 | 1.1 | -1px | Homepage h1 ("316,258,026 USERS TRUST US") | | `{typography.display-lg}` | 48px | 700 | 1.1 | -0.5px | Brand-claim headlines ("FUNDS ARE SAFU"), prize-pool hero ("Futures Masters Arena") | | `{typography.display-md}` | 40px | 600 | 1.15 | -0.3px | Section heads on long-scroll pages | | `{typography.display-sm}` | 32px | 600 | 1.2 | 0 | CTA band headlines ("Secure, Low-Fee Trading on Binance") | | `{typography.title-lg}` | 24px | 600 | 1.3 | 0 | Sub-section titles | | `{typography.title-md}` | 20px | 600 | 1.35 | 0 | QR-promo cards, feature card titles | | `{typography.title-sm}` | 16px | 600 | 1.4 | 0 | Trust badges, FAQ rows, step labels | | `{typography.number-display}` | 40px | 700 | 1.1 | -0.3px | Big stat numbers (15,000 BTC, $429,423,449) — BinancePlex | | `{typography.number-md}` | 16px | 500 | 1.4 | 0 | Markets table prices, table cells — BinancePlex | | `{typography.number-sm}` | 14px | 500 | 1.4 | 0 | Inline prices, % changes — BinancePlex | | `{typography.body-md}` | 14px | 400 | 1.5 | 0 | Default running-text — BinanceNova | | `{typography.body-sm}` | 13px | 400 | 1.5 | 0 | Cookie consent text, footer body | | `{typography.caption}` | 12px | 500 | 1.4 | 0 | Small meta labels | | `{typography.button}` | 14px | 600 | 1 | 0 | Standard CTA button labels | | `{typography.nav-link}` | 14px | 500 | 1.4 | 0 | Top nav menu items | ### Principles Display sizes use weight 700 — heavier than most marketing systems. This makes sense for a trading platform: numbers need to read at a glance, headlines need to compete with chart visualizations and dense data tables. The system will not soften display weight to 400 the way Airtable or Stripe does. `{typography.number-display}` and the smaller number variants always use **BinancePlex**, even when surrounding body type uses BinanceNova. Prices, volumes, and stat counters render in BinancePlex regardless of context — it is the system's "trustworthy number" voice. ### Note on Font Substitutes If BinanceNova and BinancePlex are unavailable, **Inter** is the closest open-source substitute for BinanceNova and **JetBrains Mono** or **IBM Plex Sans** is the closest substitute for BinancePlex (depending on whether tabular monospace fidelity matters more than humanist proportions). Adjust display headlines down by ~3% in line-height to match BinanceNova's tighter cap height. ## Layout ### Spacing System - **Base unit:** 4px. - **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 80px. - **Section padding (vertical):** `{spacing.section}` (80px) — slightly tighter than airy marketing sites (96px) because Binance pages mix marketing bands with dense product surfaces (markets tables, FAQ accordions). - **Card internal padding:** `{spacing.lg}` (24px) for content cards and markets tables; `{spacing.xl}` (32px) for QR-promo cards and CTA bands; `{spacing.md}` (16px) for trust badges and table rows. - **Gutters:** `{spacing.lg}` (24px) between cards in 3-up grids; `{spacing.md}` (16px) inside footer column gutters and dense FAQ lists. ### Grid & Container - **Max content width:** ~1280px centered on marketing pages; ~1440px on product surfaces (markets, smart-money tables) where horizontal density matters. - **Editorial body:** Single 12-column grid; product pages often use 8/4 split (main panel + side rail). - **Markets table:** 5-column header (Pair / Last Price / 24h Change / 24h Volume / Action), with the first column carrying coin icon + symbol pair. - **Footer:** 6-column link list at desktop, wrapping to 2-up at tablet and 1-up on mobile. ### Whitespace Philosophy Binance is denser than typical marketing sites — long-scroll pages mix hero bands with markets tables, FAQ accordions, and feature grids without much breathing room between them. The system trusts contrast (yellow vs. dark canvas, green vs. red price cells) to do the visual separation work, not whitespace. Where whitespace appears, it's always uniform — `{spacing.section}` between every major band. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat | No shadow, no border | Body sections, top nav, hero bands, footer | | Soft hairline | 1px `{colors.hairline-on-dark}` or `{colors.hairline-on-light}` | Inputs, table dividers, FAQ row separators, secondary buttons | | Card surface | `{colors.surface-card-dark}` background on dark canvas, `{colors.canvas-light}` on light context — no shadow | All elevated cards (markets-table-card, QR-promo-card, feature-photo-card, trust-badges) | | Subtle drop shadow | Faint shadow visible only when a card sits over imagery | Used sparingly on the buy-crypto-amount-card on transactional pages | | Focus ring | `0 0 0 2px {colors.info-ring}` at 50% alpha | Input + button keyboard focus state | The elevation philosophy is **flat surfaces with color-block separation**. Binance does not use heavy drop shadows or glassmorphism — depth comes from the contrast between `{colors.canvas-dark}` and `{colors.surface-card-dark}` (a 12-step lightness jump that reads as a clear elevation boundary). ### Decorative Depth - **Yellow → dark vertical gradient backdrop** on the Futures Arena hero: `{colors.primary}` fading down to `{colors.canvas-dark}`. This is a single-page treatment used for product-launch / event hero surfaces, not a system-wide signature. - **Coin-stack illustrations** flanking large stat blocks (3D rendered crypto coins, trophy icons). These are illustrations, not tokens — treat as content rather than design system surface. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 2px | Almost no use — reserved for very small badges | | `{rounded.sm}` | 4px | Small inline buttons (subscribe, trading-up / trading-down inline) | | `{rounded.md}` | 6px | Standard CTA buttons, primary buttons, primary input fields | | `{rounded.lg}` | 8px | Search input, content cards, trust badges, sub-cards | | `{rounded.xl}` | 12px | Elevated card containers (markets-table-card, QR-promo-card, CTA bands) | | `{rounded.pill}` | 9999px | Prominent feature CTAs ("Sign Up" pill on dark, futures-arena "Join Now") | | `{rounded.full}` | 9999px / 50% | Coin icons, avatars | Binance's radius hierarchy is tighter than typical marketing systems — most surfaces sit at 6-12px. The pill radius is a deliberate exception used to signal "this is a top-of-page action." ### Photography & Iconography - Coin icons render as 24×24 or 32×32 rounded glyphs (often 50% radius on circular outline + the coin's brand color inside). - 3D rendered coin stacks and trophy illustrations are full-color illustrations with a slight floor shadow — not flat icons. - Photographic content (people-using-the-app section) crops to `{rounded.xl}` (12px) corners, full-bleed on mobile. ## Components ### Top Navigation **`top-nav-dark`** — The marketing top nav on dark canvas. 64px tall, `{colors.canvas-dark}` background. Carries the yellow Binance wordmark at left, primary horizontal menu (Buy Crypto, Markets, Trade, Futures, Earn, Square, Smart Money, Campaigns), right-side cluster with language selector, light/dark toggle, "Log In" text link, "Sign Up" `{component.button-primary}`. The wordmark uses `{colors.primary}` for "BINANCE" type. **`top-nav-light`** — The transactional top nav on light canvas (buy crypto, deposit pages). Same layout but `{colors.canvas-light}` background and `{colors.ink}` menu items. ### Buttons **`button-primary`** — The signature primary CTA. Background `{colors.primary}`, text `{colors.on-primary}` (black on yellow — the system's iconic combination), type `{typography.button}`, padding 12px × 24px, height 40px, rounded `{rounded.md}` (6px). Press state: `button-primary-active` darkens to `{colors.primary-active}` (#f0b90b). Disabled state: `button-primary-disabled` desaturates to `{colors.primary-disabled}`. **`button-primary-pill`** — A larger pill variant of the primary CTA used for top-of-page sign-up moments and product-launch heroes (Futures Arena "Join Now"). Same yellow + black combination, padding 14px × 32px, rounded `{rounded.pill}` (9999px). Use sparingly — the pill is a "this is THE action" signal. **`button-secondary-on-dark`** — Used over `{colors.canvas-dark}` for less-emphasized actions. Background `{colors.surface-card-dark}`, text `{colors.on-dark}`, rounded `{rounded.md}`. **`button-secondary-on-light`** — Light-canvas equivalent. Background `{colors.canvas-light}` with `{colors.hairline-on-light}` 1px border, text `{colors.ink}`. **`button-tertiary-text`** — Inline text button with no background. Used for "Log In" in the top nav and inline "Read More" links. **`button-trading-up`** — A solid green button used on price-up signals (Buy / Long actions). Background `{colors.trading-up}`, text `{colors.on-dark}`, rounded `{rounded.sm}` (4px), padding 8px × 20px. Smaller and tighter than `{component.button-primary}` because it appears in dense trading interfaces. **`button-trading-down`** — Symmetric red variant for Sell / Short actions. Same shape, background `{colors.trading-down}`. **`button-subscribe`** — Compact yellow CTA used in the Smart Money traders table to subscribe to a top trader. Smaller height (28px) and tighter padding than the primary CTA — fits inside dense table rows. Same yellow + black combination. **`text-link`** — Inline body links in `{colors.primary}` (yellow on dark, also yellow on light). No underline by default. Type inherits `{typography.body-md}`. ### Cards & Containers **`hero-band-dark`** — Full-width dark band carrying the homepage h1 + sub-headline + dual CTA pair. Background `{colors.canvas-dark}`, padding `{spacing.section}` (80px). The h1 ("316,258,026 USERS TRUST US") uses `{typography.hero-display}` at 64px / 700 — the system's largest type role. **`stat-callout-card`** — Inline yellow stat numbers (15,000 BTC, 7,488,223, $429,423,449). Transparent background, text `{colors.primary}`, type `{typography.number-display}` in BinancePlex. Used as a flat layout block, not a card with surface — the yellow text alone carries the visual weight. **`trust-badge`** — Small dark cards holding "No.1 Customer Service" / "No.1 Trading Volume" claims. Background `{colors.surface-card-dark}`, rounded `{rounded.lg}` (8px), padding 16px × 20px. Yellow numeric or word badge ("No.1") sits next to a short label. **`markets-table-card`** — The right-side markets table on the homepage. Background `{colors.surface-card-dark}`, rounded `{rounded.xl}` (12px), padding `{spacing.lg}` (24px). Carries a tab row (Popular / New listing / Top gainers), then a 5-column row of coin pairs with last price, 24h change %, action button. Each row uses `{component.markets-row}`. **`markets-row`** — A single row inside the markets table. Transparent background, 12px vertical padding, hairline divider between rows. Coin icon (32×32) + symbol on left; last price in `{typography.number-md}` (BinancePlex); 24h change cell colored by direction (`{component.price-up-cell}` or `{component.price-down-cell}`); right-aligned chevron icon for "view detail." **`price-up-cell`** / **`price-down-cell`** — Colored text cells for price changes. Transparent background, text `{colors.trading-up}` or `{colors.trading-down}`, type `{typography.number-md}` in BinancePlex. Always paired with a small triangle arrow indicating direction. **`feature-photo-card`** — The "Trade on the go" section's photo strip — 3 lifestyle photos showing people using the Binance app. Background `{colors.surface-card-dark}`, rounded `{rounded.xl}`. Photos crop edge-to-edge, no internal padding around the image. **`qr-promo-card`** — The "Trade on the go. Anywhere, anytime." card with QR code. Background `{colors.surface-card-dark}`, rounded `{rounded.xl}`, padding `{spacing.xl}` (32px). Contains an h2 in `{typography.title-md}`, a body paragraph, app store badges (iOS / Android), and a centered QR code. **`funds-safu-band`** — The yellow-headlined "FUNDS ARE SAFU" band. Background stays `{colors.canvas-dark}`, but the headline uses `{colors.primary}` at `{typography.display-lg}`. Below the headline, three large `{component.stat-callout-card}` numbers anchor the band: total BTC reserves, users helped, funds recovered. **`faq-row`** — A single FAQ accordion row. Transparent background, padding 20px vertical, hairline divider between rows. Closed state: question in `{typography.title-sm}` + chevron icon at right. Open state: question + answer body in `{typography.body-md}`. **`cta-band-dark`** — The "Secure, Low-Fee Trading on Binance" pre-footer CTA band. Background `{colors.surface-card-dark}` (one step elevated from canvas), rounded `{rounded.xl}`, padding `{spacing.xxl}` (48px). Carries an h2 in `{typography.display-sm}` and a `{component.button-primary}` aligned right. ### Light-Mode Transactional Components **`buy-crypto-amount-card`** — The right-rail card on the Buy BTC page. Background `{colors.canvas-light}`, rounded `{rounded.lg}` (8px), padding `{spacing.lg}` (24px). Carries an editable amount input in `{typography.number-display}` (BinancePlex), a currency selector, and a yellow `{component.button-primary}` for "Continue" / "Confirm Order." **`steps-card`** — The "How to Buy Crypto" 3-up cards (Enter Amount → Confirm Order → Receive Crypto). Background `{colors.canvas-light}`, rounded `{rounded.lg}`, padding `{spacing.lg}`. Each card has a small numbered icon, a `{typography.title-sm}` step name, and a body description. **`price-chart-card`** — The "Bitcoin Markets" card carrying the BTC price chart. Background `{colors.canvas-light}`, rounded `{rounded.lg}`. Top row carries pair selector ($79,065.04, +0.45%); main area is a candlestick / line chart in `{colors.trading-up}` and `{colors.trading-down}`; bottom row carries timeframe selector (24H / 1W / 1M / 3M / 1Y / ALL). **`conversion-cell`** — A single row in the BTC ↔ USD conversion table. Transparent background, text `{colors.body-on-light}`, type `{typography.body-md}`. Pair label on left (BTC, USDT, etc.); USD equivalent on right. ### Inputs & Forms **`search-input-on-dark`** — The "Search currencies" input on the homepage hero. Background `{colors.surface-card-dark}`, text `{colors.on-dark}`, rounded `{rounded.lg}` (8px), padding 10px × 16px, height 40px. Carries a yellow `{component.button-primary-pill}` on the right side ("Sign Up"). **`text-input-on-light`** — Standard input on transactional pages. Background `{colors.canvas-light}`, 1px `{colors.hairline-on-light}` border, rounded `{rounded.md}` (6px), padding 10px × 16px, height 40px. Focus state inherits the focus-ring shadow. **`cookie-consent-card`** — The cookie banner card visible on the homepage. Background `{colors.canvas-light}`, rounded `{rounded.lg}`, padding `{spacing.md}` (16px). Body text in `{typography.body-sm}` (13px / 400) with three stacked button options (Accept Cookies & Continue / Reject Additional Cookies / Manage Cookies). ### Smart Money Sub-System **`trader-row`** — A single row in the top-traders table on /smart-money. Transparent background, padding 12px vertical, hairline divider between rows. Avatar + trader name + private/public badge on left; ROI %, AUM, mint date columns; yellow `{component.button-subscribe}` on right. ### Signature Components **`arena-hero-gradient`** — The Futures Arena product-launch hero. A vertical gradient from `{colors.primary}` at top to `{colors.canvas-dark}` at bottom, with the prize-pool headline (4,000,000 USDT) in `{typography.display-lg}` centered. A `{component.button-primary-pill}` ("Join Now") sits below the headline. Used only on product-launch event surfaces — do not generalize to other heroes. ### Footer **`footer-light`** — The light-gray footer that closes every page (including dark-canvas pages). Background `{colors.surface-soft-light}` (#fafafa), text `{colors.body-on-light}`. 6-column link list at desktop covering Community / About Us / Products / Business / Service / Learn columns. Vertical padding 64px. The deliberate light footer on a dark page is one of Binance's most distinctive layout choices — it visually closes the page with a "marketing reset" surface. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` (Binance Yellow) for primary actions, brand-claim headlines, and the wordmark. Never use it for secondary or decorative purposes — yellow's scarcity is what makes it powerful. - Keep `{component.button-primary}` (yellow with black text) as the universal primary CTA across both dark and light modes. The same button appears identically on `{colors.canvas-dark}` and `{colors.canvas-light}`. - Use `{component.button-trading-up}` (green) and `{component.button-trading-down}` (red) only for explicit Buy/Sell or Long/Short actions. Never use them for general "confirm" or "cancel" because they carry semantic price-direction meaning. - Use BinancePlex for every number. Prices, volumes, percentages, stat counters — all BinancePlex. Mixing BinanceNova into a number ticker breaks the trading-platform character. - Choose canvas mode by surface intent: dark for marketing / product showcase / trading dashboards; light for transactional dialogs (buy / deposit / withdraw / form submission). - Anchor every editorial band with `{spacing.section}` (80px). Binance is denser than airy marketing sites — 80px is the right rhythm. ### Don't - Don't introduce a second brand color. The system has exactly one accent (`{colors.primary}`) and any expansion dilutes the brand identity. The turquoise on Smart Money is a single-product experiment, not a system token. - Don't use yellow for body text or large surface fills. It is for focal-point CTAs and headlines only. - Don't use `{colors.trading-up}` / `{colors.trading-down}` as background fills on cards. They are price-direction signals, expressed as text color or small badge fill — never as a card surface. - Don't soften display weight. `{typography.hero-display}` and `{typography.display-lg}` are intentionally weight 700 — going to 400 reads as design-portfolio, not trading platform. - Don't add atmospheric gradients to the canvas (mesh, aurora, glow effects). Binance trusts color-block contrast — adding atmospheric depth muddies the trading-platform feel. - Don't invert `{component.button-primary}`'s text color. Black on yellow is the system's signature — white text on yellow loses contrast and brand recognition. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 768px | Top nav collapses to hamburger; hero h1 drops from 64px to ~36px; markets table converts to a horizontally-scrollable card list; demo grids drop to 1-up; footer 6 columns wrap to 2 | | Tablet | 768–1024px | Top nav stays horizontal but tightens, secondary menu items hide behind a "More" dropdown; markets table 2-up; pricing/feature grids 2-up | | Desktop | 1024–1440px | Full top-nav with all primary menu items; 5-column markets table; trading dashboards in 8/4 split (chart + side rail) | | Wide | > 1440px | Same as desktop with more outer breathing room; max content width caps at 1280-1440px depending on surface | ### Touch Targets - Primary CTAs render at minimum 40 × 40px (`{component.button-primary}` height + padding) — meets WCAG AAA's 44 × 44 with surrounding spacing. - Subscribe / inline action buttons are 28 × 28 — denser than ideal but matches industry trading platform norms. - Coin icons in markets tables are 32 × 32px, with the entire row tappable for 44px+ effective target. ### Collapsing Strategy - Top nav collapses to hamburger at < 768px; the menu opens as a full-screen sheet with the same yellow accent CTAs anchored to the bottom of the sheet. - Markets table reflows to a horizontally-scrollable single card per coin pair on mobile. - The hero stat numbers ("316M USERS") shrink proportionally rather than wrapping — Binance's biggest claim must always read as a single block. - Trading dashboards switch from chart + side-rail to chart-only with a separate "Trade" tab on mobile. - The light footer stays full-bleed at every breakpoint — it does not collapse to a separate dark variant. ### Image Behavior - Coin icons stay at fixed 24/32px sizes regardless of breakpoint. - Lifestyle photos in the "Trade on the go" section crop responsively — wider at desktop, taller (vertical) at mobile. - 3D coin-stack illustrations are fixed-aspect-ratio assets that scale uniformly without cropping. ## Iteration Guide 1. Focus on ONE component at a time. Reference its YAML key directly (`{component.button-primary}`, `{component.markets-row}`). 2. When adding a new component, decide first whether it lives in dark mode (marketing / product) or light mode (transactional). The same component appears in both with surface tone flipped. 3. Variants of an existing component (`-active`, `-disabled`) live as separate entries in `components:` — never as nested state objects. 4. Use `{token.refs}` everywhere prose mentions a color, a radius, a typography role, or a spacing value. 5. Never document hover. The system documents Default and Active/Pressed states only. 6. Numbers always use BinancePlex; copy always uses BinanceNova. Mixing them is a system violation. 7. Trading green / red are semantic price tokens — never repurpose them for "success" or "error" generic states. ## Known Gaps - The dembrandt frequency analyzer captured `#eaecef` (light hairline, count 1022) as the highest-frequency token. The brand-defining `{colors.primary}` (#FCD535) appears far less frequently because it's used scarcely as accent — its system role had to be confirmed from screenshots. - BinanceNova and BinancePlex weight-axis values are not formalized as variable-font tokens — only the static weights observed in screenshots are documented. - Animation and transition timings (chart redraws, price-change flashes) are not in scope. - Form validation states beyond `{component.text-input-on-light}` defaults are not extracted — error / success input variants would need a sign-up or order-confirmation flow to confirm. - The trading dashboard surfaces (Spot / Futures / Margin) were not in the analyzed URL set; their order book, candlestick chart configuration, and position-management cards are not documented here. - The light/dark theme toggle behavior (whether transactional pages can be forced dark by user preference) is product behavior, not extracted from the marketing surfaces.
🏡 Airbnb stays
Consumer Friendly
Airbnb Spec
复制
充满旅行与生活气息的友好型设计,使用温和圆润的排布线条、房源展示卡片与亮丽的 Coral 珊瑚红。
Airbnb Cereal 字体
珊瑚红 Rausch
圆润亲和布局
--- version: alpha name: Airbnb-design-analysis description: A warm, generous consumer marketplace anchored on a clean white canvas and Airbnb Rausch (#ff385c), the single brand voltage that carries every primary CTA, search-button orb, and rating dot. Type runs Airbnb Cereal VF at modest weights — display sits at 22–28px in weight 500/600 rather than the heavy 700+ that fintech and enterprise systems use; the brand trusts photography and generous whitespace over typographic muscle. Three product entries (Homes, Experiences, Services) sit in the top nav with hand-illustrated 32-icon glyphs and "NEW" badges, signaling a marketplace expansion rather than a feature dump. Pill-shaped search bars (`{rounded.full}`), softly rounded property cards (`{rounded.lg}` ~14px), and 32px button radii read as friendly and human — there is no hard corner anywhere except the body grid. colors: primary: "#ff385c" primary-active: "#e00b41" primary-disabled: "#ffd1da" primary-error-text: "#c13515" primary-error-text-hover: "#b32505" luxe: "#460479" plus: "#92174d" ink: "#222222" body: "#3f3f3f" muted: "#6a6a6a" muted-soft: "#929292" hairline: "#dddddd" hairline-soft: "#ebebeb" border-strong: "#c1c1c1" canvas: "#ffffff" surface-soft: "#f7f7f7" surface-card: "#ffffff" surface-strong: "#f2f2f2" on-primary: "#ffffff" on-dark: "#ffffff" legal-link: "#428bff" star-rating: "#222222" scrim: "#000000" typography: display-xl: fontFamily: "'Airbnb Cereal VF', Circular, -apple-system, system-ui, Roboto, 'Helvetica Neue', sans-serif" fontSize: 28px fontWeight: 700 lineHeight: 1.43 letterSpacing: 0 display-lg: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 22px fontWeight: 500 lineHeight: 1.18 letterSpacing: -0.44px display-md: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 21px fontWeight: 700 lineHeight: 1.43 letterSpacing: 0 display-sm: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 20px fontWeight: 600 lineHeight: 1.20 letterSpacing: -0.18px title-md: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.25 letterSpacing: 0 title-sm: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 16px fontWeight: 500 lineHeight: 1.25 letterSpacing: 0 rating-display: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 64px fontWeight: 700 lineHeight: 1.1 letterSpacing: -1px body-md: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 body-sm: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.43 letterSpacing: 0 caption: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.29 letterSpacing: 0 caption-sm: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 13px fontWeight: 400 lineHeight: 1.23 letterSpacing: 0 badge: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 11px fontWeight: 600 lineHeight: 1.18 letterSpacing: 0 micro-label: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 12px fontWeight: 700 lineHeight: 1.33 letterSpacing: 0 uppercase-tag: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 8px fontWeight: 700 lineHeight: 1.25 letterSpacing: 0.32px textTransform: uppercase button-md: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 16px fontWeight: 500 lineHeight: 1.25 letterSpacing: 0 button-sm: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.29 letterSpacing: 0 link: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.43 letterSpacing: 0 nav-link: fontFamily: "'Airbnb Cereal VF', Circular, sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.25 letterSpacing: 0 rounded: none: 0px xs: 4px sm: 8px md: 14px lg: 20px xl: 32px full: 9999px spacing: xxs: 2px xs: 4px sm: 8px md: 12px base: 16px lg: 24px xl: 32px xxl: 48px section: 64px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.sm}" padding: 14px 24px height: 48px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.sm}" button-primary-disabled: backgroundColor: "{colors.primary-disabled}" textColor: "{colors.on-primary}" rounded: "{rounded.sm}" button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.sm}" padding: 13px 23px height: 48px button-tertiary-text: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.button-md}" button-pill-rausch: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-sm}" rounded: "{rounded.full}" padding: 10px 20px search-orb: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" rounded: "{rounded.full}" height: 48px icon-button-circle: backgroundColor: "{colors.surface-strong}" textColor: "{colors.ink}" rounded: "{rounded.full}" height: 32px icon-button-outline: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.full}" height: 40px top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.nav-link}" height: 80px product-tab-active: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.nav-link}" rounded: "{rounded.none}" product-tab-inactive: backgroundColor: transparent textColor: "{colors.muted}" typography: "{typography.nav-link}" search-bar-pill: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.full}" padding: 14px 24px height: 64px search-field-segment: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.caption}" padding: 8px 24px category-strip: backgroundColor: "{colors.canvas}" textColor: "{colors.muted}" typography: "{typography.button-sm}" category-tab-active: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.button-sm}" rounded: "{rounded.none}" property-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.md}" property-card-photo: rounded: "{rounded.md}" experience-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.md}" city-link-block: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.title-sm}" rating-display-card: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.rating-display}" guest-favorite-badge: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.badge}" rounded: "{rounded.full}" padding: 4px 10px new-tag: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.uppercase-tag}" rounded: "{rounded.full}" padding: 2px 6px amenity-row: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.body-md}" padding: 12px 0 reviews-card: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.body-sm}" host-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.md}" padding: 24px reservation-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 24px date-picker-day: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.full}" date-picker-day-selected: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" rounded: "{rounded.full}" text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.sm}" padding: 14px 12px height: 56px footer-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" padding: 48px 80px footer-link: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.body-sm}" legal-band: backgroundColor: "{colors.canvas}" textColor: "{colors.muted}" typography: "{typography.caption-sm}" --- ## Overview Airbnb is the canonical example of a generous, photography-led consumer marketplace. The base canvas is **pure white** (`{colors.canvas}` — #ffffff) with deep near-black ink (`{colors.ink}` — #222222) for headlines and body, and a single voltage of **Rausch** (`{colors.primary}` — #ff385c) carrying every primary CTA, the search-button orb, the heart save state, and inline brand links. There is no secondary brand color in mainline marketing — the **Luxe purple** (`{colors.luxe}` — #460479) and **Plus magenta** (`{colors.plus}` — #92174d) tokens are sub-brand accents that only appear inside Airbnb Luxe / Plus contexts. Type runs **Airbnb Cereal VF** (a custom variable font Airbnb licenses), with **Circular** as the historic in-house fallback and a system stack underneath. Cereal sits at modest weights — display headlines render at 22–28px in weight 500–600, not the heavy 700+ weights that financial or enterprise systems lean on. The hero h1 ("Inspiration for future getaways") on the homepage is just 28px / 700, which would feel small on a typical SaaS page; here it works because the layout leans on photography (city collage, property cards) for visual weight rather than typographic muscle. The shape language is **soft**. Buttons are 8px radius (`{rounded.sm}`), property cards are ~14px (`{rounded.md}`), the search bar is fully pill-shaped (`{rounded.full}`), wishlist hearts and search orbs are circles (`{rounded.full}`), and category strip rounded corners run at 32px (`{rounded.xl}`). There is essentially no hard corner anywhere except the body grid itself — every interactive element is rounded. **Key Characteristics:** - Single accent color: `{colors.primary}` (#ff385c — "Rausch") carries every primary CTA, the search orb, the heart save state, and the brand wordmark. Used scarcely — most pages are 90% white + ink with one or two Rausch moments. - Custom variable type: `Airbnb Cereal VF`. Display weights sit at 500–700, body at 400. Modest weight is intentional — the system trusts photography for visual heft. - Three-product top nav: Homes, Experiences, Services — each with a hand-illustrated 32px icon and "NEW" badges (`{component.new-tag}`) on the two newer products. Active tab uses an underline rule (`{component.product-tab-active}`). - Pill-shaped global search bar: white surface, fully rounded (`{rounded.full}`), divided by 1px hairlines into Where / When / Who segments, terminated by a circular Rausch search orb (`{component.search-orb}`). - Property cards are photo-first: aspect-ratio rectangles with `{rounded.md}` corner clipping, swipeable image carousel, "Guest favorite" floating badge top-left, heart icon top-right, then 4–5 lines of meta beneath. - Editorial dropdowns (footer, language picker) are clean text columns over the white canvas — no card surface, no shadow. - The design system caps elevation at one shadow tier (`box-shadow: rgba(0,0,0,0.02) 0 0 0 1px, rgba(0,0,0,0.04) 0 2px 6px, rgba(0,0,0,0.1) 0 4px 8px`) — used on hover-floated cards and search/account dropdowns. - 8px base spacing system, with major sections at `{spacing.section}` (64px) — generous but not airy enough to feel editorial-magazine; the marketplace density wants more cards per scroll. ## Colors ### Brand & Accent - **Rausch** (`{colors.primary}` — #ff385c): The single brand color. Used for primary CTA backgrounds (Reserve, Continue), the search orb, the heart save state on property cards, and inline brand links. The most recognizable color in consumer travel. - **Rausch Active** (`{colors.primary-active}` — #e00b41): The press / pointer-down variant — slightly more saturated. Used on `{component.button-primary-active}`. - **Rausch Disabled** (`{colors.primary-disabled}` — #ffd1da): A pale tint used on disabled CTAs. - **Luxe Purple** (`{colors.luxe}` — #460479): Sub-brand accent for Airbnb Luxe. Only appears inside Luxe-branded surfaces — never in mainline marketing. - **Plus Magenta** (`{colors.plus}` — #92174d): Sub-brand accent for Airbnb Plus. Same scoping as Luxe — sub-product only. ### Surface - **Canvas** (`{colors.canvas}` — #ffffff): The default page floor for every public page. Airbnb does not have a dark mode on the public web. - **Surface Soft** (`{colors.surface-soft}` — #f7f7f7): The lightest fill — used on disabled fields, sub-nav hover backgrounds, and the inline search filter band. - **Surface Strong** (`{colors.surface-strong}` — #f2f2f2): Slightly heavier fill — circular icon-button surface (e.g., the breadcrumb back-arrow and listing toolbar buttons). ### Hairlines & Borders - **Hairline** (`{colors.hairline}` — #dddddd): The default 1px border tone — search bar dividers, table separators, footer column splitters, card 1px borders. - **Hairline Soft** (`{colors.hairline-soft}` — #ebebeb): A lighter divider used on long-scrolling editorial body separators. - **Border Strong** (`{colors.border-strong}` — #c1c1c1): A heavier stroke used on disabled outline buttons and form input outlines after focus. ### Text - **Ink** (`{colors.ink}` — #222222): The dominant text color on light surfaces. Display headlines, body paragraphs, primary nav links, and most inline link text. Never pure black. - **Body** (`{colors.body}` — #3f3f3f): A secondary running-text color used inside long-form review and amenity copy where ink would feel too heavy. - **Muted** (`{colors.muted}` — #6a6a6a): Sub-titles inside city link blocks ("Cottage rentals", "Villa rentals"), inactive product-tab labels, footer category sub-labels, "View all" links. - **Muted Soft** (`{colors.muted-soft}` — #929292): Disabled link text. Used very sparingly. - **Star Rating** (`{colors.star-rating}` — #222222): The same ink token — Airbnb's star icon and "4.81" rating numbers all render in ink rather than a yellow/gold color, which is a deliberate brand choice (yellow stars feel cheap in travel context). - **On Primary** (`{colors.on-primary}` — #ffffff): White text on Rausch CTAs. ### Semantic - **Error** (`{colors.primary-error-text}` — #c13515): Inline error text for form validation. Distinct from Rausch — slightly darker, more saturated red. - **Error Hover** (`{colors.primary-error-text-hover}` — #b32505): Darkens on link hover. - **Legal Link Blue** (`{colors.legal-link}` — #428bff): Inline links inside legal copy (Privacy, Terms). Only used inside the legal sub-band. ### Scrim - **Scrim** (`{colors.scrim}` — #000000 at 50% opacity): The global modal backdrop tone — date picker, login dialog, language picker. Stored as the base hex; opacity is applied at render time. ## Typography ### Font Family The system runs **Airbnb Cereal VF** for everything — display, body, navigation, captions, microcopy. Fallbacks walk `Circular, -apple-system, system-ui, Roboto, "Helvetica Neue", sans-serif`. **Circular** is the historic in-house typeface still kept as the first non-variable fallback; system stacks back it up. There is no separate display family. The variable font carries the entire scale. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.rating-display}` | 64px | 700 | 1.1 | -1px | Listing detail rating display ("4.81") | | `{typography.display-xl}` | 28px | 700 | 1.43 | 0 | Homepage h1 ("Inspiration for future getaways") | | `{typography.display-lg}` | 22px | 500 | 1.18 | -0.44px | Listing detail h1 ("Close to Fethiye Aliyah Bali Beach…") | | `{typography.display-md}` | 21px | 700 | 1.43 | 0 | Section heads inside listing detail ("What this place offers") | | `{typography.display-sm}` | 20px | 600 | 1.20 | -0.18px | Sub-section titles ("Things to know") | | `{typography.title-md}` | 16px | 600 | 1.25 | 0 | City link block titles ("Wilmington", "Athens") | | `{typography.title-sm}` | 16px | 500 | 1.25 | 0 | Footer column heads ("Support", "Hosting", "Airbnb") | | `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Default running-text inside listing copy | | `{typography.body-sm}` | 14px | 400 | 1.43 | 0 | Card meta lines, dates, prices, distance text | | `{typography.caption}` | 14px | 500 | 1.29 | 0 | Search field segment labels ("Where", "When", "Who") | | `{typography.caption-sm}` | 13px | 400 | 1.23 | 0 | Footer legal line ("© 2026 Airbnb, Inc.") | | `{typography.badge}` | 11px | 600 | 1.18 | 0 | "Guest favorite" floating badge text | | `{typography.micro-label}` | 12px | 700 | 1.33 | 0 | Card amenity micro-labels ("Inline 6") | | `{typography.uppercase-tag}` | 8px | 700 | 1.25 | 0.32px (uppercase) | "NEW" badge on product nav tabs | | `{typography.button-md}` | 16px | 500 | 1.25 | 0 | Primary CTA button labels | | `{typography.button-sm}` | 14px | 500 | 1.29 | 0 | Pill button labels (category strip) | | `{typography.link}` | 14px | 400 | 1.43 | 0 | Inline body links | | `{typography.nav-link}` | 16px | 600 | 1.25 | 0 | Top product-nav labels (Homes, Experiences, Services) | ### Principles Display weights stay modest. The homepage h1 at 28px / 700 is deliberately small — it tucks under the search bar so photography and the city-link grid carry visual hierarchy. The listing-detail h1 at 22px / 500 is even quieter; the listing photo banner does the work above it. The single typographically loud moment in the entire system is the **rating display** (`{typography.rating-display}` — 64px / 700) on listing pages. That is the only place the system trusts type alone to carry hierarchy — rating numbers are a peak trust signal, so they get the loudest treatment. ### Note on Font Substitutes If Airbnb Cereal VF and Circular are unavailable, **Inter** is the closest open-source substitute. Adjust display headlines down by ~2% in line-height to match Cereal's slightly tighter cap height; otherwise the proportions transfer cleanly. ## Layout ### Spacing System - **Base unit:** 4px (with 2px micro-step). - **Tokens:** `{spacing.xxs}` 2px · `{spacing.xs}` 4px · `{spacing.sm}` 8px · `{spacing.md}` 12px · `{spacing.base}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 64px. - **Section padding (vertical):** `{spacing.section}` (64px) for major page bands; tighter than typical SaaS marketing (80–96px) because marketplace pages need higher card density per scroll. - **Card internal padding:** `{spacing.lg}` (24px) for `{component.host-card}` and `{component.reservation-card}`; `{spacing.base}` (16px) for property-card meta block; `{spacing.sm}` (8px) for caption / date-row gutters. - **Gutters:** `{spacing.base}` (16px) between cards in the homepage city grid; `{spacing.lg}` (24px) inside footer column gutters; `{spacing.xs}` (4px) on dense category-strip dividers. ### Grid & Container - **Max content width:** ~1280px centered on the homepage and editorial pages. Listing detail pages cap closer to 1080px to keep the photo banner and reservation rail readable. - **City link grid (homepage footer):** 6-column grid at desktop with each cell housing a city name in `{typography.title-md}` and a category sub-label in `{typography.body-sm}` muted. - **Listing detail:** 2-column with photo / amenity body on the left (~64% width) and a sticky reservation card (`{component.reservation-card}`) on the right (~32%). - **Footer:** 3-column link list (Support / Hosting / Airbnb) at desktop, collapsing to 1-column on mobile. ### Whitespace Philosophy The system gives editorial bands 64px of vertical breathing room but compresses card grids — property and city-link cards sit just 16px apart. The contrast is intentional: the page reads as "open hero, dense marketplace below," reinforcing the marketplace nature without overwhelming the visitor at the fold. ## Elevation The system has essentially **one shadow tier** plus the flat baseline. - **Flat (no shadow):** Body, hero, footer, all editorial bands — 95% of surfaces. - **Card hover float:** `box-shadow: rgba(0, 0, 0, 0.02) 0 0 0 1px, rgba(0, 0, 0, 0.04) 0 2px 6px 0, rgba(0, 0, 0, 0.1) 0 4px 8px 0` — applied to property cards on pointer hover, the search bar at rest, and the dropdown menus (account menu, language picker, date picker). This is the single shadow definition in the entire system. - **Modal scrim:** `{colors.scrim}` rendered at 50% opacity — the global modal backdrop. Used on date pickers, login dialogs, language picker. There are no progressive elevation tiers — the system either has the one shadow or none. Depth comes from photography, the white-on-white surface separation, and rounded-corner clipping rather than from layered shadows. ## Components ### Buttons **`button-primary`** — Rausch fill, white text, 8px radius, 14×24px padding, 48px height, weight 500. The most common CTA across the system: "Reserve", "Continue", "Search", account-flow primaries. **`button-primary-active`** — The press state. Background flips to `{colors.primary-active}`. No transform, no shadow change. **`button-primary-disabled`** — Pale Rausch tint at #ffd1da with white text. Cursor not-allowed. **`button-secondary`** — White fill with ink text and a 1px ink outline. 8px radius. Used for "Save", "Cancel", and inverse CTAs over Rausch surfaces. **`button-tertiary-text`** — Plain ink text, no surface, no border. Underlined on hover. Used for "Show more" type links and modal close labels. **`button-pill-rausch`** — A pill-shaped Rausch CTA used on featured cells (e.g., "Become a host" sub-CTA) — 9999px radius, 10×20px padding, 14px label. ### Search Surface **`search-bar-pill`** — The signature global search bar. White fill, 9999px radius, 64px height, 1px hairline 1px-shadow border. Internally divided by vertical hairline rules into `{component.search-field-segment}` cells (Where / When / Who). Each segment holds an uppercase caption label above a placeholder line in `{typography.caption}`. **`search-orb`** — The circular Rausch orb terminating the right edge of the search bar. 48×48px, fully rounded, white magnifying-glass icon centered. The hottest single color moment on the homepage. ### Top Navigation **`top-nav`** — White surface, 80px height, 1px bottom hairline. The Airbnb wordmark sits flush left, the three product tabs (Homes / Experiences / Services) sit in the dead center, and account utilities (host link, language globe, account menu) sit flush right. **`product-tab-active`** — Ink label in `{typography.nav-link}`, 32px hand-illustrated icon, 2px ink underline rule beneath the icon-label pair. **`product-tab-inactive`** — Muted label, illustrated icon, no underline. Becomes active on click. **`new-tag`** — A tiny rounded-pill badge (`{rounded.full}`) anchored top-right of an icon, carrying the uppercase "NEW" label in `{typography.uppercase-tag}` (8px / 700 with 0.32px tracking, uppercase). Used on Experiences and Services to signal recency. ### Listing Cards **`property-card`** — A photo-first card. 1:1 aspect-ratio image with `{rounded.md}` corner clipping, image carousel dots overlay, "Guest favorite" floating badge top-left (`{component.guest-favorite-badge}`), and a heart icon top-right (`{component.icon-button-circle}` in default outlined state, Rausch-filled when saved). Beneath the image: 4–5 lines of meta — title (`{typography.title-md}`), distance / dates (`{typography.body-sm}` muted), and price ("$X night") right-aligned. **`property-card-photo`** — The photo plate itself, separated as a token because some surfaces (wishlist, search results) reuse just the photo without the meta block. **`experience-card`** — A taller-aspect card (4:5) for experience listings. Same `{rounded.md}` clipping, floating "NEW" badge top-left, heart top-right, and a single-line title beneath. **`guest-favorite-badge`** — White rounded pill (`{rounded.full}`) at 11px / 600 weight. Sits over the photo with the system's only shadow tier applied for elevation. ### Listing Detail **`rating-display-card`** — The signature listing-detail moment. A 64px / 700 rating number ("4.81") flanked left and right by tiny laurel-wreath SVG ornaments. Beneath the rating: "Guest favorite" tagline and a row of ink stat columns. The largest typographic weight in the whole system. **`amenity-row`** — A 1-column list of amenity icons + ink labels in `{typography.body-md}`. 12px row padding, no border between rows; section is closed by a 1px hairline divider above and below. **`reviews-card`** — A 2-column grid of review excerpts. Each column holds an author row (avatar, name, date) above a 3-line excerpt with "Show more" tertiary link. **`host-card`** — A white card with `{rounded.md}` rounding and 24px padding holding a host avatar, name, "Superhost" badge, response-rate stat, and a "Contact host" `{component.button-secondary}`. **`reservation-card`** — The sticky right-rail card on listing detail pages. White surface, `{rounded.md}` rounding, 1px hairline border, 1px shadow tier elevation, 24px padding. Contains: nightly price (`{typography.display-md}` ink), date-range selector, guest-count stepper, "Reserve" primary CTA full-width, and a fee breakdown stack beneath in `{typography.body-sm}`. ### Date Picker **`date-picker-day`** — A 40×40px circular cell carrying the day number in `{typography.body-sm}`. Default state is transparent fill, ink text. **`date-picker-day-selected`** — Ink fill, white text, full circle (`{rounded.full}`). Range states between two selected days carry a `{colors.surface-soft}` lozenge background that connects them. ### Forms **`text-input`** — White surface, 1px hairline outline, `{rounded.sm}` 8px radius, 56px height, 14×12px padding. Stacked label above (in `{typography.caption}` muted), placeholder text in `{typography.body-md}` muted. On focus, the border thickens to 2px ink and the border color flips to `{colors.ink}` — no glow, no ring. ### Footer **`footer-light`** — White surface (matches the page canvas — Airbnb has no contrast footer), 48×80px padding. Three columns of link blocks (Support / Hosting / Airbnb), separated by generous 24px gutters. Each column heads with a `{typography.title-sm}` ink label and stacks `{component.footer-link}` rows in `{typography.body-sm}` ink. **`legal-band`** — A bottom strip beneath the footer columns carrying the copyright line, language picker (globe icon + "English (US)" link), currency picker, and social icons (Facebook, X, Instagram). All text in muted `{colors.muted}` at `{typography.caption-sm}`. ## Responsive Behavior | Name | Width | Key Changes | |---|---|---| | Mobile | < 744px | Top nav collapses to logo + hamburger; product tabs hide behind a sheet; search bar collapses to a single tappable pill; property cards stack 1-up; city grid 1-column; listing detail collapses reservation card to a sticky bottom bar. | | Tablet | 744–1128px | Top nav keeps product tabs but search bar narrows; property cards 2-up; city grid 2–3 column; reservation card stays sticky right-rail at narrower width. | | Desktop | 1128–1440px | Full top nav with three product tabs centered; search bar at full pill width with all 3 segments visible; property cards 4-up; city grid 6-column; listing detail 2-column with reservation rail. | | Wide | > 1440px | Content width caps at 1440px on listing/search pages and ~1280px on editorial; gutters absorb the rest. | ### Touch Targets - Primary CTAs at minimum 48×48px (above WCAG AAA). - Search orb is 48×48px circular — the most-tapped element on the page. - Heart save button is 32×32px circular — borderline for AAA but compensated by a generous 12px padding inside the photo card. - Date-picker day cells are 40×40px circular. ### Collapsing Strategy - Top product tabs collapse into a hamburger sheet below 744px. - Search bar's 3 segments collapse into a single-tap entry that opens a full-screen search overlay on mobile. - Property and city-link grids drop column counts cleanly at each breakpoint — never reflow rows; always reduce columns. - Reservation card on listing detail switches from sticky right-rail to a sticky bottom bar on mobile, carrying just the "Reserve" CTA + nightly price summary. ## Do's and Don'ts ### Do - Use Coral Rausch (`#ff385c`) exclusively for primary CTA buttons. - Keep property cards with `{rounded.lg}` (12px or 14px) rounded corners. - Set card text layouts to have generous vertical gaps for high legibility. ### Don't - Don't use sharp, non-rounded corners on property images or primary action cards. - Don't apply dark or high-contrast grey backgrounds on core consumer search screens. - Don't add deep, harsh shadows on static elements. ## Known Gaps - **Hover state colors:** intentionally not documented per the global no-hover policy — Airbnb's actual `:hover` styling for property cards is a subtle elevation lift, but precise extraction is unreliable. - **Loading states / skeleton screens:** not visible on the extracted surfaces. - **Map view styling:** the search-results map uses Mapbox-tinted tiles with custom Rausch markers; not captured here. - **Form input error states:** error text color (`{colors.primary-error-text}`) is documented, but the full input outline + helper-text combination on validation failure was not visible in the captured surfaces. - **Sub-brand palettes:** Luxe (`{colors.luxe}`) and Plus (`{colors.plus}`) are documented as tokens, but their full sub-system (typography overrides, surface treatment) lives on separate sub-domains and is not captured here.
🚗 BMW Portal
Measured Luxury
BMW Spec
复制
沉稳而讲究的豪华汽车门户设计,采用粗壮醒目的标题与纤细现代的 BMW Type Next 字体。
BMW 经典蓝
深海蓝框架
工业现代排线
--- version: alpha name: BMW-design-analysis description: BMW's corporate site — distinct from BMW M's motorsport-bombastic variant, this is a measured and settled corporate-automotive interface. On a light (cream-tinted white) canvas, BMW corporate blue (#1c69d4) carries every primary CTA; dark navy hero bands frame model photography. BMW Type Next Latin sets the entire hierarchy on two weights — heavy 700 display and Light 300 body. Configuration and reservation flows ride a card-based 4-up grid, where each card holds a model render, a name, and a "Learn More" link. colors: primary: "#1c69d4" primary-active: "#0653b6" primary-disabled: "#d6d6d6" ink: "#262626" body: "#3c3c3c" body-strong: "#1a1a1a" muted: "#6b6b6b" muted-soft: "#9a9a9a" hairline: "#e6e6e6" hairline-strong: "#cccccc" canvas: "#ffffff" surface-soft: "#f7f7f7" surface-card: "#fafafa" surface-strong: "#ebebeb" surface-dark: "#1a2129" surface-dark-elevated: "#262e38" on-primary: "#ffffff" on-dark: "#ffffff" on-dark-soft: "#bbbbbb" m-blue-light: "#0066b1" m-blue-dark: "#1c69d4" m-red: "#e22718" success: "#22c55e" warning: "#f59e0b" error: "#dc2626" typography: display-xl: fontFamily: "'BMW Type Next Latin', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" fontSize: 64px fontWeight: 700 lineHeight: 1.05 letterSpacing: 0 display-lg: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 48px fontWeight: 700 lineHeight: 1.1 letterSpacing: 0 display-md: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 32px fontWeight: 700 lineHeight: 1.15 letterSpacing: 0 display-sm: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 24px fontWeight: 700 lineHeight: 1.25 letterSpacing: 0 title-lg: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 20px fontWeight: 700 lineHeight: 1.3 letterSpacing: 0 title-md: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 18px fontWeight: 700 lineHeight: 1.4 letterSpacing: 0 title-sm: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 16px fontWeight: 700 lineHeight: 1.4 letterSpacing: 0 body-md: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 16px fontWeight: 300 lineHeight: 1.55 letterSpacing: 0 body-sm: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 14px fontWeight: 300 lineHeight: 1.55 letterSpacing: 0 caption: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 12px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0.5px label-uppercase: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 13px fontWeight: 700 lineHeight: 1.3 letterSpacing: 1.5px textTransform: uppercase button: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 14px fontWeight: 700 lineHeight: 1.0 letterSpacing: 0.5px nav-link: fontFamily: "'BMW Type Next Latin', sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0.3px rounded: none: 0px xs: 2px sm: 4px md: 8px lg: 12px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 80px components: top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.nav-link}" height: 64px button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.none}" padding: 14px 32px height: 48px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.none}" button-primary-disabled: backgroundColor: "{colors.primary-disabled}" textColor: "{colors.muted}" rounded: "{rounded.none}" button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.none}" padding: 13px 31px height: 48px button-secondary-on-dark: backgroundColor: transparent textColor: "{colors.on-dark}" typography: "{typography.button}" rounded: "{rounded.none}" padding: 13px 31px button-text-link: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.label-uppercase}" text-link: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.body-md}" hero-band-dark: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.display-xl}" padding: 80px hero-photo-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-lg}" padding: 80px model-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.none}" padding: 24px model-card-photo: backgroundColor: "{colors.surface-card}" rounded: "{rounded.none}" feature-photo-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.none}" padding: 24px spec-cell: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.display-sm}" rounded: "{rounded.none}" padding: 24px inventory-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-sm}" rounded: "{rounded.none}" padding: 16px filter-chip: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.caption}" rounded: "{rounded.none}" padding: 8px 14px filter-chip-active: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" rounded: "{rounded.none}" configurator-option-tile: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.none}" padding: 16px 24px configurator-option-tile-selected: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.none}" padding: 15px 23px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.none}" padding: 14px 16px height: 48px cookie-consent-card: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-sm}" rounded: "{rounded.none}" padding: 24px category-tab: backgroundColor: transparent textColor: "{colors.muted}" typography: "{typography.label-uppercase}" rounded: "{rounded.none}" category-tab-active: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.label-uppercase}" rounded: "{rounded.none}" m-stripe-divider: backgroundColor: transparent rounded: "{rounded.none}" cta-band-photo: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.display-md}" padding: 80px footer: backgroundColor: "{colors.surface-soft}" textColor: "{colors.body}" typography: "{typography.body-sm}" padding: 64px --- ## Overview BMW's corporate site carries a far more **measured, corporate-automotive** interface than its motorsport-bombastic cousin BMW M. The atmosphere is light: `{colors.canvas}` (#ffffff) is the base surface, `{colors.surface-card}` (#fafafa) carries the soft-grey card plates, and dark navy `{colors.surface-dark}` (#1a2129) appears only inside hero bands — one per page, framing the lead model render. Type runs BMW's licensed **BMW Type Next Latin** at two weights: heavy 700 (display + button + nav) and Light 300 (body + secondary copy). That contrast — heavy display next to thin paragraph — is the editorial signature, channeling the brand's "European-engineered" voice. Weight 500 is deliberately absent; weight 400 only appears on caption and nav-link in neutral utility contexts. The brand action color, **BMW corporate blue** (`{colors.primary}` — #1c69d4), works alone across every primary CTA — buttons are **rectangular, 0px corner**, with white type. The site rotates a blue-button + dark-navy-hero combination across page rhythm. The M tricolor stripe (`{colors.m-blue-light}` → `{colors.m-blue-dark}` → `{colors.m-red}`) only appears in motorsport contexts and as M-model badges/dividers — never in the corporate site's main language. The configuration and reservation flows add a dealer-side inventory UI on top of the same system — filter chips, model cards, price tables — but typography and color stay identical; only density goes up. **Key Characteristics:** - Light `{colors.canvas}` is the base surface; dark navy `{colors.surface-dark}` appears only inside hero bands — page rhythm relies on contrast. - BMW corporate blue (`{colors.primary}` — #1c69d4) acts as the single primary action color. - BMW Type Next Latin: weight 700 display against weight 300 body is the signature. - Buttons are **rectangular, 0px radius** — corporate dialect, distinct from M's sportier radii. - Model cards run as 4-up or 5-up grids with no hairline border or only minimal border — just white plate + photo + title. - Photography (model renders) sits in environment, no shadow — depth comes entirely from color-block contrast. - M tricolor stripe appears only in M-model contexts — not part of the corporate language. - Section rhythm holds at `{spacing.section}` (80px) for every major band. ## Colors ### Brand & Accent - **BMW Blue (Primary)** (`{colors.primary}` — #1c69d4): The single brand action color. All primary CTAs, "Learn More" link prefixes (blue text), nav-link active state. Press shifts to `{colors.primary-active}` (#0653b6). - **M Blue Light** (`{colors.m-blue-light}` — #0066b1) + **M Blue Dark** (`{colors.m-blue-dark}` — #1c69d4) + **M Red** (`{colors.m-red}` — #e22718): The M tricolor stripe — appears on the corporate site only on M-model pages and the "M" badge. Never as CTA colors. ### Surface - **Canvas** (`{colors.canvas}` — #ffffff): The default page surface. - **Surface Soft** (`{colors.surface-soft}` — #f7f7f7): Soft grey for the footer and sub-navigation bands. - **Surface Card** (`{colors.surface-card}` — #fafafa): The light plate behind a model card's photo block. - **Surface Strong** (`{colors.surface-strong}` — #ebebeb): A slightly heavier grey used as a section divider. - **Surface Dark** (`{colors.surface-dark}` — #1a2129): Dark navy for hero bands and large dark CTAs. Not pure black — carries a warm undertone. - **Surface Dark Elevated** (`{colors.surface-dark-elevated}` — #262e38): One step lighter, used for nested cards on top of the dark hero. ### Hairlines - **Hairline** (`{colors.hairline}` — #e6e6e6): The 1px divider — input outline, configurator card outline, table separator. - **Hairline Strong** (`{colors.hairline-strong}` — #cccccc): A more visible 1px outline — disabled secondary buttons, emphasized table border. ### Text - **Ink** (`{colors.ink}` — #262626): All display and primary text. Not pure black — soft against photography. - **Body** (`{colors.body}` — #3c3c3c): Default running text. - **Body Strong** (`{colors.body-strong}` — #1a1a1a): Emphasized paragraphs and lead text. - **Muted** (`{colors.muted}` — #6b6b6b): Footer links, breadcrumbs, captions. - **Muted Soft** (`{colors.muted-soft}` — #9a9a9a): Disabled text, fine-print legal. - **On Primary** (`{colors.on-primary}` — #ffffff): White text on a blue button. - **On Dark** (`{colors.on-dark}` — #ffffff): White text on a dark hero band. - **On Dark Soft** (`{colors.on-dark-soft}` — #bbbbbb): A slightly muted white for secondary text on dark bands. ### Semantic - **Success** (`{colors.success}` — #22c55e): Confirmation messages and "available" indicators. - **Warning** (`{colors.warning}` — #f59e0b): Warning callouts. - **Error** (`{colors.error}` — #dc2626): Validation errors. ## Typography ### Font Family The system runs **BMW Type Next Latin** in two cuts: regular (display + UI labels) and **BMW Type Next Latin Light** (body + secondary copy). Fallback stack: `system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`. The display/body split is functional: - BMW Type Next Latin (700) → display headlines, button labels, nav links - BMW Type Next Latin Light (300) → paragraphs, descriptive copy - BMW Type Next Latin (400) → caption, neutral nav-link contexts This three-way split mirrors BMW M's — corporate and the M sub-brand share the same typographic DNA; only the weight/size ratios differ. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 64px | 700 | 1.05 | 0 | Hero h1 ("iX3", model name) | | `{typography.display-lg}` | 48px | 700 | 1.1 | 0 | Section heads | | `{typography.display-md}` | 32px | 700 | 1.15 | 0 | Sub-section heads | | `{typography.display-sm}` | 24px | 700 | 1.25 | 0 | CTA-band headlines | | `{typography.title-lg}` | 20px | 700 | 1.3 | 0 | Card group titles | | `{typography.title-md}` | 18px | 700 | 1.4 | 0 | Model card title, intro paragraphs | | `{typography.title-sm}` | 16px | 700 | 1.4 | 0 | Inventory card title, list label | | `{typography.body-md}` | 16px | 300 (Light) | 1.55 | 0 | Default body — BMW Type Next Latin Light | | `{typography.body-sm}` | 14px | 300 (Light) | 1.55 | 0 | Footer body, fine-print | | `{typography.caption}` | 12px | 400 | 1.4 | 0.5px | Photo captions, meta | | `{typography.label-uppercase}` | 13px | 700 | 1.3 | 1.5px | "LEARN MORE" inline links, category tabs | | `{typography.button}` | 14px | 700 | 1.0 | 0.5px | Standard CTA button label | | `{typography.nav-link}` | 14px | 400 | 1.4 | 0.3px | Top-nav menu items | ### Principles - The **700/300 contrast** is the editorial signature. Weight 500 is absent from the system. - **No negative letter-spacing** — BMW Type Next Latin works on a wide body, so tracking stays at default. Apple/Cal.com-style tightening reads off-brand here. - **UPPERCASE inline links** — "LEARN MORE"-style CTAs run uppercase with 1.5px tracking. The "machined precision" voice. - **Weight 400 lives in a narrow lane** — only caption and nav-link, both neutral utility roles. ### Note on Font Substitutes BMW Type Next Latin is a licensed BMW typeface. Open-source alternatives: - **Inter** (variable) — close match at weight 700/300. Leave letter-spacing at 0.0em. - **Saira Condensed** — for a slightly more compressed BMW Type feel. ## Layout ### Spacing System - **Base unit:** 8px. - **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 80px. - **Section padding:** `{spacing.section}` (80px) for every major editorial band. - **Card internal padding:** `{spacing.lg}` (24px) for model and feature cards. ### Grid & Container - **Max content width:** ~1440px center-aligned. - **Editorial body:** A single 12-column grid. - **Model card grids:** 4-up or 5-up at desktop, 2-up at tablet, 1-up on mobile. - **Configurator inventory grids:** 3-up filter row + 4-up vehicle cards, dense layout. ### Whitespace Philosophy BMW's whitespace strategy is tighter than BMW M's motorsport-aerated grenadier — the corporate side is more utility-driven. Section rhythm is 80px (not M's 96px). Card padding is 24px (not M's 32px). The page is denser, more dealership-functional. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat | No shadow, no border | Body, top nav, footer, hero bands | | Soft hairline | 1px `{colors.hairline}` border | Configurator option tile, table divider | | Card surface | `{colors.surface-card}` background — no shadow | Model card photo plate | | Photographic | Edge-to-edge photography | Hero band, model renders | The system never uses a drop shadow. Depth comes entirely from (a) color-block contrast (light canvas vs dark hero) and (b) photographic subject + lighting. ### Decorative Depth - **`m-stripe-divider`** — a 4px-tall horizontal tricolor stripe (`{colors.m-blue-light}` → `{colors.m-blue-dark}` → `{colors.m-red}`). Only in M-model contexts, motorsport badges, or as an M-related section divider. Not part of the main corporate flow. - **Photographic depth** — full-bleed vehicle photography (lighting + subject) does the work chrome would otherwise do. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Every button, card, input, configurator chip — the dominant radius | | `{rounded.xs}` | 2px | Very small badges, very rare | | `{rounded.sm}` | 4px | Small inline button (rare) | | `{rounded.md}` | 8px | Mobile-only collapse cards (rare) | | `{rounded.lg}` | 12px | Very rare — modal/dialog corners | | `{rounded.pill}` | 9999px | Filter chips in some contexts (rare) | | `{rounded.full}` | 9999px / 50% | Avatar, circular icon button | The radius hierarchy is binary: **rectangular for everything, circular only for icon buttons.** A clear departure from the soft-cornered SaaS dialect of Apple or Cal.com — closer to BMW corporate-automotive's "engineered precision" voice. ### Photography Geometry - Hero photography is full-bleed at 16:9 or 21:9 cinematic ratio. - Model card photos sit at 16:10, edge-to-edge with `{rounded.none}` corners. - Configurator vehicle renders sit on a white studio background, full silhouette visible. ## Components ### Top Navigation **`top-nav`** — A white sticky nav bar pinned to the top of the page. 64px tall, `{colors.canvas}` background. Left: BMW circular badge logo; center: primary horizontal menu (Models, Next Generation, Pre-Owned, Dealers, Test Drive); right: cart icon, language picker, profile. Menu items render in `{typography.nav-link}` (14px / 400 / 0.3px tracking). ### Buttons **`button-primary`** — The signature primary CTA. Background `{colors.primary}` (BMW Blue #1c69d4), text `{colors.on-primary}`, type `{typography.button}` (BMW Type Next Latin 14px / 700 / 0.5px tracking), padding 14px × 32px, height 48px, rounded `{rounded.none}` (0px — rectangular). Press state: `button-primary-active` shifts to `{colors.primary-active}`. **`button-secondary`** — A white button with a hairline outline. Background `{colors.canvas}`, text `{colors.ink}`, 1px `{colors.hairline-strong}` border, same padding + height + radius. **`button-secondary-on-dark`** — Used over a dark hero band. Background transparent, text `{colors.on-dark}`, 1px `{colors.on-dark}` border, same rectangular shape. **`button-text-link`** — An inline UPPERCASE letter-spaced link. No background, text `{colors.ink}`, type `{typography.label-uppercase}` (13px / 700 / 1.5px tracking). Reads as "LEARN MORE", terminated by a `›` chevron. **`text-link`** — An inline link inside body copy. `{colors.ink}` text, no underline by default; underlines per context. ### Cards & Containers **`hero-band-dark`** — Full-width dark navy hero. Background `{colors.surface-dark}`, text `{colors.on-dark}`, vertical padding `{spacing.section}` (80px). Centered: model name in `{typography.display-xl}` (64px / 700) + sub-headline + vehicle render (right-aligned or below). A single `{component.button-primary}` (blue) or `{component.button-secondary-on-dark}`. **`hero-photo-band`** — A light-canvas model showcase band. Background `{colors.canvas}`, text `{colors.ink}`. The vehicle render takes the wide area; right or below, a headline + two link CTAs + sub-tagline. **`model-card`** — Used in 4-up or 5-up model card grids on the homepage ("BMW iX3", "BMW iX", "BMW 5 Series"). Background `{colors.canvas}`, rounded `{rounded.none}`, padding `{spacing.lg}` (24px). Contents: model render at the top (`{component.model-card-photo}` on `{colors.surface-card}`), model name in `{typography.title-md}` (18px / 700) below, a one-line tagline in `{typography.body-sm}` (14px / 300), and a `{component.button-text-link}` ("LEARN MORE ›"). **`model-card-photo`** — The card's photo plate. Background `{colors.surface-card}` (#fafafa — soft grey), rounded `{rounded.none}`, vehicle render in full silhouette. Zero padding — the photo runs edge-to-edge. **`feature-photo-card`** — A feature/lifestyle card. Background `{colors.canvas}`, padding `{spacing.lg}`. 16:9 photo at the top, `{typography.title-md}` headline + body excerpt below. **`spec-cell`** — A technical spec cell (model detail page). Transparent background, separated by hairline dividers. Value on top (`{typography.display-sm}` 24px / 700), label below (`{typography.label-uppercase}`). ### Inventory & Configurator **`inventory-card`** — One card per vehicle on the dealer inventory page. Background `{colors.canvas}`, padding `{spacing.md}` (16px), rounded `{rounded.none}`. Vehicle photo on top, model + variant name + price + "View" link below. **`filter-chip`** + **`filter-chip-active`** — Inventory filter chips (model, year, price range). Inactive: background `{colors.canvas}`, 1px `{colors.hairline-strong}` border, text `{colors.ink}`, type `{typography.caption}`. Active: background `{colors.ink}`, text `{colors.on-dark}`. Padding 8px × 14px, radius `{rounded.none}`. **`configurator-option-tile`** + **`configurator-option-tile-selected`** — Configurator selection cell (color, wheels, upholstery). Inactive: background `{colors.canvas}`, 1px hairline. Selected: 2px `{colors.primary}` border. Padding 16px × 24px, radius `{rounded.none}`. ### Inputs & Forms **`text-input`** — Standard text input. Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-md}`, rounded `{rounded.none}` (0px), padding 14px × 16px, height 48px, 1px hairline border. On focus, the border thickens to ink. **`cookie-consent-card`** — Cookie banner. Background `{colors.canvas}`, 1px hairline, padding `{spacing.lg}` (24px), `{typography.body-sm}` (14px / 300 — Light even in legal copy). ### Tabs / Tags **`category-tab`** + **`category-tab-active`** — Category sub-nav. Inactive: transparent + `{colors.muted}` UPPERCASE label. Active: transparent + `{colors.ink}` UPPERCASE label + 2px ink underline. 12px vertical padding, no horizontal radius. ### Brand Signature **`m-stripe-divider`** — A 4px-tall horizontal tricolor stripe (`{colors.m-blue-light}` → `{colors.m-blue-dark}` → `{colors.m-red}`). Only in M-model contexts, motorsport badges, or as an M-related section divider. Absent from the corporate main flow; on M-model detail pages and the M Performance badge it plays an inline divider role. ### CTA / Footer **`cta-band-photo`** — A pre-footer "Discover the New iX3"-style band. Background `{colors.surface-dark}` with a full-bleed vehicle photo. Centered headline in `{typography.display-md}` (32px / 700) + a single `{component.button-secondary-on-dark}`. 80px padding. **`footer`** — The closing soft-grey footer. Background `{colors.surface-soft}` (#f7f7f7 — not pure white — soft grey), text `{colors.body}`. A 4-column link list: Models / Services / Dealers / About. Vertical padding 64px. Below, a copyright line in `{typography.body-sm}` with `{colors.muted}`. ## Do's and Don'ts ### Do - Sit every page on `{colors.canvas}` (pure white); reserve `{colors.surface-dark}` for hero bands only. - Pair primary CTAs with `{colors.primary}` (BMW Blue) + `{colors.on-primary}` white text + `{rounded.none}` 0px corners — the corporate signature. - Set display headlines in BMW Type Next Latin 700 and body in Light 300. The contrast is non-negotiable. - Use UPPERCASE letter-spaced links like "LEARN MORE" as inline CTAs. - Place the model card photo on `{colors.surface-card}` with the title beneath — the standard BMW corporate pattern. - Hold section rhythm at `{spacing.section}` (80px) — tighter than BMW M's 96px. - Reserve the M tricolor stripe for M-model contexts and motorsport dividers. ### Don't - Don't add a brand color other than blue — BMW Blue is the only primary action color. - Don't use pill or rounded buttons — `{rounded.none}` (0px) rectangular IS the brand button. - Don't drop display weight to 500 — the system uses 700 / 400 / 300; 500 is absent. - Don't bold body type — Light 300 is the BMW corporate editorial voice. - Don't add drop shadows to cards — depth comes from photo + color-block contrast. - Don't repeat the same surface mode across two consecutive bands — light → dark hero → light → light feature → dark CTA → light footer rotation is required. - Don't use the M tricolor stripe as a CTA fill — divider/accent role only. - Don't mix languages in a single page — UI language must stay consistent. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 768px | Hamburger nav; hero h1 64→40px; model card grid 1-up; configurator filter chips 2-up; footer 4 col → 1 col | | Tablet | 768–1024px | Top nav narrows, secondary menu hides under "More"; model card 2-up; inventory 2-up | | Desktop | 1024–1440px | Full top-nav; 4-up or 5-up model card grid; inventory 3-up; full configurator UI | | Wide | > 1440px | Same as desktop, content fixed at 1440px; gutters absorb the rest | ### Touch Targets - `{component.button-primary}` minimum 48 × 48px — above WCAG AAA (44 × 44). - `{component.text-input}` height 48px. - Category tabs run with 12px vertical padding, giving an effective tap area > 44px. ### Collapsing Strategy - The top nav collapses to a hamburger below 768px; the menu opens as a full-screen sheet. - The hero band's internal layout drops to a single column. - Model card grid 4-up/5-up → 2-up → 1-up. - The configurator filter chip row scrolls horizontally on mobile. - The M tricolor stripe stays at 4px height across every breakpoint. ### Image Behavior - Model renders scale at every breakpoint while preserving native aspect ratios. - Hero photography may shift to a more vertical crop on mobile (art direction). - Inventory vehicle photos may move from 16:9 to 4:3 on mobile. ## Iteration Guide 1. Focus on a single component. Reference its YAML key directly (`{component.model-card}`, `{component.button-primary}`). 2. New components default to `{rounded.none}` (0px). Use `{rounded.full}` only for circular icon buttons. 3. Variants (`-active`, `-disabled`, `-selected`) live as separate entries inside the `components:` block. 4. `{token.refs}` everywhere — never inline hex. 5. Hover state is never documented. Only Default and Active/Pressed states. 6. Display headlines stay BMW Type Next Latin 700; body stays Light 300; the trio is fixed. 7. Keep UI strings in a single language — match the locale of the page. ## Known Gaps - BMW Type Next Latin is licensed to BMW and not published as a public web font; Inter at weights 700/300 is documented as the substitute. - Animation and transition timings (configurator color swap, model card hover-reveal) are out of scope here. - Form validation states beyond `{component.text-input}` focus were not extracted — error/success states would need a dedicated form page. - The dealer inventory sub-domain shares typography and color with the main corporate site; only UI density rises (filters, tables, prices). - A cookie consent overlay can occlude part of the hero — the lead hero band content may not be fully captured. - The M tricolor stripe appears infrequently on this corporate site; full motorsport context lives on the BMW M site.
DELL.COM 1996
Retro Nostalgia
Dell 1996 Spec
复制
重温 90 年代目录式企业网页风格的复古设计,使用 Windows 95 浮雕灰色边框与纯蓝色的文字链接。
Windows 95 灰色浮雕
Times New Roman 衬线
高对比度色块
--- version: alpha name: Dell 1996 Inspired description: An inspired interpretation of Dell.com's 1996 design language — a catalog-era enterprise web design built around a literal black page frame, vivid flat color-block "ribbon cards" tinted in sage, salmon, periwinkle, sky, peach and lime, chunky Helvetica-Black display titles, Times Roman body copy, and an entire visual vocabulary of pre-Photoshop hand-cut GIF stickers (NEW! bursts, award seals, beveled product photos). colors: primary: "#e91d2a" on-primary: "#ffffff" canvas: "#ffffff" surface: "#ffffff" ink: "#000000" frame-ink: "#000000" yellow-sticker: "#fcc20f" purple-stripe: "#6a26a4" link: "#0000ee" # Ribbon-card tint family (one per product line) tint-olive: "#8e8a25" tint-sage: "#b3bd95" tint-salmon: "#d77a7a" tint-peach: "#e6915d" tint-lime: "#c0d4a7" tint-sky: "#9ab6c8" tint-steel: "#a5b8c0" tint-periwinkle: "#8c9ae0" typography: display: fontFamily: Arial Black fontSize: 36px fontWeight: 900 lineHeight: 1.0 letterSpacing: 0 heading-1: fontFamily: Arial Black fontSize: 24px fontWeight: 900 lineHeight: 1.05 letterSpacing: 0 heading-2: fontFamily: Helvetica fontSize: 16px fontWeight: 700 lineHeight: 1.2 letterSpacing: 0 heading-3: fontFamily: Helvetica fontSize: 14px fontWeight: 700 lineHeight: 1.2 letterSpacing: 0 body: fontFamily: Times New Roman fontSize: 14px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 body-sm: fontFamily: Times New Roman fontSize: 12px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 caption: fontFamily: Times New Roman fontSize: 11px fontWeight: 400 lineHeight: 1.35 letterSpacing: 0 button: fontFamily: Helvetica fontSize: 12px fontWeight: 700 lineHeight: 1.0 letterSpacing: 0 link: fontFamily: Times New Roman fontSize: 14px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 ui-label: fontFamily: Helvetica fontSize: 12px fontWeight: 700 lineHeight: 1.0 letterSpacing: 0 rounded: none: 0px full: 9999px spacing: xxs: 2px xs: 4px s: 6px sm: 8px m: 10px md: 12px lg: 16px xl: 20px xxl: 24px section-sm: 32px section: 40px section-lg: 48px components: # ─── Brand-native components ─── page-frame: backgroundColor: "{colors.frame-ink}" textColor: "{colors.canvas}" rounded: "{rounded.none}" padding: 8px top-banner: backgroundColor: "{colors.frame-ink}" textColor: "{colors.canvas}" typography: "{typography.heading-2}" rounded: "{rounded.none}" padding: 12px 16px section-eyebrow-olive: backgroundColor: "{colors.tint-olive}" textColor: "{colors.ink}" typography: "{typography.display}" rounded: "{rounded.none}" padding: 24px 16px section-eyebrow-salmon: backgroundColor: "{colors.tint-salmon}" textColor: "{colors.ink}" typography: "{typography.display}" rounded: "{rounded.none}" padding: 24px 16px ribbon-card-title: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.heading-3}" rounded: "{rounded.none}" padding: 6px 12px ribbon-card-body-sage: backgroundColor: "{colors.tint-sage}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 12px 16px ribbon-card-body-salmon: backgroundColor: "{colors.tint-salmon}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 12px 16px ribbon-card-body-peach: backgroundColor: "{colors.tint-peach}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 12px 16px ribbon-card-body-lime: backgroundColor: "{colors.tint-lime}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 12px 16px ribbon-card-body-sky: backgroundColor: "{colors.tint-sky}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 12px 16px ribbon-card-body-steel: backgroundColor: "{colors.tint-steel}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 12px 16px ribbon-card-body-periwinkle: backgroundColor: "{colors.tint-periwinkle}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 12px 16px cta-block-red: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 16px phone-callout: backgroundColor: "{colors.frame-ink}" textColor: "{colors.primary}" typography: "{typography.heading-2}" rounded: "{rounded.none}" padding: 4px 8px buy-a-dell-sticker: backgroundColor: "{colors.yellow-sticker}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.button}" rounded: "{rounded.none}" padding: 4px 8px new-burst-sticker: backgroundColor: "{colors.yellow-sticker}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.none}" padding: 4px 8px cert-seal: backgroundColor: "{colors.primary}" textColor: "{colors.canvas}" typography: "{typography.button}" rounded: "{rounded.full}" size: 64px icon-label-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.ui-label}" rounded: "{rounded.none}" padding: 8px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body}" rounded: "{rounded.none}" padding: 4px 6px button-primary: backgroundColor: "{colors.frame-ink}" textColor: "{colors.on-primary}" borderColor: "{colors.frame-ink}" typography: "{typography.button}" rounded: "{rounded.none}" padding: 6px 16px button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.button}" rounded: "{rounded.none}" padding: 6px 16px button-text-link: backgroundColor: "{colors.canvas}" textColor: "{colors.link}" typography: "{typography.link}" rounded: "{rounded.none}" footer-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" typography: "{typography.body-sm}" padding: 16px # ─── Examples (illustrative, kit-mirror) — injected by derive-examples-block.mjs ─── # ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ─── ex-pricing-tier: description: "Default Pricing tier card. Re-uses feature-card chrome with the base white surface." backgroundColor: "{colors.surface}" textColor: "{colors.ink}" borderColor: "{colors.frame-ink}" rounded: "{rounded.none}" padding: "{spacing.lg}" ex-pricing-tier-featured: description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)." backgroundColor: "{colors.ink}" textColor: "{colors.on-primary}" rounded: "{rounded.none}" padding: "{spacing.lg}" ex-product-selector: description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)." backgroundColor: "{colors.surface}" rounded: "{rounded.none}" padding: "{spacing.lg}" ex-cart-drawer: description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)." backgroundColor: "{colors.surface}" rounded: "{rounded.none}" padding: "{spacing.lg}" item-divider: "{colors.frame-ink}" ex-app-shell-row: description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator." backgroundColor: "{colors.canvas}" activeIndicator: "{colors.primary}" rounded: "{rounded.none}" padding: "{spacing.sm} {spacing.md}" ex-data-table-cell: description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm." headerBackground: "{colors.surface}" headerTypography: "{typography.caption}" bodyTypography: "{typography.body-sm}" cellPadding: "{spacing.s} {spacing.md}" rowBorder: "{colors.frame-ink}" ex-auth-form-card: description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside." backgroundColor: "{colors.surface}" rounded: "{rounded.none}" padding: "{spacing.lg}" ex-modal-card: description: "Modal dialog surface — same chrome as feature-card with elevated shadow." backgroundColor: "{colors.surface}" rounded: "{rounded.none}" padding: "{spacing.lg}" ex-empty-state-card: description: "Empty-state illustration frame." backgroundColor: "{colors.surface}" rounded: "{rounded.none}" padding: "{spacing.xl}" captionTypography: "{typography.body}" ex-toast: description: "Toast notification surface — feature-card shape + medium shadow." backgroundColor: "{colors.surface}" rounded: "{rounded.none}" padding: "{spacing.md} {spacing.lg}" typography: "{typography.body-sm}" --- ## Overview Dell's December 1996 home page is a perfectly preserved fossil of catalog-era enterprise web design — the moment when a Fortune-100 brand decided the web was *important enough* to invest in, but two years before CSS would be widely adopted and three years before "design system" was a phrase anyone used. Every visual choice on the page is a downstream consequence of that constraint: layout via HTML tables, type via the browser's built-in font stack (Arial Black / Helvetica / Times Roman), color via 8-bit-safe flat fills, and decoration via hand-cut GIF "stickers" (the NEW! burst, the round PC Magazine Readers' Choice seal, the beveled "BUY a DELL" yellow tab). The page is bordered — literally bordered, in a 1-cell-wide black HTML table — and inside that frame, every product line gets a "ribbon card": a white title bar with a sharp black underline, a tinted body block in one of eight catalog colors (sage, salmon, peach, lime, sky, steel, periwinkle, olive), and a beveled product photograph notched into the right edge of the card. The brand voice carries through in two anchors: a vivid Dell-red CTA panel on the left of the homepage (cream-yellow Times Roman copy on a `{colors.primary}` fill, set inside the black frame) and a screaming red phone number — `1-800-213-DELL` — pinned to the top-right of every page, because in 1996 the website was a brochure that ended with a phone call. The footer is a row of four hand-drawn icon-labels (FIND / HOME / ONLINE STORE / SERVICE & SUPPORT) linked by a thin green horizontal rule, and a single classic-Mosaic-blue underlined "Copyright" link sitting above the legal small print in Times Roman. **Key Characteristics:** - Literal page frame: every page sits inside a `{colors.frame-ink}` (black) outer border ~8 px thick — the design treats the browser window as a printed picture frame - Flat color-block "ribbon cards" tint each product family with a dedicated catalog color (`{colors.tint-sage}` Latitude, `{colors.tint-salmon}` OptiPlex GX, `{colors.tint-periwinkle}` PowerEdge, `{colors.tint-sky}` Dellware, etc.) — no gradients, no shadows, no opacity - Chunky display typography in `{typography.display}` (Arial Black 36 / weight 900) for section title blocks; `{typography.heading-2}` (Helvetica Bold 16) for product row titles; `{typography.body}` Times Roman 14 for everything else - Hand-cut GIF "stickers" overlay the layout: yellow "BUY a DELL" tab in the top right, angled "NEW!" bursts on new product rows, round red PC Magazine Readers' Choice seals - `{colors.primary}` (Dell red) reserved for two things only: the homepage CTA panel and the top-right phone number — never decorative - Footer icon-nav with classic-blue (`{colors.link}` #0000ee) anchor underlines — the unmistakable Netscape 3.x link colour ## Colors ### Brand & Accent - **Dell Red** (`{colors.primary}` — #e91d2a): The brand's signature red. Reserved for the homepage CTA panel ("At Dell.com, we'll help you find the right system…"), the top-right phone number, and the PC Magazine Readers' Choice seal ring. Never used as a card body fill. - **Dell Yellow** (`{colors.yellow-sticker}` — #fcc20f): Sticker yellow — the "BUY a DELL" tab in the top banner, and the angled "NEW!" bursts overlapping new product rows. - **Dell Purple** (`{colors.purple-stripe}` — #6a26a4): The accent stripe behind the lowercase ".com" / "DELL" wordmark text — appears inside the "BUY a DELL" sticker chrome only. ### Surface - **Frame Ink** (`{colors.frame-ink}` — #000000): Pure black. The page frame, the top banner background, button fills, and all 1 px ribbon-card hairlines. - **Canvas** (`{colors.canvas}` — #ffffff): True white inside the frame. The page surface, the ribbon-card title-bar fill, and the icon-label nav backdrop. ### Text - **Ink** (`{colors.ink}` — #000000): Body text, headings, link copy before visit. Pure black; no warm-near-black softening in 1996. - **Link** (`{colors.link}` — #0000ee): Classic Mosaic / Netscape 3.x default link blue. Underlined inline anchors ("Copyright", "(Terms of Use)", inline "from Dell's award-winning service and support teams"). ### Ribbon-Card Tint Family Eight catalog colors, one per product line — these are the page's chromatic personality: - **Olive** (`{colors.tint-olive}` — #8e8a25): "DIMENSION DESKTOPS" eyebrow block - **Sage** (`{colors.tint-sage}` — #b3bd95): Latitude Notebooks ribbon body - **Salmon** (`{colors.tint-salmon}` — #d77a7a): "OPTIPLEX DESKTOP SYSTEMS" eyebrow + GX Series body - **Peach** (`{colors.tint-peach}` — #e6915d): Dimension card body + OptiPlex Gs body - **Lime** (`{colors.tint-lime}` — #c0d4a7): OptiPlex G Series body - **Sky** (`{colors.tint-sky}` — #9ab6c8): Dellware ribbon body - **Steel** (`{colors.tint-steel}` — #a5b8c0): Dimension XPS Pro ribbon body - **Periwinkle** (`{colors.tint-periwinkle}` — #8c9ae0): PowerEdge ribbon body The tints are saturated but not vivid — they sit just below true neutral chroma, the signature of GIF-era web-safe-palette quantization. ## Typography ### Font Family Three system-stack families, no webfonts (webfonts didn't exist yet): - **Arial Black** (fallback: Helvetica, system-ui sans) — display headings only. The chunky stenciled section eyebrows ("DIMENSION DESKTOPS", "OPTIPLEX DESKTOP SYSTEMS") are Arial Black at weight 900, set in all-caps with normal tracking. - **Helvetica** (fallback: Arial, system-ui sans) — product-row titles, button labels, the top banner's "BUILD YOUR OWN COMPUTER. ONLINE." headline. Always bold (700), always all-caps. - **Times New Roman** (fallback: Times, serif) — body copy. Every paragraph, every caption, every inline anchor sits in default-rendered Times Roman. The serifs date the design instantly — body text on the modern web is almost never serif. ### Hierarchy | Token | Size | Weight | Line Height | Use | |---|---|---|---|---| | `{typography.display}` | 36px | 900 | 1.0 | Section eyebrow titles ("DIMENSION DESKTOPS", "OPTIPLEX DESKTOP SYSTEMS") | | `{typography.heading-1}` | 24px | 900 | 1.05 | Sub-page hero headlines | | `{typography.heading-2}` | 16px | 700 | 1.2 | Top banner copy, product-line H1 ("Reliable PC's for High-Performance Computing.") | | `{typography.heading-3}` | 14px | 700 | 1.2 | Ribbon-card title bar ("OPTIPLEX GX PRO", "DIMENSION XPS") | | `{typography.body}` | 14px | 400 | 1.4 | Default paragraph copy, ribbon-card body, CTA-panel copy | | `{typography.body-sm}` | 12px | 400 | 1.4 | "This site is best viewed with browser versions 3.0 and higher." | | `{typography.caption}` | 11px | 400 | 1.35 | Footer copyright text | | `{typography.button}` | 12px | 700 | 1.0 | Button labels, "NEW!" sticker, BUY-a-DELL sticker | | `{typography.ui-label}` | 12px | 700 | 1.0 | Icon-label nav uppercase labels ("FIND", "HOME", "ONLINE STORE", "SERVICE & SUPPORT") | ### Principles - Sans for UI, serif for body — the inverse of the modern convention, and a dead giveaway of mid-90s typography. - Display weights are extreme (900 / Black) and never softer. The "Dimension" / "OptiPlex" eyebrow blocks lean on the heaviest weight the font ships. - No letter-spacing tracking adjustments — pixel-fonts in 1996 didn't reward it. Everything is set at the browser's default kern. - Line-height is tight on display (1.0) and conventional on body (1.4) — a holdover from print-magazine catalog layout. ### Note on Font Substitutes All three families are operating-system defaults on every consumer OS shipped in 1996 (Windows 95: Arial / Times New Roman; Mac OS 7.5+: Helvetica / Times). The brand had no fallback strategy because no fallback was needed — the fonts were always present. Modern reproductions can stay on this exact stack (Arial Black / Helvetica / Times New Roman) for authenticity. ## Layout ### Spacing System - **Base unit**: 4 px (with 2 / 6 / 10 intermediates). 1996 page layout was driven by HTML table cell padding (`cellpadding="4"` / `cellspacing="0"`) rather than a designed scale. - **Tokens**: `{spacing.xxs}` 2px · `{spacing.xs}` 4px · `{spacing.s}` 6px · `{spacing.sm}` 8px · `{spacing.m}` 10px · `{spacing.md}` 12px · `{spacing.lg}` 16px · `{spacing.xl}` 20px · `{spacing.xxl}` 24px · `{spacing.section-sm}` 32px · `{spacing.section}` 40px · `{spacing.section-lg}` 48px. - **Card interior padding**: `{spacing.md}` 12 px vertical / `{spacing.lg}` 16 px horizontal on ribbon-card bodies. - **Section vertical rhythm**: `{spacing.section}` 40 px between product-ribbon stacks; `{spacing.section-sm}` 32 px between the eyebrow color block and its first ribbon-card. ### Grid & Container - Fixed-width table layout pinned around 760 px wide — the de facto 1996 standard targeting 800×600 monitors with a small scrollbar gutter. - Two-column outer structure: left rail (~28 %) carries the homepage icon-link grid + CTA red panel; right column (~72 %) carries the product ribbon stack. - No grid system in the modern sense — every section is its own `<table>` declaration with hard-coded column widths. ### Whitespace Philosophy Tight by modern standards. Catalog density wins over editorial breath — every pixel inside the black frame is doing work (illustration, color block, headline, body). The compensating decompression happens *inside* each ribbon card: white title bar + tinted body block + product photo notch creates internal breathing room without enlarging the overall page. ### Responsive Strategy #### Breakpoints | Name | Width | Key Changes | |---|---|---| | Period default | 800 × 600 | Fixed 760 px layout, designed for the era's standard monitor | | Modern desktop | 1280+ px | Layout sits centered with generous side gutters — emulates "magazine spread in the middle of the screen" | | Tablet | 768 px | Black frame compresses to 4 px; ribbon-cards stack at full width inside | | Mobile | < 480 px | Black frame to 2 px; two-column structure collapses to single column; left rail icon grid stacks above the right-column product stack | #### Touch Targets 1996 had no notion of touch — the original designs assume mouse-only. Modern reproductions need to widen the icon-label nav targets to 44 × 44 px minimum at mobile (the 1996 icons sat at ~24 × 24 with 8 px label below, well under modern guidelines). #### Collapsing Strategy - At ≤ 768 px, the homepage's left-rail icon-link grid (Online Store / Service / Why Dell? / Government / Worldwide / Order Status / Company Info / U.S. Careers) collapses from a 2 × 4 grid to a single-column stack - Ribbon-card right-edge product photo notch becomes a top-aligned full-width image at mobile - The top banner's tagline ("BUILD YOUR OWN COMPUTER. ONLINE.") shrinks one type tier; the phone number wraps below the BUY-a-DELL sticker - Footer icon-label nav stays 4-up at all widths — the icons are small enough to survive #### Image Behavior Product photos are bitmap GIFs with hand-applied bevel shadows — they were authored at fixed pixel widths (typically 80–120 px wide). The right-edge notch effect was achieved by table-cell negative spacing. Modern reproductions should keep the bevel shadow effect (it's signature) but use SVG drop-shadow or CSS `filter: drop-shadow(2px 2px 0 #000)` to recreate it crisply at high-DPI. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 — Flush | No shadow, no border | Body text, copyright row, footer band background | | 1 — Hairline | `1px solid {colors.frame-ink}` | Ribbon-card outer edge, table-cell dividers | | 2 — Frame | `8px solid {colors.frame-ink}` | The page-frame border around the entire viewport | | 3 — Bevel | Hard-edge 1 px highlight + 1 px shadow on GIF stickers and product photos | "BUY a DELL" yellow sticker, NEW! bursts, award seals, product photographs | There are **no soft shadows** in the 1996 design — every depth cue is either a hard 1 px border or a hand-painted bevel inside a GIF. Modern reproductions that need to feel period-accurate must resist the urge to add Material-style elevation or atmospheric drop shadows. ### Decorative Depth Bevels and frames carry the entire depth vocabulary: - The **page frame** is the strongest depth cue — it tells the viewer "this is a contained document, not a continuous canvas." - **Bevels on stickers** (BUY a DELL, NEW!, PC Magazine Readers' Choice) push them forward off the page surface as if pinned on with thumbtacks. - **Product photographs** carry their own hand-painted bevel + drop-shadow, baked into the GIF itself. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Universal default — buttons, cards, inputs, banners, page frame, ribbon-card bodies, eyebrow blocks | | `{rounded.full}` | 9999px | Circular award seals (PC Magazine Readers' Choice), the round "h" sticker on the HOME icon | The 1996 design has effectively **two** radius modes: square (everything) and round (decorative seal stickers). No 4 / 8 / 12 px subtle radius tier — that vocabulary belongs to the post-Bootstrap web. ### Photography Geometry Product photos are rectangular GIFs with their own internal beveled "monitor" framing — they sit at native pixel dimensions, never scaled. Aspect ratios cluster around 4:3 (the era's standard CRT shape). Avatars don't exist on this site — staff photography was reserved for "About Dell" pages not captured in these snapshots. ## Components > **No hover states documented.** Per the global no-hover policy, every component below documents Default state only. ### Frame & Banner **`page-frame`** — the literal black border around the entire viewport. - Background `{colors.frame-ink}`, padding `{spacing.sm}` 8 px on every side, no radius. - The page sits *inside* this border. Treat it as a non-negotiable container chrome; collapsing it on mobile is acceptable (to ~4 px), but removing it entirely loses the brand. **`top-banner`** — pure-black strip running across the top with white "BUILD YOUR OWN COMPUTER. ONLINE." headline + sub-tagline, the yellow "BUY a DELL" sticker pinned at right, and the red "1-800-213-DELL" phone number. - Background `{colors.frame-ink}`, text `{colors.canvas}`, type `{typography.heading-2}`, padding 12 px vertical / 16 px horizontal, no radius. ### Section Eyebrow Blocks **`section-eyebrow-olive`** — large tinted color block holding the chunky stenciled section title ("DIMENSION DESKTOPS"). Used at the top of the Dimension product page. - Background `{colors.tint-olive}`, text `{colors.ink}`, type `{typography.display}` (Arial Black 36 / 900), padding 24 × 16, no radius. **`section-eyebrow-salmon`** — same chrome with the OptiPlex line's salmon-pink fill ("OPTIPLEX DESKTOP SYSTEMS"). - Background `{colors.tint-salmon}`, otherwise identical to the olive variant. ### Ribbon Cards The brand's signature component. Each product-row "card" is a stack of three pieces: 1. **`ribbon-card-title`** — white horizontal title bar with the product variant name in Helvetica Bold all-caps (e.g. "OPTIPLEX GX PRO", "DIMENSION XPS", "POWEREDGE SERVERS"). 1 px bottom border in `{colors.frame-ink}`. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.heading-3}`, padding 6 × 12, no radius. 2. **`ribbon-card-body-<tint>`** — color-block body in one of eight tints, holding the short marketing pitch in `{typography.body}` (Times Roman 14). Padding 12 × 16. The product photograph notches into the right edge with a transparent GIF cutout. 3. **Photo notch** — the GIF sits in the rightmost ~25 % of the row, hanging slightly above and below the body bar like a card pinned to a corkboard. Each tint variant is its own component entry. Pick the one that matches the product family: - **`ribbon-card-body-sage`** — `{colors.tint-sage}` fill, used for Latitude Notebooks rows - **`ribbon-card-body-salmon`** — `{colors.tint-salmon}` fill, used for OptiPlex GX Series rows - **`ribbon-card-body-peach`** — `{colors.tint-peach}` fill, used for Dimension rows and OptiPlex Gs - **`ribbon-card-body-lime`** — `{colors.tint-lime}` fill, used for OptiPlex G Series rows - **`ribbon-card-body-sky`** — `{colors.tint-sky}` fill, used for Dellware rows - **`ribbon-card-body-steel`** — `{colors.tint-steel}` fill, used for Dimension XPS Pro rows - **`ribbon-card-body-periwinkle`** — `{colors.tint-periwinkle}` fill, used for PowerEdge Server rows All seven share identical chrome: 1 px solid `{colors.frame-ink}` border, `{spacing.md}` × `{spacing.lg}` (12 × 16) padding, `{rounded.none}` (sharp corners), `{typography.body}` Times Roman 14 inside. Only the fill color changes per product family. ### Call-to-Action **`cta-block-red`** — the homepage's vivid Dell-red panel ("At Dell.com, we'll help you find the right system, configure it, price it, and order it…"). - Background `{colors.primary}`, text `{colors.on-primary}` (white), 1 px solid frame-ink border, type `{typography.body}` (Times Roman 14), padding 16 px, no radius. - One per page maximum. The brand's most aggressive attention-grab — never use it for anything except a top-tier sales message. **`phone-callout`** — top-right phone number ("1-800-213-DELL") rendered as red on the black banner. - Background `{colors.frame-ink}`, text `{colors.primary}`, type `{typography.heading-2}` Helvetica Bold 16, padding 4 × 8, no radius. Pinned to the right of the top banner on every page. ### Stickers (GIF-style overlays) **`buy-a-dell-sticker`** — yellow rectangular sticker with "BUY a DELL" in Helvetica Bold, the "a" set in a small purple stripe, the "DELL" wordmark in black. Pinned to the top-right of every page. - Background `{colors.yellow-sticker}`, text `{colors.ink}`, 1 px black border, type `{typography.button}`, padding 4 × 8, no radius. **`new-burst-sticker`** — angled yellow burst with "NEW!" in Helvetica Bold black, overlapping the right side of new product ribbon-cards. Slight rotation (~15°) gives it the pinned-on-with-tape feel. - Background `{colors.yellow-sticker}`, text `{colors.ink}`, type `{typography.button}`, padding 4 × 8, no radius (rotation applied separately). **`cert-seal`** — round red award seal: center reads "PC MAGAZINE", ringed by "SERVICE · RELIABILITY · READERS' CHOICE", with an inner white field and red bordered ring. Sits on the right rail of product pages. - Background `{colors.primary}`, text `{colors.canvas}`, type `{typography.button}`, rounded `{rounded.full}`, 64 px size. ### Navigation **`icon-label-nav`** — bottom-of-page navigation row: four hand-drawn icons (eyeglasses-FIND / house-HOME / yellow-sticker-ONLINE STORE / wrench-SERVICE & SUPPORT) connected by a thin green horizontal rule, each with an uppercase Helvetica label beneath. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.ui-label}`, padding 8 px around each icon-label pair, no radius. - The connecting green rule is part of the GIF imagery, not a CSS border. ### Inputs & Buttons **`text-input`** — bordered HTML input. White fill, 1 px solid black border, Times Roman 14 inside. - Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid frame-ink, type `{typography.body}`, padding 4 × 6, no radius. - Used on the Search and "Configure & Buy" forms (not visible in these three captures but consistent with the era's HTML 3.2 form widgets). **`button-primary`** — black filled button with white Helvetica Bold uppercase label. - Background `{colors.frame-ink}`, text `{colors.on-primary}`, 1 px solid frame-ink, type `{typography.button}`, padding 6 × 16, no radius. **`button-secondary`** — white filled outlined button. Same chrome with inverted colours. - Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid frame-ink, type `{typography.button}`, padding 6 × 16, no radius. **`button-text-link`** — bare underlined anchor in classic-Mosaic blue. - Text `{colors.link}` #0000ee, type `{typography.link}` Times Roman 14, underline on default. No padding, no radius. ### Footer **`footer-band`** — the bottom of every page: icon-label nav row, classic-blue Copyright link, "(Terms of Use)" parenthetical, browser-compatibility small print, and the Microsoft BackOffice / Internet Explorer logo banners. - Background `{colors.canvas}`, text `{colors.ink}`, 1 px top border in frame-ink, type `{typography.body-sm}`, padding 16 px. ### Examples (illustrative) > Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass. **`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with the base white surface. - Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding` **`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode). - Properties: `backgroundColor`, `textColor`, `rounded`, `padding` **`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery). - Properties: `backgroundColor`, `rounded`, `padding` **`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart). - Properties: `backgroundColor`, `rounded`, `padding`, `item-divider` **`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator. - Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding` **`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm. - Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder` **`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside. - Properties: `backgroundColor`, `rounded`, `padding` **`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow. - Properties: `backgroundColor`, `rounded`, `padding` **`ex-empty-state-card`** — Empty-state illustration frame. - Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography` **`ex-toast`** — Toast notification surface — feature-card shape + medium shadow. - Properties: `backgroundColor`, `rounded`, `padding`, `typography` ## Do's and Don'ts ### Do - Keep the literal `{components.page-frame}` black border on every page — this is the brand's single most identifiable container chrome. - Reserve `{colors.primary}` (Dell red) for the `{components.cta-block-red}` panel and the `{components.phone-callout}` only. Every other use dilutes the urgency signal. - Use the eight ribbon-card tint colors (`{colors.tint-olive}` / sage / salmon / peach / lime / sky / steel / periwinkle) as a *family* — pick one per product line and stay with it across the line's marketing surfaces. - Set every display headline in `{typography.display}` (Arial Black 36 / weight 900). The brand's typographic register depends on extreme weight against flat color. - Keep body copy in `{typography.body}` Times Roman 14 — substituting a modern sans loses the catalog feel entirely. - Render every CTA / button at `{rounded.none}` (0 px). Modern soft-radius buttons betray the era. - Use hand-painted bevels / hard-edge GIF shadows on stickers and product photos. Never substitute a soft CSS shadow. ### Don't - Don't introduce a chromatic accent outside the eight catalog tints + Dell red + Dell yellow + classic link blue. The palette is closed by design. - Don't soften any corner. `{rounded.none}` is the universal modifier; only award seals get `{rounded.full}`. - Don't replace Times Roman body with Arial / Helvetica / Inter / a webfont — the serif body is the era's signature. - Don't add soft drop-shadows or atmospheric gradients. The brand has hard borders and flat fills; everything else reads as anachronism. - Don't crop or "tuck" product photos with `border-radius` or `clip-path`. The notch into the ribbon-card right edge is the framing — the photo itself stays a hard rectangle. - Don't pair two `{components.cta-block-red}` panels on the same page. The red fill is meant to be the singular attention pole. - Don't strip the `{components.phone-callout}` from the top banner. In 1996 the website existed to drive phone-call orders; the phone number IS the navigation.
Cohere Platform
Data-Rich Dashboard
Cohere Spec
复制
企业级大模型研发与部署设计系统,融合温暖矿物背景、深绿色调与高精度的单色数字看板。
矿物灰调 canvas
深绿与黑
monospace 数据标识
--- version: alpha name: Cohere-design-analysis description: Cohere's 2026 web system is a controlled enterprise AI interface built from stark white editorial space, deep green-black product bands, soft mineral surfaces, rounded media cards, and a distinctive type split between monospaced-feeling display headlines and precise Unica77 UI text. colors: primary: "#17171c" cohere-black: "#000000" ink: "#212121" deep-green: "#003c33" dark-navy: "#071829" canvas: "#ffffff" soft-stone: "#eeece7" pale-green: "#edfce9" pale-blue: "#f1f5ff" hairline: "#d9d9dd" border-light: "#e5e7eb" card-border: "#f2f2f2" muted: "#93939f" slate: "#75758a" body-muted: "#616161" action-blue: "#1863dc" focus-blue: "#4c6ee6" coral: "#ff7759" coral-soft: "#ffad9b" form-focus: "#9b60aa" on-primary: "#ffffff" on-dark: "#ffffff" error: "#b30000" typography: hero-display: fontFamily: CohereText fontSize: 96px fontWeight: 400 lineHeight: 1 letterSpacing: -1.92px product-display: fontFamily: CohereText fontSize: 72px fontWeight: 400 lineHeight: 1 letterSpacing: -1.44px section-display: fontFamily: Unica77 Cohere Web fontSize: 60px fontWeight: 400 lineHeight: 1 letterSpacing: -1.2px section-heading: fontFamily: Unica77 Cohere Web fontSize: 48px fontWeight: 400 lineHeight: 1.2 letterSpacing: -0.48px card-heading: fontFamily: Unica77 Cohere Web fontSize: 32px fontWeight: 400 lineHeight: 1.2 letterSpacing: -0.32px feature-heading: fontFamily: Unica77 Cohere Web fontSize: 24px fontWeight: 400 lineHeight: 1.3 letterSpacing: 0 body-large: fontFamily: Unica77 Cohere Web fontSize: 18px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 body: fontFamily: Unica77 Cohere Web fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 button: fontFamily: Unica77 Cohere Web fontSize: 14px fontWeight: 500 lineHeight: 1.71 letterSpacing: 0 caption: fontFamily: Unica77 Cohere Web fontSize: 14px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 mono-label: fontFamily: CohereMono fontSize: 14px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0.28px micro: fontFamily: Unica77 Cohere Web fontSize: 12px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 rounded: xs: 4px sm: 8px md: 16px lg: 22px xl: 30px pill: 32px full: 9999px spacing: xxs: 2px xs: 6px sm: 8px md: 12px lg: 16px xl: 24px xxl: 32px section: 80px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 12px 24px button-secondary: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xs}" padding: 8px 0 button-pill-outline: backgroundColor: transparent textColor: "{colors.primary}" typography: "{typography.button}" rounded: "{rounded.xl}" padding: 6px 12px announcement-bar: backgroundColor: "{colors.cohere-black}" textColor: "{colors.on-dark}" typography: "{typography.micro}" height: 36px hero-photo-card: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" agent-console-card: backgroundColor: "{colors.primary}" textColor: "{colors.on-dark}" rounded: "{rounded.sm}" padding: 24px trust-logo-strip: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.caption}" capability-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xs}" padding: 24px dark-feature-band: backgroundColor: "{colors.deep-green}" textColor: "{colors.on-dark}" rounded: "{rounded.lg}" padding: 80px product-card: backgroundColor: "{colors.soft-stone}" textColor: "{colors.ink}" rounded: "{rounded.sm}" padding: 32px blog-filter-chip: backgroundColor: transparent textColor: "{colors.coral}" typography: "{typography.card-heading}" rounded: "{rounded.sm}" padding: 8px 14px research-table: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-large}" contact-form-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.lg}" padding: 32px footer-newsletter: backgroundColor: "{colors.primary}" textColor: "{colors.on-dark}" typography: "{typography.micro}" --- ## Overview Cohere's current web presence feels like a sober enterprise AI command center with editorial restraint. The home page opens on a huge typographic declaration over a white canvas, then uses photography, dark product mockups, trust logos, and generous empty space to make AI infrastructure feel controlled rather than speculative. Product pages invert the tone into deep green-black or dark navy bands, while blog and research pages move toward publishing-system clarity: large filters, thin rules, dense lists, and pale technical backgrounds. What makes the system distinctive is the mix of austere black-and-white UI with bursts of tactile brand imagery. The site avoids decorative chrome in the normal interface; color arrives through photography, abstract 3D media, coral blog taxonomy chips, blue research links, and dark product environments. Cards are rounded but not cute. Type is large, tight, and almost monospaced in spirit, creating a research-lab cadence across marketing, product, and editorial surfaces. **Key Characteristics:** - Monumental display headlines with very tight line height and negative tracking. - White editorial canvases interrupted by deep green, dark navy, and image-led CTA bands. - Rounded media cards and product cards, usually 8px to 22px. - Pill CTAs in near-black or white, with most secondary actions rendered as underlined text links. - Trust-logo strips with monochrome partner marks and very wide vertical spacing. - Agent-console mockups using dark panels, small status chips, and product integration badges. - Blog and research surfaces with prominent taxonomy chips, long rule-separated lists, and search fields. ## Colors ### Brand & Accent - **Cohere Black** (`#000000`): Announcement bar, highest-contrast text, and the global brand anchor. - **Near-Black Primary** (`#17171c`): Primary CTA buttons, dark footer, and deep UI cards. - **Deep Enterprise Green** (`#003c33`): Product hero bands for North and Command-style dark sections. - **Dark Navy** (`#071829`): Financial-services and security-oriented solution bands. - **Action Blue** (`#1863dc`): Editorial links, pagination, and secondary action emphasis. - **Coral** (`#ff7759`): Blog category chips, taxonomy outlines, and warm product markers. - **Soft Coral** (`#ffad9b`): Pale chip borders and segmented article-label details. ### Surface & Background - **Canvas White** (`#ffffff`): Dominant page background and form/card surface. - **Soft Stone** (`#eeece7`): Product cards, testimonial placeholders, and warm neutral surface blocks. - **Pale Green Wash** (`#edfce9`): North page section backdrop behind stacked dark capability panels. - **Pale Blue Wash** (`#f1f5ff`): Blog CTA surface behind abstract 3D imagery. - **Card Border** (`#f2f2f2`): Softest card containment line. ### Text & Rules - **Ink** (`#212121`): Default body text and most link text on light backgrounds. - **Muted Slate** (`#93939f`): Footer links, dates, metadata, and de-emphasized labels. - **Slate** (`#75758a`): Research separators and tertiary text. - **Hairline** (`#d9d9dd`): Standard list rules and section dividers. - **Border Light** (`#e5e7eb`): Secondary divider and utility rule. ### Semantic - **Focus Blue** (`#4c6ee6`): Keyboard focus and ring color. - **Form Focus Violet** (`#9b60aa`): Focus border for text inputs. - **Error Red** (`#b30000`): Extracted ring/shadow color associated with validation-like states. ### Gradient System Cohere does not use gradients as a generic UI fill. Gradients and color fields are media-led: abstract 3D hero imagery, deep blue open-science particle fields, red-orange product video posters, and dark green-to-black product environments. Keep UI surfaces flat; reserve gradient richness for large media panels and CTA image bands. ## Typography ### Font Family - **Display**: `CohereText`, falling back to `Space Grotesk`, `Inter`, `ui-sans-serif`, and `system-ui`. - **Body/UI**: `Unica77 Cohere Web`, falling back to `Inter`, `Arial`, `ui-sans-serif`, and `system-ui`. - **Technical labels**: `CohereMono`, falling back to `Arial`, `ui-sans-serif`, and `system-ui`. - **Icons**: Cohere uses custom icon fonts and thin-line geometric illustrations. ### Hierarchy | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes | |---|---|---:|---:|---:|---:|---| | Hero Display | CohereText | 96px | 400 | 1.00 | -1.92px | Home page declaration scale. | | Product Display | CohereText | 72px | 400 | 1.00 | -1.44px | Product and research hero headlines. | | Section Display | Unica77 | 60px | 400 | 1.00 | -1.2px | Large product-page headings. | | Section Heading | Unica77 | 48px | 400 | 1.20 | -0.48px | Split hero and CTA headings. | | Card Heading | Unica77 | 32px | 400 | 1.20 | -0.32px | Feature card and list section titles. | | Feature Heading | Unica77 | 24px | 400 | 1.30 | 0 | Cards, filters, and article titles. | | Body Large | Unica77 | 18px | 400 | 1.40 | 0 | Lead text and larger paragraphs. | | Body | Unica77 | 16px | 400 | 1.50 | 0 | Default copy and link text. | | Button | Unica77 | 14px | 500 | 1.71 | 0 | Compact CTA labels. | | Caption | Unica77 | 14px | 400 | 1.40 | 0 | Metadata and small explanatory text. | | Mono Label | CohereMono | 14px | 400 | 1.40 | 0.28px | Uppercase technical labels. | | Micro | Unica77 | 12px | 400 | 1.40 | 0 | Footer, nav microcopy, and small links. | ### Principles - Use massive type sparingly; Cohere pages often have one oversized headline and then settle into restrained 16px-24px UI copy. - Keep display type tight. Hero copy should feel compact and carved, not airy. - Avoid heavy bold weights. Size, spacing, and surface contrast do most of the hierarchy work. - Use uppercase mono labels for category and system markers, especially on product and research pages. - Editorial pages can use coral chips and blue links, but the base typography remains black and measured. ## Layout ### Spacing System The system uses an 8px base with many one-off alignment values: `2px`, `6px`, `8px`, `10px`, `12px`, `16px`, `20px`, `22px`, `24px`, `28px`, `32px`, `36px`, `40px`, `56px`, `60px`, `64px`, and `80px`. Large sections rely on dramatic vertical breathing room. The home page places a trust-logo strip far below the hero media. Product pages often hold dark panels inside fields of empty white space, then transition to dense forms or footers only near the end. ### Grid & Container - Global nav uses a three-zone layout: logo left, menu centered, sign-in/CTA right. - Home hero is centered text above a two-card media composition: a wide product mockup card beside a narrower photography card. - Feature sections commonly use 3-column cards on desktop. - Product pages alternate centered hero blocks, trust-logo strips, large single-feature bands, and 2- or 3-column card grids. - Research pages use full-width lists with date and chip columns instead of decorative cards. - Forms use two-column input rows inside a rounded white card on dark or stone section backgrounds. ### Whitespace Philosophy Cohere uses whitespace as a trust signal. Large empty intervals separate the brand claim, customer proof, product proof, and CTA. Dense content appears only where it serves the information architecture: research paper rows, blog card grids, and contact form fields. ## Elevation & Depth Cohere is mostly flat. Depth comes from surface alternation, media contrast, rounded corners, and thin borders rather than drop shadows. | Level | Treatment | Use | |---|---|---| | Flat | No shadow, white or dark field | Hero copy, research lists, editorial surfaces | | Bordered | 1px `#d9d9dd`, `#e5e7eb`, or dark translucent rules | Research rows, forms, pale cards, footer inputs | | Media Lift | Rounded image or video over contrasting section color | Hero photo cards, product videos, CTA imagery | | Dark Product Field | Deep green or navy full-width band | Command, North, financial services, security sections | ## Shapes ### Radius Scale | Token | Value | Role | |---|---:|---| | `xs` | 4px | Small images, search fields, article thumbnails, utility elements | | `sm` | 8px | Blog chips, cards, small media, dialogs | | `md` | 16px | Medium product cards and grouped blocks | | `lg` | 22px | Signature media-card and soft placeholder radius | | `xl` | 30px | Research/topic filter pills | | `pill` | 32px | Primary CTA buttons | | `full` | 9999px | Round status elements and fully pill-shaped controls | ### Image Treatment Images are not decorative backdrops for text except in CTA bands. Most imagery sits as rounded cards with visible corners: product videos, enterprise photography, article thumbnails, and abstract 3D renders. The dominant radii are 8px and 22px. ## Components ### **`button-primary`** Near-black or white pill CTA, depending on surface contrast. Uses 14px-16px Unica77, 12px 24px padding, and a 32px pill radius. This is the primary action style for "Request a demo", "Submit", and hero CTAs. ### **`button-secondary`** Text-only action link, usually underlined or rule-aligned, with no filled background. Used for "Explore products", "Try the Playground", newsletter signup, and secondary hero actions. ### **`button-pill-outline`** Outlined pill control with transparent fill, 1px dark border, and 30px radius. Used for research filters, topic tags, and lightweight taxonomy controls. ### **`announcement-bar`** Full-width black strip above the nav, 36px tall, centered microcopy with an underlined "Learn more" link and a close control at the far right. ### **`hero-photo-card`** Rounded media card used in the home hero and solution pages. It combines photography or abstract imagery with an overlaid dark agent-console module. Radius is usually 22px on large cards and 8px on smaller thumbnails. ### **`agent-console-card`** Dark product mockup panel showing agent names, status chips, integration badges, prompt fields, and generated response cards. Background is near-black, text is white or muted, and small accent chips use product colors. ### **`trust-logo-strip`** Centered copy above a row of monochrome customer logos. It is intentionally quiet: no cards, no borders, just large horizontal spacing and black or white logos depending on the background. ### **`capability-card`** Content block with thin-line geometric illustration, 24px heading, body copy, and a text link. On light backgrounds, cards often have only a top rule or a subtle image/card relationship rather than full boxing. ### **`dark-feature-band`** Deep green or navy full-width section used for product capabilities, security claims, and feature breakdowns. Text turns white; cards use darker translucent surfaces, pale borders, and abstract line illustrations. ### **`product-card`** Warm stone card used for product/model summaries. Typically 3-column on desktop, with 8px radius, generous padding, a small pill button, a divider line, and checkmark bullet rows. ### **`blog-filter-chip`** Large coral taxonomy chip used on the blog index. Active chips invert to coral fill with dark text; inactive chips use coral outline and pale fill. Typography is oversized relative to typical filters, making the taxonomy a hero-level control. ### **`research-table`** Rule-separated publication list with title left, topic pills centered, and date right. Rows are tall, white, and border-driven; filters above use many compact outlined pills. ### **`contact-form-card`** Rounded white form panel set against dark green or warm stone sections. Inputs are rectangular with thin gray borders, 12px-16px padding, and compact labels/placeholders. Submit uses the same near-black pill style as primary CTAs. ### **`footer-newsletter`** Dark footer subscription block with coral "AI moves fast" label, white headline, muted legal microcopy, a single-line email field, and arrow submit marker. Footer columns use white section labels and muted links. ## Do's and Don'ts ### Do - Use white canvas as the default surface; introduce dark green or navy as full-width product bands. - Keep primary CTAs pill-shaped and near-black on light surfaces. - Use 22px radius on major media cards and placeholders. - Use coral for editorial taxonomy and small warm accents, not as the main CTA system. - Use monochrome trust logos with wide spacing. - Use thin-line geometric illustrations for research and capability icons. - Let photography and product mockups carry color, while the UI shell stays restrained. ### Don't - Do not turn coral or blue into broad decorative surface colors. - Do not add heavy drop shadows to cards. - Do not make every section card-based; Cohere often uses unframed rows, rules, and open space. - Do not use rounded cards below 8px for major media. - Do not replace the display/body type split with one generic sans-serif voice. - Do not render undocumented interaction variants in documentation or previews. - Do not use saturated gradients as normal UI backgrounds; keep gradients media-led. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---:|---| | Small Mobile | <425px | Single-column cards, compact nav, reduced hero headline scale | | Mobile | 425-640px | Hero media stacks, card grids become one column, form rows stack | | Large Mobile | 640-768px | Wider one-column layouts with larger media cards | | Tablet | 768-1024px | Two-column cards begin, nav spacing tightens | | Desktop | 1024-1440px | Full nav, 3-column card grids, split hero compositions | | Large Desktop | 1440-2560px | Wide containers and large empty vertical intervals | ### Touch Targets Primary CTAs and pills meet comfortable touch sizing through 12px-24px padding and pill radii. Research filter chips and blog category chips are larger than standard tags, making dense taxonomy surfaces usable on touch devices. ### Collapsing Strategy - Nav collapses from full horizontal links to a compact mobile menu. - Hero media moves from split cards to stacked cards. - Product and capability grids collapse from 3 columns to 2 and then 1. - Form fields collapse from paired rows to a single column. - Research rows preserve their rule-separated structure but stack metadata below titles on smaller widths. ## Iteration Guide 1. Start from a white canvas or a full-width dark green/navy band; avoid mid-tone page backgrounds unless the screenshot shows a specific CTA/form section. 2. Use `button-primary` for the single highest-priority action and `button-secondary` for the companion action. 3. Use `hero-photo-card` or `agent-console-card` when a page needs visual energy; avoid invented dashboard data. 4. For editorial pages, combine `blog-filter-chip`, `button-pill-outline`, and `research-table` instead of generic marketing cards. 5. Keep component examples structurally honest: placeholder product frames are better than invented product content. ## Known Gaps - Exact proprietary font files are not bundled; use the documented fallbacks when implementing externally. - Mobile screenshots were not regenerated in this public update, so mobile behavior is documented from the desktop system and existing responsive patterns. - Some live pages lazy-load content blocks late; blank testimonial placeholders are documented as placeholder skeleton surfaces rather than filled testimonial cards.
Mistral Console
French Minimalism
Mistral AI Spec
复制
欧洲人工智能领头羊的优雅极简设计系统,以极高饱和度橘红作为单一交互点缀,版面极其克制。
法式工程极简
高亮橘红
灰泥底噪背景
--- version: alpha name: Mistral-AI-design-analysis description: Mistral AI brands itself with a singular signature — atmospheric sunset gradients (mustard, orange, deep red) layered over photography of mountains, plus a horizontal "sunset stripe" bar that closes every page. The system pairs warm cream-yellow surfaces ({colors.cream}) with a saturated orange primary CTA ({colors.primary}) and uses an elegant near-serif voice for hero displays. Coverage spans homepage (Frontier AI hero), Le Studio product page, Coding solutions, news article surfaces, contact form, and services tier page — all anchored by the signature gradient closing band. colors: primary: "#fa520f" primary-deep: "#cc3a05" on-primary: "#ffffff" sunshine-300: "#ffd06a" sunshine-500: "#ffb83e" sunshine-700: "#ffa110" sunshine-800: "#ff8105" sunshine-900: "#ff8a00" yellow-saturated: "#ffd900" cream: "#fff8e0" cream-light: "#fffaeb" cream-deeper: "#fff0c2" beige-deep: "#e6d5a8" block-5: "#ffe295" block-6: "#ffd900" block-7: "#ff8105" ink: "#1f1f1f" ink-tint: "#3d3d3d" charcoal: "#2c2c2c" slate: "#4a4a4a" steel: "#6a6a6a" stone: "#8a8a8a" muted: "#a8a8a8" hairline: "#e5e5e5" hairline-soft: "#ededed" hairline-strong: "#c7c7c7" canvas: "#ffffff" surface: "#fafafa" surface-cream: "#fff8e0" surface-cream-soft: "#fffaeb" surface-code: "#1c1c1e" on-dark: "#ffffff" on-dark-muted: "#a8a8a8" on-cream: "#1f1f1f" footer-cream: "#fff8e0" link: "#fa520f" typography: hero-display: fontFamily: PP Editorial Old fontSize: 84px fontWeight: 400 lineHeight: 1.05 letterSpacing: -1.5px display-lg: fontFamily: PP Editorial Old fontSize: 64px fontWeight: 400 lineHeight: 1.10 letterSpacing: -1px heading-1: fontFamily: PP Editorial Old fontSize: 52px fontWeight: 400 lineHeight: 1.15 letterSpacing: -0.5px heading-2: fontFamily: Inter fontSize: 36px fontWeight: 500 lineHeight: 1.20 letterSpacing: -0.5px heading-3: fontFamily: Inter fontSize: 28px fontWeight: 500 lineHeight: 1.25 heading-4: fontFamily: Inter fontSize: 22px fontWeight: 500 lineHeight: 1.30 heading-5: fontFamily: Inter fontSize: 18px fontWeight: 500 lineHeight: 1.40 subtitle: fontFamily: Inter fontSize: 18px fontWeight: 400 lineHeight: 1.50 body-md: fontFamily: Inter fontSize: 16px fontWeight: 400 lineHeight: 1.55 body-md-medium: fontFamily: Inter fontSize: 16px fontWeight: 500 lineHeight: 1.55 body-sm: fontFamily: Inter fontSize: 14px fontWeight: 400 lineHeight: 1.50 body-sm-medium: fontFamily: Inter fontSize: 14px fontWeight: 500 lineHeight: 1.50 caption: fontFamily: Inter fontSize: 13px fontWeight: 400 lineHeight: 1.40 caption-bold: fontFamily: Inter fontSize: 13px fontWeight: 600 lineHeight: 1.40 micro: fontFamily: Inter fontSize: 12px fontWeight: 500 lineHeight: 1.40 micro-uppercase: fontFamily: Inter fontSize: 11px fontWeight: 600 lineHeight: 1.40 letterSpacing: 1px button-md: fontFamily: Inter fontSize: 14px fontWeight: 500 lineHeight: 1.30 stat-display: fontFamily: PP Editorial Old fontSize: 56px fontWeight: 400 lineHeight: 1.10 letterSpacing: -1px code-md: fontFamily: JetBrains Mono fontSize: 14px fontWeight: 400 lineHeight: 1.50 rounded: xs: 4px sm: 6px md: 8px lg: 12px xl: 16px xxl: 20px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 20px xl: 24px xxl: 32px xxxl: 40px section-sm: 48px section: 64px section-lg: 96px hero: 120px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 20px" button-primary-pressed: backgroundColor: "{colors.primary-deep}" textColor: "{colors.on-primary}" button-primary-disabled: backgroundColor: "{colors.hairline}" textColor: "{colors.muted}" button-cream: backgroundColor: "{colors.cream}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 20px" border: "1px solid {colors.beige-deep}" button-dark: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 20px" button-secondary: backgroundColor: "transparent" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 20px" border: "1px solid {colors.hairline-strong}" button-on-cream: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: "10px 20px" border: "1px solid {colors.beige-deep}" button-link: backgroundColor: "transparent" textColor: "{colors.primary}" typography: "{typography.body-sm-medium}" padding: "0" card-base: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xl}" border: "1px solid {colors.hairline-soft}" card-feature: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.hairline-soft}" card-cream: backgroundColor: "{colors.cream}" textColor: "{colors.ink}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.beige-deep}" card-cream-soft: backgroundColor: "{colors.surface-cream-soft}" textColor: "{colors.ink}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" card-feature-product: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.hairline-soft}" shadow: "rgba(0, 0, 0, 0.04) 0px 4px 12px" card-photographic: backgroundColor: "{colors.surface-code}" textColor: "{colors.on-dark}" rounded: "{rounded.lg}" padding: "0" pricing-card: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.hairline-soft}" pricing-card-featured: backgroundColor: "{colors.cream}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "2px solid {colors.primary}" text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: "{spacing.sm} {spacing.md}" border: "1px solid {colors.hairline-strong}" height: 44px text-input-focused: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" border: "2px solid {colors.primary}" text-area: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: "{spacing.md}" border: "1px solid {colors.hairline-strong}" contact-form-panel: backgroundColor: "{colors.cream}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.beige-deep}" pill-tab: backgroundColor: "{colors.canvas}" textColor: "{colors.steel}" typography: "{typography.body-sm-medium}" rounded: "{rounded.full}" padding: "{spacing.xs} {spacing.md}" border: "1px solid {colors.hairline}" pill-tab-active: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" rounded: "{rounded.full}" border: "1px solid {colors.ink}" segmented-tab: backgroundColor: "transparent" textColor: "{colors.steel}" typography: "{typography.body-sm-medium}" padding: "{spacing.sm} {spacing.md}" border: "0 0 2px transparent solid" segmented-tab-active: backgroundColor: "transparent" textColor: "{colors.primary}" typography: "{typography.body-sm-medium}" border: "0 0 2px {colors.primary} solid" badge-orange: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.caption-bold}" rounded: "{rounded.full}" padding: "4px 10px" badge-cream: backgroundColor: "{colors.cream-deeper}" textColor: "{colors.ink}" typography: "{typography.caption-bold}" rounded: "{rounded.full}" padding: "4px 10px" badge-dark: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" typography: "{typography.caption-bold}" rounded: "{rounded.full}" padding: "4px 10px" promo-banner: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" typography: "{typography.body-sm-medium}" padding: "{spacing.sm} {spacing.md}" hero-band-sunset: backgroundColor: "{colors.sunshine-700}" textColor: "{colors.ink}" rounded: "0" padding: "{spacing.hero}" sunset-stripe-band: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" rounded: "0" padding: "{spacing.lg} 0" cta-banner-cream: backgroundColor: "{colors.cream}" textColor: "{colors.ink}" rounded: "{rounded.lg}" padding: "{spacing.section}" code-block: backgroundColor: "{colors.surface-code}" textColor: "{colors.on-dark}" typography: "{typography.code-md}" rounded: "{rounded.md}" padding: "{spacing.md}" code-block-header: backgroundColor: "{colors.surface-code}" textColor: "{colors.on-dark-muted}" typography: "{typography.caption}" padding: "{spacing.xs} {spacing.md}" border: "0 0 1px rgba(255,255,255,0.08) solid" feature-icon-tile: backgroundColor: "{colors.cream}" rounded: "{rounded.md}" padding: "{spacing.md}" border: "1px solid {colors.beige-deep}" industry-tile: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xl}" border: "1px solid {colors.hairline-soft}" stat-cell: backgroundColor: "transparent" textColor: "{colors.ink}" typography: "{typography.stat-display}" padding: "{spacing.lg}" customer-testimonial-card: backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xxl}" border: "1px solid {colors.hairline-soft}" logo-wall-item: backgroundColor: "transparent" textColor: "{colors.steel}" typography: "{typography.body-md-medium}" padding: "{spacing.lg}" faq-accordion-item: backgroundColor: "{colors.canvas}" rounded: "{rounded.md}" padding: "{spacing.xl}" border: "0 0 1px {colors.hairline} solid" footer-region: backgroundColor: "{colors.footer-cream}" textColor: "{colors.ink}" typography: "{typography.body-sm}" padding: "{spacing.section} {spacing.xxl}" footer-link: backgroundColor: "transparent" textColor: "{colors.primary}" typography: "{typography.body-sm}" padding: "{spacing.xxs} 0" app-store-badge: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" typography: "{typography.caption-bold}" rounded: "{rounded.md}" padding: "{spacing.sm} {spacing.md}" --- ## Overview Mistral AI carries itself with a singular, almost cinematographic visual signature — the homepage opens with "Frontier AI. In your hands." rendered in elegant near-serif display type over a photographic mountain landscape bathed in mustard-orange sunset light. Below the hero, every page closes with the same recognizable element: a horizontal "sunset stripe" gradient band running red→orange→yellow→cream that wraps the foot of the page just above the footer. This stripe is THE brand recognizer — it appears on the homepage, products/studio, solutions/coding, news articles, contact form, and services tier page without exception. The system pairs PP Editorial Old (a near-serif elegant display face) for hero displays with Inter for everything else (body, headings, UI). Cream-yellow surfaces ({colors.cream}, {colors.surface-cream-soft}) anchor form panels and feature cards; saturated orange ({colors.primary}) carries primary CTAs; the deep mountain photography on the homepage and the dark code mockups inside Le Studio create photographic depth. Cards are rectangular with `{rounded.lg}` (12px) corners — distinctly less playful than Miro's or Mintlify's pill-buttons-everywhere approach. Buttons are also `{rounded.md}` (8px), not pills — Mistral's geometry is more sober and editorial than its peers. **Key Characteristics:** - Atmospheric mountain-sunset hero photography (orange-red-yellow gradient sky) - Horizontal "sunset stripe" band ({colors.primary} → {colors.sunshine-700} → {colors.yellow-saturated} → {colors.cream}) at every page bottom - Cream-yellow surfaces ({colors.cream}, {colors.cream-soft}) for form panels and feature cards - PP Editorial Old (or similar near-serif) for hero displays; Inter for everything else - `{rounded.md}` (8px) buttons and `{rounded.lg}` (12px) cards — less playful, more editorial geometry - Saturated orange primary CTA ({colors.primary}) carries every action call ## Colors > Source pages: mistral.ai/ (homepage), /products/studio (Le Studio product), /solutions/coding (coding solution), /news/vibe-remote-agents-mistral-medium-3-5 (news), /contact (contact form), /services (services tiers). Token coverage was identical across all six pages. ### Brand & Accent - **Mistral Orange** ({colors.primary}): Primary CTA color, brand orange - **Orange Deep** ({colors.primary-deep}): Pressed-state and emphasis variant - **Sunshine 300** ({colors.sunshine-300}): Atmospheric light orange-yellow - **Sunshine 500** ({colors.sunshine-500}): Mid-spectrum sunset orange - **Sunshine 700** ({colors.sunshine-700}): Saturated mid sunset gradient stop - **Sunshine 800** ({colors.sunshine-800}): Deep sunset gradient stop - **Sunshine 900** ({colors.sunshine-900}): Deepest sunset orange - **Yellow Saturated** ({colors.yellow-saturated}): Pure brand yellow used in the sunset stripe gradient - **Block 5/6/7** ({colors.block-5}, {colors.block-6}, {colors.block-7}): Spectrum stops along the sunset gradient (light-yellow → mid-yellow → deep-orange) ### Cream / Neutral Warm - **Cream** ({colors.cream}): Warm yellow-cream surface for form panels, feature cards, footer - **Cream Soft** ({colors.cream-soft}): Lighter cream variant - **Cream Deeper** ({colors.cream-deeper}): More-saturated cream for badge/tag chips - **Beige Deep** ({colors.beige-deep}): Cream surface 1px border color ### Surface - **Canvas White** ({colors.canvas}): Page background and card surface - **Surface** ({colors.surface}): Subtle quieter background - **Surface Cream** ({colors.surface-cream}): Cream-yellow tinted surface - **Surface Code** ({colors.surface-code}): Dark code-block / IDE mockup surface - **Hairline** ({colors.hairline}): 1px borders - **Hairline Soft** ({colors.hairline-soft}): Quieter dividers - **Hairline Strong** ({colors.hairline-strong}): Stronger 1px border for inputs ### Text - **Ink** ({colors.ink}): Primary headlines and body text - **Ink Tint** ({colors.ink-tint}): Slightly softer black for hero overlay text - **Charcoal** ({colors.charcoal}): Body emphasis - **Slate** ({colors.slate}): Secondary text - **Steel** ({colors.steel}): Tertiary text, captions - **Stone** ({colors.stone}): Muted labels - **Muted** ({colors.muted}): Disabled, placeholders - **On Dark** ({colors.on-dark}): White text on dark surfaces - **On Dark Muted** ({colors.on-dark-muted}): Reduced-opacity white - **On Cream** ({colors.on-cream}): Ink text on cream surfaces ### Semantic - **Link** ({colors.link}): Inline link color (matches primary orange) ## Typography ### Font Family **PP Editorial Old** (display): Mistral's signature near-serif elegant display typeface used for hero displays, large numbers, and editorial section openers. Carries a slightly classical, intelligent character that contrasts the contemporary product positioning. Fallbacks: 'Times New Roman', Georgia, serif. **Inter** (UI prose): Variable typeface for body, navigation, buttons, labels, captions. Fallbacks: ui-sans-serif, system-ui, -apple-system, sans-serif. **JetBrains Mono** (code): Monospace for code blocks and IDE mockups. Fallbacks: 'SF Mono', Menlo, Consolas, monospace. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Family | Use | |---|---|---|---|---|---|---| | `{typography.hero-display}` | 84px | 400 | 1.05 | -1.5px | PP Editorial Old | Hero ("Frontier AI. In your hands.") | | `{typography.display-lg}` | 64px | 400 | 1.10 | -1px | PP Editorial Old | Section openers | | `{typography.heading-1}` | 52px | 400 | 1.15 | -0.5px | PP Editorial Old | Page headlines ("Get in touch with the team.") | | `{typography.stat-display}` | 56px | 400 | 1.10 | -1px | PP Editorial Old | Stat callouts ("75%") | | `{typography.heading-2}` | 36px | 500 | 1.20 | -0.5px | Inter | Subsection headlines | | `{typography.heading-3}` | 28px | 500 | 1.25 | 0 | Inter | Card titles | | `{typography.heading-4}` | 22px | 500 | 1.30 | 0 | Inter | Feature tile titles | | `{typography.heading-5}` | 18px | 500 | 1.40 | 0 | Inter | Smaller card titles | | `{typography.subtitle}` | 18px | 400 | 1.50 | 0 | Inter | Hero subtitle, lead body | | `{typography.body-md}` | 16px | 400 | 1.55 | 0 | Inter | Primary body text | | `{typography.body-md-medium}` | 16px | 500 | 1.55 | 0 | Inter | Body emphasis | | `{typography.body-sm}` | 14px | 400 | 1.50 | 0 | Inter | Secondary body | | `{typography.body-sm-medium}` | 14px | 500 | 1.50 | 0 | Inter | Active sidebar, button labels | | `{typography.caption}` | 13px | 400 | 1.40 | 0 | Inter | Helper text | | `{typography.caption-bold}` | 13px | 600 | 1.40 | 0 | Inter | Badge labels | | `{typography.micro}` | 12px | 500 | 1.40 | 0 | Inter | Footer microcopy | | `{typography.micro-uppercase}` | 11px | 600 | 1.40 | 1px | Inter | Section eyebrows | | `{typography.button-md}` | 14px | 500 | 1.30 | 0 | Inter | Button labels | | `{typography.code-md}` | 14px | 400 | 1.50 | 0 | JetBrains Mono | Code blocks | ### Principles - **Editorial / sans pairing** — PP Editorial Old (near-serif, classical) anchors hero displays; Inter (geometric sans) carries everything else. The contrast IS the brand voice. - **Generous body leading** (1.55 on body-md) for editorial readability across long-form pages - **Tight hero leading** (1.05 on 84px display) creates magazine-grade typographic display - **Negative letter-spacing** progresses with size — display sizes use -1.5px to -0.5px; smaller heads relax to 0 - **Stat-display token** (56px Editorial) for marketing stat callouts ("75% / 80% / 100%") ## Layout ### Spacing System - **Base unit**: 4px (8px primary increment) - **Tokens**: `{spacing.xxs}` (4px) · `{spacing.xs}` (8px) · `{spacing.sm}` (12px) · `{spacing.md}` (16px) · `{spacing.lg}` (20px) · `{spacing.xl}` (24px) · `{spacing.xxl}` (32px) · `{spacing.xxxl}` (40px) · `{spacing.section-sm}` (48px) · `{spacing.section}` (64px) · `{spacing.section-lg}` (96px) · `{spacing.hero}` (120px) - **Section rhythm**: Marketing pages use `{spacing.section-lg}` (96px); content pages tighten to `{spacing.section}` (64px) - **Card internal padding**: `{spacing.xl}` (24px) for compact cards; `{spacing.xxl}` (32px) for feature panels and form panels ### Grid & Container - Marketing pages use 1280px max-width with 32px gutters - Hero band uses 2-column split (text left, sunset photography right) on desktop - Le Studio product page uses 3-up feature grid below the hero - Contact page uses 1-column layout with cream form panel centered (~520px max-width) - Services page uses 4-tier card layout with cream feature panel separator strip ### Whitespace Philosophy Marketing surfaces give content generous breathing room — `{spacing.hero}` (120px) hero padding lets the mountain-sunset photography fill the frame. Form pages tighten dramatically: contact form panel uses `{spacing.xxl}` (32px) internal padding, fields stack on `{spacing.md}` (16px) gap. ## Elevation & Depth The system runs predominantly flat with strategic atmospheric depth from photography. | Level | Treatment | Use | |---|---|---| | 0 (flat) | No shadow; `{colors.hairline-soft}` border | Default cards, table rows, form inputs | | 1 (subtle) | `rgba(0, 0, 0, 0.04) 0px 1px 2px 0px` | Hover-elevated tiles | | 2 (card) | `rgba(0, 0, 0, 0.04) 0px 4px 12px 0px` | Standard feature cards | | 3 (mockup) | `rgba(0, 0, 0, 0.08) 0px 12px 24px -4px` | IDE mockup, code editor frames | | 4 (modal) | `rgba(0, 0, 0, 0.12) 0px 16px 48px -8px` | Modals, dropdowns | ### Decorative Depth - The atmospheric depth on Mistral's hero comes from the photographic mountain-sunset imagery — natural light gradient does the work - The "sunset stripe" closing band carries depth via its multi-stop gradient (red → orange → yellow → cream) - IDE / code mockups use dark-canvas backgrounds with subtle drop shadow ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Small chips, micro-controls | | `{rounded.sm}` | 6px | Discount badges, compact UI | | `{rounded.md}` | 8px | Buttons, inputs, search-pill, code blocks | | `{rounded.lg}` | 12px | Cards, modals, panels (the dominant card radius) | | `{rounded.xl}` | 16px | Larger feature panels | | `{rounded.xxl}` | 20px | Featured emphasis cards | | `{rounded.full}` | 9999px | Status badges, pill tabs (used sparingly — most buttons are NOT pills) | The radius scale is sober and editorial — Mistral does NOT use pill buttons. `{rounded.md}` (8px) for buttons, `{rounded.lg}` (12px) for cards, `{rounded.full}` reserved for badges and the rare pill tab. ### Photography Geometry - Hero photography is full-bleed atmospheric mountain-sunset imagery with no internal framing - IDE/code mockups render with `{rounded.lg}` (12px) corners on dark canvas - Customer logos wall presents wordmarks inline at consistent 60–80px height - Product imagery (Le Studio mockup, agent UI mockups) sits in `{rounded.lg}` panels with subtle border ## Components > Per the no-hover policy, hover states are NOT documented. Default and pressed/active states only. ### Buttons **`button-primary`** — Saturated-orange primary CTA, the dominant action. - Background `{colors.primary}`, text `{colors.on-primary}`, typography `{typography.button-md}`, padding `10px 20px`, rounded `{rounded.md}`. - Pressed state `button-primary-pressed` deepens to `{colors.primary-deep}`. - Disabled state `button-primary-disabled` uses `{colors.hairline}` background and `{colors.muted}` text. **`button-cream`** — Warm cream-yellow secondary action, common on cream-surface sections. - Background `{colors.cream}`, text `{colors.ink}`, border `1px solid {colors.beige-deep}`, typography `{typography.button-md}`, padding `10px 20px`, rounded `{rounded.md}`. **`button-dark`** — Dark/black primary CTA on cream surfaces. - Background `{colors.ink}`, text `{colors.on-dark}`, typography `{typography.button-md}`, padding `10px 20px`, rounded `{rounded.md}`. **`button-secondary`** — Outlined secondary action. - Background transparent, text `{colors.ink}`, border `1px solid {colors.hairline-strong}`, typography `{typography.button-md}`, padding `10px 20px`, rounded `{rounded.md}`. **`button-on-cream`** — White button on cream-tinted backgrounds. - Background `{colors.canvas}`, text `{colors.ink}`, border `1px solid {colors.beige-deep}`, typography `{typography.button-md}`, padding `10px 20px`, rounded `{rounded.md}`. **`button-link`** — Inline orange text link. - Background transparent, text `{colors.primary}`, typography `{typography.body-sm-medium}`, padding `0`. Underline on activation. ### Cards & Containers **`card-base`** — Standard content card. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xl}`, border `1px solid {colors.hairline-soft}`. **`card-feature`** — White feature card with larger padding. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid `{colors.hairline-soft}`. **`card-cream`** — Warm cream-yellow feature card (services tiers, perk callouts). - Background `{colors.cream}`, text `{colors.ink}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid {colors.beige-deep}`. **`card-cream-soft`** — Lighter cream variant. - Background `{colors.surface-cream-soft}`, text `{colors.ink}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`. **`card-feature-product`** — Product showcase card with subtle elevation. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid {colors.hairline-soft}`, shadow `rgba(0, 0, 0, 0.04) 0px 4px 12px`. **`card-photographic`** — Photographic product card with dark background. - Background `{colors.surface-code}`, text `{colors.on-dark}`, rounded `{rounded.lg}`, padding `0` (image fills the card). **`pricing-card`** — Standard pricing tier card. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid {colors.hairline-soft}`. **`pricing-card-featured`** — Featured pricing tier (cream background + orange border). - Background `{colors.cream}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `2px solid {colors.primary}`. ### Inputs & Forms **`text-input`** — Standard text field. - Background `{colors.canvas}`, text `{colors.ink}`, border `1px solid {colors.hairline-strong}`, rounded `{rounded.md}`, padding `{spacing.sm} {spacing.md}`, height 44px. **`text-input-focused`** — Activated state. - Border switches to `2px solid {colors.primary}`. **`text-area`** — Multi-line text area for contact form. - Background `{colors.canvas}`, text `{colors.ink}`, border `1px solid {colors.hairline-strong}`, rounded `{rounded.md}`, padding `{spacing.md}`. **`contact-form-panel`** — Cream-tinted form container on the contact page. - Background `{colors.cream}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid {colors.beige-deep}`. Hosts text-inputs, text-area, submit `button-dark`. ### Tabs **`pill-tab`** + **`pill-tab-active`** — Pill-style tab nav (used sparingly on product pages). - Inactive: background `{colors.canvas}`, text `{colors.steel}`, border `1px solid {colors.hairline}`, padding `{spacing.xs} {spacing.md}`, rounded `{rounded.full}`. - Active: background `{colors.ink}`, text `{colors.on-dark}`. **`segmented-tab`** + **`segmented-tab-active`** — Underline-style tab navigation. - Inactive: text `{colors.steel}`, transparent background, padding `{spacing.sm} {spacing.md}`, no bottom border. - Active: text `{colors.primary}`, 2px bottom border in `{colors.primary}`. ### Badges & Status **`badge-orange`** — Saturated orange badge. - Background `{colors.primary}`, text `{colors.on-primary}`, typography `{typography.caption-bold}`, rounded `{rounded.full}`, padding `4px 10px`. **`badge-cream`** — Cream-tinted tag chip. - Background `{colors.cream-deeper}`, text `{colors.ink}`, typography `{typography.caption-bold}`, rounded `{rounded.full}`, padding `4px 10px`. **`badge-dark`** — Dark/black status badge. - Background `{colors.ink}`, text `{colors.on-dark}`, typography `{typography.caption-bold}`, rounded `{rounded.full}`, padding `4px 10px`. **`promo-banner`** — Sticky black promo strip ABOVE the top nav. - Background `{colors.ink}`, text `{colors.on-dark}`, typography `{typography.body-sm-medium}`, padding `{spacing.sm} {spacing.md}`. Carries one-line copy + inline CTA. ### Code **`code-block`** — Syntax-highlighted IDE-style code block (Le Studio page mockup, agent demos). - Background `{colors.surface-code}`, text `{colors.on-dark}`, typography `{typography.code-md}`, rounded `{rounded.md}`, padding `{spacing.md}`. **`code-block-header`** — Header bar above the code block. - Background `{colors.surface-code}`, text `{colors.on-dark-muted}`, typography `{typography.caption}`, padding `{spacing.xs} {spacing.md}`, bottom border `1px solid rgba(255,255,255,0.08)`. ### Documentation Components **`feature-icon-tile`** — Cream-yellow feature icon callout. - Background `{colors.cream}`, rounded `{rounded.md}`, padding `{spacing.md}`, border `1px solid {colors.beige-deep}`. **`industry-tile`** — Industry-vertical tile in solutions page grid. - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xl}`, border `1px solid {colors.hairline-soft}`. **`stat-cell`** — Stat-row cell ("75% more / 80% better"). - Background transparent, text `{colors.ink}`, typography `{typography.stat-display}`, padding `{spacing.lg}`. **`customer-testimonial-card`** — Customer quote card (used inside Le Studio and Solutions pages). - Background `{colors.canvas}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`, border `1px solid {colors.hairline-soft}`. Quote in `{typography.body-md}`, attribution in `{typography.body-sm}` `{colors.steel}`. **`logo-wall-item`** — Customer logo wordmark cell. - Background transparent, text `{colors.steel}`, typography `{typography.body-md-medium}`, padding `{spacing.lg}`. **`faq-accordion-item`** — FAQ panel. - Background `{colors.canvas}`, rounded `{rounded.md}`, padding `{spacing.xl}`, bottom border `1px solid {colors.hairline}`. **`app-store-badge`** — App Store / Google Play download badge. - Background `{colors.ink}`, text `{colors.on-dark}`, typography `{typography.caption-bold}`, rounded `{rounded.md}`, padding `{spacing.sm} {spacing.md}`. ### Navigation **Top Navigation (Marketing)** — Sticky white bar. - Background `{colors.canvas}`, height ~64px, bottom border `1px solid {colors.hairline-soft}`. - Left: Mistral M-mark logo + "MISTRAL AI_" wordmark + horizontal link list (Products, Solutions, Research, Blog, Customers, Company). - Right: "Contact Sales" link + black-pill "Try Studio" CTA. ### Signature Components **`hero-band-sunset`** — Atmospheric sunset hero band. - Background gradient `linear-gradient(135deg, {colors.sunshine-700} 0%, {colors.sunshine-900} 60%, {colors.primary} 100%)` overlaid on photographic mountain landscape. - Layout: hero headline left in `{typography.hero-display}` ({colors.ink}), subtitle in `{typography.subtitle}` ({colors.ink-tint}), button row (`button-dark` + `button-secondary`), atmospheric mountain photography right. **`sunset-stripe-band`** — Horizontal closing band at the foot of every page. - Multi-stop gradient: `{colors.primary}` → `{colors.sunshine-700}` → `{colors.sunshine-500}` → `{colors.yellow-saturated}` → `{colors.cream}`. - Padding `{spacing.lg} 0`. Spans full width, sits above the footer. THIS IS THE BRAND'S MOST RECOGNIZABLE SIGNATURE ELEMENT. **`cta-banner-cream`** — Page-bottom CTA band on cream surface. - Background `{colors.cream}`, text `{colors.ink}`, rounded `{rounded.lg}`, padding `{spacing.section}`. "The next chapter of AI is yours." headline in `{typography.heading-1}` (PP Editorial Old), button row below. **`footer-region`** — Cream-tinted multi-column footer. - Background `{colors.footer-cream}`, padding `{spacing.section} {spacing.xxl}`. - 5-column link grid (Why Mistral / Explore / Build / Legal + brand mark column). - Bottom: language picker + social icons. **`footer-link`** — Individual footer link. - Background transparent, text `{colors.primary}`, typography `{typography.body-sm}`, padding `{spacing.xxs} 0`. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` (saturated orange) for primary CTAs and active states only - Use the **sunset stripe band** at the foot of every page — it's the brand's most recognizable signature - Pair PP Editorial Old (display) with Inter (UI) — never substitute either with a generic alternative - Apply `{rounded.md}` (8px) to buttons and `{rounded.lg}` (12px) to cards consistently - Use cream-yellow surfaces ({colors.cream}) for form panels, feature cards, and footer - Anchor heroes with photographic mountain-sunset imagery (or its visual equivalent — atmospheric gradient sky) - Use stat-display token (PP Editorial 56px) for stat callouts to maintain editorial character ### Don't - Don't use pill-shaped buttons (`{rounded.full}`) — Mistral's geometry is sober and editorial, not playful - Don't introduce additional accent colors beyond the orange/yellow/cream sunset palette - Don't reduce hero leading below 1.05 — the editorial display needs that magazine-grade tightness - Don't replace PP Editorial Old hero displays with Inter — the editorial / sans contrast IS the brand - Don't apply heavy shadows on flat documentation cards; reserve elevation for IDE mockups - Don't drop the sunset stripe band from any page bottom — it's the brand's continuity element ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile (small) | < 480px | Single column. Hero scales to 40px (PP Editorial). Pill nav collapses to hamburger. Pricing tiers stack 1-up. | | Mobile (large) | 480 – 767px | Feature tiles 2-up. Hero scales to 52px. | | Tablet | 768 – 1023px | 2-column feature grids. Pill-tab nav returns. Hero 64px. | | Desktop | 1024 – 1279px | Multi-column layouts. Hero 76px. Stat row at full width. | | Wide Desktop | ≥ 1280px | Full 84px hero presentation. | ### Touch Targets - Buttons render at 40–44px effective height — at WCAG AAA floor with `10px 20px` padding - Form inputs render at 44px height - Pill tabs render at ~32px tall — bumps to 44px on mobile ### Collapsing Strategy - **Promo banner** stays full-width; truncates at < 480px - **Top nav** below 1024px collapses to hamburger - **Hero band**: 2-column hero (text + photography) collapses to stacked at < 1024px - **Pricing tiers**: 4-column desktop → 2-column tablet → 1-column mobile - **Stat row**: 3-column → stacked at < 768px - **Hero typography**: 84px → 64px → 52px → 40px - **Footer**: 5-column desktop → 3-column tablet → 1-column accordion mobile - **Sunset stripe band** stays full-width on all breakpoints ### Image Behavior - Mountain-sunset photography uses 16:9 ratio with full-bleed scaling - IDE mockup images maintain aspect ratio across breakpoints - Customer logo wall presents wordmarks at consistent 60–80px height ## Iteration Guide 1. Focus on ONE component at a time 2. Reference component names and tokens directly (`{colors.primary}`, `{component-name}-pressed`) 3. Run `npx @google/design.md lint DESIGN.md` after edits 4. Add new variants as separate `components:` entries 5. Default to `{typography.body-md}` for body and `{typography.subtitle}` for emphasis. Hero displays use `{typography.hero-display}` (PP Editorial Old). 6. Keep `{colors.primary}` confined to primary CTAs, active states, and the sunset stripe band 7. Cards use `{rounded.lg}` (12px), buttons use `{rounded.md}` (8px). Pills (`{rounded.full}`) reserved for badges only. 8. Always include the sunset-stripe-band component at the foot of every page mockup. ## Known Gaps - Specific dark-mode token values not surfaced; the brand has not shipped a published dark-mode palette - Animation/transition timings not extracted; recommend 150–200ms ease for hover/focus state transitions - Form validation success state not explicitly captured beyond defaults - Sunset stripe band gradient stops are approximations — the actual values may vary slightly across pages but the visual rhythm is consistent
Expo Orbit
React Native Dark
Expo Spec
复制
移动端跨平台构建生态系统的现代暗色设计系统,极窄的字母间距,辅以代码级高对比度文字和深蓝色卡片。
极窄字母间距
暗黑宇宙
代码容器
--- version: alpha name: Expo-design-analysis description: A React Native developer-platform whose marketing site reads like a quietly-confident infrastructure brand. The base canvas is pure white with a soft sky-blue gradient atmospheric wash behind the hero; near-black ink (`#171717`) carries body and display alike. The single brand voltage is **pure black** (`#000000`) for primary CTAs — minimal and editorial-feeling, paired with a small blue text-link accent (`#0d74ce`) reserved for inline body links. Type pairs Inter at modest weights (display 600, body 400) with JetBrains Mono on every code surface. The brand's strongest visual signature is the **device-mockup hero** — a centered MacBook + iPhone composite showing real Expo dev surfaces — over the gradient sky wash. colors: primary: "#000000" primary-active: "#1a1a1a" text-link: "#0d74ce" text-link-secondary: "#476cff" ink: "#171717" body: "#60646c" body-strong: "#171717" muted: "#999999" muted-soft: "#cccccc" hairline: "#f0f0f3" hairline-soft: "#f5f5f7" hairline-strong: "#dcdee0" canvas: "#ffffff" canvas-soft: "#fafafa" surface-card: "#ffffff" surface-strong: "#f0f0f3" surface-dark: "#171717" surface-dark-elevated: "#1a1a1a" on-primary: "#ffffff" on-dark: "#ffffff" on-dark-soft: "#b0b4ba" gradient-sky-light: "#cfe7ff" gradient-sky-mid: "#a8c8e8" accent-warning: "#ab6400" accent-preview: "#8145b5" accent-link-bright: "#47c2ff" semantic-error: "#eb8e90" semantic-success: "#16a34a" typography: display-mega: fontFamily: "'Inter', -apple-system, system-ui, sans-serif" fontSize: 64px fontWeight: 600 lineHeight: 1.05 letterSpacing: -1.92px display-xl: fontFamily: "'Inter', sans-serif" fontSize: 48px fontWeight: 600 lineHeight: 1.1 letterSpacing: -1.44px display-lg: fontFamily: "'Inter', sans-serif" fontSize: 36px fontWeight: 600 lineHeight: 1.15 letterSpacing: -1.08px display-md: fontFamily: "'Inter', sans-serif" fontSize: 28px fontWeight: 600 lineHeight: 1.2 letterSpacing: -0.84px display-sm: fontFamily: "'Inter', sans-serif" fontSize: 22px fontWeight: 600 lineHeight: 1.25 letterSpacing: -0.5px title-md: fontFamily: "'Inter', sans-serif" fontSize: 18px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 title-sm: fontFamily: "'Inter', sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0 body-md: fontFamily: "'Inter', sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 body-sm: fontFamily: "'Inter', sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 caption: fontFamily: "'Inter', sans-serif" fontSize: 13px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 caption-uppercase: fontFamily: "'Inter', sans-serif" fontSize: 11px fontWeight: 600 lineHeight: 1.4 letterSpacing: 0.88px textTransform: uppercase code: fontFamily: "'JetBrains Mono', 'Fira Code', monospace" fontSize: 13px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 button: fontFamily: "'Inter', sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.0 letterSpacing: 0 nav-link: fontFamily: "'Inter', sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 rounded: none: 0px xs: 4px sm: 6px md: 8px lg: 12px xl: 16px xxl: 24px pill: 9999px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px base: 16px md: 20px lg: 24px xl: 32px xxl: 48px section: 96px components: top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.nav-link}" height: 64px button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 10px 18px height: 40px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.md}" button-secondary: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.md}" padding: 9px 17px height: 40px button-tertiary-text: backgroundColor: transparent textColor: "{colors.text-link}" typography: "{typography.button}" hero-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-mega}" padding: 96px device-mockup-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" rounded: "{rounded.xl}" padding: 0 feature-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 24px feature-card-dark: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.title-md}" rounded: "{rounded.lg}" padding: 24px workflow-step-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.body}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 20px workflow-step-icon: backgroundColor: "{colors.surface-strong}" rounded: "{rounded.md}" size: 32px code-block: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.code}" rounded: "{rounded.lg}" padding: 20px ide-mockup-card: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" rounded: "{rounded.lg}" padding: 0 pricing-tier-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px pricing-tier-featured: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px text-input: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 12px 16px height: 44px badge-pill: backgroundColor: "{colors.surface-strong}" textColor: "{colors.ink}" typography: "{typography.caption-uppercase}" rounded: "{rounded.pill}" padding: 4px 10px ecosystem-tile: backgroundColor: "{colors.surface-card}" rounded: "{rounded.md}" size: 64px cta-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-lg}" padding: 96px testimonial-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.body}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 24px footer-light: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-sm}" padding: 64px 48px footer-link: backgroundColor: transparent textColor: "{colors.body}" typography: "{typography.body-sm}" --- ## Overview 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. The brand's strongest visual signature is the **device-mockup hero** — a centered MacBook + iPhone composite showing real Expo dev surfaces (Expo Studio, EAS Build dashboard, the Expo Go simulator) — over a sky-blue gradient atmospheric wash. The composite is the page's chrome instead of an illustration. **Key Characteristics:** - Pure white canvas with sky-blue gradient atmospheric backdrop in hero only. - Single primary CTA: pure black pill at `{rounded.md}` (8px) — compact developer-tool dialect. - Text-link blue (`{colors.text-link}`) for inline links only — never on a CTA. - Inter as the single sans family — no custom display typeface. - JetBrains Mono on every code surface. - Device-mockup hero with real Expo product surfaces is the brand chrome. - Hairline + soft drop depth; no atmospheric brand decoration outside the hero. - 96px section rhythm. ## Colors ### Brand & Accent - **Black** (`{colors.primary}` — #000000): Primary CTA fill. Used scarcely. - **Black Active** (`{colors.primary-active}` — #1a1a1a): Press state. - **Text Link Blue** (`{colors.text-link}` — #0d74ce): Inline body links inside long-form copy. Scoped narrowly — never on CTAs. - **Legal Link Blue** (`{colors.text-link-secondary}` — #476cff): Inline links inside legal copy footer. - **Bright Cyan** (`{colors.accent-link-bright}` — #47c2ff): Used very sparingly inside docs widget links. ### Surface - **Canvas** (`{colors.canvas}` — #ffffff): Pure white page floor. - **Canvas Soft** (`{colors.canvas-soft}` — #fafafa): Subtle alternating band. - **Surface Card** (`{colors.surface-card}` — #ffffff): Pure white card. - **Surface Strong** (`{colors.surface-strong}` — #f0f0f3): Badges, ecosystem tiles, secondary buttons. - **Surface Dark** (`{colors.surface-dark}` — #171717): Dark feature cards, code blocks, IDE mockups, featured pricing. - **Surface Dark Elevated** (`{colors.surface-dark-elevated}` — #1a1a1a): One step lighter inside dark cards. ### 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. - **Hairline Strong** (`{colors.hairline-strong}` — #dcdee0): Stronger panel outline. ### Text - **Ink** (`{colors.ink}` — #171717): Display, body emphasis. - **Body** (`{colors.body}` — #60646c): Default running-text — slightly cool gray. - **Body Strong** (`{colors.body-strong}` — #171717): Same as ink. - **Muted** (`{colors.muted}` — #999999): Sub-titles. - **Muted Soft** (`{colors.muted-soft}` — #cccccc): Disabled text. - **On Primary** (`{colors.on-primary}` — #ffffff): White text on black CTA. - **On Dark** (`{colors.on-dark}` — #ffffff): White text on dark cards. - **On Dark Soft** (`{colors.on-dark-soft}` — #b0b4ba): Muted off-white on dark. ### Semantic - **Warning** (`{colors.accent-warning}` — #ab6400): Warning text inside docs callouts. - **Preview** (`{colors.accent-preview}` — #8145b5): "Preview" tag color. - **Success** (`{colors.semantic-success}` — #16a34a): Confirmation. - **Error** (`{colors.semantic-error}` — #eb8e90): Validation errors. ## Typography ### 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 | |---|---|---|---|---|---| | `{typography.display-mega}` | 64px | 600 | 1.05 | -1.92px | Homepage hero h1 | | `{typography.display-xl}` | 48px | 600 | 1.1 | -1.44px | Subsidiary heroes | | `{typography.display-lg}` | 36px | 600 | 1.15 | -1.08px | Section heads | | `{typography.display-md}` | 28px | 600 | 1.2 | -0.84px | Sub-section heads | | `{typography.display-sm}` | 22px | 600 | 1.25 | -0.5px | Card group titles | | `{typography.title-md}` | 18px | 600 | 1.4 | 0 | Component titles | | `{typography.title-sm}` | 16px | 600 | 1.4 | 0 | List labels | | `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Default body | | `{typography.body-sm}` | 14px | 400 | 1.5 | 0 | Footer body | | `{typography.caption}` | 13px | 400 | 1.4 | 0 | Photo captions | | `{typography.caption-uppercase}` | 11px | 600 | 1.4 | 0.88px | Section labels, badges | | `{typography.code}` | 13px | 400 | 1.5 | 0 | Code blocks — JetBrains Mono | | `{typography.button}` | 14px | 500 | 1.0 | 0 | CTA labels | | `{typography.nav-link}` | 14px | 500 | 1.4 | 0 | Top-nav menu | ### 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. - **JetBrains Mono on every code surface.** ### Note on Font Substitutes Inter and JetBrains Mono are both freely available — the system uses them directly. ## Layout ### 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. - **Section padding:** 96px. ### Grid & Container - Max content width: ~1200px. - Editorial body: 12-column grid. - Feature card grids: 2-up at desktop for hero splits, 3-up for benefit grids. - Ecosystem tile grid: 8-up at desktop. - Footer: 5-column at desktop. ### 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). ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat (canvas) | `{colors.canvas}` (#ffffff) | Body bands, footer | | Card | `{colors.surface-card}` (#ffffff) | Content cards | | Hairline border | 1px `{colors.hairline}` | Card outlines | | Soft drop | `0 4px 12px rgba(0, 0, 0, 0.04)` | Hovered cards (single shadow tier) | | Atmospheric gradient | Sky-blue radial wash | Hero backdrop only | | Dark inversion | `{colors.surface-dark}` (#171717) | Dark feature cards, code blocks, featured pricing | ### 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. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Reserved | | `{rounded.xs}` | 4px | Inline tags | | `{rounded.sm}` | 6px | Compact rows | | `{rounded.md}` | 8px | CTA buttons, form inputs, ecosystem tiles | | `{rounded.lg}` | 12px | Feature cards, code blocks, pricing tiers | | `{rounded.xl}` | 16px | Device mockup cards | | `{rounded.xxl}` | 24px | Larger atmospheric cards (rare) | | `{rounded.pill}` | 9999px | Badges only | | `{rounded.full}` | 9999px | Avatar plates (rare) | Compact developer-ergonomic radii — 8px CTAs, 12px cards. Pill geometry is reserved for badges, never CTAs. ## Components ### 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}`. ## 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. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 640px | Hero h1 64→32px; device mockup → single iPhone screen; feature grid 1-up; nav hamburger. | | Tablet | 640–1024px | Hero h1 48px; device mockup compresses; feature grid 2-up. | | Desktop | 1024–1280px | Full hero h1 64px; full MacBook + iPhone composite; feature grid 3-up. | | Wide | > 1280px | Content caps at 1200px. | ### 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. - Feature grid: 3-up → 2-up → 1-up. - Ecosystem tile grid: 8-up → 4-up → 3-up → 2-up. ## Iteration Guide 1. Focus on a single component at a time. 2. CTAs default to `{rounded.md}` (8px). Cards use `{rounded.lg}` (12px). 3. Variants live as separate entries. 4. Use `{token.refs}` everywhere — never inline hex. 5. Hover state never documented. 6. Inter 600 for display, Inter 400 for body. JetBrains Mono on code. 7. Black stays the only CTA color; text-link blue stays inline-only. ## Known Gaps - Inter and JetBrains Mono are freely available — no licensing concerns. - Animation timings (device mockup parallax, hero entrance) out of scope. - In-app surfaces (EAS dashboard interactive, Expo Go simulator) only partially captured via marketing mockups. - Form validation states beyond focus not visible on captured surfaces.
Vercel Deployment
Geist Monochrome
Vercel Spec
复制
极简主义与黑白几何图形的杰出代表,使用高度统一的 Geist 字体与超薄的发光边框结构。
Geist 字体家族
黑白纯几何
清晰布局比例
--- version: alpha name: Vercel-Inspired-design-analysis description: An inspired interpretation of Vercel's design language — a developer-platform brand whose surface is a stark black-and-ink duet on near-white canvas, broken at hero scale by a multi-color mesh gradient (cyan / blue / magenta / amber) that acts as the entire decorative system, paired with a custom geometric sans for headlines and a monospaced caption face for technical labels. colors: primary: "#171717" on-primary: "#ffffff" ink: "#171717" body: "#4d4d4d" mute: "#888888" hairline: "#ebebeb" hairline-strong: "#a1a1a1" canvas: "#ffffff" canvas-soft: "#fafafa" canvas-soft-2: "#f5f5f5" link: "#0070f3" link-deep: "#0761d1" link-bg-soft: "#d3e5ff" success: "#0070f3" error: "#ee0000" error-soft: "#f7d4d6" error-deep: "#c50000" warning: "#f5a623" warning-soft: "#ffefcf" warning-deep: "#ab570a" violet: "#7928ca" violet-soft: "#d8ccf1" violet-deep: "#4c2889" cyan: "#50e3c2" cyan-soft: "#aaffec" cyan-deep: "#29bc9b" highlight-pink: "#ff0080" highlight-magenta: "#eb367f" gradient-develop-start: "#007cf0" gradient-develop-end: "#00dfd8" gradient-preview-start: "#7928ca" gradient-preview-end: "#ff0080" gradient-ship-start: "#ff4d4d" gradient-ship-end: "#f9cb28" selection-bg: "#171717" selection-fg: "#f2f2f2" typography: display-xl: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 48px fontWeight: 600 lineHeight: 48px letterSpacing: -2.4px display-lg: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 32px fontWeight: 600 lineHeight: 40px letterSpacing: -1.28px display-md: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 24px fontWeight: 600 lineHeight: 32px letterSpacing: -0.96px display-sm: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 20px fontWeight: 600 lineHeight: 28px letterSpacing: -0.6px body-lg: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 18px fontWeight: 400 lineHeight: 28px letterSpacing: 0px body-md: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 16px fontWeight: 400 lineHeight: 24px body-md-strong: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 16px fontWeight: 500 lineHeight: 24px body-sm: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 14px fontWeight: 400 lineHeight: 20px letterSpacing: -0.28px body-sm-strong: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 14px fontWeight: 500 lineHeight: 20px letterSpacing: -0.28px caption: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 12px fontWeight: 400 lineHeight: 16px caption-mono: fontFamily: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace fontSize: 12px fontWeight: 400 lineHeight: 16px code: fontFamily: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace fontSize: 13px fontWeight: 400 lineHeight: 20px button-md: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 14px fontWeight: 500 lineHeight: 20px button-lg: fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif fontSize: 16px fontWeight: 500 lineHeight: 24px rounded: none: 0px xs: 4px sm: 6px md: 8px lg: 12px xl: 16px pill-sm: 64px pill: 100px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px 2xl: 40px 3xl: 48px 4xl: 64px 5xl: 96px 6xl: 128px section: 192px components: nav-bar: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" height: 64px padding: "{spacing.sm} {spacing.lg}" nav-link: textColor: "{colors.body}" typography: "{typography.body-sm}" rounded: "{rounded.full}" padding: "{spacing.xs} {spacing.sm}" nav-cta-signup: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.body-sm-strong}" rounded: "{rounded.sm}" padding: "0px {spacing.xs}" height: 28px nav-cta-login: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm-strong}" rounded: "{rounded.sm}" padding: "0px {spacing.xs}" height: 28px nav-cta-ask-ai: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.hairline}" typography: "{typography.body-sm-strong}" rounded: "{rounded.sm}" padding: "0px {spacing.xs}" height: 28px button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-lg}" rounded: "{rounded.pill}" padding: "0px {spacing.sm}" button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button-lg}" rounded: "{rounded.pill}" padding: "0px {spacing.sm}" button-primary-sm: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.pill}" padding: "0px {spacing.xs}" button-secondary-sm: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.pill}" padding: "0px {spacing.xs}" tab-ghost: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.pill-sm}" padding: "0px {spacing.md}" icon-button-circular: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.hairline}" rounded: "{rounded.full}" card-marketing: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: "{spacing.lg}" card-marketing-large: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: "{spacing.xl}" card-soft: backgroundColor: "{colors.canvas-soft}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: "{spacing.lg}" template-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: "{spacing.md}" code-editor-mockup: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.code}" rounded: "{rounded.md}" padding: "{spacing.lg}" form-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.hairline}" typography: "{typography.body-sm}" rounded: "{rounded.sm}" padding: "0px {spacing.sm}" height: 40px form-input-sm: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.hairline}" typography: "{typography.body-sm}" rounded: "{rounded.sm}" padding: "0px {spacing.sm}" height: 32px form-input-lg: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" borderColor: "{colors.hairline}" typography: "{typography.body-md}" rounded: "{rounded.sm}" padding: "0px {spacing.sm}" height: 48px badge-secondary: backgroundColor: "{colors.canvas-soft}" textColor: "{colors.body}" typography: "{typography.caption}" rounded: "{rounded.full}" padding: "0px {spacing.xs}" pricing-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: "{spacing.xl}" pricing-card-featured: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: "{spacing.xl}" logo-strip: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-sm}" padding: "{spacing.lg} {spacing.xl}" hero-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-xl}" padding: "{spacing.4xl} {spacing.lg}" feature-mesh-band: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-lg}" padding: "{spacing.5xl} {spacing.lg}" showcase-band-light: backgroundColor: "{colors.canvas-soft}" textColor: "{colors.ink}" typography: "{typography.display-lg}" padding: "{spacing.5xl} {spacing.lg}" showcase-band-dark: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.display-lg}" padding: "{spacing.5xl} {spacing.lg}" footer: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-sm}" padding: "{spacing.4xl} {spacing.lg}" link-inline: textColor: "{colors.link}" typography: "{typography.body-md}" banner-marketing: backgroundColor: "{colors.canvas-soft}" textColor: "{colors.body}" typography: "{typography.body-sm}" rounded: "{rounded.full}" padding: "{spacing.xs} {spacing.sm}" # ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ─── ex-pricing-tier: description: "Default tier card. Mirrors pricing-card chrome on canvas-soft surface with a hairline border." backgroundColor: "{colors.canvas-soft}" textColor: "{colors.ink}" borderColor: "{colors.hairline}" rounded: "{rounded.lg}" padding: "{spacing.xl}" ex-pricing-tier-featured: description: "Featured tier — polarity-flipped to ink primary with white text and white CTA." backgroundColor: "{colors.ink}" textColor: "{colors.on-primary}" rounded: "{rounded.lg}" padding: "{spacing.xl}" ex-product-selector: description: "What's Included summary card — repurposed for the brand's GPU / inference / Pro feature tiers." backgroundColor: "{colors.canvas-soft}" rounded: "{rounded.md}" padding: "{spacing.lg}" ex-cart-drawer: description: "Subscription summary — line items per add-on (NOT a literal e-commerce cart)." backgroundColor: "{colors.canvas}" rounded: "{rounded.md}" padding: "{spacing.lg}" item-divider: "{colors.hairline}" ex-app-shell-row: description: "Sidebar nav row. Active state uses brand primary as a left-edge indicator bar." backgroundColor: "{colors.canvas}" activeIndicator: "{colors.primary}" rounded: "{rounded.sm}" padding: "{spacing.xs} {spacing.sm}" ex-data-table-cell: description: "Mirrors the brand's table chrome. Header uses caption-mono uppercase mono; body uses body-sm." headerBackground: "{colors.canvas-soft}" headerTypography: "{typography.caption-mono}" bodyTypography: "{typography.body-sm}" cellPadding: "{spacing.xs} {spacing.sm}" rowBorder: "{colors.hairline}" ex-auth-form-card: description: "Sign-in / sign-up card. Mirrors card-marketing-large chrome with form-input primitives inside." backgroundColor: "{colors.canvas-soft}" rounded: "{rounded.lg}" padding: "{spacing.xl}" ex-modal-card: description: "Modal dialog surface — same chrome as card-marketing-large with Level 5 modal shadow." backgroundColor: "{colors.canvas}" rounded: "{rounded.lg}" padding: "{spacing.xl}" ex-empty-state-card: description: "Empty-state illustration frame. Generous padding on canvas-soft." backgroundColor: "{colors.canvas-soft}" rounded: "{rounded.lg}" padding: "{spacing.3xl}" captionTypography: "{typography.body-md}" ex-toast: description: "Toast notification surface — flat-cornered card-marketing chrome with Level 4 shadow." backgroundColor: "{colors.canvas}" rounded: "{rounded.md}" padding: "{spacing.sm} {spacing.md}" typography: "{typography.body-sm}" --- ## Overview Vercel is a developer-platform brand — the page is a deployment dashboard's marketing surface, written for engineers who already know the syntax. It earns that posture with one of the cleanest stark systems on the web: near-white `{colors.canvas-soft}` body background, ink-near-black `{colors.ink}` text, a 200-step gray scale that gives every divider, border, and disabled state its own deliberate step. The only place the brand introduces colour at marketing scale is the multi-stop mesh gradient (`{colors.gradient-develop-start}` → `{colors.gradient-preview-end}` → `{colors.gradient-ship-start}` → cyan / magenta / amber) that floats in atmospheric backdrops, never miniaturised to a swatch. That gradient is the entire decoration system. Type is the second decisive voice. The brand's own custom geometric sans (Geist) carries display, body, button — everything narrative — at weight 600 for display, 500 for buttons, 400 for body. A matching monospaced face (Geist Mono) carries technical labels: terminal mockups, code blocks, sometimes filename captions. Headlines are sentence-case with aggressive negative letter-spacing (`-2.4px` at 48 px hero) — the brand never letter-spaces positively, never goes uppercase outside of mono labels. Surfaces use a four-step ladder: `{colors.canvas}` (pure white for cards), `{colors.canvas-soft}` 98% (the page body), `{colors.canvas-soft-2}` 95% (occasional inset region), `{colors.primary}` (the deep ink-near-black used as the polarity-flipped band when a section needs the dark mode treatment). Shadows are exceptionally subtle — every elevated card carries a stacked shadow built from `0px 1px 1px #00000005` + `0px 2px 2px #0000000a` + an inset border. Cards never float on heavy drop-shadow; they sit on the page held by hairline + soft glow. **Key Characteristics:** - A single black-ink primary CTA `{colors.primary}` carries every conversion target, paired with white-on-white `button-secondary` for the secondary action. The brand uses 100 px pill shape for marketing CTAs and a tight 6 px square shape for in-app nav buttons. - A multi-stop mesh gradient (cyan-blue-magenta-amber) is the only decorative chrome — used at hero scale and inside feature-band atmospheric backdrops. It is the brand. - Every section eyebrow and small label uses the monospace face `{typography.caption-mono}` or `{typography.code}`; everything else is in the geometric sans. - Subtle stacked-shadow elevation — three offsets layered with 4-12 % black opacity — never a single heavy drop-shadow. - A complete 100–1000 gray + blue + red + amber + green + teal + purple + pink colour scale exists as a system token set, but the marketing surface uses only the `100`, `1000`, and `700`-level tones; the rest stay in the design-system tokens for in-product surfaces. - An "Active CPU" pricing rhythm: `pricing-card` lays out 3-up on the pricing page with `pricing-card-featured` (Pro tier) polarity-flipped to `{colors.primary}` against white-card siblings. ## Colors ### Brand & Accent - **Ink** (`{colors.primary}` — `#171717`): The single primary CTA color. Black-near-pure ink that carries every Sign Up pill, every footer CTA, the dark-band polarity-flip. Used as text color throughout the page on light surfaces. (Resolved from `--ds-gray-1000`.) - **Cyan** (`{colors.cyan}` — `#50e3c2`): A signature mint-cyan used in the brand gradient and inside Geist-system spotlight tokens. Visible inside the hero gradient stops. - **Highlight Pink** (`{colors.highlight-pink}` — `#ff0080`): The brand's highlight magenta, used as the high-saturation stop in the preview-gradient pair. - **Violet** (`{colors.violet}` — `#7928ca`): The deep purple used as the start of the preview-gradient and inside developer-console highlights. - **Link Blue** (`{colors.link}` — `#0070f3`): The brand's primary link color and the legacy `--geist-success` semantic. ### Surface - **Canvas** (`{colors.canvas}` — `#ffffff`): The pure-white card / dialog / modal surface. - **Canvas Soft** (`{colors.canvas-soft}` — `#fafafa`): The default page background — 98 % white. Almost every section sits on this tone. - **Canvas Soft 2** (`{colors.canvas-soft-2}` — `#f5f5f5`): A slightly deeper inset surface for "code editor inner background", template-card hover states, and dropdown menus. - **Hairline** (`{colors.hairline}` — `#ebebeb`): 1 px dividers — table rows, card borders, input borders. - **Hairline Strong** (`{colors.hairline-strong}` — `#a1a1a1`): The 500-level gray, used as the slightly-stronger divider on light bands and as the deemphasised text color. ### Text - **Ink** (`{colors.ink}` — `#171717`): Every heading and body paragraph on light surfaces. - **Body** (`{colors.body}` — `#4d4d4d`): Secondary text — sub-headings, body captions, nav-link inactive text, footer column body. - **Mute** (`{colors.mute}` — `#888888`): Lowest-priority text — placeholder text, fine print, low-key labels. - **On Primary** (`{colors.on-primary}` — `#ffffff`): All text on `{colors.primary}` surfaces. ### Semantic - **Success / Link** (`{colors.success}` — `#0070f3`): The brand's legacy success indicator doubles as the primary link color. Visible underline-on-hover for inline body links. - **Link Deep** (`{colors.link-deep}` — `#0761d1`): The pressed / visited tone for inline links. - **Link Bg Soft** (`{colors.link-bg-soft}` — `#d3e5ff`): Soft pastel blue fill for "what's new" pill banners and informational badges. - **Error** (`{colors.error}` — `#ee0000`): Validation red for destructive actions and form errors. - **Error Soft** (`{colors.error-soft}` — `#f7d4d6`): Soft pastel red for destructive-state backgrounds. - **Error Deep** (`{colors.error-deep}` — `#c50000`): Pressed / deep destructive state. - **Warning** (`{colors.warning}` — `#f5a623`): Caution / pending status indicator. - **Warning Soft** (`{colors.warning-soft}` — `#ffefcf`) / **Warning Deep** (`{colors.warning-deep}` — `#ab570a`): Background + pressed variants. ### Brand Gradient The brand's signature decoration is a three-pair gradient stack: - **Develop** (`{colors.gradient-develop-start}` `#007cf0` → `{colors.gradient-develop-end}` `#00dfd8`) — the blue-to-teal pair used to mark the "deploy" / "develop" rhythm. - **Preview** (`{colors.gradient-preview-start}` `#7928ca` → `{colors.gradient-preview-end}` `#ff0080`) — the violet-to-pink pair used for "preview" surfaces. - **Ship** (`{colors.gradient-ship-start}` `#ff4d4d` → `{colors.gradient-ship-end}` `#f9cb28`) — the coral-to-amber pair used for "ship" surfaces. The three pairs collapse into a single multi-color mesh gradient when used as the hero atmospheric backdrop. Treat the gradient as one unified object — do not crop down to a single colour, do not reorder the stops, and do not miniaturise. Used at hero scale only. ## Typography ### Font Family Two custom faces carry the entire system: 1. **A custom geometric sans** (extracted as `Geist`) for every display, body, button, link, and label. Weights 400 / 500 / 600 are the working set; the face never appears in 700 or heavier. Display sizes are tracked aggressively negative (`-2.4 px` at 48 px hero, `-1.28 px` at 32 px section); body stays at neutral or slightly-negative tracking. 2. **A custom monospaced face** (extracted as `Geist Mono`) for terminal mockups, code blocks, and small mono-caption labels — anything that wants to signal "technical." Weight 400 only at 12 – 13 px. Tracking neutral. A condensed display sans (`Space Grotesk`) is loaded as a third face for occasional editorial moments but does not render as the primary face anywhere in the captured surfaces. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 48px | 600 | 48px | -2.4px | Hero headline ("Build and deploy on the AI Cloud."). | | `{typography.display-lg}` | 32px | 600 | 40px | -1.28px | Section headlines ("Your frontend, delivered.", "A compute model for all workloads."). | | `{typography.display-md}` | 24px | 600 | 32px | -0.96px | Card-cluster headlines, pricing-tier names. | | `{typography.display-sm}` | 20px | 600 | 28px | -0.6px | Inline display micro-headings. | | `{typography.body-lg}` | 18px | 400 | 28px | 0 | Lead paragraphs under section headlines. | | `{typography.body-md}` | 16px | 400 | 24px | 0 | Default body paragraph. | | `{typography.body-md-strong}` | 16px | 500 | 24px | 0 | Bolded inline body. | | `{typography.body-sm}` | 14px | 400 | 20px | -0.28px | Secondary body, nav-link text, button-md labels. | | `{typography.body-sm-strong}` | 14px | 500 | 20px | -0.28px | Nav CTA labels, table-row emphasis. | | `{typography.caption}` | 12px | 400 | 16px | 0 | Footer secondary lines, badge labels. | | `{typography.caption-mono}` | 12px | 400 | 16px | 0 | Section eyebrows and label captions that want a technical voice. | | `{typography.code}` | 13px | 400 | 20px | 0 | Inline code, terminal mockups, command snippets. | | `{typography.button-md}` | 14px | 500 | 20px | 0 | Small / nav-scale button labels. | | `{typography.button-lg}` | 16px | 500 | 24px | 0 | Marketing-scale pill button labels. | ### Principles - **Negative tracking is part of the voice.** Display sizes use aggressive `-2.4` to `-0.6` px tracking. Reverting to default tracking breaks the brand. - **Sentence-case headlines, period-terminated.** Headlines like "Build and deploy on the AI Cloud." end with a deliberate period — that punctuation is part of the brand's voice. - **Mono for the technical layer only.** Section eyebrows, code blocks, terminal mockups. Body paragraphs never set in mono. - **Weight 600 is the display ceiling.** The geometric sans never appears at 700 / 800. The brand reads as a calmer system because of this. ### Note on Font Substitutes The two primary faces are proprietary (custom-cut for the brand). Open-source substitutes: - **Geometric sans** — *Inter* (400 / 500 / 600) is the closest stylistic match; `font-feature-settings: "ss01", "ss02"` enables the geometric alternates. *Satoshi* is a passable second choice. - **Monospace** — *JetBrains Mono* (400) at 12 – 13 px matches the technical voice. *IBM Plex Mono* is the second-best option. ## Layout ### Spacing System - **Base unit**: 4 px. The brand's `--geist-space` token is exactly 4 px and every captured value is a multiple of 4. - **Tokens**: `{spacing.xxs}` 4 px · `{spacing.xs}` 8 px · `{spacing.sm}` 12 px · `{spacing.md}` 16 px · `{spacing.lg}` 24 px · `{spacing.xl}` 32 px · `{spacing.2xl}` 40 px · `{spacing.3xl}` 48 px · `{spacing.4xl}` 64 px · `{spacing.5xl}` 96 px · `{spacing.6xl}` 128 px · `{spacing.section}` 192 px. - **Section padding**: marketing bands use `{spacing.4xl}` to `{spacing.5xl}` top/bottom. Hero bands stretch to `{spacing.section}` to give the mesh gradient room to breathe. - **Card interior padding**: marketing cards sit at `{spacing.lg}` to `{spacing.xl}`; template-grid cards stay tighter at `{spacing.md}` because they sit in a denser grid. - **Inline gap**: button rows, nav rows, and chip rows use `{spacing.sm}` to `{spacing.md}` between siblings. The brand's `--geist-gap` is exactly 24 px. ### Grid & Container - **Max width**: ~1400 px (`--ds-page-width`); the legacy `--geist-page-width` is 1200 px and still appears on some marketing surfaces. Content centres with horizontal gutters of `{spacing.lg}` 24 px on desktop, `{spacing.md}` 16 px on mobile. - **Column patterns**: - Three-feature row: 3-up at desktop, 1-up at mobile (rows like "Web Apps / Composable Commerce / Multi-tenant Platforms"). - Tab pill row: 5-up centred row of `tab-ghost` pills. - Template-grid cluster: 5-up at desktop, scaling to 1-up at mobile. - Pricing tier grid: 3-up at desktop with the middle tier polarity-flipped. - Logo strip: ~5 logos wide, single row. ### Whitespace Philosophy The mesh gradient does most of the heavy decorative lifting; whitespace separates the bands. Section spacing is generous — `{spacing.4xl}` to `{spacing.5xl}` between bands lets the gradient breathe. Inside a card, the headline/paragraph stack is tight (`{spacing.xs}` 8 px gap), then a wider gap before the CTA cluster. The page reads as engineered — large gaps + tight interior, never the other way around. ### Responsive Strategy #### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 600px | Hero stacks; nav collapses to hamburger; 3-up feature grids drop to 1-up; tab pill row enables horizontal scroll. | | Tablet | 600–959px | 3-up grids drop to 2-up; nav still horizontal. | | Desktop | 960–1199px | Full 3-up grids; pricing 3-up. | | Wide | 1200–1399px | Container caps at 1400 px content width. | | Ultra-wide | ≥ 1400px | Content stays centred at 1400 px; bands stretch edge-to-edge in colour but content holds the max-width. | #### Touch Targets The `button-primary` pill renders at ~32 px tall in nav and ~48 px tall in marketing contexts. Marketing CTAs comfortably meet WCAG AAA at all breakpoints; nav buttons inflate touch area through `{spacing.xs}` padding on mobile to meet the 44 × 44 px floor. #### Collapsing Strategy - **Nav**: full link row + Ask AI / Log In / Sign Up pills at desktop. Collapses to logo + hamburger at mobile with the menu opening as a full-overlay. - **Hero**: mesh gradient stays centred; headline + body stack vertically at all breakpoints (the brand doesn't use a split-hero pattern). - **Three-feature row**: 3-up → 2-up → 1-up at the breakpoints above; cards keep their `{rounded.md}` 8 px shape across all viewports. - **Pricing card grid**: 3-up at desktop, vertical stack at mobile with `pricing-card-featured` always sitting in the middle. - **Template grid**: 5-up → 3-up → 2-up → 1-up. Each `template-card` keeps its 16:9 aspect on the image. #### Image Behavior - **Mesh gradient**: rendered as inline SVG or canvas-painted gradient; scales fluidly with the hero container; never crops, never tiles. - **Customer logos**: rendered as monochrome SVGs in the logo strip; consistent 24 px height. - **Code editor mockup**: dark `{colors.primary}` rectangle with mono text rendered inside; treated as an image at the layout level. - **Template thumbnails**: 16:9 landscape inside `{rounded.md}` card chrome; lazy-loaded; consistent grayscale palette in the placeholder state. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Level 0 — Flat | No shadow, no border. | Full-bleed hero bands and the polarity-flipped dark sections. | | Level 1 — Inset Hairline | `0 0 0 1px #00000014` inset 1 px border. | Default card chrome — the brand's universal "you can see this card" cue. | | Level 2 — Subtle Drop | `0px 1px 1px #00000005, 0px 2px 2px #0000000a` plus inset hairline. | Slightly elevated cards (template-grid, marketing-card). | | Level 3 — Soft Stack | `0px 2px 2px #0000000a, 0px 8px 8px -8px #0000000a` plus inset hairline. | The "medium" elevation — feature-grid cards. | | Level 4 — Float Stack | `0px 2px 2px #0000000a, 0px 8px 16px -4px #0000000a` plus inset hairline. | "Large" elevation — pricing cards, callout panels. | | Level 5 — Modal | `0px 1px 1px #00000005, 0px 8px 16px -4px #0000000a, 0px 24px 32px -8px #0000000f` plus inset hairline. | Modal / dialog surfaces and dropdown menus. | The brand uses STACKED shadows — multiple small offsets layered to fake natural light — never a single 8-px-blur generic drop. Inset hairline rings are always added so the card edge stays crisp. ### Decorative Depth - **Mesh gradient as atmospheric depth**: the hero's multi-stop gradient is the brand's only "atmospheric" effect — applied as a flat 2-D backdrop rather than a 3-D illustration. - **Polarity-flipped dark band as section-depth**: switching the surface from `{colors.canvas-soft}` to `{colors.primary}` (the deep ink) is the brand's chief depth cue between bands. - **Inset-shadow + drop-shadow combo**: the cards' combination of an inset 1 px ring and a multi-stop drop produces a "card sits on the page" effect without ever feeling material-heavy. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Full-bleed hero / footer bands. | | `{rounded.xs}` | 4px | Tightest inline pill — the `nav-cta-signup` 6-px-radius button (mapped to `xs/sm`). | | `{rounded.sm}` | 6px | The brand's `--geist-radius` token — base UI radius for in-app buttons, form inputs, dropdown menus. | | `{rounded.md}` | 8px | The brand's `--geist-marketing-radius` token — feature cards, template cards. | | `{rounded.lg}` | 12px | Slightly larger card chrome (pricing-card variants). | | `{rounded.xl}` | 16px | Largest card chrome — when a card hosts a hero image cap. | | `{rounded.pill-sm}` | 64px | Tab-ghost pills inside the "AI Apps / Web Apps / Ecommerce / Marketing / Platforms" row. | | `{rounded.pill}` | 100px | The marketing CTA pill — `button-primary`, `button-secondary`, "Start Deploying" pill. | | `{rounded.full}` | 9999px | Icon-button circular containers, nav-link ghost pills. | ### Photography Geometry - **Mesh gradient**: full-bleed 2-D atmospheric backdrop, never cropped to a frame; treated as the page's wallpaper. - **Customer logos**: monochrome SVG, consistent 24 px height in a flex row. - **Code editor mockup**: 16:10 dark rectangle, `{rounded.md}` corners. - **Template thumbnails**: 16:9 landscape inside `{rounded.md}` chrome. - **Showcase imagery**: 2:1 or 16:9 inside `{rounded.lg}` to `{rounded.xl}` chrome with a stacked shadow. ## Components ### Buttons **`button-primary`** — the canonical 100-px-radius black pill, marketing scale. - Background `{colors.primary}`, text `{colors.on-primary}`, label set in `{typography.button-lg}`, padding `0px {spacing.sm}` 12 px, shape `{rounded.pill}` 100 px. Renders ~48 px tall when paired with the marketing flex layout. **`button-secondary`** — the white pill paired with the black primary inside marketing bands. - Background `{colors.canvas}`, text `{colors.ink}`, same typography + padding as `button-primary`, shape `{rounded.pill}`. **`button-primary-sm`** — the smaller-scale primary pill used inside nav and pricing-card CTAs. - Background `{colors.primary}`, text `{colors.on-primary}`, label set in `{typography.button-md}` (14 px / 500), shape `{rounded.pill}`. **`button-secondary-sm`** — the smaller-scale white pill paired with `button-primary-sm`. - Background `{colors.canvas}`, text `{colors.ink}`, same typography + shape as `button-primary-sm`. **`tab-ghost`** — the centred-row tab pill ("AI Apps / Web Apps / Ecommerce / Marketing / Platforms"). - Background `{colors.canvas}`, text `{colors.ink}`, label set in `{typography.body-sm}`, padding `0px {spacing.md}`, shape `{rounded.pill-sm}` 64 px. **`icon-button-circular`** — the circular icon container (often a "?" or arrow inside). - Background `{colors.canvas}`, dark icon, 1 px solid hairline border, shape `{rounded.full}`. **Nav CTAs:** **`nav-cta-signup`** — the small black "Sign Up" button in the nav row. - Background `{colors.primary}`, text `{colors.on-primary}`, label `{typography.body-sm-strong}`, padding `0px {spacing.xs}`, height 28 px, shape `{rounded.sm}` 6 px (the brand's `--geist-radius`). **`nav-cta-login`** — the white "Log In" button in the nav. - Background `{colors.canvas}`, text `{colors.ink}`, same typography / height / shape as `nav-cta-signup`. **`nav-cta-ask-ai`** — the small "Ask AI" button with a faint border. - Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border (extracted as `0px solid rgb(235, 235, 235)`), same typography / height / shape. ### Cards & Containers **`card-marketing`** — the canonical marketing feature card (3-up section cards). - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.lg}` 24 px, shape `{rounded.md}` 8 px (the `--geist-marketing-radius`). Carries Level 3 soft-stack shadow. **`card-marketing-large`** — the larger marketing card used for "compute model" / "AI Gateway" callouts. - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.xl}`, shape `{rounded.lg}` 12 px. Carries Level 4 float-stack shadow. **`card-soft`** — the soft-tinted card used inside cluster groups (lighter than canvas-soft). - Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.lg}`, shape `{rounded.md}`. **`template-card`** — the deploy-template card in the "Deploy your first app" grid. - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md}` 16 px, shape `{rounded.md}` 8 px. Hosts a 16:9 thumbnail at the top. **`code-editor-mockup`** — the dark code-preview surface inside marketing bands. - Background `{colors.primary}`, text `{colors.on-primary}`, body in `{typography.code}` (13 px / Geist Mono), padding `{spacing.lg}` 24 px, shape `{rounded.md}` 8 px. **`pricing-card`** — the default pricing-tier card. - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.xl}` 32 px, shape `{rounded.lg}` 12 px. Inside: tier name in `{typography.display-md}`, price in `{typography.display-xl}`, feature list in `{typography.body-md}` rows, CTA at the bottom. **`pricing-card-featured`** — the polarity-flipped "Pro" tier card. - Background `{colors.primary}`, text `{colors.on-primary}`, same shape + padding as `pricing-card`. CTA inverts to `button-secondary-sm` (white pill on black card). ### Inputs & Forms **`form-input`** — the canonical text input. - Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border, body in `{typography.body-sm}` (14 px), padding `0px {spacing.sm}`, height 40 px (the brand's `--geist-form-height`), shape `{rounded.sm}` 6 px. **`form-input-sm`** — small-height variant (32 px tall) for tight forms. - Same as `form-input` but height 32 px (the `--geist-form-small-height`). **`form-input-lg`** — large-height variant (48 px tall) for hero CTAs. - Same as `form-input` but height 48 px (the `--geist-form-large-height`); body in `{typography.body-md}` 16 px. ### Navigation **`nav-bar`** — the sticky top nav. - Background `{colors.canvas}`, text `{colors.ink}`, height 64 px (the brand's `--header-height`), padding `{spacing.sm} {spacing.lg}`. Layout: logo left, link row centre, "Ask AI / Log In / Sign Up" cluster right. **`nav-link`** — the centred link row inside `nav-bar`. - Text `{colors.body}`, set in `{typography.body-sm}`, padding `{spacing.xs} {spacing.sm}`, shape `{rounded.full}` (ghost pill — visible only on hover or active, but the radius is documented). **`footer`** — the bottom 4-column nav. - Background `{colors.canvas}`, text `{colors.body}`, padding `{spacing.4xl} {spacing.lg}`. Eyebrow column labels in `{typography.caption-mono}` (uppercase mono effect); link rows in `{typography.body-sm}`. ### Signature Components **`hero-band`** — the white hero with the mesh gradient backdrop. - Background `{colors.canvas}` (or `{colors.canvas-soft}` on some surfaces), text `{colors.ink}`, padding `{spacing.4xl} {spacing.lg}`. Inside: a small mono badge above the headline, the headline in `{typography.display-xl}` (sentence-case, period-terminated), a body lead in `{typography.body-lg}`, then a CTA row with `button-primary` + `button-secondary`. The mesh gradient sits behind, scaled to occupy roughly the top half of the band. **`feature-mesh-band`** — the secondary section that hosts a mesh-gradient atmospheric backdrop with feature copy on top. - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.5xl} {spacing.lg}`. Section headline in `{typography.display-lg}`; supporting body in `{typography.body-md}`. **`showcase-band-light`** — a soft-canvas section ("Deploy your first app in seconds"). - Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.5xl} {spacing.lg}`. **`showcase-band-dark`** — the polarity-flipped dark band ("A compute model for all workloads"). - Background `{colors.primary}`, text `{colors.on-primary}`, padding `{spacing.5xl} {spacing.lg}`. Section headline in `{typography.display-lg}` (white on black). Often contains a `code-editor-mockup` flush with the band. **`logo-strip`** — the customer-logo wrapping row near the top of the page. - Background `{colors.canvas}`, text `{colors.body}`, padding `{spacing.lg} {spacing.xl}`. Logos rendered as monochrome SVGs at consistent height. **`badge-secondary`** — the small inline metadata pill ("New", "Beta", "Live"). - Background `{colors.canvas-soft}`, text `{colors.body}`, body in `{typography.caption}`, padding `0px {spacing.xs}`, shape `{rounded.full}`. **`banner-marketing`** — the "Introducing X" announcement pill at the top of pages. - Background `{colors.canvas-soft}`, text `{colors.body}`, body in `{typography.body-sm}`, padding `{spacing.xs} {spacing.sm}`, shape `{rounded.full}`. **`link-inline`** — body-copy inline links. - Text `{colors.link}` (`#0070f3`), body in `{typography.body-md}`, underlined. ### Examples (illustrative) > Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass. **`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface. - Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding` **`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode). - Properties: `backgroundColor`, `textColor`, `rounded`, `padding` **`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery). - Properties: `backgroundColor`, `rounded`, `padding` **`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart). - Properties: `backgroundColor`, `rounded`, `padding`, `item-divider` **`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator. - Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding` **`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm. - Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder` **`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside. - Properties: `backgroundColor`, `rounded`, `padding` **`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow. - Properties: `backgroundColor`, `rounded`, `padding` **`ex-empty-state-card`** — Empty-state illustration frame. - Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography` **`ex-toast`** — Toast notification surface — feature-card shape + medium shadow. - Properties: `backgroundColor`, `rounded`, `padding`, `typography` ## Do's and Don'ts ### Do - Reserve `{colors.primary}` (`#171717`) for primary CTAs across the page. Black ink IS the conversion target. - Use `{rounded.pill}` 100 px for every marketing-scale CTA and `{rounded.sm}` 6 px for nav-scale buttons. The two pill scales coexist deliberately. - Set every headline in `{typography.display-*}` weight 600, sentence-case, often period-terminated. Aggressive negative tracking is part of the voice. - Use the brand mesh gradient as atmospheric decoration at hero scale only — never miniaturise it to an icon, never reduce to a single colour. - Layer stacked shadows (multiple small offsets with inset hairline) rather than single heavy drops. The brand's elevation is calmer than Material. - Cycle page surfaces in `{colors.canvas-soft}` → `{colors.canvas}` → `{colors.primary}` polarity-flipped bands; the dark band IS the depth cue. - Set every code block and technical eyebrow in `{typography.code}` / `{typography.caption-mono}`. Mono is the voice of the platform. ### Don't - Don't introduce a sixth accent colour. The brand operates with ink + gray + the four-pair gradient palette; new accents flatten the voice. - Don't render headlines in all-caps. Sentence-case + negative tracking is non-negotiable. - Don't drop a single heavy drop-shadow on cards. The brand's elevation is built from stacked small offsets + inset hairline rings. - Don't render the brand gradient at icon scale or in a single-colour reduced form. The gradient lives at hero scale only. - Don't promote the geometric sans to weight 700. The brand's display ceiling is 600. - Don't pair the marketing 100-px pill CTA shape with the 6-px nav radius on the same screen — pick a scale and stay there. - Don't set body paragraphs in the mono face. The mono is for code + technical labels only.
Supabase DB
Dark Emerald
Supabase Spec
复制
开发者的云端数据库平台,以深碳灰和极高饱和度霓虹翡翠绿为主色,带有独特的代码语法高亮质感。
霓虹翡翠绿
开发者控制台
代码首选
--- version: alpha name: Supabaze-Inspired-design-analysis description: An inspired interpretation of Supabaze's design language — an open-source database platform built on a clean white-and-near-black system with a single signature emerald-green CTA, a custom humanist sans display tier, and dense product UI mockups composited above the hero. The brand reads as quietly technical: minimal chrome, a near-monochrome palette, and the green primary acting as the only chromatic event on the page. colors: primary: "#3ecf8e" primary-deep: "#24b47e" primary-soft: "#4ade80" ink: "#171717" ink-secondary: "#212121" ink-mute: "#707070" ink-mute-2: "#9a9a9a" ink-faint: "#b2b2b2" on-primary: "#171717" on-dark: "#ffffff" canvas: "#ffffff" canvas-soft: "#fafafa" canvas-night: "#1c1c1c" canvas-night-soft: "#202020" hairline: "#dfdfdf" hairline-strong: "#c7c7c7" hairline-cool: "#ededed" hairline-cool-2: "#efefef" hairline-cool-3: "#d4d4d4" accent-purple: "#6b01c2" accent-violet: "#644fc1" accent-purple-soft: "#eddbf9" accent-yellow: "#ffdb13" accent-tomato: "#ff2201" accent-pink: "#c7007e" accent-indigo: "#054cff" accent-crimson: "#e2005a" typography: display-xxl: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 64px fontWeight: 500 lineHeight: 1.1 letterSpacing: -1.92px display-xl: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 48px fontWeight: 500 lineHeight: 1.1 letterSpacing: -1.44px display-lg: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 36px fontWeight: 500 lineHeight: 1.15 letterSpacing: -0.72px display-md: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 28px fontWeight: 500 lineHeight: 1.2 letterSpacing: -0.42px heading-lg: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 22px fontWeight: 500 lineHeight: 1.2 letterSpacing: 0 heading-md: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 18px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 body-lg: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 18px fontWeight: 400 lineHeight: 1.55 letterSpacing: 0 body-md: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 button-md: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.0 letterSpacing: 0 caption: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 13px fontWeight: 400 lineHeight: 1.45 letterSpacing: 0 micro: fontFamily: "Circular, 'Helvetica Neue', Helvetica, Arial, sans-serif" fontSize: 12px fontWeight: 400 lineHeight: 1.45 letterSpacing: 0 code: fontFamily: "ui-monospace, Menlo, Monaco, Consolas, 'Liberation Mono', monospace" fontSize: 14px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 rounded: xs: 4px sm: 6px md: 8px lg: 12px xl: 16px full: 9999px spacing: xxs: 2px xs: 4px sm: 8px md: 12px lg: 16px xl: 24px xxl: 32px huge: 64px components: button-primary-green: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.sm}" padding: 8px 16px button-primary-green-pressed: backgroundColor: "{colors.primary-deep}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.sm}" padding: 8px 16px button-secondary-outline: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.sm}" padding: 8px 16px button-on-dark: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-dark}" typography: "{typography.button-md}" rounded: "{rounded.sm}" padding: 8px 16px button-link: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.xs}" padding: 0px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.sm}" padding: 8px 12px card-feature-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-pricing: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-pricing-featured: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-dark}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-feature-dark: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-dark}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px code-block: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-dark}" typography: "{typography.code}" rounded: "{rounded.sm}" padding: 16px pill-tag-green: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.micro}" rounded: "{rounded.full}" padding: 2px 8px pill-tag-soft: backgroundColor: "{colors.canvas-soft}" textColor: "{colors.ink}" typography: "{typography.micro}" rounded: "{rounded.full}" padding: 2px 8px nav-bar-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.xs}" padding: 16px 24px link-on-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.xs}" padding: 0px footer-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink-mute}" typography: "{typography.caption}" rounded: "{rounded.xs}" padding: 64px 24px --- ## Overview Supabaze's design language is engineered for clarity above all else. The marketing surfaces sit on `{colors.canvas}` (pure white), with text rendered in `{colors.ink}` (`#171717` — near-black, never pure black). Across the entire system the only consistent chromatic event is the **emerald green primary** (`{colors.primary}` — `#3ecf8e`) — used as the filled CTA, occasional accent dot, and the signature highlight color in the wordmark. Everything else is a calibrated grey ladder from `#ededed` hairline-cool to `#171717` ink, with thin black-on-white typography doing most of the visual work. Typography runs **Circular** at weight 500 for display and 400 for body. The display tier uses tight negative letter-spacing (-1.92px at 64px) to pull the rounded humanist letterforms into editorial density. There's no atmospheric gradient, no full-bleed photography, no dark-canvas marketing track — the brand commits to white. The product itself appears as composited UI screenshots on every page: dashboard tables, SQL editors, query builders, log streams. These screenshots are the brand's argument. They sit inside `{rounded.lg}` 12px containers with subtle 1px hairlines, often arranged 2-up or in a floating "stacked panes" composition above the hero band. **Key Characteristics:** - Single emerald primary (`{colors.primary}` `#3ecf8e`) as the only chromatic event; everything else is monochrome. - White canvas marketing track with greyscale hierarchy from `{colors.hairline-cool}` to `{colors.ink}`. - Custom humanist sans display tier at weight 500 with negative letter-spacing of -1.92px to -0.42px. - Composited product UI screenshots (dashboard, SQL editor, log stream) are the dominant decorative element — never photography, never illustrations. - Tight 6px / 8px button radii — square-ish, technical, never pill-shaped. - Code blocks rendered in deep `{colors.canvas-night}` (`#1c1c1c`) with monospace inline code; the brand's developer DNA is visible in every snippet. - Pricing tiers use a dark inverted `{colors.canvas-night}` featured tier, not a green one — the green is reserved for buttons and dot accents. ## Colors > **Source pages:** home (`/`), `/database`, `/partners/integrations`, `/partners/integrations/powersync`, `/solutions/ai-builders`, `/pricing`. ### Brand & Accent - **Emerald** (`{colors.primary}` — `#3ecf8e`): The signature CTA color. Filled-button background, brand wordmark accent, dot indicator. - **Emerald Deep** (`{colors.primary-deep}` — `#24b47e`): Pressed-state lift of the primary. - **Emerald Soft** (`{colors.primary-soft}` — `#4ade80`): Lighter emerald used in chart accents and product UI. - **Accent Purple** (`{colors.accent-purple}` — `#6b01c2`): Rare accent used in integration logos and chart points; never a button. - **Accent Violet** (`{colors.accent-violet}` — `#644fc1`): Secondary accent in the same role as accent purple. - **Accent Yellow** (`{colors.accent-yellow}` — `#ffdb13`): Chart accent / status indicator only. - **Accent Pink / Crimson / Indigo / Tomato**: Reserved for integration logos and rare chart highlights, never as system colors. ### Surface - **Canvas** (`{colors.canvas}` — `#ffffff`): Default page background. - **Canvas Soft** (`{colors.canvas-soft}` — `#fafafa`): Barely-tinted off-white for alternating section bands. - **Canvas Night** (`{colors.canvas-night}` — `#1c1c1c`): Deep near-black used in code blocks, dashboard mockups, featured pricing tier. - **Canvas Night Soft** (`{colors.canvas-night-soft}` — `#202020`): Slightly lifted dark for nested chrome. - **Hairline** (`{colors.hairline}` — `#dfdfdf`): 1px borders on cards and tables. - **Hairline Strong** (`{colors.hairline-strong}` — `#c7c7c7`): Slightly darker border for emphasis. - **Hairline Cool** (`{colors.hairline-cool}` — `#ededed`) / **Hairline Cool 2** (`#efefef`) / **Hairline Cool 3** (`#d4d4d4`): The brand's grey ladder for fine chrome work. ### Text - **Ink** (`{colors.ink}` — `#171717`): Default body text. Near-black, never pure. - **Ink Secondary** (`{colors.ink-secondary}` — `#212121`): Slightly cooler near-black for body emphasis. - **Ink Mute** (`{colors.ink-mute}` — `#707070`): Secondary text and helper copy. - **Ink Mute 2** (`{colors.ink-mute-2}` — `#9a9a9a`): Tertiary text. - **Ink Faint** (`{colors.ink-faint}` — `#b2b2b2`): Disabled / placeholder text. - **On Primary** (`{colors.on-primary}` — `#171717`): Text on the emerald primary fill — near-black, not white. The button reads as a "lit" surface with dark type, not a colored chip. - **On Dark** (`{colors.on-dark}` — `#ffffff`): Text on canvas-night surfaces. ## Typography ### Font Family The display and UI tier is **Circular** — a proprietary geometric humanist sans by Lineto. Fallback chain: `'Helvetica Neue', Helvetica, Arial`. For maximum brand fidelity when Circular isn't licensed, use **Inter** (open-source via Google Fonts) at weight 500 for display with `letter-spacing: -1.92px` at 64px. Inter is the closest open-source analogue to Circular's geometric humanist character. Code blocks use **system mono** (`ui-monospace`, with Menlo / Monaco / Consolas fallbacks). ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xxl}` | 64px | 500 | 1.1 | -1.92px | Hero headline | | `{typography.display-xl}` | 48px | 500 | 1.1 | -1.44px | Section opener | | `{typography.display-lg}` | 36px | 500 | 1.15 | -0.72px | Sub-section / pricing tier | | `{typography.display-md}` | 28px | 500 | 1.2 | -0.42px | Card title | | `{typography.heading-lg}` | 22px | 500 | 1.2 | 0 | Compact heading | | `{typography.heading-md}` | 18px | 500 | 1.4 | 0 | Section sub-heading | | `{typography.body-lg}` | 18px | 400 | 1.55 | 0 | Marketing body lead | | `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Default UI body | | `{typography.button-md}` | 14px | 500 | 1.0 | 0 | Button label | | `{typography.caption}` | 13px | 400 | 1.45 | 0 | Helper, footnote | | `{typography.micro}` | 12px | 400 | 1.45 | 0 | Pill label, fine print | | `{typography.code}` | 14px | 400 | 1.5 | 0 | Code block content | ### Principles - **Weight 500 across display.** Mid-weight reads as engineered, not decorative. - **Negative tracking on display.** -1.92px at 64px scaling proportionally down — tightens the rounded humanist letterforms into editorial density. - **Mono for code.** System mono families (Menlo / Monaco) — no proprietary mono webfont. ### Note on Font Substitutes Circular is proprietary. Use **Inter** at weight 500 with `letter-spacing: -1.92px` for display tiers. **Geist Sans** (open-source from Vercel) is another close alternative for both display and body. Avoid Helvetica defaults — they're heavier and lack the geometric warmth. ## Layout ### Spacing System - **Base unit**: 8px (with 2 / 4 / 12 sub-tokens for fine work). - **Tokens**: `{spacing.xxs}` 2px · `{spacing.xs}` 4px · `{spacing.sm}` 8px · `{spacing.md}` 12px · `{spacing.lg}` 16px · `{spacing.xl}` 24px · `{spacing.xxl}` 32px · `{spacing.huge}` 64px. - **Section padding**: 64–96px on marketing surfaces. - **Card internal padding**: 32px on feature/pricing cards. ### Grid & Container - Marketing pages center in a ~1280px container with no edge-bleed; the brand keeps content inside the box. - Pricing collapses 4-up → 2-up → 1-up at 1024 / 768 breakpoints. - Product UI mockups stack 2-up or render as overlapping panes inside the same container. ### Whitespace Philosophy The brand uses generous 64–96px section padding without atmospheric gradients filling the space — the white canvas is the design. The composited product UI mockups break up sections without requiring decoration. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 | Flat, 1px hairline | Default cards | | 1 | `box-shadow: 0 1px 3px rgba(0,0,0,0.06)` | Subtle card lift | | 2 | `box-shadow: 0 8px 24px rgba(0,0,0,0.08)` | Floating composited UI mockups | | 3 | `box-shadow: 0 16px 48px rgba(0,0,0,0.12)` | Modal overlays, deep elevation | ### Decorative Depth The brand's depth is **product UI mockups** rather than gradients. Stacked dashboard / SQL editor / log panes composite together with subtle Level 2 shadows to suggest spatial hierarchy. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Form inputs, hairline tags | | `{rounded.sm}` | 6px | Buttons (the brand's signature button radius), code blocks | | `{rounded.md}` | 8px | Compact cards, alerts | | `{rounded.lg}` | 12px | Pricing cards, feature cards, product mockups | | `{rounded.xl}` | 16px | Modal dialogs, large container chrome | | `{rounded.full}` | 9999px | Pill tags, avatars | ### Photography Geometry The brand uses minimal photography. Customer logo strips display wordmarks at uniform height (~24–32px) in greyscale; case-study cards (rare) use 4:3 photos inset in `{rounded.lg}` containers. ## Components ### Buttons **`button-primary-green`** — the signature CTA. - Background `{colors.primary}`, text `{colors.on-primary}` (near-black, NOT white), type `{typography.button-md}`, padding `{spacing.sm} {spacing.lg}` (8px 16px), rounded `{rounded.sm}` 6px. - Pressed state `button-primary-green-pressed` shifts to `{colors.primary-deep}`. **`button-secondary-outline`** — outline alternative on white. - Background `{colors.canvas}`, text `{colors.ink}`, 1px solid `{colors.hairline-strong}` border, same shape. **`button-on-dark`** — used on dark surfaces / code-block CTAs. - Background `{colors.canvas-night}`, text `{colors.on-dark}`, same shape. **`button-link`** — text-only inline button. - Transparent background, text `{colors.ink}` rendered in `{typography.button-md}`, no padding, with a subtle underline on hover. ### Cards & Containers **`card-feature-light`** — feature card on white. - Background `{colors.canvas}`, padding `{spacing.xxl}`, rounded `{rounded.lg}` 12px, 1px `{colors.hairline}` border. **`card-pricing`** — standard pricing tier. - Background `{colors.canvas}`, padding `{spacing.xxl}`, rounded `{rounded.lg}`, 1px `{colors.hairline}` border. Title in `{typography.heading-lg}`, price in `{typography.display-md}`, body in `{typography.body-md}`, CTA `button-primary-green` pinned bottom. **`card-pricing-featured`** — inverted dark featured tier. - Background `{colors.canvas-night}`, text `{colors.on-dark}`, otherwise identical structure. **`card-feature-dark`** — feature card with deep dark fill. - Background `{colors.canvas-night}`, text `{colors.on-dark}`, padding `{spacing.xxl}`, rounded `{rounded.lg}`. Used for code-heavy feature explanations. **`code-block`** — code snippet container. - Background `{colors.canvas-night}`, text `{colors.on-dark}` rendered in `{typography.code}`. Padding `{spacing.lg}` 16px, rounded `{rounded.sm}` 6px. ### Inputs & Forms **`text-input`** — standard form input. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-md}`, padding `{spacing.sm} {spacing.md}` (8px 12px), rounded `{rounded.sm}` 6px, 1px `{colors.hairline}` border. ### Navigation **`nav-bar-light`** — top nav across the site. - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.lg} {spacing.xl}`. Logo on the left, primary nav center, "Sign In" link + filled `button-primary-green` on the right. ### Pills, Tags, and Chips **`pill-tag-green`** — small green pill used for "new" or featured indicators. - Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.micro}`, padding `{spacing.xxs} {spacing.sm}`, rounded `{rounded.full}`. **`pill-tag-soft`** — neutral pill on light surfaces. - Background `{colors.canvas-soft}`, text `{colors.ink}`, otherwise same shape. ### Signature Components **Composited Product UI Mockups** — multi-layer dashboard / SQL editor / log pane composites with subtle Level 2 shadows. The product is the brand's argument; mockups always sit on white canvas with no surrounding decoration. **`link-on-light`** — inline links in body copy. - Text `{colors.ink}` rendered in `{typography.body-md}` with a persistent underline. **`footer-light`** — site-wide footer. - Background `{colors.canvas}`, text `{colors.ink-mute}`, type `{typography.caption}`, padding `{spacing.huge} {spacing.xl}` (64px 24px). Holds 4–5 columns of link groups, social icons, and a small legal row. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` emerald for filled CTAs and the wordmark accent — it should appear sparingly. - Render display tiers at weight 500 with negative letter-spacing — the engineered tightness is part of the brand. - Use `{rounded.sm}` 6px for buttons — square-ish radii, never pill-shaped. - Composite product UI mockups inside `{rounded.lg}` containers with subtle Level 2 shadows. - Use near-black `{colors.ink}` on the emerald button (not white) — the green reads as "lit" with dark type, which is the brand's idiosyncratic choice. - Apply system mono for every code block. ### Don't - Don't introduce additional accent colors as system colors — purples, yellows, and pinks belong inside chart points and integration logos only. - Don't bump display weight above 500 — the brand's calibrated mid-weight breaks at 600+. - Don't use pill-shaped buttons; the brand's button radius is square-ish 6px. - Don't use white text on the emerald button — the brand specifically uses near-black on green. - Don't add atmospheric gradients to hero bands — the white canvas is the design. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Wide | ≥ 1440px | Full container width; product mockups at full scale | | Desktop | 1024–1440px | Default content max-width; pricing 4-up | | Tablet | 768–1023px | Pricing 2-up; mockups simplify to single panel | | Mobile | < 768px | Pricing 1-up; hamburger nav; display drops 64 → 36px | ### Touch Targets - Buttons hit ≥ 36×36px on mobile; vertical padding scales up to maintain WCAG AA minimum. - Form fields stay at 36px minimum height. ### Collapsing Strategy - Display tiers stair-step 64 → 48 → 36 → 28 → 22px. - Product UI mockups simplify to a single primary panel on mobile. - Pricing tiers stair-step 4-up → 2-up → 1-up; dark featured tier always distinguished. ### Image Behavior Product UI mockups use `srcset` with desktop / mobile crops; mobile crops focus on the most actionable inner panel. ## Iteration Guide 1. Focus on ONE component at a time. 2. Reference component names and tokens directly. 3. Run `npx @google/design.md lint DESIGN.md` after edits. 4. Default body to `{typography.body-md}`; use `{typography.code}` for any developer-facing snippet. 5. Keep emerald scarce; one filled green button per viewport. 6. The white-canvas commitment is non-negotiable — adding atmospheric backdrops breaks the brand.
PostHog Analytics
Playful Retro Tech
PostHog Spec
复制
充满趣味性的数据分析设计系统,融合经典的复古街机风格与标志性刺猬插图,在沉闷的 SaaS 行业脱颖而出。
街机式粗线框
橙色高亮
刺猬趣味图腾
--- version: alpha name: PostHog-design-analysis description: | A playful developer-tools system rendered on a warm cream canvas with hand-drawn hedgehog mascots dotted across every page like marginalia in a sketchbook. The chrome reads like a friendly engineering blog: olive-gray ink (#4d4f46) for body, deep olive-charcoal (#23251d) for headlines, IBM Plex Sans Variable typography in tight 1.43-line-height paragraphs, and a single saturated yellow-orange CTA pill (#f7a501) carrying every primary action. The system actively rejects the genre's typical somber dark-tech aesthetic in favor of a creamy, textbook-illustration sensibility — bordered cards stack on the cream canvas with 4–6px radii, doc sidebars use rounded outline-icon mini-illustrations, and the home page leans on cartoon characters (hedgehogs in lab coats, hedgehogs at terminals, hedgehogs in lounge chairs) as its signature decoration. Code samples and product analytics charts live inside white-on-cream cards with thin olive borders; the contrast between the playful illustration and the data-dense product imagery is the brand's signature voice. colors: primary: "#f7a501" primary-pressed: "#dd9001" primary-active: "#b17816" on-primary: "#23251d" ink: "#23251d" body: "#4d4f46" charcoal: "#33342d" mute: "#6c6e63" ash: "#9b9c92" stone: "#b6b7af" hairline: "#bfc1b7" hairline-soft: "#dcdfd2" on-dark: "#ffffff" canvas: "#eeefe9" surface-soft: "#e5e7e0" surface-card: "#ffffff" surface-doc: "#fcfcfa" surface-dark: "#23251d" link-blue: "#1d4ed8" link-teal: "#1078a3" accent-blue: "#2c84e0" accent-blue-soft: "#dceaf6" accent-red: "#cd4239" accent-red-soft: "#f7d6d3" accent-green: "#2c8c66" accent-green-soft: "#d9eddf" accent-purple: "#7c44a6" accent-purple-soft: "#e7d8ee" focus-ring: "rgba(59,130,246,0.5)" typography: display-xl: fontFamily: IBM Plex Sans Variable fontSize: 36px fontWeight: 700 lineHeight: 1.5 letterSpacing: 0 display-lg: fontFamily: IBM Plex Sans Variable fontSize: 24px fontWeight: 800 lineHeight: 1.33 letterSpacing: -0.6px heading-lg: fontFamily: IBM Plex Sans Variable fontSize: 21px fontWeight: 700 lineHeight: 1.4 letterSpacing: -0.5px heading-md: fontFamily: IBM Plex Sans Variable fontSize: 20px fontWeight: 700 lineHeight: 1.4 letterSpacing: 0 heading-sm: fontFamily: IBM Plex Sans Variable fontSize: 18px fontWeight: 700 lineHeight: 1.5 letterSpacing: 0 textTransform: uppercase heading-sm-mixed: fontFamily: IBM Plex Sans Variable fontSize: 18px fontWeight: 600 lineHeight: 1.56 letterSpacing: 0 body-md: fontFamily: IBM Plex Sans Variable fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 body-strong: fontFamily: IBM Plex Sans Variable fontSize: 16px fontWeight: 600 lineHeight: 1.5 letterSpacing: 0 body-sm: fontFamily: IBM Plex Sans Variable fontSize: 15px fontWeight: 400 lineHeight: 1.71 letterSpacing: 0 body-sm-strong: fontFamily: IBM Plex Sans Variable fontSize: 15px fontWeight: 600 lineHeight: 1.71 letterSpacing: 0 body-xs: fontFamily: IBM Plex Sans Variable fontSize: 14px fontWeight: 500 lineHeight: 1.43 letterSpacing: 0 caption-md: fontFamily: IBM Plex Sans Variable fontSize: 14px fontWeight: 700 lineHeight: 1.71 letterSpacing: 0 caption-sm: fontFamily: IBM Plex Sans Variable fontSize: 13px fontWeight: 500 lineHeight: 1.5 letterSpacing: 0 caption-xs: fontFamily: IBM Plex Sans Variable fontSize: 12px fontWeight: 600 lineHeight: 1.33 letterSpacing: 0 textTransform: uppercase utility-xs: fontFamily: IBM Plex Sans Variable fontSize: 12px fontWeight: 700 lineHeight: 1.33 letterSpacing: 0 textTransform: uppercase link-md: fontFamily: IBM Plex Sans Variable fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 button-md: fontFamily: IBM Plex Sans Variable fontSize: 14px fontWeight: 700 lineHeight: 1.5 letterSpacing: 0 button-sm: fontFamily: IBM Plex Sans Variable fontSize: 13px fontWeight: 500 lineHeight: 1 letterSpacing: 0 code-sm: fontFamily: ui-monospace fontSize: 14px fontWeight: 400 lineHeight: 1.43 letterSpacing: 0 code-xs: fontFamily: Source Code Pro fontSize: 14px fontWeight: 500 lineHeight: 1.43 letterSpacing: 0 rounded: none: 0px xs: 2px sm: 4px md: 6px lg: 8px full: 9999px spacing: xxs: 2px xs: 4px sm: 8px md: 12px lg: 16px xl: 24px xxl: 32px section: 80px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: 8px 16px height: 40px button-primary-pressed: backgroundColor: "{colors.primary-pressed}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.md}" button-secondary: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: 8px 16px height: 40px button-tertiary: backgroundColor: "transparent" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.md}" padding: 8px 12px button-disabled: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ash}" rounded: "{rounded.md}" text-input: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 8px 12px height: 36px text-input-focused: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" rounded: "{rounded.md}" search-input: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 8px 12px height: 36px product-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 24px doc-card: backgroundColor: "{colors.surface-doc}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 24px feature-tile: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.heading-sm-mixed}" rounded: "{rounded.md}" padding: 20px pricing-tier-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 32px hedgehog-mascot-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 24px product-tab: backgroundColor: "transparent" textColor: "{colors.body}" typography: "{typography.body-strong}" rounded: "{rounded.md}" padding: 8px 12px product-tab-active: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-strong}" rounded: "{rounded.md}" pill-tab: backgroundColor: "transparent" textColor: "{colors.body}" typography: "{typography.button-sm}" rounded: "{rounded.full}" padding: 6px 14px pill-tab-active: backgroundColor: "{colors.ink}" textColor: "{colors.on-dark}" typography: "{typography.button-sm}" rounded: "{rounded.full}" badge-uppercase: backgroundColor: "transparent" textColor: "{colors.body}" typography: "{typography.utility-xs}" rounded: "{rounded.none}" badge-promo: backgroundColor: "{colors.accent-blue-soft}" textColor: "{colors.link-blue}" typography: "{typography.caption-xs}" rounded: "{rounded.full}" padding: 2px 8px banner-tip-blue: backgroundColor: "{colors.accent-blue-soft}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 16px 20px banner-tip-green: backgroundColor: "{colors.accent-green-soft}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 16px 20px banner-tip-red: backgroundColor: "{colors.accent-red-soft}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 16px 20px banner-tip-purple: backgroundColor: "{colors.accent-purple-soft}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 16px 20px code-block: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.code-sm}" rounded: "{rounded.md}" padding: 16px 20px inline-code: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ink}" typography: "{typography.code-xs}" rounded: "{rounded.xs}" padding: 2px 6px primary-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-strong}" rounded: "{rounded.none}" height: 56px sub-nav-strip: backgroundColor: "{colors.surface-soft}" textColor: "{colors.body}" typography: "{typography.body-xs}" rounded: "{rounded.none}" height: 40px doc-sidebar: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-xs}" rounded: "{rounded.none}" width: 240px footer-section: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-xs}" rounded: "{rounded.none}" padding: 32px 24px link-inline: textColor: "{colors.link-teal}" typography: "{typography.link-md}" --- ## Overview PostHog's marketing system is built on the visual contradiction at the heart of the brand: a serious open-source product analytics platform rendered as if it were a friendly engineering sketchbook. The chrome runs on a warm cream canvas (`{colors.canvas}` — `#eeefe9`) — not white — and every page is dotted with hand-drawn hedgehog mascots in lab coats, lounge chairs, terminals, and reading glasses, scattered across the layout like marginalia in a textbook. Type sits in IBM Plex Sans Variable at olive-gray (`{colors.body}` — `#4d4f46`) for body and deep olive-charcoal (`{colors.ink}` — `#23251d`) for headlines, with weights stepped tightly between 400, 600, 700, and 800 to create hierarchy without color. The single saturated yellow-orange pill (`{colors.primary}` — `#f7a501`) is the brand's only loud chromatic moment; everything else is cream, olive, white card, and the occasional pastel callout band. The system has a distinctive **two-mode body layout**: marketing pages (home, workflows, pricing) lean on alternating-pastel callout bands and feature tiles in white cards on cream, while documentation pages add a sticky 240px left sidebar with a rounded outline-icon section list. Code samples are full-width dark blocks on `{colors.surface-dark}` (the same olive-charcoal that carries body ink, used inverted) inside white doc cards, creating the system's most distinctive visual moment: a dark-on-dark code island floating inside a white card on a cream canvas, with a hedgehog mascot doodled in the margin. Sections stack at `{spacing.section}` (80px) rhythm with cream canvas continuing edge-to-edge between them. The only color bands that interrupt the cream are pastel `{component.banner-tip-blue}` / `-green` / `-red` / `-purple` callout panels inside doc articles — soft tinted boxes that carry "💡 Tip", "✅ Success", "⚠️ Warning", "📘 Info" inline annotations. There are no decorative gradients, no atmospheric mesh backgrounds, and no full-bleed dark hero chapters; the cream canvas runs uninterrupted top to bottom and the hedgehogs are the entire visual identity. **Key Characteristics:** - Warm cream canvas (`{colors.canvas}` — #eeefe9) end-to-end with no surface alternation between sections — the page is one continuous sheet - Single yellow-orange CTA pill (`{colors.primary}` — #f7a501) with deep olive text (`{colors.on-primary}`) — the brand's only saturated color - IBM Plex Sans Variable across every text role with weights 400/500/600/700/800 — no other typeface in the system - Hand-drawn hedgehog mascots scattered across the layout as the entire decorative system — no gradients, no mesh, no atmospheric backgrounds - 4–8px radius card vocabulary: `{rounded.md}` (6px) for most components, `{rounded.lg}` (8px) for select containers, fully rounded for pill chips - Pastel callout banners (`{colors.accent-blue-soft}`, `{colors.accent-green-soft}`, `{colors.accent-red-soft}`, `{colors.accent-purple-soft}`) break up doc article body with soft tinted side rails for tips/warnings/info - Documentation pages add a sticky 240px `{component.doc-sidebar}` with rounded outline-icon section nav and an "Ask PostHog AI" CTA at the top ## Colors > **Source pages:** `/` (home), `/pricing` (pricing detail), `/docs/product-analytics` (docs article), `/workflows` (product feature page). The chrome palette is identical across all four pages — only doc-specific accents (callout-banner pastels, code-block dark surface) appear exclusively inside the docs experience. ### Brand & Accent - **PostHog Yellow** (`{colors.primary}` — `#f7a501`): the universal primary CTA. Sticky "Get started — free" pill in the top-right of every nav, hero CTAs, pricing-tier subscribe buttons, footer signup pill. The system's only saturated chromatic moment. - **Yellow Pressed** (`{colors.primary-pressed}` — `#dd9001`): pressed state for the primary pill. - **Yellow Active** (`{colors.primary-active}` — `#b17816`): deeply-pressed yellow + the system's gold-toned border accent (rare 1px gold rule on inline form elements). ### Surface - **Canvas** (`{colors.canvas}` — `#eeefe9`): the warm cream page background. End-to-end on every page; the brand's most distinctive surface choice. - **Soft Surface** (`{colors.surface-soft}` — `#e5e7e0`): button-secondary fill, sub-nav strip background, inline-code chip background. - **Surface Card** (`{colors.surface-card}` — `#ffffff`): true white card and tile background sitting on top of the cream canvas. The dominant card surface. - **Surface Doc** (`{colors.surface-doc}` — `#fcfcfa`): a faintly cream-warm white used inside doc article body cards — slightly softer than pure white to keep the page tonally unified. - **Surface Dark** (`{colors.surface-dark}` — `#23251d`): the deep olive-charcoal used inverted as code-block background. The same hex as `{colors.ink}` — the brand uses one olive-near-black for both text and dark code surfaces. - **Hairline** (`{colors.hairline}` — `#bfc1b7`): 1px card border, table rule, footer column dividers. - **Hairline Soft** (`{colors.hairline-soft}` — `#dcdfd2`): in-card row divider, soft inset rule. - **On Dark** (`{colors.on-dark}` — `#ffffff`): primary text on `{colors.surface-dark}` code blocks. ### Text - **Ink** (`{colors.ink}` — `#23251d`): headlines, button text on light, primary nav links — deep olive-charcoal that reads near-black against cream. - **Body** (`{colors.body}` — `#4d4f46`): default paragraph text, doc article body, inline link color before hover. The brand's most-used text color. - **Charcoal** (`{colors.charcoal}` — `#33342d`): emphasized body text where body is too soft. - **Mute** (`{colors.mute}` — `#6c6e63`): metadata, footer link text, in-list secondary annotations. - **Ash** (`{colors.ash}` — `#9b9c92`): disabled-state text and lowest-emphasis utility. - **Stone** (`{colors.stone}` — `#b6b7af`): least-emphasis caption text and disabled icon color. ### Semantic - **Link Blue** (`{colors.link-blue}` — `#1d4ed8`): inline anchor link inside body prose. The system's primary informational link color. - **Link Teal** (`{colors.link-teal}` — `#1078a3`): doc-article inline link variant, paired with body text. - **Accent Blue** (`{colors.accent-blue}` — `#2c84e0`) + **Accent Blue Soft** (`{colors.accent-blue-soft}` — `#dceaf6`): "💡 Tip / Info" callout banner inside docs. - **Accent Red** (`{colors.accent-red}` — `#cd4239`) + **Accent Red Soft** (`{colors.accent-red-soft}` — `#f7d6d3`): "⚠️ Warning / Caution" callout banner. - **Accent Green** (`{colors.accent-green}` — `#2c8c66`) + **Accent Green Soft** (`{colors.accent-green-soft}` — `#d9eddf`): "✅ Success / Positive" callout banner. - **Accent Purple** (`{colors.accent-purple}` — `#7c44a6`) + **Accent Purple Soft** (`{colors.accent-purple-soft}` — `#e7d8ee`): "📘 Note / Reference" callout banner. - **Focus Ring** (`{colors.focus-ring}` — `rgba(59,130,246,0.5)`): translucent blue browser-default focus ring around interactive elements. ## Typography ### Font Family **IBM Plex Sans Variable** is the system's primary face — used across every text role on every page at weights 400 (regular), 500 (medium), 600 (semibold), 700 (bold), and 800 (extra-bold). Falls back through `IBM Plex Sans` → `-apple-system` → `system-ui` → broad cross-platform sans stack. **ui-monospace** + **Source Code Pro** carry code samples and inline-code chips at 14px / 1.43 line-height. Source Code Pro is the explicit display monospace; ui-monospace handles inline `<code>` chips. The brand-distinctive choice is the **mixed weight ladder** (400 / 500 / 600 / 700 / 800) — most chrome lives in the 400–700 band, with weight 800 reserved exclusively for the larger display headlines on home and pricing. This gives the system its "engineering blog" feel: hierarchy is built from weight contrast much more than from size. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 36px | 700 | 1.5 | 0 | Hero headline ("The new way to build products") | | `{typography.display-lg}` | 24px | 800 | 1.33 | -0.6px | Section headline, pricing tier name | | `{typography.heading-lg}` | 21px | 700 | 1.4 | -0.5px | Sub-section heading, doc-article H2 | | `{typography.heading-md}` | 20px | 700 | 1.4 | 0 | Card group title, in-grid heading | | `{typography.heading-sm}` | 18px | 700 | 1.5 | 0 (uppercase) | Section eyebrow ("UNDERSTAND PRODUCT USAGE") | | `{typography.heading-sm-mixed}` | 18px | 600 | 1.56 | 0 | Card title in mixed-case (no uppercase transform) | | `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Body copy, default paragraph | | `{typography.body-strong}` | 16px | 600 | 1.5 | 0 | Inline emphasis, primary nav link, in-card label | | `{typography.body-sm}` | 15px | 400 | 1.71 | 0 | Doc article body, marketing card description | | `{typography.body-sm-strong}` | 15px | 600 | 1.71 | 0 | Sub-section emphasis inside doc article | | `{typography.body-xs}` | 14px | 500 | 1.43 | 0 | Doc sidebar item, metadata, in-list caption | | `{typography.caption-md}` | 14px | 700 | 1.71 | 0 | Card eyebrow, link cluster header | | `{typography.caption-sm}` | 13px | 500 | 1.5 | 0 | Compact metadata caption | | `{typography.caption-xs}` | 12px | 600 | 1.33 | 0 (uppercase) | Inline badge label | | `{typography.utility-xs}` | 12px | 700 | 1.33 | 0 (uppercase) | Section-eyebrow utility text, footer category header | | `{typography.link-md}` | 16px | 400 | 1.5 | 0 | Inline body anchor link | | `{typography.button-md}` | 14px | 700 | 1.5 | 0 | Standard primary/secondary button label | | `{typography.button-sm}` | 13px | 500 | 1 | 0 | Pill chip / compact CTA | | `{typography.code-sm}` | 14px | 400 | 1.43 | 0 | Code block content | | `{typography.code-xs}` | 14px | 500 | 1.43 | 0 | Inline code chip | ### Principles The hierarchy is explicitly built from weight + size + occasional uppercase transform — there is no italic style, no decorative display variant, no proprietary face. The biggest display moments use weight 800 with -0.6px tracking, and the body settles at 400 with 1.5 line-height; everything else fills the band between. Section eyebrows (`{typography.heading-sm}` and `{typography.utility-xs}`) consistently render uppercase, which gives the doc layout its textbook-chapter feel. ### Note on Font Substitutes IBM Plex Sans Variable is open-source and Google-Fonts-hosted. There is no need for a substitute — load it directly. If a substitute is genuinely needed, **Inter** is the closest geometric match at all five weights; pair with Inter's letter-spacing -0.5 to -0.6px on display sizes to approximate Plex's display tracking. For monospace, **JetBrains Mono** is a near-perfect substitute for Source Code Pro at body sizes. ## Layout ### Spacing System - **Base unit:** 8px (with finer 2/4/6px steps for tight inline gaps in callout banners and pill buttons). - **Tokens (front matter):** `{spacing.xxs}` (2px) · `{spacing.xs}` (4px) · `{spacing.sm}` (8px) · `{spacing.md}` (12px) · `{spacing.lg}` (16px) · `{spacing.xl}` (24px) · `{spacing.xxl}` (32px) · `{spacing.section}` (80px). - **Universal section rhythm:** every page in the set uses `{spacing.section}` (80px) as the vertical gap between major content blocks. Card grids use `{spacing.lg}` (16px) gutters; card internal padding sits at `{spacing.xl}` (24px) for product cards and `{spacing.xxl}` (32px) for pricing tier cards. ### Grid & Container - **Max width:** ~1280px content area at desktop with 24px gutters (~48px at ultrawide). Doc article body sits at ~720px max width with the 240px sidebar pushing the article column right of center. - **Marketing card grid:** 4-up at desktop, 3-up at 1024px, 2-up at 768px, 1-up at 480px. Cards preserve a fixed 1:1 or 4:3 ratio. - **Pricing tier grid:** 3-up at desktop with a left rail of plan info, collapsing to 2-up + 1 at tablet and 1-up at mobile. - **Doc layout:** desktop 240px sticky left sidebar + ~720px article body + (optional) 200px right TOC rail = ~1160px content width. - **Footer:** 6-column horizontal link grid at desktop, 3-up at tablet, 2-up at mobile. ### Whitespace Philosophy Whitespace is generous on marketing pages and tight on doc pages. The home and workflows pages stack feature tiles with `{spacing.lg}` (16px) gutters and 24px internal padding, while doc articles tighten internal spacing to `{spacing.md}` (12px) between paragraphs to maximize information density. The cream canvas runs continuously through every section — there are no decorative dividers, no shaded section bands; only the 1px hairline beneath section eyebrows and footer column rules separate content blocks. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 — Flat | No border, no shadow | Default for canvas-on-canvas blocks, hero text, body sections | | 1 — Hairline border | 1px solid `{colors.hairline}` | Marketing cards, pricing tier cards, doc sidebar items, footer column rules | | 2 — Hairline soft | 1px solid `{colors.hairline-soft}` | In-card row divider between adjacent rows | | 3 — Inverted dark code block | `{colors.surface-dark}` fill | Code samples inside doc cards — the system's only "elevated" surface uses color, not shadow | The system has no drop-shadow elevation in marketing or product chrome. Cards sit flat on cream with thin olive borders. The single inverted moment is the dark code-block surface used inside doc article body cards. ### Decorative Depth Depth comes entirely from illustration and the pastel callout band system, not from CSS effects: - **Hand-drawn hedgehog mascots** — characters in various costumes (lab coat, terminal, lounge chair, magnifying glass, hammock, hat) scattered across pages as marginalia. Always rendered as flat color illustrations, never photographs. - **Pastel callout banners** — `{component.banner-tip-blue}` / `-green` / `-red` / `-purple` soft tinted side-rail panels inside doc articles, each prefixed with an emoji icon (💡 ✅ ⚠️ 📘) and carrying tip/warning/note copy. - **Code blocks** — full-width dark olive-charcoal panels on `{colors.surface-dark}` with white code text. The system's most cinematic surface, used inside white doc cards. - **Outline product icons** in the doc sidebar — small rounded-square mini-illustrations (chart icon, funnel, session-replay icon) mark each major product section. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Sub-nav strip, footer, doc sidebar, primary nav — flat structural surfaces | | `{rounded.xs}` | 2px | Inline `<code>` chips, micro-rule highlights | | `{rounded.sm}` | 4px | Inline buttons, form inputs, micro chips | | `{rounded.md}` | 6px | Marketing cards, pricing cards, doc cards, code blocks, every standard CTA | | `{rounded.lg}` | 8px | Tab top corners (`6px 6px 0 0` on active tab) and rare large containers | | `{rounded.full}` | 9999px | Pill chips and pill-style CTAs ("Get started — free" sticky CTA in nav) | The radius vocabulary clusters around 4–6px for nearly everything; the only fully-rounded element is the pill-style sticky nav CTA and inline pill chips. ### Photography Geometry There is no photography. Visual elements are limited to: - **Hedgehog character illustrations** — flat-color cartoon hedgehogs ranging from ~80px (in-card mascot) to ~240px (hero illustration). Always at native aspect, never cropped to a frame. - **Outline product icons** in the doc sidebar — 20–24px rounded-square illustrations. - **Inline emoji** at 14–16px inside callout banners (💡 ✅ ⚠️ 📘) — used as functional iconography rather than decoration. - **Section illustrations** on the home page — small hedgehog vignettes paired with each "Understand product usage" / "Build sticky habits" / "Test before launch" feature row. ## Components > **No hover states documented** per system policy. Each spec covers Default and Active/Pressed only. ### Buttons **`button-primary`** — the universal PostHog CTA - Background `{colors.primary}` (yellow-orange), text `{colors.on-primary}` (deep olive), type `{typography.button-md}`, padding `8px 16px`, height `40px`, rounded `{rounded.md}`. - Used for "Get started — free" (sticky top-nav CTA), "Sign up", "Try it free", "Subscribe" — every primary action. - Pressed state lives in `button-primary-pressed` — background drops to `{colors.primary-pressed}`. **`button-secondary`** — soft alternative on cream canvas - Background `{colors.surface-soft}` (`#e5e7e0`), text `{colors.ink}`, type `{typography.button-md}`, padding `8px 16px`, height `40px`, rounded `{rounded.md}`. - "Talk to sales", "Read docs", "Watch demo" — second-tier actions paired with the yellow primary. **`button-tertiary`** — ghost text button - Background transparent, text `{colors.ink}`, type `{typography.button-md}`, padding `8px 12px`, rounded `{rounded.md}`. - Lowest-emphasis action: "See all docs →", "Browse all features". **`button-disabled`** - Background `{colors.surface-soft}`, text `{colors.ash}` — flat soft cream-gray. ### Tabs & Chips **`product-tab`** + **`product-tab-active`** — major product section tabs - Default: transparent background, text `{colors.body}`, type `{typography.body-strong}`, padding `8px 12px`, rounded `{rounded.md}`. - Active: background flips to `{colors.surface-card}` (white), text `{colors.ink}` — the tab card lifts off the cream canvas as the visual signal of selection. **`pill-tab`** + **`pill-tab-active`** — compact filter pill - Default: transparent background, text `{colors.body}`, type `{typography.button-sm}`, padding `6px 14px`, rounded `{rounded.full}`. - Active: background flips to `{colors.ink}`, text `{colors.on-dark}` — the chip flips fully inverted on selection. **`badge-uppercase`** — text-only utility label - Background transparent, text `{colors.body}` in `{typography.utility-xs}` (uppercase) — used as in-list category prefix ("FEATURE FLAG", "EXPERIMENT", "HEATMAP"). **`badge-promo`** — small inline pill chip - Background `{colors.accent-blue-soft}`, text `{colors.link-blue}`, type `{typography.caption-xs}`, padding `2px 8px`, rounded `{rounded.full}`. - "New", "Beta", "Coming soon" pill labels overlaid on cards. ### Inputs & Forms **`text-input`** + **`text-input-focused`** - Default: background `{colors.surface-card}`, text `{colors.ink}`, 1px solid `{colors.hairline}`, type `{typography.body-md}`, padding `8px 12px`, height `36px`, rounded `{rounded.md}`. - Focused: same surface; 2px solid `{colors.accent-blue}` border replaces the 1px hairline + a translucent `{colors.focus-ring}` outline. **`search-input`** — utility search field (doc sidebar, "Ask PostHog AI") - Same dimensions as `text-input` with a magnifier glyph at the left edge in `{colors.mute}`. ### Cards & Containers **`product-card`** — marketing tile / feature card - Container: background `{colors.surface-card}` (white), 1px solid `{colors.hairline}`, padding `{spacing.xl}` (24px), rounded `{rounded.md}`. - Layout: small hedgehog illustration at top-left, `{typography.heading-sm-mixed}` title, `{typography.body-sm}` description, optional `{component.button-tertiary}` "Learn more →" link. **`doc-card`** — doc article body card - Container: background `{colors.surface-doc}` (`#fcfcfa` warm-white), 1px solid `{colors.hairline}`, padding `{spacing.xl}` (24px), rounded `{rounded.md}`. - Carries article body sections, code blocks, callout banners, and tables inside doc pages. **`feature-tile`** — small marketing feature tile - Container: background `{colors.surface-card}`, 1px solid `{colors.hairline}`, padding `{spacing.lg}` (20px), rounded `{rounded.md}`. - Used in 3-up or 4-up grids on home and workflows pages — paired with a small icon and a 1-line description. **`pricing-tier-card`** — pricing plan card - Container: background `{colors.surface-card}`, 1px solid `{colors.hairline}`, padding `{spacing.xxl}` (32px), rounded `{rounded.md}`. - Layout: tier name in `{typography.display-lg}` (24px / 800 / -0.6px), large price + period, feature checklist with check-icon bullets, primary or secondary CTA at bottom. **`hedgehog-mascot-card`** — feature card with margin-anchored hedgehog - Same chrome as `{component.product-card}` but with a hand-drawn hedgehog illustration anchored in the right margin or top-right corner — the brand's signature card variant. ### Callout Banners **`banner-tip-blue`** + **`banner-tip-green`** + **`banner-tip-red`** + **`banner-tip-purple`** - Background `{colors.accent-blue-soft}` / `{colors.accent-green-soft}` / `{colors.accent-red-soft}` / `{colors.accent-purple-soft}`, text `{colors.ink}`, type `{typography.body-md}`, padding `16px 20px`, rounded `{rounded.md}`. - Each prefixed with an inline emoji icon (💡 / ✅ / ⚠️ / 📘) followed by an inline label and body copy. - Only appear inside doc article body. The four-color callout family is the brand's information-architecture vocabulary for inline tips/warnings/info inside long-form documentation. ### Code **`code-block`** — dark code sample inside doc card - Container: background `{colors.surface-dark}` (deep olive-charcoal), text `{colors.on-dark}` in `{typography.code-sm}`, padding `16px 20px`, rounded `{rounded.md}`. - Syntax highlighting uses muted accent colors (blue for keywords, green for strings, purple for numbers) — never the bright accent colors used in callout banners. **`inline-code`** — small inline `<code>` chip - Background `{colors.surface-soft}`, text `{colors.ink}` in `{typography.code-xs}`, padding `2px 6px`, rounded `{rounded.xs}` (2px). - Used inside body prose to mark code snippets and identifiers. ### Navigation **`primary-nav`** - Background `{colors.canvas}` (cream — same as the page), text `{colors.ink}`, height `56px`, type `{typography.body-strong}`, rounded `{rounded.none}`. - Layout (desktop): PostHog wordmark + hedgehog logo at left, nav menu cluster ("Pricing · Docs · Community · Company"), right cluster with a search-glyph, "Login" link, and the always-yellow `{component.button-primary}` "Get started — free" pill anchored to the far right. **`sub-nav-strip`** — secondary nav bar (under primary) - Background `{colors.surface-soft}`, text `{colors.body}` in `{typography.body-xs}`, height `40px`, rounded `{rounded.none}`. - Sits directly below the primary nav on workflows / product pages with section anchor links and a contextual "Get started →" link at the right. **`doc-sidebar`** — sticky doc-page left sidebar - Background `{colors.canvas}`, text `{colors.body}` in `{typography.body-xs}`, width `240px`, rounded `{rounded.none}`. - Layout: search-input "Ask PostHog AI" at top, then a vertical list of section headers each with a small rounded outline-icon mini-illustration, then nested item links indented under the active header. **Top Nav (Mobile)** - Hamburger menu icon at left, PostHog wordmark + hedgehog at center, search + sticky yellow "Get started — free" CTA at right. Primary nav collapses into a full-height drawer that slides from the left. ### Footer **`footer-section`** - Background `{colors.canvas}`, text `{colors.body}` in `{typography.body-xs}`, padding `32px 24px`, rounded `{rounded.none}`, with a 1px `{colors.hairline}` top rule. - Layout: 6-column horizontal link grid (Product · Resources · Company · Community · Pricing · Legal), each column with a `{typography.utility-xs}` (uppercase) header and a vertical list of links in `{typography.body-xs}` `{colors.body}`. - Bottom row: PostHog wordmark + small hedgehog illustration, copyright in `{typography.caption-xs}` `{colors.mute}`, social-icon row at far-right. ### Inline **`link-inline`** — body-prose anchor link - `{colors.link-teal}` (`#1078a3`) in body prose with no underline by default; underline appears on focus. The brand's primary inline link color. ## Do's and Don'ts ### Do - Use `{colors.canvas}` (cream — `#eeefe9`) as the page body. Never substitute pure white as the canvas. - Reserve `{colors.primary}` (yellow-orange) for the primary CTA pill only. The "Get started — free" treatment is the brand's anchor. - Render the brand wordmark with the hedgehog illustration alongside it, not as a stand-alone wordmark. The hedgehog IS the brand identity. - Use IBM Plex Sans Variable across every text role — body 400, emphasis 600/700, display 800. - Stack content sections at `{spacing.section}` (80px) rhythm with no decorative dividers between them; let the cream canvas continue uninterrupted. - Use `{component.banner-tip-blue}` / `-green` / `-red` / `-purple` only inside doc article body for tip/warning/note panels — keep marketing chrome out of the four-color callout family. - Pair every code sample with the dark `{component.code-block}` surface; inline `<code>` chips use `{component.inline-code}` (cream surface-soft chip). - Anchor a hedgehog mascot illustration in feature tile margins on home and workflows pages — the system's signature decoration. ### Don't - Don't introduce drop shadows on cards. Cards sit flat on cream with thin olive borders only. - Don't add a second saturated chromatic CTA. Yellow-orange is the only loud color in the system. - Don't replace the cream canvas with pure white or full-bleed dark hero bands. The cream is the brand. - Don't use the four-color callout banner pastels (`{colors.accent-blue-soft}`, `-green`, `-red`, `-purple`) as marketing-card backgrounds. They belong to inline doc content only. - Don't substitute the hedgehog illustration with a generic icon set. The character system is the brand. - Don't use uppercase transform outside of `{typography.heading-sm}`, `{typography.utility-xs}`, and `{typography.caption-xs}`. Uppercase is reserved for eyebrows and footer category headers. - Don't pad cards with 32px+ on all sides except for `{component.pricing-tier-card}`. Standard cards sit at 24px internal padding. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | ultrawide | 1920px+ | Content max-width holds at 1280px; outer gutters grow to ~80px | | desktop-large | 1440px | Default — 4-up feature tile grid, 240px sticky doc sidebar visible | | desktop | 1280px | Same layout with narrower outer gutters | | desktop-small | 1024px | 4-up tiles collapse to 3-up; doc sidebar remains visible | | tablet | 768px | 3-up tiles collapse to 2-up; doc sidebar collapses into a top accordion; primary nav becomes hamburger | | mobile | 480px | Single-column everything; hero `{typography.display-xl}` scales 36px → ~28px | | mobile-narrow | 320px | Section padding tightens to 32px | ### Touch Targets All interactive elements meet WCAG AA (≥ 40×40px). `{component.button-primary}` and `{component.button-secondary}` sit at 40px height with 16px padding. `{component.text-input}` sits at 36px (just under AAA but above AA at this size). `{component.pill-tab}` is ~32–36px height with 14px padding extending to ~44px tappable via inline padding. Doc-sidebar items use 14px text with ~32px line-height + 6px vertical padding for ~44px tap rows. ### Collapsing Strategy - **Primary nav:** desktop horizontal cluster → tablet hamburger drawer at 768px. The yellow "Get started — free" CTA stays visible at every breakpoint. - **Sub-nav strip:** desktop horizontal anchor row → tablet horizontal scroll → mobile select dropdown. - **Marketing card grid:** 4-up → 3-up → 2-up → 1-up at 1024, 768, and 480px; gutters drop from 16px to 12px on mobile. - **Pricing grid:** 3-up → 2+1 → 1-up stacked at tablet and below. - **Doc layout:** desktop 240px sidebar + 720px article → tablet sidebar collapses to a top accordion → mobile fully collapsed accordion. - **Footer:** 6-up link columns → 3-up at tablet → 2-up at mobile. - **Section padding:** `{spacing.section}` (80px) desktop → 64px tablet → 48px mobile. - **Hero headline:** `{typography.display-xl}` (36px) at desktop, scaling to ~28px at mobile, line-height holding at 1.5. ### Image Behavior The only "imagery" in the system is hand-drawn hedgehog illustrations rendered as inline SVG. They preserve their natural aspect at every breakpoint and scale via CSS `width: auto; max-width: 100%`. There is no responsive art-direction needed because there is no photography. ## Iteration Guide 1. Focus on ONE component at a time. Pull its YAML entry and verify every property resolves. 2. Reference component names and tokens directly (`{colors.primary}`, `{component.button-primary-pressed}`, `{rounded.md}`) — do not paraphrase. 3. Run `npx @google/design.md lint DESIGN.md` after edits — `broken-ref`, `contrast-ratio`, and `orphaned-tokens` warnings flag issues automatically. 4. Add new variants as separate component entries (`-pressed`, `-disabled`, `-focused`) — do not bury them inside prose. 5. Default body to `{typography.body-md}` (16px / 400 / 1.5); reach for `{typography.body-strong}` for emphasis; reserve `{typography.display-lg}` (24px / 800) strictly for marketing display moments. 6. Keep `{colors.primary}` scarce per viewport — at most one yellow-orange pill per fold. 7. When introducing a new component, ask whether it can be expressed with the existing card + 6px-radius + cream-canvas vocabulary before adding new tokens. The system's strength is that it almost never needs new ones. ## Known Gaps - **Mobile screenshots not captured** — responsive behavior synthesizes PostHog's mobile pattern (hamburger drawer, single-column grid, doc sidebar accordion) from desktop evidence and the breakpoint stack. - **Hover states not documented** by system policy. - **In-product app chrome** (PostHog dashboard, charts, session replay player) not in the captured set — the marketing site is documented here, not the in-product analytics interface. - **Authenticated chrome** (login modal, account dashboard, billing settings) not in the captured pages. - **Form validation states** beyond the focused-state input not present in the captured surfaces. - **Marketing illustration set** — the full library of hedgehog character poses is not enumerated here; specific poses (lab coat hedgehog, terminal hedgehog, hammock hedgehog) are noted as visible in screenshots but the full asset library is page-specific.
Figma Canvas
Vibrant Creative
Figma Spec
复制
全球顶级在线协作设计工具的界面系统,采用彩虹多色圆点与工具栏像素线框,营造高自由度的创意画布。
多彩协同圆点
深灰工具栏
无限画板缩放
--- version: alpha name: Figma-design-analysis description: "A confident black-and-white editorial frame interrupted by oversized, hand-cut pastel color blocks. The marketing canvas is rigorously monochrome — figmaSans variable type, pure white surfaces, pure black ink, pill-shaped CTAs — while each story section drops the page into a saturated lime, lavender, cream, mint, or pink panel that reads like a sticky note placed on a clean desk. The result is a design system that feels both technical and joyful — a tool for serious work, made by people who like color." colors: primary: "#000000" on-primary: "#ffffff" ink: "#000000" canvas: "#ffffff" inverse-canvas: "#000000" inverse-ink: "#ffffff" on-inverse-soft: "#ffffff" hairline: "#e6e6e6" hairline-soft: "#f1f1f1" surface-soft: "#f7f7f5" block-lime: "#dceeb1" block-lilac: "#c5b0f4" block-cream: "#f4ecd6" block-pink: "#efd4d4" block-mint: "#c8e6cd" block-coral: "#f3c9b6" block-navy: "#1f1d3d" accent-magenta: "#ff3d8b" semantic-success: "#1ea64a" overlay-scrim: "#000000" typography: display-xl: fontFamily: figmaSans fontSize: 86px fontWeight: 340 lineHeight: 1.00 letterSpacing: -1.72px fontFeature: kern display-lg: fontFamily: figmaSans fontSize: 64px fontWeight: 340 lineHeight: 1.10 letterSpacing: -0.96px fontFeature: kern headline: fontFamily: figmaSans fontSize: 26px fontWeight: 540 lineHeight: 1.35 letterSpacing: -0.26px fontFeature: kern subhead: fontFamily: figmaSans fontSize: 26px fontWeight: 340 lineHeight: 1.35 letterSpacing: -0.26px fontFeature: kern card-title: fontFamily: figmaSans fontSize: 24px fontWeight: 700 lineHeight: 1.45 letterSpacing: 0 fontFeature: kern body-lg: fontFamily: figmaSans fontSize: 20px fontWeight: 330 lineHeight: 1.40 letterSpacing: -0.14px fontFeature: kern body: fontFamily: figmaSans fontSize: 18px fontWeight: 320 lineHeight: 1.45 letterSpacing: -0.26px fontFeature: kern body-sm: fontFamily: figmaSans fontSize: 16px fontWeight: 330 lineHeight: 1.45 letterSpacing: -0.14px fontFeature: kern link: fontFamily: figmaSans fontSize: 20px fontWeight: 480 lineHeight: 1.40 letterSpacing: -0.10px fontFeature: kern button: fontFamily: figmaSans fontSize: 20px fontWeight: 480 lineHeight: 1.40 letterSpacing: -0.10px fontFeature: kern eyebrow: fontFamily: figmaMono fontSize: 18px fontWeight: 400 lineHeight: 1.30 letterSpacing: 0.54px fontFeature: kern caption: fontFamily: figmaMono fontSize: 12px fontWeight: 400 lineHeight: 1.00 letterSpacing: 0.60px fontFeature: kern rounded: xs: 2px sm: 6px md: 8px lg: 24px xl: 32px pill: 50px full: 9999px spacing: hair: 1px xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 10px 20px button-primary-pressed: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 8px 18px 10px button-tertiary-text: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.link}" rounded: "{rounded.full}" padding: 8px 12px button-icon-circular: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.full}" size: 40px button-icon-circular-inverse: backgroundColor: "{colors.on-inverse-soft}" textColor: "{colors.inverse-ink}" typography: "{typography.button}" rounded: "{rounded.full}" size: 40px button-magenta-promo: backgroundColor: "{colors.accent-magenta}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 10px 18px pricing-tab-default: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 8px 18px pricing-tab-selected: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 8px 18px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: 12px 14px text-input-focused: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: 12px 14px pricing-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.lg}" padding: 24px pricing-card-feature-row: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.xs}" color-block-section: backgroundColor: "{colors.block-lime}" textColor: "{colors.ink}" typography: "{typography.subhead}" rounded: "{rounded.lg}" padding: 48px color-block-section-lilac: backgroundColor: "{colors.block-lilac}" textColor: "{colors.ink}" typography: "{typography.subhead}" rounded: "{rounded.lg}" padding: 48px color-block-section-navy: backgroundColor: "{colors.block-navy}" textColor: "{colors.inverse-ink}" typography: "{typography.subhead}" rounded: "{rounded.lg}" padding: 48px promo-banner-lilac: backgroundColor: "{colors.block-lilac}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.md}" padding: 16px 24px template-card: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.md}" padding: 16px feature-illustration-tile: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ink}" typography: "{typography.eyebrow}" rounded: "{rounded.md}" padding: 24px top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.xs}" height: 56px marquee-strip: backgroundColor: "{colors.inverse-canvas}" textColor: "{colors.inverse-ink}" typography: "{typography.body-sm}" rounded: "{rounded.xs}" height: 36px comparison-checkmark: backgroundColor: "{colors.canvas}" textColor: "{colors.semantic-success}" typography: "{typography.body-sm}" rounded: "{rounded.full}" size: 16px footer: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.caption}" rounded: "{rounded.xs}" padding: 64px 32px --- ## Overview Figma's marketing canvas is, at the system level, an editor-clean black-and-white frame. The chrome — top nav, body type, footer, primary CTA — is monochrome. Headlines are oversized `{typography.display-xl}` set in `figmaSans` with aggressive negative tracking, body copy hovers around weight 320–340 of the same variable family, and small mono `{typography.eyebrow}` and `{typography.caption}` labels (figmaMono, all-caps, positive tracking) act as section markers. Every CTA is a pill — `{rounded.pill}` — and the primary action across the entire site is the same black `{components.button-primary}` paired with the same white `{components.button-secondary}`. What makes the design unique is what happens **between** those monochrome bookends: the page repeatedly drops into oversized pastel **color-block sections** — lime, lavender, cream, mint, pink, coral, and a deep navy — that span the full content width with `{rounded.lg}` corners and `{spacing.xxl}` interior padding. These blocks are where the storytelling lives. They aren't accents tucked into a card; they take over a whole viewport's worth of vertical space, like a designer arranging giant sticky notes on a clean wall. FigJam is the most pastel-saturated, the home page rotates through the full set, and the pricing page ends with a lime FAQ panel — same vocabulary, different rhythm per route. This is a system built on contrast: the monochrome chrome makes the color blocks feel intentional rather than decorative, and the color blocks make the monochrome chrome feel like editorial paper rather than enterprise SaaS. Density is generous, line-heights are tight on display sizes, and the interface never reaches for shadows or gradients to do the work that color blocks and confident typography already do. **Key Characteristics:** - Monochrome system core: `{colors.primary}` (black) and `{colors.canvas}` (white) carry every CTA, every body line, every footer link. - Oversized pastel **color-block sections** (`{colors.block-lime}`, `{colors.block-lilac}`, `{colors.block-cream}`, `{colors.block-mint}`, `{colors.block-pink}`, `{colors.block-coral}`, `{colors.block-navy}`) define the narrative rhythm of every long-form page. - Pill is the only button shape — `{rounded.pill}` for text CTAs, `{rounded.full}` for icon buttons. No square buttons anywhere. - `figmaSans` variable typeface used at unusually fine weight increments (320, 330, 340, 450, 480, 540) — the type system reads as a single voice that flexes rather than a multi-weight family. - Tight negative letter-spacing on display sizes (-1.72px at 86px, -0.96px at 64px) creates a confident editorial cadence. - `figmaMono` reserved for category labels, eyebrows, and captions — always uppercase, positive tracking — to flag taxonomy without competing with display type. - Color-block page rhythm (home): white hero → marquee strip → white feature → lime systems block → navy ship-products block → coral developer block → white template grid → white footer. ## Colors > Source pages: figma.com (home), /design/, /figjam/brainstorming-tool/, /pricing/, /contact/. ### Brand & Accent - **Black** ({colors.primary}): The system primary. Every primary CTA, every headline, every body line, the marquee strip, the inverse canvas of dark sections. - **White** ({colors.on-primary}): Inverse text on black surfaces; also the canvas color used as the foreground of secondary pill buttons (`{components.button-secondary}`). - **Magenta Promo** ({colors.accent-magenta}): A single saturated CTA pink reserved for promotional inline buttons — appears, for example, on the lilac "Save your spot" Release Notes banner. Use scarcely; it is not a section color. ### Surface - **Canvas** ({colors.canvas}): Default page background and the body of every white card. - **Inverse Canvas** ({colors.inverse-canvas}): Footer, marquee strip, and a subset of "ship products"-style story sections. - **Surface Soft** ({colors.surface-soft}): Off-white tile background used for icon buttons, template cards, and feature illustration tiles when they sit on the white canvas. - **Hairline** ({colors.hairline}): 1px borders on form inputs, pricing cards, and table dividers. - **Hairline Soft** ({colors.hairline-soft}): Even subtler dividers — comparison-table row separators and footer column rules. - **Block Lime** ({colors.block-lime}): The signature **systems / FAQ / contact-form** color block. Recurs across home, pricing, contact. - **Block Lilac** ({colors.block-lilac}): Hero block on `/design/`; also the inline Release Notes promo banner. - **Block Cream** ({colors.block-cream}): Soft warm background — FigJam hero strip, template-grid section. - **Block Mint** ({colors.block-mint}): FigJam pastel section. - **Block Pink** ({colors.block-pink}): FigJam pastel section. - **Block Coral** ({colors.block-coral}): "Ship products" coral story block on home. - **Block Navy** ({colors.block-navy}): Deep indigo story block — only place dark surfaces appear above the footer. ### Text - **Ink** ({colors.ink}): All headline, body, and caption type on light surfaces. There is no softer mid-gray text role on marketing — body copy is always black at weight 320–340, and weight (not opacity) carries the hierarchy. - **Inverse Ink** ({colors.inverse-ink}): Type on inverse-canvas surfaces (footer, marquee strip, navy color block). - **On-Inverse Soft** ({colors.on-inverse-soft}): White used at ~16% opacity for circular icon-button surfaces against dark sections (token captures the base color; the translucency is applied at render time). ### Semantic - **Success Green** ({colors.semantic-success}): Comparison-table checkmarks on pricing. Used as a glyph fill, not a surface. - **Overlay Scrim** ({colors.overlay-scrim}): Black used at ~60% opacity behind modal / video-overlay surfaces (token captures the base; opacity applied at render time). ## Typography ### Font Family - **figmaSans** — Figma's proprietary variable typeface; fallback stack `figmaSans Fallback, SF Pro Display, system-ui, helvetica`. Variable weight axis is exercised at unusually fine increments (320, 330, 340, 450, 480, 540, 700) — the design system reads as a single voice modulating rather than a stepped weight family. - **figmaMono** — Proprietary monospace; fallback `figmaMono Fallback, SF Mono, menlo`. Used exclusively for eyebrow labels and captions, always uppercase with positive letter-spacing. OpenType `kern` is enabled across every role. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 86px | 340 | 1.00 | -1.72px | Hero headlines (home, FigJam) | | `{typography.display-lg}` | 64px | 340 | 1.10 | -0.96px | Section opener headlines | | `{typography.headline}` | 26px | 540 | 1.35 | -0.26px | Story-block titles inside color blocks | | `{typography.subhead}` | 26px | 340 | 1.35 | -0.26px | Long-form intro paragraphs that sit at near-headline scale | | `{typography.card-title}` | 24px | 700 | 1.45 | 0 | Pricing-tier titles, feature card titles | | `{typography.body-lg}` | 20px | 330 | 1.40 | -0.14px | Lead body copy on hero, contact form labels | | `{typography.body}` | 18px | 320 | 1.45 | -0.26px | Default body | | `{typography.body-sm}` | 16px | 330 | 1.45 | -0.14px | Card body, footer link list | | `{typography.link}` | 20px | 480 | 1.40 | -0.10px | Inline link emphasis | | `{typography.button}` | 20px | 480 | 1.40 | -0.10px | All pill buttons, primary and secondary | | `{typography.eyebrow}` | 18px | 400 | 1.30 | 0.54px | figmaMono uppercase section eyebrows | | `{typography.caption}` | 12px | 400 | 1.00 | 0.60px | figmaMono uppercase captions, footer column heads | ### Principles - **Weight, not size, carries hierarchy on body copy.** A 20px paragraph at weight 330 sits next to a 20px link at weight 480 — the eye reads emphasis without scale change. - **Negative letter-spacing scales with size.** Display-xl pulls -1.72px; subhead pulls only -0.26px. Body copy stays near-zero. The result is editorial-feeling display type without sacrificing readability at body size. - **Mono is taxonomy, not body.** figmaMono is reserved for eyebrows and captions — never used to set a paragraph. - **Tight line-heights on display, generous on body.** Display sizes run 1.00–1.10; body runs 1.40–1.45. The contrast reinforces that headlines are graphics and body copy is for reading. ### Note on Font Substitutes If implementing without access to figmaSans / figmaMono, suitable open-source substitutes are **Inter** (or **Geist**) for the sans, and **JetBrains Mono** (or **Geist Mono**) for the mono. Inter at variable weights closely matches the fine-grained weight axis figmaSans uses; expect to manually adjust line-heights down by ~0.02 to compensate for Inter's slightly taller x-height. ## Layout ### Spacing System - **Base unit**: 8px. - **Tokens (front matter)**: `{spacing.hair}` 1px · `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px. - Section interior padding: `{spacing.xxl}` (48px) on color-block sections. - Card interior padding: `{spacing.lg}` (24px) on pricing cards and template tiles. - Form input padding: `{spacing.sm}` 12px vertical · 14px horizontal. - Button padding: `{spacing.xs}` 8px vertical · `{spacing.lg}` 24px horizontal for pill buttons (the asymmetric `8px 18px 10px` extracted on `button-secondary` nudges the type optically inside the pill). - Universal rhythm constant: `{spacing.section}` (96px) — the vertical gap between major content sections holds across home, pricing, and FigJam pages. ### Grid & Container - Max content width sits around 1280px (one of the explicit breakpoints), with side gutters that scale from `{spacing.xxl}` on desktop down to `{spacing.lg}` on mobile. - Three- and four-column grids on the desktop pricing comparison and FigJam template galleries. - Color-block sections break the column grid — they span content width with full bleed inside the rounded `{rounded.lg}` corners, then place a single editorial column of headline + body inside. ### Whitespace Philosophy White space is used to make the color blocks feel deliberate. Between every colored panel and the next, the page returns to white canvas with `{spacing.section}` of breathing room. Inside a color block, the type itself is given generous side margins (often more than 1/4 of the block's width on each side) so the panel reads as a poster, not a wall of copy. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 (flat) | No shadow, no border | Default for color-block sections, inverse-canvas footer, hero | | 1 (hairline) | 1px `{colors.hairline}` border on `{colors.canvas}` | Pricing cards, form inputs, comparison table cells | | 2 (soft elevation) | Subtle drop shadow approx 0 4px 16px rgba(0,0,0,0.06) | Floating template tiles, dropdown menus | | 3 (modal) | Stronger shadow + `{colors.overlay-scrim}` behind | Video / image lightbox overlays | Figma's marketing system is shadow-light by design — the color blocks substitute for traditional elevation. Where most SaaS sites use a shadowed white card to draw attention, Figma uses a saturated background panel. This makes the rare actual shadow (e.g., a floating template card hovering over a cream section) feel like an exception worth noticing. ### Decorative Depth - **Color-block sections** are the primary depth device. The change from white canvas to lime / lavender / cream is the section break. - **Sticky-note style component thumbnails** in FigJam — slightly off-axis pastel rectangles arranged like notes on a board — read as collage, not card-stack. - **Embedded product UI mocks** (Figma Design panels, FigJam canvas snippets) appear as flat compositions on color blocks; their internal shadows are subtle and stay within the mock. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 2px | Anchor / link decoration corners | | `{rounded.sm}` | 6px | Small chips, sub-nav tabs | | `{rounded.md}` | 8px | Form inputs, list items, image frames | | `{rounded.lg}` | 24px | Pricing cards, color-block sections, large image containers | | `{rounded.xl}` | 32px | Hero feature panels, oversized callouts | | `{rounded.pill}` | 50px | All text CTAs (primary, secondary, tab toggles) | | `{rounded.full}` | 9999px | Circular icon buttons, comparison-table checkmark glyphs | ### Photography & Illustration Geometry - Image frames use `{rounded.md}` (8px) — generous enough to feel friendly, conservative enough to read as editorial. - Template thumbnails on the home grid sit in `{rounded.md}` tiles with `{spacing.md}` interior padding around the embedded preview. - FigJam pastel sticky-note component thumbnails preserve a small `{rounded.sm}` corner that mimics actual sticky paper. - No avatar circles appear in marketing surfaces — Figma's marketing avoids personification. ## Components ### Buttons **`button-primary`** — The black "Get started for free" pill that appears in the top nav, every hero, and every closing CTA. - Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.button}`, padding 10px 20px, rounded `{rounded.pill}`. - Pressed state lives in `button-primary-pressed` (same surface; the live site relies on micro-scale rather than a darkened fill). **`button-secondary`** — White pill with black text. Used for tertiary navigation actions ("Contact sales") and as the visual counterpart to the primary pill. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.button}`, padding 8px 18px 10px (asymmetric vertical to optically center the type), rounded `{rounded.pill}`. No border. **`button-tertiary-text`** — Plain text link styled as a button hit target inside top nav and footer. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.link}`, rounded `{rounded.full}` (hit target only), padding `{spacing.xs}` `{spacing.sm}`. **`button-icon-circular`** — 40px circular icon button used for carousel controls, social links, and inline actions on light surfaces. - Background `{colors.surface-soft}`, text `{colors.ink}`, rounded `{rounded.full}`, size 40px. **`button-icon-circular-inverse`** — Same shape, used on inverse-canvas / dark color blocks. - Background `{colors.on-inverse-soft}` (translucent white), text `{colors.inverse-ink}`, rounded `{rounded.full}`, size 40px. **`button-magenta-promo`** — Saturated pink pill used only inside promotional surfaces such as the lilac "Save your spot" Release Notes banner. Reserved for moments where Figma's product team wants the CTA to pop against an already-colored panel. - Background `{colors.accent-magenta}`, text `{colors.on-primary}`, type `{typography.button}`, rounded `{rounded.pill}`, padding 10px 18px. ### Pricing Tabs **`pricing-tab-default`** + **`pricing-tab-selected`** — The pill-toggle that switches between Starter / Professional / Organization / Enterprise on `/pricing/`. - Default: `{colors.canvas}` background, `{colors.ink}` text, rounded `{rounded.pill}`. - Selected: `{colors.primary}` background, `{colors.on-primary}` text — exactly the same surface as `button-primary`, which makes the selected tab feel like an active CTA, not a passive state. ### Inputs & Forms **`text-input`** + **`text-input-focused`** — Form fields on `/contact/` and pricing seat-count steppers. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.md}`, padding 12px 14px. - Focused state retains the same surface — focus is communicated via ring, not via fill change. ### Cards & Containers **`pricing-card`** — Each tier on `/pricing/`. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding `{spacing.lg}`. Stroked with `{colors.hairline}` rather than shadowed. **`pricing-card-feature-row`** — Single row inside the comparison table. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-sm}`. Row separator is `{colors.hairline-soft}`. **`template-card`** — Thumbnail tile in the home "Explore what people are making" grid and the FigJam template gallery. - Background `{colors.surface-soft}`, text `{colors.ink}`, type `{typography.body-sm}`, rounded `{rounded.md}`, padding `{spacing.md}`. **`feature-illustration-tile`** — Larger composition tile that holds a product UI mock or pastel illustration. - Background `{colors.surface-soft}`, text `{colors.ink}`, type `{typography.eyebrow}`, rounded `{rounded.md}`, padding `{spacing.lg}`. ### Color-Block Sections (signature) The defining surface of Figma's marketing. Each is a full-content-width panel with `{rounded.lg}` corners and `{spacing.xxl}` interior padding. Variants: **`color-block-section`** — lime ground for "systems" stories (home), pricing FAQ, and the contact form. - Background `{colors.block-lime}`, text `{colors.ink}`, type `{typography.subhead}`, rounded `{rounded.lg}`, padding `{spacing.xxl}`. **`color-block-section-lilac`** — lavender ground for `/design/` hero and FigJam highlight sections. - Background `{colors.block-lilac}`, otherwise identical structure. **`color-block-section-navy`** — deep indigo ground for the home "Ship products" story block. The only inverse color-block surface above the footer. - Background `{colors.block-navy}`, text `{colors.inverse-ink}`, otherwise identical structure. (Cream, mint, pink, and coral block variants follow the same shape with their respective `{colors.block-*}` surface.) ### Promo Banner **`promo-banner-lilac`** — The Release Notes / "Save your spot" inline banner that floats above the contact form. - Background `{colors.block-lilac}`, text `{colors.ink}`, type `{typography.body-sm}`, rounded `{rounded.md}`, padding `{spacing.md}` `{spacing.lg}`. Carries a `button-magenta-promo` on the right edge. ### Navigation **`top-nav`** — Sticky white bar with logo, primary nav links, sign-in link, and the right-anchored `button-secondary` ("Contact sales") + `button-primary` ("Get started for free") pair. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-sm}`, height 56px. - Mobile: collapses primary links into a hamburger that opens a full-canvas overlay; the two pill CTAs remain visible on the bar. **`marquee-strip`** — Thin black ribbon directly under the nav that scrolls through customer logos in white. - Background `{colors.inverse-canvas}`, text `{colors.inverse-ink}`, type `{typography.body-sm}`, height 36px. ### Comparison Glyphs **`comparison-checkmark`** — Green check used in the pricing comparison matrix. - Background `{colors.canvas}`, glyph color `{colors.semantic-success}`, rounded `{rounded.full}`, size 16px. ### Footer **`footer`** — Dense link grid on white canvas with the wordmark "Figma" set in display weight at the top-left. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.caption}` for column headings and small links, padding `{spacing.section}` top/bottom · `{spacing.xl}` sides. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` for genuine primary CTAs and selected states (e.g., `pricing-tab-selected`). Don't use it as a decorative accent. - When introducing a story section, choose **one** color block from the `{colors.block-*}` family and let it span full content width with `{rounded.lg}` corners and `{spacing.xxl}` interior padding. - Keep type in `figmaSans` at variable weights — pick from 320, 330, 340, 480, 540, 700 to express hierarchy. Avoid intermediate weights outside this set. - Use `figmaMono` only for eyebrows and captions, always uppercase, with the documented positive letter-spacing. - Compose every CTA as a pill (`{rounded.pill}`) and every icon button as a circle (`{rounded.full}`). - Allow the page to **return to white canvas** between every two color blocks so each block reads as deliberate. - Pair `button-primary` and `button-secondary` whenever a section needs both a primary action and a sales / secondary action — the black-and-white pair is the brand signature. ### Don't - Don't introduce mid-gray text. Body hierarchy comes from `figmaSans` weight, not from opacity. - Don't add drop shadows to color-block sections — the color is the depth device. - Don't introduce new accent colors outside the documented `{colors.block-*}` palette and `{colors.accent-magenta}`. Adding, e.g., a saturated brand orange would break the system. - Don't combine more than one color block visible inside a single viewport — Figma's pacing always lets the white canvas separate them. - Don't square off CTAs. Square buttons read as a different brand. - Don't put `figmaMono` in body copy — it's a taxonomy tool, not a reading typeface. - Don't replace the `pricing-tab-selected` black fill with a colored tab; the brand pattern is "selected = primary surface". ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | 4k | 1920px | Max content width holds at 1280px; gutters expand | | Desktop-XL | 1440px | Default desktop layout | | Desktop | 1400px | Comparison table column widths normalize | | Desktop-S | 1280px | Pricing 4-up tier grid maintained | | Tablet | 960px | Pricing collapses 4-up → 2-up; nav becomes hamburger | | Mobile-L | 768px | Color-block sections become full-bleed (no rounded corners on edges) | | Mobile | 560px | Display-xl reduces from 86px to ~48px; pill CTAs go full-width | | Mobile-XS | 559px | Two-column footer collapses to single column | ### Touch Targets - Pill buttons (`button-primary`, `button-secondary`) maintain a minimum 44px tap height across all viewports — achieved by combining `{typography.button}` 20px line-height with the documented vertical padding. - Circular icon buttons (`button-icon-circular`) are 40px on desktop and grow to 44px on touch viewports. - Form input minimum tap target on `/contact/` is 48px high. ### Collapsing Strategy - **Nav**: desktop horizontal nav with two right-anchored pills collapses to a hamburger overlay below 960px. The two pills (`Contact sales`, `Get started for free`) stay visible on the bar above 560px and stack in the overlay below. - **Pricing tier grid**: 4-up → 2-up at 960px → 1-up below 768px. The pill toggle stays horizontal and scrolls horizontally if needed below 560px. - **Color-block sections**: above 768px the section keeps `{spacing.xxl}` of canvas around it so the rounded corners read; below 768px the corners are removed and the block bleeds to viewport edge for a poster effect. - **Comparison table**: below 960px the matrix collapses into per-tier accordions to avoid horizontal scroll. ### Image Behavior - Product UI mocks inside color blocks scale proportionally and never crop. Below 768px they shrink rather than reflow. - Template thumbnails in the home grid use lazy loading and animate in on scroll. - Sticky-note style FigJam thumbnails maintain their slight off-axis rotation across breakpoints — the rotation is a brand signal, not a desktop-only flourish. ## Iteration Guide 1. Focus on ONE component at a time and reference it by its `components:` token name (e.g., `{components.button-primary}`, `{components.color-block-section}`). 2. When introducing a new section, decide **first** which `{colors.block-*}` token it sits on; the surface choice is the most consequential decision. 3. Default body type to `{typography.body}`; reach for `{typography.subhead}` or `{typography.headline}` only inside a color block. 4. Run `npx @google/design.md lint DESIGN.md` after edits — `broken-ref`, `contrast-ratio`, and `orphaned-tokens` warnings flag issues automatically. 5. Add new variants as separate component entries (`-pressed`, `-selected`) — do not bury them in prose. 6. Keep `{colors.primary}` scarce. If two `button-primary` instances appear in the same viewport, the section is doing too much — neutralize one to `button-secondary`. 7. Treat `{colors.accent-magenta}` as a single-shot color: one promo CTA per page, never two. ## Known Gaps - The exact pastel hex values of `{colors.block-*}` are derived from screenshot pixels; the production source likely uses named tokens that aren't exposed via CSS variables. Treat the documented hex values as faithful approximations rather than exact brand specs. - Dark mode is not documented because the marketing site does not ship a dark theme — the closest analog is the navy color-block (`color-block-section-navy`) and the inverse-canvas footer. - Form-field error and validation styling is not visible on `/contact/` because no error states render in the static screenshot. Inputs have hairline borders and rounded `{rounded.md}` corners; error treatment is not documented. - The animated marquee-strip and color-block reveal animations are not documented (per the no-interaction policy).
Framer Studio
Motion Blue
Framer Spec
复制
面向高动效与交互网站的暗黑前沿构建系统,使用霓虹极光蓝作为交互焦点,强调速度感与无边框美学。
霓虹极光蓝
无网格画布
微秒响应状态
--- version: alpha name: Framer-design-analysis description: "A confident dark-canvas builder marketing site that treats the page like a working artboard — pure black surfaces, white display type set in GT Walsheim Medium with aggressive negative tracking, and a single confident blue (#0099ff) reserved for hyperlinks and selection states. The page rhythm is broken by oversized vibrant gradient atmosphere panels — magenta, violet, orange spotlights — that act as living showcase tiles, not decoration. Every CTA is a white pill on dark; every card is a translucent or charcoal surface; every section title pulls letter-spacing tight enough to feel like a poster." colors: primary: "#ffffff" on-primary: "#000000" accent-blue: "#0099ff" ink: "#ffffff" ink-muted: "#999999" canvas: "#090909" surface-1: "#141414" surface-2: "#1c1c1c" hairline: "#262626" hairline-soft: "#1a1a1a" inverse-canvas: "#ffffff" inverse-ink: "#000000" gradient-magenta: "#d44df0" gradient-violet: "#6a4cf5" gradient-orange: "#ff7a3d" gradient-coral: "#ff5577" semantic-success: "#22c55e" typography: display-xxl: fontFamily: GT Walsheim Framer Medium fontSize: 110px fontWeight: 500 lineHeight: 0.85 letterSpacing: -5.5px display-xl: fontFamily: GT Walsheim Medium fontSize: 85px fontWeight: 500 lineHeight: 0.95 letterSpacing: -4.25px fontFeature: ss02 display-lg: fontFamily: GT Walsheim Medium fontSize: 62px fontWeight: 500 lineHeight: 1.00 letterSpacing: -3.1px fontFeature: ss02 display-md: fontFamily: GT Walsheim Medium fontSize: 32px fontWeight: 500 lineHeight: 1.13 letterSpacing: -1.0px headline: fontFamily: Inter fontSize: 22px fontWeight: 700 lineHeight: 1.20 letterSpacing: -0.8px fontFeature: cv05 subhead: fontFamily: Inter Variable fontSize: 24px fontWeight: 400 lineHeight: 1.30 letterSpacing: -0.01px fontFeature: cv11 body-lg: fontFamily: Inter Variable fontSize: 18px fontWeight: 400 lineHeight: 1.30 letterSpacing: -0.18px fontFeature: cv11 body: fontFamily: Inter Variable fontSize: 15px fontWeight: 400 lineHeight: 1.30 letterSpacing: -0.15px fontFeature: cv11 body-sm: fontFamily: Inter Variable fontSize: 14px fontWeight: 500 lineHeight: 1.40 letterSpacing: -0.14px fontFeature: cv11 caption: fontFamily: Inter Variable fontSize: 13px fontWeight: 500 lineHeight: 1.20 letterSpacing: -0.13px fontFeature: cv11 micro: fontFamily: Inter Variable fontSize: 12px fontWeight: 400 lineHeight: 1.20 letterSpacing: -0.12px fontFeature: cv11 button: fontFamily: Inter Variable fontSize: 14px fontWeight: 500 lineHeight: 1.0 letterSpacing: -0.14px fontFeature: cv11 rounded: xs: 4px sm: 6px md: 10px lg: 15px xl: 20px xxl: 30px pill: 100px full: 9999px spacing: hair: 1px xxs: 4px xs: 8px sm: 12px md: 15px lg: 20px xl: 30px xxl: 40px section: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 10px 15px button-primary-pressed: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" button-secondary: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 10px 15px button-translucent: backgroundColor: "{colors.surface-2}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.xxl}" padding: 8px 14px button-icon-circular: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.full}" size: 40px pricing-tab-default: backgroundColor: "{colors.canvas}" textColor: "{colors.ink-muted}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 8px 14px pricing-tab-selected: backgroundColor: "{colors.surface-2}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 8px 14px text-input: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: 10px 14px text-input-focused: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: 10px 14px pricing-card: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xl}" padding: 24px pricing-card-featured: backgroundColor: "{colors.surface-2}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xl}" padding: 24px template-card: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.lg}" padding: 12px gradient-spotlight-card: backgroundColor: "{colors.gradient-violet}" textColor: "{colors.ink}" typography: "{typography.subhead}" rounded: "{rounded.xl}" padding: 32px gradient-spotlight-card-magenta: backgroundColor: "{colors.gradient-magenta}" textColor: "{colors.ink}" typography: "{typography.subhead}" rounded: "{rounded.xl}" padding: 32px gradient-spotlight-card-orange: backgroundColor: "{colors.gradient-orange}" textColor: "{colors.ink}" typography: "{typography.subhead}" rounded: "{rounded.xl}" padding: 32px product-mockup-tile: backgroundColor: "{colors.surface-1}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.xl}" padding: 16px feature-row: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xs}" comparison-row: backgroundColor: "{colors.canvas}" textColor: "{colors.ink-muted}" typography: "{typography.body-sm}" rounded: "{rounded.xs}" top-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-sm}" rounded: "{rounded.xs}" height: 56px faq-row: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: 24px footer: backgroundColor: "{colors.canvas}" textColor: "{colors.ink-muted}" typography: "{typography.caption}" rounded: "{rounded.xs}" padding: 64px 32px --- ## Overview Framer's marketing canvas is a near-pure black artboard. The dominant surface is `{colors.canvas}` — almost pure black with a faint warmth — and on top of it sits oversized white display type set in **GT Walsheim Medium** with letter-spacing pulled to extreme negative values (-5.5px on the 110px display, -4.25px on the 85px hero). The page reads like a poster: one assertive statement per band, generous breathing room above and below. The single accent is `{colors.accent-blue}` — used scarcely, mostly for hyperlinks, selection halos, and a subtle blue-tinted shadow ring on focused inputs. The brand chrome itself is monochrome: white pill buttons, charcoal cards, gray secondary text. What makes Framer distinctive is the rhythm break — every few sections the page drops in a **vibrant gradient atmosphere card**: a magenta-violet spotlight, a sunset-orange wash, a coral-pink panel. These aren't section backgrounds; they're individual cards arranged in a card grid, each one a small living poster that shows what Framer can produce. Body type is **Inter Variable**, with Framer leaning hard into Inter's character variants (`cv01`, `cv05`, `cv09`, `cv11`, `ss03`, `ss07`, `dlig`) — the result is a body voice that feels custom-tuned, with single-storey "a", straight-leg "l", and tabular figures. There's no light mode on the marketing site; the brand IS dark. **Key Characteristics:** - Black-canvas marketing system: `{colors.canvas}` is the surface for hero, body, pricing, FAQ, and footer alike — no light interludes. - Massive negative letter-spacing on display sizes (-5.5px / -4.25px / -3.1px) creates a poster-grade headline cadence. - White pill (`{components.button-primary}`) is the only primary CTA shape across the site; secondary actions live as charcoal pills (`{components.button-secondary}`) or text links. - Oversized **gradient spotlight cards** (violet, magenta, orange, coral) act as showcase tiles inside the dark grid; they are individual cards, not section backgrounds. - Inter Variable with bespoke OpenType character variants (`cv01/05/09/11`, `ss03/ss07`, `dlig`) used everywhere body type appears — the typographic voice is unmistakable. - Border radius scale runs from 4px utility chips up to 100px pills and full circles, with 15–20px the default for cards and 30px for atmospheric gradient cards. - A single chromatic accent `{colors.accent-blue}` reserved for hyperlinks, focus, and selection — never decorative. ## Colors > Source pages: framer.com (home), /ai/, /startups/, /marketplace/templates/nudge/, /gallery/a16z-speedrun-×-tonik, /pricing. ### Brand & Accent - **Pure White** ({colors.primary}): The brand primary surface. Every primary CTA pill, every display headline, every body line on canvas. - **Sky Blue** ({colors.accent-blue}): The single chromatic accent. Hyperlinks, focused-input rings, and a few selection states. Never used for backgrounds or as a brand fill. ### Surface - **Canvas** ({colors.canvas}): Default page background — near-black with a faint warmth. Footer, pricing, hero, and FAQ all sit on it. - **Surface 1** ({colors.surface-1}): One step above canvas — pricing cards, secondary buttons, mockup tiles. - **Surface 2** ({colors.surface-2}): Two steps above — featured pricing card, hero pill backdrop, selected pricing tab. - **Hairline** ({colors.hairline}): 1px borders on input groups, comparison-table dividers. - **Hairline Soft** ({colors.hairline-soft}): Subtler dividers — between FAQ rows and footer column rules. - **Inverse Canvas** ({colors.inverse-canvas}): Pure white — used as the surface of light-on-dark pill CTAs and a small set of light-mode template thumbnails embedded in the showcase grid. ### Text - **Ink** ({colors.ink}): All headline and emphasized body type — pure white. - **Ink Muted** ({colors.ink-muted}): Secondary type — gray (#999999) used for meta info, footer columns, comparison-row labels, deselected pricing tabs. Hierarchy on the dark canvas is carried by ink → ink-muted contrast, not by weight changes. ### Semantic - **Success Green** ({colors.semantic-success}): Pricing comparison-table checkmarks. Glyph fill, not surface. ### Brand Gradient (signature) - **Gradient Magenta** ({colors.gradient-magenta}): Spotlight card variant. - **Gradient Violet** ({colors.gradient-violet}): Spotlight card variant — most common. - **Gradient Orange** ({colors.gradient-orange}): Spotlight card variant — sunset wash. - **Gradient Coral** ({colors.gradient-coral}): Spotlight card variant — coral/pink. These four sit as oversized atmospheric tiles inside otherwise monochrome card grids — a dark canvas with one or two glowing spotlight cards is a recurring page signature. ## Typography ### Font Family - **GT Walsheim Framer Medium** / **GT Walsheim Medium** — Framer's display typeface. Geometric, slightly humanist, very confident at large sizes with extreme negative tracking. Fallbacks: `GT Walsheim Medium Placeholder` system font. - **Inter Variable** — System body typeface. Used with extensive OpenType character variants: `cv01` (alternate "1"), `cv05` (alternate "g"), `cv09` (alternate "i" / "l"), `cv11` (alternate "0"), `ss03` / `ss07` stylistic sets, `dlig` discretionary ligatures, and `tnum` for numerics in tabular contexts. The result is a body voice that feels bespoke without commissioning a custom face. - **Inter** — Used selectively for `{typography.headline}` (the 22px / 20px tier). The non-variable cut catches small tracking targets that the variable file rounds. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xxl}` | 110px | 500 | 0.85 | -5.5px | Largest hero headline (home, AI page) | | `{typography.display-xl}` | 85px | 500 | 0.95 | -4.25px | Section opener headlines | | `{typography.display-lg}` | 62px | 500 | 1.00 | -3.1px | Sub-section openers | | `{typography.display-md}` | 32px | 500 | 1.13 | -1.0px | Card titles, smaller display | | `{typography.headline}` | 22px | 700 | 1.20 | -0.8px | Pricing tier headlines, FAQ category titles | | `{typography.subhead}` | 24px | 400 | 1.30 | -0.01px | Lead body next to display headlines | | `{typography.body-lg}` | 18px | 400 | 1.30 | -0.18px | Hero subhead, lead paragraphs | | `{typography.body}` | 15px | 400 | 1.30 | -0.15px | Default body, card descriptions | | `{typography.body-sm}` | 14px | 500 | 1.40 | -0.14px | Pricing comparison rows, dense data | | `{typography.caption}` | 13px | 500 | 1.20 | -0.13px | Eyebrows, footer columns, meta | | `{typography.micro}` | 12px | 400 | 1.20 | -0.12px | Disclaimer, footnote | | `{typography.button}` | 14px | 500 | 1.0 | -0.14px | Pill buttons | ### Principles - **Letter-spacing scales with size, hard.** Display-xxl pulls -5.5px (5% of size); body sticks to about -1% (-0.15px on 15px). The result: posters at the top, comfortable reading at body. - **OpenType character variants are the brand voice.** Switching off `cv11`, `ss03`, etc. visibly changes the body voice — the brand depends on them. - **Weight stays in a narrow band.** Display sits at 500, body at 400, body-sm/caption at 500. Hierarchy is carried by size + tracking, not by 700/900 ramps. - **Tight line-heights everywhere.** Even body runs at 1.30 — Framer's editorial tone is denser than typical SaaS marketing. ### Note on Font Substitutes If implementing without GT Walsheim Medium, suitable open-source substitutes include **Mona Sans**, **Geist**, or **Inter** at weight 600–700 with manually tightened tracking. Mona Sans's hairline weights at 100–300 are particularly close to Framer's cleaner section openers. Inter Variable is open-source — keep it as-is and preserve the documented OpenType variants. ## Layout ### Spacing System - **Base unit**: 5px (Framer uses non-standard 5/10/15/20/30 increments rather than the more common 4/8/16/24). - **Tokens (front matter)**: `{spacing.hair}` 1px · `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 15px · `{spacing.lg}` 20px · `{spacing.xl}` 30px · `{spacing.xxl}` 40px · `{spacing.section}` 96px. - Card interior padding: `{spacing.lg}` 20px on pricing cards; `{spacing.xl}` 30px on gradient spotlight cards. - Pill button padding: 10px vertical · 15px horizontal — `{components.button-primary}`. - Section padding (vertical): roughly `{spacing.section}` 96px on home; tighter (~64px) on pricing comparison. ### Grid & Container - Max content width sits around the 1199px breakpoint, with side gutters that scale toward `{spacing.xl}` on desktop. - Card grids on the home gallery use 2-up at desktop, collapsing to 1-up below 810px. - Pricing tier grid is 4-up across the documented breakpoints; comparison table beneath it uses fixed-width left column with horizontally scrolling tier columns at narrow widths. ### Whitespace Philosophy The dark canvas IS the whitespace. Where lighter brands lean on white air to separate sections, Framer leans on long stretches of black with a single oversized statement floating in the middle. Sections separate by mode change: a band of charcoal cards, then a band of black with a gradient spotlight, then back to charcoal — like cuts in a dark film. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 (flat) | No shadow, no border | Default for canvas-mounted display type, FAQ rows, footer | | 1 (charcoal) | `{colors.surface-1}` lift on canvas | Pricing cards, mockup tiles, secondary buttons | | 2 (light-edge) | `rgba(255,255,255,0.10)` 0.5px top edge + `rgba(0,0,0,0.25)` 0px 10px 30px drop | Floating product cards, modal cards | | 3 (selected) | `rgba(0,153,255,0.15)` 0px 0px 0px 1px ring | Focused inputs, selected option | Four shadow signatures recur across the homepage: a 1px subtle drop, a translucent blue ring, a thick near-black 2px outline (used as the active-element marker on sub-nav), and the layered light-edge + drop-shadow used for floating cards. ### Decorative Depth - **Gradient spotlight cards** are the dominant depth device — color saturation against black canvas substitutes for shadow-driven elevation. - **Layered product mockups** (browser frames containing live Framer-built sites) sit inside `{colors.surface-1}` cards with the level-2 light-edge treatment. - **Subtle blue ring (focus / selected)** is the only chromatic depth signal — used to mark the active state of input groups and pricing tier toggles without changing the underlying surface. ## Shapes ### Border Radius Scale Framer's extracted radius set is unusually granular (1px, 4px, 5px, 6px, 8px, 10px, 12px, 15px, 20px, 30px, 40px, 100px). The named scale below picks the levels the marketing surface actually consumes. | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Small chip / utility radius | | `{rounded.sm}` | 6px | Inline tag, badge | | `{rounded.md}` | 10px | Form input, list item | | `{rounded.lg}` | 15px | Template card thumbnails | | `{rounded.xl}` | 20px | Pricing cards, mockup tiles | | `{rounded.xxl}` | 30px | Gradient spotlight cards, oversized panels | | `{rounded.pill}` | 100px | All primary text CTAs | | `{rounded.full}` | 9999px | Circular icon buttons, avatar circles | ### Photography & Illustration Geometry - Embedded site mockups (browser-chromed previews of Framer-built sites) sit in `{rounded.xl}` 20px tiles with `{spacing.md}` 15px interior padding. - Gradient spotlight cards use `{rounded.xxl}` 30px corners — softer than the 20px content cards by design, to make them feel like atmospheric panels rather than tighter UI. - Icon glyphs and sub-nav glyphs render in `{rounded.full}` circles at 32–40px sizes. ## Components ### Buttons **`button-primary`** — White pill on dark canvas. The primary CTA across home, pricing, AI, and gallery pages. - Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.button}`, padding 10px 15px, rounded `{rounded.pill}`. - Pressed state lives in `button-primary-pressed` (the live site uses a transform-scale shrink rather than a darkened fill). **`button-secondary`** — Charcoal pill. Used for secondary navigation actions ("Sign in", "Talk to sales") and as the visual counterpart to the primary pill. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.button}`, padding 10px 15px, rounded `{rounded.pill}`. **`button-translucent`** — Translucent / lifted secondary used on top of busy backgrounds (gallery hero, gradient cards). - Background `{colors.surface-2}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.xxl}`, padding 8px 14px. **`button-icon-circular`** — 40px circle for inline icon actions (carousel arrows, social links). - Background `{colors.surface-1}`, text `{colors.ink}`, rounded `{rounded.full}`, size 40px. ### Pricing Tabs **`pricing-tab-default`** + **`pricing-tab-selected`** — The pill-toggle that switches between Basic / Pro / Business / Enterprise on `/pricing`. - Default: `{colors.canvas}` background, `{colors.ink-muted}` text, rounded `{rounded.pill}`. - Selected: `{colors.surface-2}` background, `{colors.ink}` text — selected = lift, not color. Surface depth communicates "active" without needing a chromatic fill. ### Inputs & Forms **`text-input`** + **`text-input-focused`** — Form fields on `/pricing` (seat-count, currency switcher) and the in-product preview surfaces. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.md}`, padding 10px 14px. - Focused state retains the same surface; the focus ring is the level-3 blue-tinted shadow `rgba(0,153,255,0.15)` 0 0 0 1px. ### Cards & Containers **`pricing-card`** — Each tier on `/pricing`. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.xl}`, padding 24px. **`pricing-card-featured`** — The Pro tier (visually emphasized). - Background `{colors.surface-2}`, otherwise identical structure. The lift is one surface step up — no chromatic outline. **`template-card`** — Thumbnail tile in the home "Built with Framer" gallery and `/marketplace`. - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body-sm}`, rounded `{rounded.lg}`, padding 12px. **`product-mockup-tile`** — Larger tile that frames a live product UI mock (Framer canvas, Workshop video, AI translate panel). - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body-sm}`, rounded `{rounded.xl}`, padding 16px. ### Gradient Spotlight Cards (signature) The defining decorative surface of Framer's marketing — oversized atmospheric tiles dropped into otherwise monochrome card grids. Variants: **`gradient-spotlight-card`** — violet ground (most common). - Background `{colors.gradient-violet}`, text `{colors.ink}`, type `{typography.subhead}`, rounded `{rounded.xl}`, padding 32px. (The on-site card often pushes to `{rounded.xxl}` 30px when it spans a wider tile.) **`gradient-spotlight-card-magenta`** — magenta-pink ground. - Background `{colors.gradient-magenta}`, otherwise identical. **`gradient-spotlight-card-orange`** — sunset-orange wash. - Background `{colors.gradient-orange}`, otherwise identical. (Coral pink follows the same shape with `{colors.gradient-coral}`.) ### Comparison & FAQ **`feature-row`** + **`comparison-row`** — Single rows inside the pricing comparison table. - `feature-row`: `{colors.canvas}` background, `{colors.ink}` text. Header rows. - `comparison-row`: `{colors.canvas}` background, `{colors.ink-muted}` text. Data rows with `{typography.body-sm}` and 1px `{colors.hairline-soft}` underlines. **`faq-row`** — Each accordion line in the pricing-page FAQ. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.md}`, padding 24px. ### Navigation **`top-nav`** — Sticky bar on `{colors.canvas}` with the Framer wordmark left, primary nav links centered, and a `button-secondary` ("Sign in") + `button-primary` ("Get started for free") pair right. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-sm}`, height 56px. - Mobile: collapses primary links into a hamburger; the two pill CTAs collapse into a single primary pill on the bar. ### Footer **`footer`** — Dense link grid on `{colors.canvas}` with the Framer wordmark left and 5–6 columns of caption-sized links. - Background `{colors.canvas}`, text `{colors.ink-muted}`, type `{typography.caption}`, padding 64px 32px. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` (white) and `{colors.canvas}` (near-black) as the system's two anchor surfaces. Every band of the page chooses one or the other. - Push display-size letter-spacing aggressively negative — `{typography.display-xxl}` at -5.5px is the brand signature, not a stylistic accident. - Use `{colors.accent-blue}` only for hyperlinks, focus rings, and selected indicators. Never as a background or button fill. - Drop one or two `gradient-spotlight-card` variants into a card grid; they are the brand's atmosphere device. Don't overdo it — three or more in the same viewport reads as a moodboard, not a system. - Compose every CTA as a pill (`{rounded.pill}`); secondary actions live as charcoal pills, never as bordered ghost buttons. - Keep body type Inter Variable with character variants `cv01`, `cv05`, `cv09`, `cv11`, `ss03`, `ss07` enabled — the brand voice depends on them. - Use surface lift (canvas → surface-1 → surface-2) to mark hierarchy on dark, not opacity changes on white type. ### Don't - Don't ship a light-mode marketing page. Framer's identity is dark. - Don't introduce mid-tone gray text outside `{colors.ink-muted}`. The hierarchy is binary: `ink` or `ink-muted`. - Don't use `{colors.accent-blue}` as a brand fill (e.g., a blue CTA pill). The blue is a signal color, not a surface. - Don't square off CTAs. Pill (`{rounded.pill}`) or full circle is the brand vocabulary. - Don't reduce the negative letter-spacing on display sizes "for accessibility". The compression is intrinsic to the brand voice; reduce the SIZE if needed, but keep the percentage. - Don't apply gradient backgrounds to whole sections. Gradients are CARDS, not section grounds. - Don't combine more than one chromatic accent. The palette is monochrome plus one blue plus the gradient family — not "blue, green, and red". ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Desktop | 1199px | Default desktop layout | | Tablet | 810px | Card grids collapse 4-up → 2-up; nav becomes hamburger | | Mobile-Lg | 809px | Pricing comparison table becomes per-tier accordion | | Mobile-XS | 98px | Smallest documented breakpoint — single-column everything | ### Touch Targets - Pill buttons (`button-primary`, `button-secondary`) maintain a minimum 44px tap height across all viewports — combine `{typography.button}` 14px line-height with the documented 10px vertical padding. - Circular icon buttons (`button-icon-circular`) are 40px on desktop and grow to 44px on touch viewports. - Pricing-tab pills hold ≥40px tap height; below 810px they may collapse into a horizontal-scroll row instead of stacking. ### Collapsing Strategy - **Nav**: horizontal nav with a centered link group + right-anchored pill pair collapses to a hamburger overlay below 810px. The `button-primary` stays visible on the bar. - **Card grids**: the gallery and template-card grids go 2-up on desktop → 1-up on mobile. Gradient spotlight cards retain `{rounded.xxl}` corners at every viewport — they don't bleed. - **Pricing comparison table**: collapses into per-tier accordions below 810px to avoid horizontal scroll. - **Display type**: `{typography.display-xxl}` 110px scales down toward `{typography.display-lg}` 62px on tablet and `{typography.display-md}` 32px on mobile, preserving the percentage-negative letter-spacing. ### Image Behavior - Embedded product mockups (browser frames containing live Framer-built sites) maintain their aspect ratio and never crop. - Gradient spotlight cards keep their gradient orientations across breakpoints — the gradient direction is part of the brand spec. ## Iteration Guide 1. Focus on ONE component at a time and reference it by its `components:` token name (e.g., `{components.button-primary}`, `{components.gradient-spotlight-card}`). 2. When introducing a new section on the dark canvas, decide first which surface lift it lives on — `{colors.canvas}` for hero/FAQ, `{colors.surface-1}` for cards, `{colors.surface-2}` for featured cards. The depth choice is the most consequential decision. 3. Default body to `{typography.body}` with all the documented OpenType variants; reach for `{typography.subhead}` only inside spotlight cards. 4. Run `npx @google/design.md lint DESIGN.md` after edits — `broken-ref`, `contrast-ratio`, and `orphaned-tokens` warnings flag issues automatically. 5. Add new variants as separate component entries (`-pressed`, `-featured`, `-selected`) — do not bury them in prose. 6. Treat `{colors.accent-blue}` as a single-shot signal color: hyperlinks, focus, and selection — that's it. If you find yourself reaching for a second blue, the brand is drifting. 7. Gradient spotlight cards are scarce by design. One or two per long page is the spec; three is a moodboard. ## Known Gaps - The exact gradient stops for the spotlight cards are derived from screenshot pixels rather than from CSS variables — the production gradients are likely defined as `linear-gradient` strings on individual elements rather than as design tokens. Treat the documented `{colors.gradient-*}` hex values as base anchors, not as exact gradient specs. - Form-field validation / error styling is not visible on the inspected pages because no error states render in the static screenshots. - Dark mode is the only mode — no light-mode adaptation is documented because the marketing site does not ship one. - The marketplace template detail page returned sparser CSS variable data than the other pages; surface tokens for that page were inferred from the matching home / gallery treatment rather than extracted directly.
Stripe API
Weight-300 Elegance
Stripe Spec
复制
被奉为互联网美学天花板的支付规范,标志性的三斜角渐变底色,极轻薄的字体字重与梦幻高阶色彩。
极轻柔细字重
斜角渐变画布
高饱和梦幻紫
--- version: alpha name: Stripi-Inspired-design-analysis description: An inspired interpretation of Stripi's design language — a financial-infrastructure brand built on a deep navy ink, an electric indigo primary, and a recurring atmospheric gradient mesh that occupies the upper third of nearly every marketing page. The system pairs the proprietary Sohne family at thin (300) weights with negative letter-spacing for editorial-density display headlines, and uses tabular-figure body type where money and numerics matter. Buttons are tight-radius pills, cards live on near-white surfaces, and the dashboard track flips polarity to a familiar dark-app shell. colors: primary: "#533afd" primary-deep: "#4434d4" primary-press: "#2e2b8c" primary-soft: "#665efd" primary-bg-subdued-hover: "#b9b9f9" brand-dark-900: "#1c1e54" ink: "#0d253d" ink-secondary: "#273951" ink-mute: "#64748d" ink-mute-2: "#61718a" on-primary: "#ffffff" canvas: "#ffffff" canvas-soft: "#f6f9fc" canvas-cream: "#f5e9d4" hairline: "#e3e8ee" hairline-input: "#a8c3de" ruby: "#ea2261" magenta: "#f96bee" lemon: "#9b6829" shadow-blue: "#003770" typography: display-xxl: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 56px fontWeight: 300 lineHeight: 1.03 letterSpacing: -1.4px fontFeature: ss01 display-xl: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 48px fontWeight: 300 lineHeight: 1.15 letterSpacing: -0.96px fontFeature: ss01 display-lg: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 32px fontWeight: 300 lineHeight: 1.1 letterSpacing: -0.64px fontFeature: ss01 display-md: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 26px fontWeight: 300 lineHeight: 1.12 letterSpacing: -0.26px fontFeature: ss01 heading-lg: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 22px fontWeight: 300 lineHeight: 1.1 letterSpacing: -0.22px fontFeature: ss01 heading-md: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 20px fontWeight: 300 lineHeight: 1.4 letterSpacing: -0.2px fontFeature: ss01 heading-sm: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 18px fontWeight: 300 lineHeight: 1.4 letterSpacing: 0 fontFeature: ss01 body-lg: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 16px fontWeight: 300 lineHeight: 1.4 letterSpacing: 0 fontFeature: ss01 body-md: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 15px fontWeight: 300 lineHeight: 1.4 letterSpacing: 0 fontFeature: ss01 body-tabular: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 14px fontWeight: 300 lineHeight: 1.4 letterSpacing: -0.42px fontFeature: tnum button-md: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.0 letterSpacing: 0 fontFeature: ss01 button-sm: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.0 letterSpacing: 0 fontFeature: ss01 caption: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 13px fontWeight: 400 lineHeight: 1.4 letterSpacing: -0.39px fontFeature: tnum micro: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 11px fontWeight: 300 lineHeight: 1.4 letterSpacing: 0 fontFeature: ss01 micro-cap: fontFamily: "sohne-var, 'SF Pro Display', system-ui, -apple-system, sans-serif" fontSize: 10px fontWeight: 400 lineHeight: 1.15 letterSpacing: 0.1px fontFeature: ss01 rounded: xs: 4px sm: 6px md: 8px lg: 12px xl: 16px pill: 9999px spacing: xxs: 2px xs: 4px sm: 8px md: 12px lg: 16px xl: 24px xxl: 32px huge: 64px components: button-primary-pill: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.pill}" padding: 8px 16px button-primary-pill-pressed: backgroundColor: "{colors.primary-press}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.pill}" padding: 8px 16px button-secondary: backgroundColor: "{colors.canvas}" textColor: "{colors.primary}" typography: "{typography.button-md}" rounded: "{rounded.pill}" padding: 8px 16px button-on-dark: backgroundColor: "{colors.brand-dark-900}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.pill}" padding: 8px 16px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.sm}" padding: 8px 12px text-input-focused: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.sm}" padding: 8px 12px card-feature-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-pricing: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-pricing-featured: backgroundColor: "{colors.brand-dark-900}" textColor: "{colors.on-primary}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-cream-band: backgroundColor: "{colors.canvas-cream}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-dashboard-mockup: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-tabular}" rounded: "{rounded.lg}" padding: 24px pill-tag-soft: backgroundColor: "{colors.primary-bg-subdued-hover}" textColor: "{colors.primary-deep}" typography: "{typography.micro-cap}" rounded: "{rounded.pill}" padding: 4px 8px nav-bar-on-mesh: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.xs}" padding: 16px 24px link-on-light: backgroundColor: "{colors.canvas}" textColor: "{colors.primary}" typography: "{typography.body-md}" rounded: "{rounded.xs}" padding: 0px footer-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink-mute}" typography: "{typography.caption}" rounded: "{rounded.xs}" padding: 64px 24px --- ## Overview Stripi's design language opens with the gradient mesh. A wide horizontal band of pastel cream, sherbet orange, lavender, electric indigo, and ruby pink occupies the upper third of nearly every marketing page — the brand's instantly-recognizable atmospheric backdrop. Type and product UI mockups float above it on `{colors.canvas}` (white), with the gradient acting as both decoration and visual anchor. The lower portion of the page returns to white, with feature explanations on `{colors.canvas-soft}` (a barely-tinted cool off-white) and dashboard product mockups composited as faux IDE/console panels in deep navy. The color system has two primary roles. **Indigo** (`{colors.primary}` — `#533afd`) is the brand's signature CTA color, used sparingly: one filled pill per band. **Deep navy** (`{colors.ink}` — `#0d253d`) is the universal body text color and the fill of dashboard mockups, the featured pricing tier, and the dark-app surfaces on the dashboard track. Ruby (`{colors.ruby}`) and magenta (`{colors.magenta}`) appear inside the gradient mesh and as accent dots in product UI mockups; they are not used as button colors. Typography is built around **Sohne** at weight 300 with negative letter-spacing — the brand's editorial-density display signature. Display sizes (32–56px) use -1.4px to -0.64px tracking; body sizes use 0; tabular caption sizes (where money and numerics matter) use the OpenType `tnum` feature plus a tightening -0.36 to -0.42px tracking. The `ss01` stylistic set is enabled across all roles. **Key Characteristics:** - Gradient-mesh backdrop on every marketing hero — cream/orange/lavender/indigo/ruby horizontally washed across the upper third of the page. - Single-indigo CTA hierarchy: filled `{colors.primary}` pill is the only filled button on marketing surfaces. - Sohne thin (weight 300) display tier with negative tracking from -1.4px to -0.2px depending on size. - Tabular-figure body type (`tnum`) for any cell containing money or numerics — the brand's quiet financial-data signal. - Dark-app dashboard track: deep navy product UI mockups sit composited above the white canvas, frequently with rendered code or dashboard tables inside. - Pill-shaped buttons (`{rounded.pill}` 9999px) with tight `8px 16px` padding — short, decisive, transactional. - Cream-band feature cards (`{colors.canvas-cream}`) introduce a warm interlude between blue/white sections without breaking the brand's chromatic logic. ## Colors > **Source pages:** home (`/`), `/payments`, `/pricing`, `dashboard.stripe.com/register/payments`. ### Brand & Accent - **Indigo** (`{colors.primary}` — `#533afd`): The brand's signature CTA color. Filled-pill button, link emphasis, gradient anchor. - **Indigo Deep** (`{colors.primary-deep}` — `#4434d4`): A deeper indigo used in gradient mid-stops and as the press-state warmer alternative. - **Indigo Press** (`{colors.primary-press}` — `#2e2b8c`): Pressed-state lift of the primary. - **Indigo Soft** (`{colors.primary-soft}` — `#665efd`): A lighter indigo used in product-UI accents and chart highlights. - **Indigo Subdued** (`{colors.primary-bg-subdued-hover}` — `#b9b9f9`): Pale indigo fill used as soft tag background. - **Brand Dark 900** (`{colors.brand-dark-900}` — `#1c1e54`): The deep navy used on the featured pricing tier and dashboard chrome. - **Ruby** (`{colors.ruby}` — `#ea2261`): Gradient accent and chart highlight; never a button. - **Magenta** (`{colors.magenta}` — `#f96bee`): Brighter pink stop in gradient meshes. - **Lemon** (`{colors.lemon}` — `#9b6829`): Warm sherbet stop in gradient backdrops. ### Surface - **Canvas** (`{colors.canvas}` — `#ffffff`): Default page background. - **Canvas Soft** (`{colors.canvas-soft}` — `#f6f9fc`): Cool-tinted off-white used on feature bands beneath the gradient hero. - **Canvas Cream** (`{colors.canvas-cream}` — `#f5e9d4`): Warm cream used as a feature-band fill — the brand's chromatic interlude. - **Hairline** (`{colors.hairline}` — `#e3e8ee`): 1px borders on cards and tables. - **Hairline Input** (`{colors.hairline-input}` — `#a8c3de`): Slightly cooler hairline used on form inputs. ### Text - **Ink** (`{colors.ink}` — `#0d253d`): Default body text color across the brand. Deep navy, never pure black. - **Ink Secondary** (`{colors.ink-secondary}` — `#273951`): Secondary text on white. - **Ink Mute** (`{colors.ink-mute}` — `#64748d`): Helper text, captions, table labels. - **Ink Mute 2** (`{colors.ink-mute-2}` — `#61718a`): Near-equivalent to ink-mute used in nav. - **On Primary** (`{colors.on-primary}` — `#ffffff`): Text on indigo / dark-navy surfaces. ### Semantic The brand does not use a separate semantic color palette in the marketing system — error / success states live in dashboard-product UI specifically. ## Typography ### Font Family The display and UI tier is **Sohne** (proprietary, licensed from Klim Type Foundry) at weights 300 (thin) and 400 (regular). The variable font (`sohne-var`) is loaded with `font-feature-settings: "ss01"` enabled globally — the stylistic set substitutes a single-story `a` and other character variants that are part of the brand's typographic signature. When Sohne is unavailable, fall back to **SF Pro Display** at thin weights, then system-ui. For maximum brand fidelity, **Inter** (open-source) at weight 300 with `font-feature-settings: "ss01"` and `letter-spacing: -1.4px` on display sizes approximates the rhythm closely. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xxl}` | 56px | 300 | 1.03 | -1.4px | Hero headline | | `{typography.display-xl}` | 48px | 300 | 1.15 | -0.96px | Section opener | | `{typography.display-lg}` | 32px | 300 | 1.1 | -0.64px | Card title / sub-section | | `{typography.display-md}` | 26px | 300 | 1.12 | -0.26px | Compact card title | | `{typography.heading-lg}` | 22px | 300 | 1.1 | -0.22px | Pricing tier name | | `{typography.heading-md}` | 20px | 300 | 1.4 | -0.2px | Section sub-heading | | `{typography.heading-sm}` | 18px | 300 | 1.4 | 0 | Mini-section label | | `{typography.body-lg}` | 16px | 300 | 1.4 | 0 | Marketing body lead | | `{typography.body-md}` | 15px | 300 | 1.4 | 0 | Default UI body | | `{typography.body-tabular}` | 14px | 300 | 1.4 | -0.42px | Money / numeric tables (uses `tnum`) | | `{typography.button-md}` | 16px | 400 | 1.0 | 0 | Pill button label | | `{typography.button-sm}` | 14px | 400 | 1.0 | 0 | Compact pill label | | `{typography.caption}` | 13px | 400 | 1.4 | -0.39px | Helper, table labels | | `{typography.micro}` | 11px | 300 | 1.4 | 0 | Fine print | | `{typography.micro-cap}` | 10px | 400 | 1.15 | 0.1px | All-caps eyebrow | ### Principles - **Thin weight is the brand.** Display tiers always render at weight 300. Bumping to 400+ removes the brand's editorial air. - **Negative tracking on display.** -1.4px at 56px, scaling proportionally down to -0.2px at 20px. The negative tracking is the brand's typographic signature. - **Tabular figures for money.** Any cell rendering currency, transaction amounts, or numeric counts uses `font-feature-settings: "tnum"` plus a tightening tracking. The brand quietly signals its financial DNA through this micro-detail. - **`ss01` globally.** Apply `font-feature-settings: "ss01"` to the body element so the stylistic-set substitution is on for every text role. ### Note on Font Substitutes Sohne is proprietary. Use **Inter** (open-source via Google Fonts) at weight 300 with `letter-spacing: -1.4px` and `font-feature-settings: "ss01"` for display tiers — Inter is the closest open-source analogue. For body sizes, Inter at 300 weight with `font-feature-settings: "tnum"` (where applicable) is the canonical substitute. Avoid Helvetica or system-ui defaults — they're heavier than the brand needs. ## Layout ### Spacing System - **Base unit**: 8px (with 2 / 4 / 12 sub-tokens for fine work). - **Tokens**: `{spacing.xxs}` 2px · `{spacing.xs}` 4px · `{spacing.sm}` 8px · `{spacing.md}` 12px · `{spacing.lg}` 16px · `{spacing.xl}` 24px · `{spacing.xxl}` 32px · `{spacing.huge}` 64px. - **Section padding**: 64–96px on marketing surfaces; 32–48px on dashboard / product surfaces. - **Card internal padding**: 32px on feature cards; 24px on dashboard mockups. ### Grid & Container - Marketing pages center in a ~1200px container with the gradient mesh extending edge-to-edge above. - Pricing collapses 4-up → 2-up → 1-up at 1024 / 768 breakpoints. - Dashboard product mockups use their own internal grids (12-col tables, 3-col card grids) rendered as static composites. ### Whitespace Philosophy The gradient mesh occupies the upper third of the page; the white canvas below is generously padded. Section gaps tend toward 96px, with content tightening to 32px on dashboard / pricing pages where users compare and act. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 | Flat | Default surface | | 1 | `box-shadow: rgba(0,55,112,0.08) 0 1px 3px` | Card lift on white | | 2 | `box-shadow: rgba(0,55,112,0.08) 0 8px 24px, rgba(0,55,112,0.04) 0 2px 6px` | Floating panels, dashboard mockup chrome | | 3 | Gradient mesh backdrop | The brand's primary depth medium — atmospheric color rather than literal shadow | ### Decorative Depth The gradient mesh IS the depth system. Implemented as a layered SVG or large background image rather than CSS gradients (the actual mesh has organic blob shapes that aren't CSS-renderable). The mesh provides the brand's signature lift; literal shadows are reserved for product-UI mockups and stay subtle. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Hairline tags, table chrome | | `{rounded.sm}` | 6px | Form inputs | | `{rounded.md}` | 8px | Compact cards, alerts | | `{rounded.lg}` | 12px | Pricing cards, feature cards | | `{rounded.xl}` | 16px | Dashboard product mockup chrome | | `{rounded.pill}` | 9999px | All buttons, tag pills | ### Photography Geometry The brand uses **product UI mockups** more than photography. Dashboard composites render as faux IDE/terminal/dashboard chrome inside `{rounded.lg}` 12px containers with a subtle `box-shadow`. Real photography appears in customer logo strips and the rare case-study card; treated as inset 4:3 with no shadow. ## Components ### Buttons **`button-primary-pill`** — the dominant CTA system-wide. - Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.button-md}`, padding `{spacing.sm} {spacing.lg}` (8px 16px), rounded `{rounded.pill}` 9999px. - Pressed state `button-primary-pill-pressed` shifts background to `{colors.primary-press}`. **`button-secondary`** — outline-style alternative. - Background `{colors.canvas}`, text `{colors.primary}`, 1px solid `{colors.primary}` border, same pill geometry. **`button-on-dark`** — used on dashboard / dark surfaces. - Background `{colors.brand-dark-900}`, text `{colors.on-primary}`, same pill geometry. ### Cards & Containers **`card-feature-light`** — feature explanation card on white. - Background `{colors.canvas}`, padding `{spacing.xxl}`, rounded `{rounded.lg}` 12px, 1px `{colors.hairline}` border, optional Level 1 shadow. **`card-pricing`** — standard pricing tier. - Background `{colors.canvas}`, padding `{spacing.xxl}`, rounded `{rounded.lg}`, 1px `{colors.hairline}` border. Title `{typography.heading-lg}`, price `{typography.display-md}`, body `{typography.body-md}`, CTA pinned bottom as `button-primary-pill`. **`card-pricing-featured`** — the inverted dark featured tier. - Background `{colors.brand-dark-900}`, text `{colors.on-primary}`, otherwise identical structure to `card-pricing`. The deep-navy fill is the brand's distinctive featured-tier choice. **`card-cream-band`** — warm interlude card. - Background `{colors.canvas-cream}`, text `{colors.ink}`, padding `{spacing.xxl}`, rounded `{rounded.lg}`. Used to break up the indigo / white rhythm with warmth. **`card-dashboard-mockup`** — composited dashboard / product UI screenshot. - Background `{colors.canvas}`, type `{typography.body-tabular}` (with `tnum`), padding `{spacing.xl}` 24px, rounded `{rounded.lg}` 12px, Level 2 shadow. Often contains nested mini-mockups: code preview + dashboard table + chart card. ### Inputs & Forms **`text-input`** — standard form field. - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-md}`, padding `{spacing.sm} {spacing.md}` (8px 12px), rounded `{rounded.sm}` 6px, 1px `{colors.hairline-input}` border. - Focus state `text-input-focused`: border swaps to `{colors.primary}`. ### Navigation **`nav-bar-on-mesh`** — top nav floating over the gradient hero. - Background `{colors.canvas}` (or transparent depending on scroll), text `{colors.ink}`, padding `{spacing.lg} {spacing.xl}`. Logo wordmark on the left, primary nav center, sign-in + filled `button-primary-pill` on the right. ### Pills, Tags, and Chips **`pill-tag-soft`** — subdued indigo tag. - Background `{colors.primary-bg-subdued-hover}`, text `{colors.primary-deep}`, type `{typography.micro-cap}`, padding `4px 8px`, rounded `{rounded.pill}`. ### Signature Components **Gradient Mesh Backdrop** — pastel cream → sherbet orange → lavender → indigo → ruby pink stops blurred horizontally across the upper third of the page. Implemented as SVG or a large background image — not a flat CSS gradient (the real mesh has organic blob shapes). **Composited Dashboard Mockup** — multi-layer faux-product-UI compositions: an IDE panel on the left, a dashboard table center, a chart card on the right, all rendered at small scale inside `{rounded.lg}` containers with subtle Level 2 shadows. The composite is the brand's most-photographed feature. **Tabular-Figure Money Type** — every number rendering money, count, or transaction value uses `font-feature-settings: "tnum"`. The brand's quiet signal that it's a financial-infrastructure platform. **`link-on-light`** — inline links on light surfaces. - Text `{colors.primary}` rendered in `{typography.body-md}`, no underline by default. **`footer-light`** — site-wide footer. - Background `{colors.canvas}`, text `{colors.ink-mute}`, type `{typography.caption}`, padding `{spacing.huge} {spacing.xl}` (64px 24px). Holds 4–6 columns of link groups, social icons, and a small legal row. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` for filled CTAs and inline link emphasis — it should appear sparingly, one filled button per band. - Apply the gradient mesh to every marketing hero; bare-canvas heroes feel off-brand. - Render display tiers at weight 300 with negative letter-spacing — the thin tracking is the typographic signature. - Use `font-feature-settings: "tnum"` on every money / numeric cell. - Apply `font-feature-settings: "ss01"` globally on the body element. - Pair every feature explanation with a composited product UI mockup; the brand's argument is "look at the actual product." ### Don't - Don't bump display weight above 300 — at 400 the brand's editorial air collapses. - Don't add new accent colors outside the documented gradient stops (cream / orange / lavender / indigo / ruby / magenta). - Don't use the indigo `{colors.primary}` as a body-text color — it's a CTA and link color, not a type color at body size. - Don't shrink button padding below `8px 16px` — the tight pill is part of the brand's transactional feel. - Don't render money cells without `tnum` — it breaks the quiet financial-data signature. - Don't replace the pill shape with rounded-rectangles for buttons. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Wide | ≥ 1440px | Full gradient mesh edge-to-edge; dashboard composite at full scale | | Desktop | 1024–1440px | Default content max-width; pricing 4-up | | Tablet | 768–1023px | Pricing 2-up; dashboard composite simplifies to 2 panels | | Mobile | < 768px | Pricing 1-up; hamburger nav; display drops 56 → 36px | ### Touch Targets - Pill buttons hit ≥ 40×40px on mobile via padding scaling. On smaller screens, buttons size up to 44×44px to maintain WCAG AAA. - Form fields stay at 40px minimum height. ### Collapsing Strategy - Display tiers stair-step 56 → 48 → 32 → 26 → 22px through the breakpoints. - Gradient mesh re-tiles on mobile to preserve the wash without disappearing. - Dashboard composites simplify to single-panel mockups on mobile; the multi-layer composition only renders at desktop+. - Pricing tiers stair-step 4-up → 2-up → 1-up. ### Image Behavior Product UI composites use `srcset` with art-direction crops at major breakpoints. Mobile crops focus on the most actionable inner panel; desktop crops show the full multi-layer composition. ## Iteration Guide 1. Focus on ONE component at a time. 2. Reference component names and tokens directly (`{colors.primary}`, `{button-primary-pill}-pressed`, `{rounded.pill}`). 3. Run `npx @google/design.md lint DESIGN.md` after edits. 4. Add new variants as separate entries. 5. Default body to `{typography.body-md}` (15px); use `{typography.body-tabular}` for any money / numeric cell. 6. Apply `ss01` globally on the body; apply `tnum` per-element on numeric content. 7. The gradient mesh is non-negotiable on marketing heroes — bare-canvas heroes break the brand.
Coinbase Prime
Institutional Trust
Coinbase Spec
复制
定位于主流金融合规的加密资产交易所设计系统,以实心的 Coinbase 蓝为主打,版面沉稳而严谨。
实心高安全蓝
机构卡片式
无衬线学术排版
--- version: alpha name: Coinbase-design-analysis description: An institutional-grade crypto exchange whose marketing surfaces read like a quietly-confident financial-services brand. The base canvas is pure white; Coinbase Blue (`#0052ff`) is the single brand voltage, used scarcely on primary CTAs, signature glyphs, and inline accent moments. Type runs Coinbase's licensed CoinbaseDisplay (display) and CoinbaseSans (body) at modest weights — display sits at weight 400 not 700, signaling editorial calm rather than fintech-bombastic. Page rhythm rotates between bright white sections, soft gray elevation bands, and full-bleed dark editorial heroes (`#0a0b0d`) carrying product-ui mockup cards. Iconography is geometric and minimal; depth comes from card-on-card layering, never decorative shadows. colors: primary: "#0052ff" primary-active: "#003ecc" primary-disabled: "#a8b8cc" ink: "#0a0b0d" body: "#5b616e" body-strong: "#0a0b0d" muted: "#7c828a" muted-soft: "#a8acb3" hairline: "#dee1e6" hairline-soft: "#eef0f3" canvas: "#ffffff" surface-soft: "#f7f7f7" surface-card: "#ffffff" surface-strong: "#eef0f3" surface-dark: "#0a0b0d" surface-dark-elevated: "#16181c" on-primary: "#ffffff" on-dark: "#ffffff" on-dark-soft: "#a8acb3" semantic-up: "#05b169" semantic-down: "#cf202f" accent-yellow: "#f4b000" typography: display-mega: fontFamily: "'Coinbase Display', -apple-system, system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" fontSize: 80px fontWeight: 400 lineHeight: 1.0 letterSpacing: -2px display-xl: fontFamily: "'Coinbase Display', sans-serif" fontSize: 64px fontWeight: 400 lineHeight: 1.0 letterSpacing: -1.6px display-lg: fontFamily: "'Coinbase Display', sans-serif" fontSize: 52px fontWeight: 400 lineHeight: 1.0 letterSpacing: -1.3px display-md: fontFamily: "'Coinbase Display', sans-serif" fontSize: 44px fontWeight: 400 lineHeight: 1.09 letterSpacing: -1px display-sm: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 36px fontWeight: 400 lineHeight: 1.11 letterSpacing: -0.5px title-lg: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 32px fontWeight: 400 lineHeight: 1.13 letterSpacing: -0.4px title-md: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 18px fontWeight: 600 lineHeight: 1.33 letterSpacing: 0 title-sm: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.25 letterSpacing: 0 body-md: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 body-strong: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 16px fontWeight: 700 lineHeight: 1.5 letterSpacing: 0 body-sm: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 14px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 caption: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 13px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 caption-strong: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 12px fontWeight: 600 lineHeight: 1.5 letterSpacing: 0 number-display: fontFamily: "'Coinbase Mono', 'Coinbase Sans', monospace" fontSize: 18px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 button: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 16px fontWeight: 600 lineHeight: 1.15 letterSpacing: 0 nav-link: fontFamily: "'Coinbase Sans', sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0 rounded: none: 0px xs: 4px sm: 8px md: 12px lg: 16px xl: 24px pill: 100px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px base: 16px md: 20px lg: 24px xl: 32px xxl: 48px section: 96px components: top-nav-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.nav-link}" height: 64px top-nav-on-dark: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.nav-link}" height: 64px button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 12px 20px height: 44px button-primary-active: backgroundColor: "{colors.primary-active}" textColor: "{colors.on-primary}" rounded: "{rounded.pill}" button-primary-disabled: backgroundColor: "{colors.primary-disabled}" textColor: "{colors.on-primary}" rounded: "{rounded.pill}" button-secondary-light: backgroundColor: "{colors.surface-strong}" textColor: "{colors.ink}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 12px 20px height: 44px button-secondary-dark: backgroundColor: "{colors.surface-dark-elevated}" textColor: "{colors.on-dark}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 12px 20px height: 44px button-outline-on-dark: backgroundColor: transparent textColor: "{colors.on-dark}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 11px 19px height: 44px button-tertiary-text: backgroundColor: transparent textColor: "{colors.primary}" typography: "{typography.button}" button-pill-cta: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button}" rounded: "{rounded.pill}" padding: 16px 32px height: 56px hero-band-dark: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.display-mega}" padding: 96px hero-band-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.display-mega}" padding: 96px product-ui-card-dark: backgroundColor: "{colors.surface-dark-elevated}" textColor: "{colors.on-dark}" rounded: "{rounded.xl}" padding: 32px product-ui-card-light: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.xl}" padding: 32px feature-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.title-md}" rounded: "{rounded.xl}" padding: 32px asset-row: backgroundColor: transparent textColor: "{colors.ink}" typography: "{typography.body-md}" padding: 16px 0 price-up-cell: backgroundColor: transparent textColor: "{colors.semantic-up}" typography: "{typography.number-display}" price-down-cell: backgroundColor: transparent textColor: "{colors.semantic-down}" typography: "{typography.number-display}" pricing-tier-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.xl}" padding: 32px pricing-tier-featured: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.body-md}" rounded: "{rounded.xl}" padding: 32px cta-band-dark: backgroundColor: "{colors.surface-dark}" textColor: "{colors.on-dark}" typography: "{typography.display-lg}" padding: 96px text-input: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 14px 16px height: 48px search-input-pill: backgroundColor: "{colors.surface-strong}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.pill}" padding: 12px 20px height: 44px badge-pill: backgroundColor: "{colors.surface-strong}" textColor: "{colors.ink}" typography: "{typography.caption-strong}" rounded: "{rounded.pill}" padding: 4px 12px asset-icon-circular: backgroundColor: "{colors.surface-strong}" rounded: "{rounded.full}" size: 32px footer-light: backgroundColor: "{colors.canvas}" textColor: "{colors.body}" typography: "{typography.body-sm}" padding: 64px 48px footer-link: backgroundColor: transparent textColor: "{colors.body}" typography: "{typography.body-sm}" legal-band: backgroundColor: "{colors.canvas}" textColor: "{colors.muted}" typography: "{typography.caption}" --- ## Overview Coinbase reads like an institutional financial brand that happens to trade crypto — the marketing surfaces are quiet, white-canvas, editorially-spaced, and almost monochromatic. The single brand voltage is **Coinbase Blue** (`{colors.primary}` — #0052ff), used scarcely: every primary CTA pill, the brand wordmark, and inline emphasis links. Beyond that one blue, the system is white canvas + ink + soft gray elevation bands + a deep near-black editorial canvas (`{colors.surface-dark}` — #0a0b0d) for full-bleed product-mockup heroes. Type pairs **CoinbaseDisplay** for hero headlines with **CoinbaseSans** for body, captions, and navigation. Display sits at **weight 400** — not the 700+ typical of trading platforms. The choice signals editorial calm and institutional trust rather than fintech urgency. The page rhythm rotates three modes: bright white editorial sections, soft-gray elevation bands, and **full-bleed dark editorial heroes** carrying layered product-UI mockup cards. The dark hero with floating dashboard mockups is the single most distinctive component. **Key Characteristics:** - Single accent color: `{colors.primary}` (#0052ff Coinbase Blue) carries every primary CTA, wordmark, and inline brand link. Used scarcely. - Modest display weights — CoinbaseDisplay at weight 400, never 700+. - Editorial pill geometry: every CTA is `{rounded.pill}` (100px), every asset glyph is `{rounded.full}`, every card is `{rounded.xl}` (24px). Sharp corners absent. - Full-bleed dark heroes with floating product-UI cards: `{component.hero-band-dark}` plus inline `{component.product-ui-card-dark}` mockups is the brand's strongest signature pattern. - Trading semantics: `{colors.semantic-up}` (#05b169) and `{colors.semantic-down}` (#cf202f) — text color only, never background fills. - 96px section rhythm — generous editorial pacing. ## Colors ### Brand & Accent - **Coinbase Blue** (`{colors.primary}` — #0052ff): The single brand color. Every primary CTA pill, the Coinbase wordmark, and inline brand links. - **Coinbase Blue Active** (`{colors.primary-active}` — #003ecc): Press-state darken on the primary pill. - **Coinbase Blue Disabled** (`{colors.primary-disabled}` — #a8b8cc): Faded-blue tint for disabled CTAs. - **Accent Yellow** (`{colors.accent-yellow}` — #f4b000): A small sub-brand accent used very sparingly on Bitcoin/asset glyph fills inside feature cards. Illustrative-only, not an action color. ### Surface - **Canvas** (`{colors.canvas}` — #ffffff): The default page floor. - **Surface Soft** (`{colors.surface-soft}` — #f7f7f7): Subtle alternating band surface. - **Surface Strong** (`{colors.surface-strong}` — #eef0f3): The light-gray fill behind secondary buttons, search pills, asset-icon plates. - **Surface Dark** (`{colors.surface-dark}` — #0a0b0d): Deep near-black canvas for full-bleed dark heroes, CTA bands. Same hex as `{colors.ink}` — page-floor and text-color share the value. - **Surface Dark Elevated** (`{colors.surface-dark-elevated}` — #16181c): One step lighter, used for floating product-UI mockup cards inside dark heroes. ### Hairlines - **Hairline** (`{colors.hairline}` — #dee1e6): Default 1px divider on white surfaces. - **Hairline Soft** (`{colors.hairline-soft}` — #eef0f3): Lighter divider — same hex as `{colors.surface-strong}`. ### Text - **Ink** (`{colors.ink}` — #0a0b0d): Display headings, primary nav, body emphasis. - **Body** (`{colors.body}` — #5b616e): Default running-text — slightly cool gray. - **Body Strong** (`{colors.body-strong}` — #0a0b0d): Same as ink, used for stronger emphasis. - **Muted** (`{colors.muted}` — #7c828a): Sub-titles, breadcrumbs, footer secondary. - **Muted Soft** (`{colors.muted-soft}` — #a8acb3): Disabled link text. - **On Primary** (`{colors.on-primary}` — #ffffff): White text on Coinbase Blue CTAs. - **On Dark** (`{colors.on-dark}` — #ffffff): White text on dark heroes. - **On Dark Soft** (`{colors.on-dark-soft}` — #a8acb3): Muted off-white for secondary text on dark. ### Trading Semantics - **Semantic Up** (`{colors.semantic-up}` — #05b169): "Price up" green, text color only. - **Semantic Down** (`{colors.semantic-down}` — #cf202f): "Price down" red, text color only. ## Typography ### Font Family The system runs **CoinbaseDisplay** (display headlines), **CoinbaseSans** (body, navigation, captions, buttons), **CoinbaseIcons** (icon font), and **CoinbaseMono** for tabular numerical data. Fallback stack: `-apple-system, system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`. The display/body split is functional: CoinbaseDisplay carries hero headlines only; CoinbaseSans carries everything else. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-mega}` | 80px | 400 | 1.0 | -2px | Homepage hero h1 | | `{typography.display-xl}` | 64px | 400 | 1.0 | -1.6px | Subsidiary heroes | | `{typography.display-lg}` | 52px | 400 | 1.0 | -1.3px | Section heads | | `{typography.display-md}` | 44px | 400 | 1.09 | -1px | CTA-band headlines | | `{typography.display-sm}` | 36px | 400 | 1.11 | -0.5px | Sub-section heads — CoinbaseSans | | `{typography.title-lg}` | 32px | 400 | 1.13 | -0.4px | Card group titles | | `{typography.title-md}` | 18px | 600 | 1.33 | 0 | Component titles, asset row primary | | `{typography.title-sm}` | 16px | 600 | 1.25 | 0 | List labels | | `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Default body | | `{typography.body-strong}` | 16px | 700 | 1.5 | 0 | Emphasized body | | `{typography.body-sm}` | 14px | 400 | 1.5 | 0 | Footer body | | `{typography.caption}` | 13px | 400 | 1.5 | 0 | Photo captions | | `{typography.caption-strong}` | 12px | 600 | 1.5 | 0 | Badge pill labels | | `{typography.number-display}` | 18px | 500 | 1.4 | 0 | Asset prices, percent changes — CoinbaseMono | | `{typography.button}` | 16px | 600 | 1.15 | 0 | Standard CTA pill | | `{typography.nav-link}` | 14px | 500 | 1.4 | 0 | Top-nav menu items | ### Principles - **Display weight stays at 400.** The single most distinctive typographic choice — signals "calm institutional brand" rather than "trading-platform urgency." - **Negative letter-spacing on display only.** Display uses -1px to -2px tracking; body stays at 0. - **CoinbaseMono on every number.** Asset prices, percent changes — anything tabular renders in CoinbaseMono. ### Note on Font Substitutes CoinbaseDisplay, CoinbaseSans, and CoinbaseMono are licensed Coinbase typefaces. - **CoinbaseDisplay → Inter** at weight 400, letter-spacing -1.5%. - **CoinbaseSans → Inter** at weight 400/600. - **CoinbaseMono → JetBrains Mono** or **Geist Mono** at weight 500. ## Layout ### 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. - **Section padding:** `{spacing.section}` (96px) for every major editorial band. - **Card internal padding:** `{spacing.xl}` (32px) for feature cards and product-UI mockups. ### Grid & Container - **Max content width:** ~1200px centered. Hero photography full-bleed. - **Editorial body:** Single 12-column grid. - **Feature card grids:** 2-up at desktop for hero splits, 3-up for benefit grids. - **Footer:** 6-column link list at desktop. ### Whitespace Philosophy Generous editorial pacing — closer to Bloomberg or the Financial Times than to a trading dashboard. 96px between bands; cards inside bands sit 24px apart. Density lives behind login walls, not on marketing. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | Flat | No shadow, no border | 80% of surfaces | | Hairline border | 1px `{colors.hairline}` | Feature card outlines on white | | Soft drop | `0 4px 12px rgba(0, 0, 0, 0.04)` | Single shadow tier — hovered cards | | Photographic | Full-bleed product-UI mockups | Hero depth | ### Decorative Depth - **Layered product-UI cards inside dark heroes** is the most distinctive decorative pattern — a `{component.product-ui-card-dark}` floats above a darker base canvas, often with a second smaller card overlapping at an angle. - **Geometric brand illustrations** carry illustrative depth where shadows would otherwise. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Reserved (essentially unused) | | `{rounded.xs}` | 4px | Inline tags | | `{rounded.sm}` | 8px | Compact rows | | `{rounded.md}` | 12px | Form inputs | | `{rounded.lg}` | 16px | Mid-size cards | | `{rounded.xl}` | 24px | Feature cards, product-UI mockups, pricing tiers | | `{rounded.pill}` | 100px | All CTA buttons, search pills, badges | | `{rounded.full}` | 9999px | Asset icon circles, avatars | Pill for interactive, card-radius (24px) for containers, full circle for icons. Sharp corners absent. ## Components ### Top Navigation **`top-nav-light`** — Default top nav on white pages. Background `{colors.canvas}`, text `{colors.ink}`, height 64px. Layout: Coinbase wordmark left, primary horizontal menu (Cryptocurrencies / Individuals / Businesses / Institutions / Developers / Company), search-icon + globe + Sign In + Sign Up CTAs right. **`top-nav-on-dark`** — Top nav over a dark hero band. Background `{colors.surface-dark}`, text `{colors.on-dark}`. Same layout. ### Buttons **`button-primary`** — The signature Coinbase Blue pill. Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.button}` (16px / 600), padding 12px × 20px, height 44px, rounded `{rounded.pill}` (100px). **`button-primary-active`** — Press state. Background `{colors.primary-active}`, deeper blue. **`button-primary-disabled`** — Faded blue tint. Background `{colors.primary-disabled}`. Cursor not-allowed. **`button-secondary-light`** — Soft-gray secondary on white surfaces. Background `{colors.surface-strong}`, text `{colors.ink}`, same pill geometry. **`button-secondary-dark`** — Used on dark heroes. Background `{colors.surface-dark-elevated}`, text `{colors.on-dark}`, same pill geometry. **`button-outline-on-dark`** — Transparent pill with white outline. Background transparent, text `{colors.on-dark}`, 1px white border. **`button-tertiary-text`** — Inline text link. Background transparent, text `{colors.primary}`, type `{typography.button}`. **`button-pill-cta`** — Larger pill CTA used on the homepage hero ("Get started"). Same Coinbase Blue palette but with 56px height and 16px × 32px padding for a prouder stance. ### Hero Bands **`hero-band-dark`** — The signature full-bleed dark hero. Background `{colors.surface-dark}`, text `{colors.on-dark}`, full-bleed layered product-UI mockup cards. Display headline left in `{typography.display-mega}` (80px / 400), subhead in `{typography.body-md}`, two CTAs. **`hero-band-light`** — White-canvas variant used on Wealth and Explore. Background `{colors.canvas}`, text `{colors.ink}`. Same skeleton, light palette. ### Cards **`product-ui-card-dark`** — The floating product-UI mockup. Background `{colors.surface-dark-elevated}`, text `{colors.on-dark}`, rounded `{rounded.xl}` (24px), padding 32px. Often shown as 2-3 stacked cards at slight rotation, mimicking a layered dashboard. **`product-ui-card-light`** — Light-canvas variant used on Explore for asset cards. Background `{colors.canvas}`, text `{colors.ink}`, same geometry, 1px hairline border. **`feature-card`** — Used in 3-up and 2-up grids. Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.title-md}`, rounded `{rounded.xl}`, padding 32px. ### Trading Surfaces **`asset-row`** — Horizontal row in asset lists (Explore, Wealth). Background transparent, 1px hairline divider. Layout: 32px circular asset icon left, asset name + ticker, price column in `{typography.number-display}`, 24h change column with `{component.price-up-cell}` or `{component.price-down-cell}`. **`price-up-cell`** + **`price-down-cell`** — Inline price-change cells. Color only — green or red text in `{typography.number-display}`, no background fill. **`asset-icon-circular`** — Circular plate behind asset glyphs. Background `{colors.surface-strong}`, rounded `{rounded.full}`, 32px diameter. ### Pricing **`pricing-tier-card`** — Standard pricing tier on Developer Platform. Background `{colors.canvas}`, rounded `{rounded.xl}`, padding 32px, 1px hairline border. Layout: tier name + price + feature checklist + CTA pill. **`pricing-tier-featured`** — The featured tier. Background `{colors.surface-dark}`, text `{colors.on-dark}`. Same skeleton, dark palette — visual inversion signals "highlighted choice" without colored ribbons. ### Forms **`text-input`** — Standard text input. Background `{colors.canvas}`, text `{colors.ink}`, rounded `{rounded.md}` (12px), padding 14px × 16px, height 48px, 1px hairline border. On focus, border thickens to 2px Coinbase Blue. **`search-input-pill`** — Pill-shaped search bar. Background `{colors.surface-strong}`, rounded `{rounded.pill}`, padding 12px × 20px, height 44px. ### Tags & Badges **`badge-pill`** — Small uppercase pill used as section labels ("INSTITUTIONAL", "REGULATED"). Background `{colors.surface-strong}`, text `{colors.ink}`, type `{typography.caption-strong}`, rounded `{rounded.pill}`. ### CTA / Footer **`cta-band-dark`** — Pre-footer "Take control of your money" band. Background `{colors.surface-dark}`, text `{colors.on-dark}`, vertical padding 96px. Centered headline + two CTAs. **`footer-light`** — Closing white-canvas footer. Background `{colors.canvas}`, text `{colors.body}`. 6-column link list. **`footer-link`** — Individual footer link. Background transparent, text `{colors.body}`. **`legal-band`** — Bottom strip beneath footer columns. All text `{colors.muted}` at `{typography.caption}`. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` (Coinbase Blue) for primary CTAs, wordmark, brand-glyph illustrations, inline accent links. - Set every CTA as `{rounded.pill}` (100px); every asset glyph as `{rounded.full}`. - Keep CoinbaseDisplay headlines at weight 400. - Use the dark/light band rotation as page rhythm. - Render every numerical value in CoinbaseMono via `{typography.number-display}`. - Pair every dark hero with a layered product-UI mockup card stack. ### Don't - Don't introduce a secondary brand color. Coinbase Blue is the only action color; trading green/red are semantic-only. - Don't bold display copy — display sits at weight 400; bolding shifts the brand voice. - Don't add drop shadow tiers — system has one shadow tier. - Don't use sharp `{rounded.none}` (0px) on CTAs. - Don't mix CoinbaseDisplay and CoinbaseSans inside the same headline. - Don't use trading green/red as a button background. - Don't extract a CTA color from a third-party widget (cookie consent, OneTrust). The brand's CTA color is what appears on actual product CTAs, not on injected modals. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Mobile | < 640px | Hero h1 80→40px; feature card grid 1-up; asset row stacks; nav collapses to hamburger; layered product-UI cards collapse to single card. | | Tablet | 640–1024px | Hero h1 64px; feature card grid 2-up; asset rows stay horizontal but compress columns. | | Desktop | 1024–1280px | Full hero h1 80px; feature card grid 3-up; full asset row layout. | | Wide | > 1280px | Content caps at 1200px; hero photography full-bleed. | ### Touch Targets - Primary CTA pill at 44px height — at WCAG AAA. - Larger hero pill (`{component.button-pill-cta}`) at 56px — well above AAA. - Asset icon circles at 32px — borderline; padded 8px row creates effective 48px tap zone. - Search pill at 44px height — at AAA. ### Collapsing Strategy - Top nav switches to hamburger sheet below 768px. Sign Up CTA stays visible. - Hero h1 steps down: 80 → 64 → 52 → 44 → 36px on smallest screens. - Layered product-UI mockup cards collapse from 2-3 stacked into a single card on mobile. - Pricing tier rows: 3-up → 2-up → 1-up. - Asset rows on mobile stack vertically: ticker line on top, price + change line beneath. ## Iteration Guide 1. Focus on a single component at a time. Reference YAML keys directly. 2. New CTAs default to `{rounded.pill}` (100px); new icon plates default to `{rounded.full}`. Cards use `{rounded.xl}`. 3. Variants live as separate entries inside the `components:` block. 4. Use `{token.refs}` everywhere — never inline hex. 5. Hover state never documented. Only Default and Active/Pressed. 6. CoinbaseDisplay 400 for display, CoinbaseSans 400/600/700 for body. CoinbaseMono on every number. 7. Coinbase Blue stays scarce — one or two blue moments per band. ## Known Gaps - CoinbaseDisplay, CoinbaseSans, CoinbaseMono are licensed; Inter and JetBrains Mono are documented substitutes. - In-product trading surfaces (order book, charts, order forms) are behind login walls — this document covers marketing only. - Animation timings out of scope. - Form validation states beyond focus not visible on captured surfaces. - Accent yellow appears only inside Bitcoin asset glyph illustrations; documented as illustrative-only.
NIKE RUN
Futura High-Impact
Nike Spec
复制
极具视觉冲击力的运动品牌设计,超大字重的全大写 Futura 字体与全屏无边界图文排版。
大写 Futura 字体
纯黑底色点缀
大留白排版
--- version: alpha name: Nike-design-analysis description: | A photography-first commerce system built on extreme typographic contrast — towering uppercase Futura display lockups burned into editorial campaign imagery, sitting above a dense, neutral, near-monochrome retail chrome of pill-shaped black CTAs, gray search and tag pills, and tight 8px-grid product cards. The brand's voice is athletic, kinetic, and absolute: pure black, pure white, a single soft surface gray, and a deliberately small set of semantic accents (sale red, success green, restrained category tints) — every chromatic moment is reserved for editorial photography or pricing signal, never decorative chrome. colors: primary: "#111111" on-primary: "#ffffff" canvas: "#ffffff" soft-cloud: "#f5f5f5" ink: "#111111" charcoal: "#39393b" ash: "#4b4b4d" mute: "#707072" stone: "#9e9ea0" hairline: "#cacacb" hairline-soft: "#e5e5e5" sale: "#d30005" sale-deep: "#780700" success: "#007d48" success-bright: "#1eaa52" info: "#1151ff" info-deep: "#0034e3" accent-pink: "#ed1aa0" accent-pink-soft: "#ffb0dd" accent-purple-soft: "#beaffd" accent-purple-pale: "#d6d1ff" accent-teal: "#0a7281" accent-pink-deep: "#4c012d" typography: display-campaign: fontFamily: Nike Futura ND fontSize: 96px fontWeight: 500 lineHeight: 0.9 letterSpacing: 0 textTransform: uppercase heading-xl: fontFamily: Helvetica Now Display Medium fontSize: 32px fontWeight: 500 lineHeight: 1.2 letterSpacing: 0 heading-lg: fontFamily: Helvetica Now Display Medium fontSize: 24px fontWeight: 500 lineHeight: 1.2 letterSpacing: 0 heading-md: fontFamily: Helvetica Now Display Medium fontSize: 16px fontWeight: 500 lineHeight: 1.75 letterSpacing: 0 body-md: fontFamily: Helvetica Now Text fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 body-strong: fontFamily: Helvetica Now Text Medium fontSize: 16px fontWeight: 500 lineHeight: 1.5 letterSpacing: 0 button-lg: fontFamily: Helvetica Now Display Medium fontSize: 24px fontWeight: 500 lineHeight: 1.2 letterSpacing: 0 button-md: fontFamily: Helvetica Now Text Medium fontSize: 16px fontWeight: 500 lineHeight: 1.5 letterSpacing: 0 button-sm: fontFamily: Helvetica Now Text Medium fontSize: 14px fontWeight: 500 lineHeight: 1.5 letterSpacing: 0 link-md: fontFamily: Helvetica Now Text fontSize: 16px fontWeight: 500 lineHeight: 1.75 letterSpacing: 0 textDecoration: underline caption-md: fontFamily: Helvetica Now Text Medium fontSize: 14px fontWeight: 500 lineHeight: 1.5 letterSpacing: 0 caption-sm: fontFamily: Helvetica Now Text Medium fontSize: 12px fontWeight: 500 lineHeight: 1.5 letterSpacing: 0 utility-xs: fontFamily: Helvetica Neue fontSize: 9px fontWeight: 500 lineHeight: 1.75 letterSpacing: 0 rounded: none: 0px sm: 18px md: 24px lg: 30px full: 9999px spacing: xxs: 2px xs: 4px sm: 8px md: 12px lg: 18px xl: 24px xxl: 30px section: 48px components: button-primary: backgroundColor: "{colors.ink}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.full}" padding: 16px 32px height: 48px button-primary-active: backgroundColor: "{colors.ink}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.full}" button-secondary: backgroundColor: "{colors.soft-cloud}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.full}" padding: 16px 32px height: 48px button-outline-on-image: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.full}" padding: 12px 24px button-icon-circular: backgroundColor: "{colors.soft-cloud}" textColor: "{colors.ink}" rounded: "{rounded.full}" size: 40px search-pill: backgroundColor: "{colors.soft-cloud}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 8px 16px height: 40px search-pill-focused: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" rounded: "{rounded.md}" filter-chip: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.full}" padding: 8px 16px filter-chip-active: backgroundColor: "{colors.ink}" textColor: "{colors.on-primary}" typography: "{typography.button-md}" rounded: "{rounded.full}" badge-promo: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.caption-sm}" rounded: "{rounded.full}" padding: 4px 12px badge-sale-text: textColor: "{colors.sale}" typography: "{typography.caption-md}" product-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-strong}" rounded: "{rounded.none}" padding: 0px product-card-image: backgroundColor: "{colors.soft-cloud}" rounded: "{rounded.none}" swatch-dot: backgroundColor: "{colors.ink}" rounded: "{rounded.full}" size: 12px swatch-dot-active: backgroundColor: "{colors.ink}" rounded: "{rounded.full}" size: 12px campaign-tile: backgroundColor: "{colors.ink}" textColor: "{colors.on-primary}" typography: "{typography.display-campaign}" rounded: "{rounded.none}" category-icon-card: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.caption-md}" rounded: "{rounded.none}" member-benefit-card: backgroundColor: "{colors.ink}" textColor: "{colors.on-primary}" typography: "{typography.heading-lg}" rounded: "{rounded.none}" faq-row: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.heading-md}" rounded: "{rounded.none}" padding: 24px 0px pdp-disclosure-row: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-strong}" rounded: "{rounded.none}" padding: 24px 0px utility-bar: backgroundColor: "{colors.soft-cloud}" textColor: "{colors.ink}" typography: "{typography.caption-sm}" rounded: "{rounded.none}" height: 36px primary-nav: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-strong}" rounded: "{rounded.none}" height: 56px filter-sidebar: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.body-strong}" rounded: "{rounded.none}" footer: backgroundColor: "{colors.canvas}" textColor: "{colors.mute}" typography: "{typography.caption-md}" rounded: "{rounded.none}" --- ## Overview Nike's commerce system is built on a single, almost violently simple idea: photography speaks, the chrome doesn't. Every page reads as an athletic editorial — towering uppercase Futura display lockups (`{typography.display-campaign}`) burned into full-bleed campaign imagery, with everything else (nav, filters, buttons, cards, footer) reduced to neutral typography and pill geometry on `{colors.canvas}` and `{colors.soft-cloud}`. There is no decorative gradient, no soft shadow nostalgia, no accent color used for "tone" — the system saves all chromatic energy for product photography and the small handful of moments that actually need to signal (sale price `{colors.sale}`, success `{colors.success}`, swatch dots). The result is a layout that feels physical — campaign hero, product grid, sport tile, footer — stacked like a printed catalog rather than animated like a typical SaaS landing page. Density is high but never crowded, because the system relies on three relentless devices: square or near-square 1:1 product imagery on `{colors.soft-cloud}`, pill-shaped black CTAs (`{rounded.full}`) anchoring every actionable surface, and a tight 8px-base spacing scale that keeps cards and filters mathematically aligned across PLP, PDP, and editorial pages. Across `/men`, the trail-running listing, the Zegama PDP, `/membership`, and Jordan Golf, the same chrome appears in identical proportions — only the photography and copy change. That is the system's signature: maximum editorial expression in the imagery, maximum mechanical restraint everywhere else. **Key Characteristics:** - Editorial campaign hero with `{typography.display-campaign}` (Nike Futura ND, 96px, line-height 0.9, uppercase) burned directly into full-bleed photography - Pure black/white/single-gray UI palette: `{colors.ink}`, `{colors.canvas}`, and `{colors.soft-cloud}` carry ~95% of the chrome surface area - Pill geometry everywhere: every CTA, search field, filter chip, and badge uses `{rounded.full}` (30px) or `{rounded.md}` (24px) — there are no sharp-cornered buttons in the system - Product cards have zero radius, zero shadow, sit directly on `{colors.soft-cloud}` swatch backgrounds — the photograph is the card - Two-tone CTA hierarchy: `{component.button-primary}` (black on anything light) versus `{component.button-secondary}` (`{colors.soft-cloud}` on anything bright) — never both at once on the same surface - 8px spacing system with section rhythm at `{spacing.section}` (48px) creating consistent vertical breathing across PLP, PDP, and editorial pages - Sale signaling is the only place a non-neutral color appears in retail chrome: `{colors.sale}` price + strike-through original price, no badge background ## Colors > **Source pages:** `/men` (primary), `/w/mens-acg-trail-running-shoes-…`, `/t/acg-zegama-…`, `/membership`, `/w/jordan-golf-…`. The chrome palette is identical across all five — only photography varies. ### Brand & Accent - **Nike Black** (`{colors.ink}` — `#111111`): The brand's only "color." It is the primary CTA, the swatch dot, the active filter chip, the campaign overlay, the headline color, and the body text. When Nike wants to assert anything, it goes black. - **Pure White** (`{colors.on-primary}`, `{colors.canvas}` — `#ffffff`): Equal partner to black. Carries every page background, the on-image CTA, and the inverse text on `{colors.ink}` surfaces. ### Surface - **Soft Cloud** (`{colors.soft-cloud}` — `#f5f5f5`): The most-used non-white surface in the entire system. Product card image backgrounds, search pill, secondary CTA, utility bar, sport-category swatch tiles. It is the "color" of every product photograph's stage. - **Hairline** (`{colors.hairline}` — `#cacacb`): 1px dividers between filter rows, footer columns, and PDP disclosure rows. - **Hairline Soft** (`{colors.hairline-soft}` — `#e5e5e5`): Inset 1px shadow under sticky bars and tab strips, the only "shadow" the system uses. ### Text - **Ink** (`{colors.ink}` — `#111111`): Primary text on light surfaces — headlines, product names, prices, nav. - **Charcoal** (`{colors.charcoal}` — `#39393b`): Slightly softer body where ink is too heavy. - **Ash** (`{colors.ash}` — `#4b4b4d`): Disabled secondary border on dark surfaces and very low-emphasis utility text. - **Mute** (`{colors.mute}` — `#707072`): Product category subtitles ("Men's Trail Running Shoes"), footer link text, secondary metadata. - **Stone** (`{colors.stone}` — `#9e9ea0`): Inverse secondary text on dark surfaces and lowest-emphasis utility text. ### Semantic - **Sale** (`{colors.sale}` — `#d30005`): Discounted price color and "% off" copy — the only red in the entire retail chrome. - **Sale Deep** (`{colors.sale-deep}` — `#780700`): Sale price hover/pressed and dark-mode sale anchor. - **Success** (`{colors.success}` — `#007d48`): Confirmation messages, in-stock indicators, eligibility ticks. - **Success Bright** (`{colors.success-bright}` — `#1eaa52`): Inverse success on dark surfaces. - **Info** (`{colors.info}` — `#1151ff`): Informational link/badge accent in member-experience callouts. - **Info Deep** (`{colors.info-deep}` — `#0034e3`): Pressed state for info accent. ### Category Accents (sport / collection chips) These appear sparingly — almost exclusively as small chip backgrounds, swatch dots, or category illustrations in editorial tiles. They are never used as text or primary CTA color. - **Accent Pink** (`{colors.accent-pink}` — `#ed1aa0`): SKIMS / women's collection moments. - **Accent Pink Soft** (`{colors.accent-pink-soft}` — `#ffb0dd`): Soft tinting on member-experience tiles. - **Accent Purple Soft** (`{colors.accent-purple-soft}` — `#beaffd`): Editorial swatch dot, soft category chip. - **Accent Purple Pale** (`{colors.accent-purple-pale}` — `#d6d1ff`): Lightest soft-tile fill. - **Accent Teal** (`{colors.accent-teal}` — `#0a7281`): Trail / outdoor / ACG editorial accent in lockups. - **Accent Pink Deep** (`{colors.accent-pink-deep}` — `#4c012d`): Deepest editorial overlay tint, used as wash on heritage / Jordan tiles. ## Typography ### Font Family - **Nike Futura ND** (display campaign only) — proprietary geometric sans for the towering uppercase headlines burned into campaign hero photography. Falls back to Helvetica Now Text Medium → Helvetica → Arial. - **Helvetica Now Display Medium** (headings 16–32px) — modern Helvetica cut tuned for display sizes; carries every section title, PDP product name, and dialog headline. - **Helvetica Now Text Medium** (UI 12–16px) — buttons, captions, swatch labels, badge text. The system's UI workhorse. - **Helvetica Now Text** (body and links) — long-form body and underlined inline links. - **Neue Frutiger Arabic** — RTL pairing for Arabic locales at `{typography.heading-lg}` and caption sizes. - **Helvetica Neue 9px** — legal-fine-print utility row only (`{typography.utility-xs}`). When substituting on systems without proprietary Nike fonts: pair **Inter** (Display 700 for body chrome, Display 500 for buttons) with **Bebas Neue** or **Anton** at 96px/0.9 line-height for the campaign headline tier. Tighten letter-spacing slightly (-0.5%) on the substitute to approximate Futura ND's optical weight. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-campaign}` | 96px | 500 | 0.9 | 0 | Editorial campaign headline burned into hero photography (uppercase) | | `{typography.heading-xl}` | 32px | 500 | 1.2 | 0 | Section headers — "FEATURED FOOTWEAR", "LATEST IN CLOTHING", PDP product title block | | `{typography.heading-lg}` | 24px | 500 | 1.2 | 0 | Subsection / member-benefit card title, large CTA label, PDP price | | `{typography.heading-md}` | 16px | 500 | 1.75 | 0 | Card title, FAQ row label, filter group header | | `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Body copy, search-pill placeholder, product description | | `{typography.body-strong}` | 16px | 500 | 1.5 | 0 | Product card name, filter row label, primary nav link | | `{typography.button-lg}` | 24px | 500 | 1.2 | 0 | Pressed-letter campaign CTA inside hero blocks | | `{typography.button-md}` | 16px | 500 | 1.5 | 0 | Standard pill CTAs across the system | | `{typography.button-sm}` | 14px | 500 | 1.5 | 0 | Compact pill CTA, badge label, geo-selector button | | `{typography.link-md}` | 16px | 500 | 1.75 | 0 | Underlined inline link, "View Product Details" | | `{typography.caption-md}` | 14px | 500 | 1.5 | 0 | Product subtitle ("Men's Trail Running Shoes"), filter count, footer link | | `{typography.caption-sm}` | 12px | 500 | 1.5 | 0 | Filter chip label, badge text, color count | | `{typography.utility-xs}` | 9px | 500 | 1.75 | 0 | Legal copyright / fine-print row at the very bottom | ### Principles The system runs on extreme typographic contrast: a single 96px uppercase display tier reserved for editorial campaign moments, and a quiet 12–16px Helvetica Now Text/Medium tier carrying everything else. There is almost no middle ground — the jump from `{typography.heading-xl}` (32px) directly to `{typography.body-strong}` (16px) is intentional and creates the "billboard above, catalog below" effect across every page. Letter-spacing is left at 0 (Futura ND and Helvetica Now are both cut for tight optical fit at scale). ### Note on Font Substitutes The closest open-source path to Nike's display tier is **Bebas Neue** (free, geometric condensed) at 96px / 0.9 / uppercase / 500. For UI text, **Inter** is the safest substitute — match weights 400/500 and the system reads almost identically at button and caption sizes. ## Layout ### Spacing System - **Base unit:** 8px - **Tokens (front matter):** `{spacing.xxs}` (2px) · `{spacing.xs}` (4px) · `{spacing.sm}` (8px) · `{spacing.md}` (12px) · `{spacing.lg}` (18px) · `{spacing.xl}` (24px) · `{spacing.xxl}` (30px) · `{spacing.section}` (48px+) - **Universal rhythm:** every page in the set uses `{spacing.section}` (48px) as the vertical gap between major content blocks (campaign hero → trending row → featured row → shop-by-sport → latest-in-clothing → footer). PLP card grids use `{spacing.sm}` (8px) gutters. PDP disclosure rows are stacked at `{spacing.xl}` (24px) vertical padding. - **Card internal padding:** product cards use 0px internal padding — image is full-bleed; metadata rows sit directly below with `{spacing.sm}` (8px) gap between name, subtitle, and price. ### Grid & Container - **Max width:** ~1440px content area with edge gutters that grow to ~80px at 1920px (the system lets very wide viewports breathe rather than stretch). - **Column patterns:** PLP listing uses 3-up at desktop, collapsing to 2-up at 1023px and 1-up at 599px. The men's home `/men` mixes a 2-up campaign hero row, a 3- or 4-up "Trending Now" row, a horizontal-scroll "Shop by Sport" rail, and a 4-up "Latest in Clothing" thumbnail grid. - **Filter sidebar:** ~220px fixed-width left rail on PLP at desktop, collapsing into a `Hide Filters` toggle button at narrow widths. ### Whitespace Philosophy Whitespace is a tool for separation, not for breath. Sections butt directly against each other vertically with `{spacing.section}` rhythm, and product photos tile edge-to-edge inside their grid — there is no padding wrapped around the product image itself. The "air" comes from the `{colors.soft-cloud}` background of the photograph, not from layout margin. Headlines do not have decorative whitespace above them; they sit immediately under the section divider line. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 — Flat | No shadow, no border | Default for cards, buttons, sections — the dominant treatment | | 1 — Hairline divider | 1px solid `{colors.hairline}` | Filter row separators, footer column borders, PDP disclosure-row separators | | 2 — Inset bottom-line | `box-shadow: inset 0 -1px 0 {colors.hairline-soft}` | Sticky utility/sub-nav bar bottom edge, tab strip underline | The system has no drop-shadow elevation in its retail chrome at all. Cards do not lift on the page. The only depth cue is the 1px inset hairline on sticky strips and the contrast between full-bleed photography and `{colors.soft-cloud}` product backdrops. ### Decorative Depth Depth in Nike's system comes entirely from photography, not from CSS effects: - **Editorial campaign tiles** create depth via cinematic perspective — a runner on a trail, a model in a courtyard — with the Futura display headline overlaid in white or `{colors.ink}` directly on the image. - **Product card photography** is shot on flat `{colors.soft-cloud}` to remove any background depth, so the product itself is the only thing with form on the page. - **Sport-category tiles** on the home page are full-bleed cinematic photography with a small `{component.button-outline-on-image}` pill anchored at the bottom-left, giving a moment of crisp white pill against atmospheric image. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Cards, campaign tiles, product imagery, navigation, footer — every container in the system | | `{rounded.sm}` | 18px | Avatar / icon container in member-benefit lockups | | `{rounded.md}` | 24px | Search pill, search submit, filter input | | `{rounded.lg}` | 30px | Every CTA pill — primary, secondary, on-image, filter chip, geo-selector, "Notify Me" | | `{rounded.full}` | 9999px | Color swatch dots and circular icon buttons (back, share, favorite, carousel paddle) | ### Photography Geometry - **Product cards:** consistent 1:1 square or near-square (~4:5 portrait on tall product crops), full-bleed within the card with no padding, sitting on `{colors.soft-cloud}` backdrop. - **Editorial campaign hero:** ~16:9 or wider cinematic crop, full-bleed across the content max-width, with the Futura display headline burned into the lower-left or upper-left third. - **Sport-category rail:** 4:5 portrait full-bleed thumbnails with a small CTA pill anchored bottom-left. - **PDP main image:** square primary image with vertical thumbnail rail to its left (~5–7 thumbnails stacked at small size), enabling rapid color/angle browsing without leaving the page. - **Avatar / category icon cards:** centered illustrated icon at ~80–96px on `{colors.canvas}` with `{typography.caption-md}` label below. ## Components > **No hover states documented** per system policy. Each spec covers Default and Active/Pressed only; variants live as separate `components:` entries in the front matter. ### Buttons **`button-primary`** — the universal Nike CTA - Background `{colors.ink}`, text `{colors.on-primary}`, type `{typography.button-md}`, padding `16px 32px`, height `{spacing.section}` (48px), rounded `{rounded.lg}` (30px pill). - Used on every primary action in the system: "Sign Up", "Notify Me", "Buy", "Türkiye" geo-confirm, "Shop" overlay on sport tiles, "Continue". - Pressed state lives in `button-primary-active` — the bg stays `{colors.ink}` while the surface shrinks to `scale(0.5)` with `opacity: 0.5` (Nike's signature "tap collapse" feedback that's extracted across all five pages). **`button-secondary`** — soft alternative on light surfaces - Background `{colors.soft-cloud}`, text `{colors.ink}`, type `{typography.button-md}`, padding `16px 32px`, rounded `{rounded.lg}`. - Used as the lower-emphasis alternate when a primary CTA already exists, e.g., "United States" geo-decline next to the black "Türkiye" confirm; "Cancel" or "Discover More" on light cards. **`button-outline-on-image`** — overlay CTA on photography - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.button-md}`, padding `12px 24px`, rounded `{rounded.lg}`. - The crisp white pill that anchors the bottom-left of every full-bleed sport-category and editorial campaign tile. **`button-icon-circular`** — chrome icon controls - Background `{colors.soft-cloud}` or transparent, icon `{colors.ink}`, rounded `{rounded.full}`, size 40px. - Used for back-arrow, carousel paddle (left/right), wishlist heart, share, and "Hide Filters" toggle. **`filter-chip`** + **`filter-chip-active`** - Default: background `{colors.canvas}`, text `{colors.ink}`, 1px hairline `{colors.hairline}`, type `{typography.button-md}`, rounded `{rounded.lg}`, padding `8px 16px`. - Active: background `{colors.ink}`, text `{colors.on-primary}` — the chip flips fully inverted when selected. No middle state. ### Inputs & Forms **`search-pill`** + **`search-pill-focused`** - Default: background `{colors.soft-cloud}`, text `{colors.ink}`, type `{typography.body-md}`, rounded `{rounded.md}` (24px), padding `8px 16px`, height `40px`. Anchored to the right of the primary nav with a small magnifier icon. - Focused: background `{colors.canvas}`, 2px solid border `{colors.ink}`, with a 12px outer halo of `{colors.soft-cloud}` (the system's only "focus ring" effect). The pill shape stays `{rounded.md}` so the halo reads as a soft glove, not a hard outline. ### Cards & Containers **`product-card`** - Container: background `{colors.canvas}`, rounded `{rounded.none}`, padding 0, no shadow. - Image area: `{component.product-card-image}` — full-bleed product photo on `{colors.soft-cloud}` square. - Below image (in this order with `{spacing.sm}` between): swatch dot row (3–6 dots at 12px circular), promo badge if applicable (`{component.badge-promo}` "Just In", "Coming Soon", "Recycled Materials"), product name `{typography.body-strong}` `{colors.ink}`, category subtitle `{typography.caption-md}` `{colors.mute}`, price row. - Price row: regular price `{typography.body-strong}` `{colors.ink}`. If on sale: discounted price `{colors.sale}` followed by strike-through original `{colors.mute}` followed by "% off" in `{colors.sale}`. **`campaign-tile`** — the brand's signature editorial unit - Full-bleed photography with `{typography.display-campaign}` headline burned in (uppercase, 96px, line-height 0.9). - Headline color is whichever of `{colors.canvas}` or `{colors.ink}` reads against the underlying image — not parameterized; chosen per-asset. - A single `{component.button-outline-on-image}` pill anchored bottom-left of the tile carries the call-to-action. **`category-icon-card`** - Container: background `{colors.canvas}`, rounded `{rounded.none}`. - Centered category illustration (~80px) + label `{typography.caption-md}` `{colors.ink}` directly below. Used in the "Latest in Clothing" 4–8-up icon strip on `/men`. **`member-benefit-card`** - Full-bleed photographic card on a dark image background; copy slot at the bottom-left with `{typography.heading-lg}` headline `{colors.on-primary}` and a `{component.button-outline-on-image}` "Explore" pill below. - Used in the `/membership` "Member Benefits" 3-up grid. **`swatch-dot`** + **`swatch-dot-active`** - 12px circle, rounded `{rounded.full}`, no border in default state. Renders the colorway options on every product card and PDP color picker. - Default: filled with the colorway's actual product color (extracted at runtime from the product image), 1px subtle outer ring in `{colors.hairline}` for white/light colorways so they remain visible on `{colors.canvas}`. - Active: identical fill with a 2px `{colors.ink}` outer ring and 2px white interior gap, creating Nike's signature concentric-ring "selected" state. No size change between default and active. **`badge-promo`** - Background `{colors.canvas}` with 1px hairline `{colors.hairline}`, text `{colors.ink}`, type `{typography.caption-sm}`, rounded `{rounded.lg}`, padding `4px 12px`. - Sits on top of product imagery (top-left of card) with copy like "Just In", "Coming Soon", "Recycled Materials", "Member Exclusive". **`badge-sale-text`** - Inline price-row text in `{colors.sale}` with no background — the only "badge" in the system that has no container. ### Navigation **`utility-bar`** — top utility strip - Background `{colors.soft-cloud}`, text `{colors.ink}`, type `{typography.caption-sm}`, height ~36px, rounded `{rounded.none}`. - Right-aligned cluster: "Find a Store · Help · Join Us · Sign In". Always present; never collapses. **`primary-nav`** — main navigation - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-strong}` for nav links, height 56–64px, rounded `{rounded.none}`. - Layout: Nike swoosh logo at left (32×32), centered nav row ("New & Featured · Men · Women · Kids · Jordan · Nike SKIMS · Sport"), right cluster (search pill, wishlist heart icon, bag icon). - The active section gets a 2px-bottom underline in `{colors.ink}` — no background fill. **Sub-nav strip** (PLP) — appears under primary nav with breadcrumb + sort + hide-filters controls. - Same `{colors.canvas}` background with a 1px inset hairline-soft bottom edge. - Left: breadcrumb in `{typography.caption-md}` `{colors.mute}` separated by " / ". - Right: "Hide Filters" toggle + "Sort By: …" dropdown — both in `{typography.button-md}` with chevron icons. **Top Nav (Mobile)** - Hamburger menu icon (left), Nike swoosh (center), search + bag icons (right). - Search pill collapses into an icon-only button at narrow widths; tapping expands a full-width overlay search pill with `{rounded.md}`. - Primary nav collapses into a full-height drawer that slides in from the left, listing nav rows top-down with `{spacing.xl}` vertical padding. ### Signature Components **`pdp-disclosure-row`** — PDP information accordion rows - Stacked rows for "View Product Details", "Shipping & Returns", "Reviews (n)" with `{spacing.xl}` vertical padding and a 1px `{colors.hairline}` divider below each. - Label `{typography.body-strong}` `{colors.ink}` left-aligned; chevron `{colors.ink}` right-aligned. **`faq-row`** — `/membership` FAQ accordion - Identical pattern to `pdp-disclosure-row` but with `{typography.heading-md}` label weight; 1px `{colors.hairline}` divider below each. **`filter-sidebar`** — PLP left rail - Container `{colors.canvas}`, rounded `{rounded.none}`. - Section headers `{typography.body-strong}` `{colors.ink}` with `{spacing.lg}` (18px) vertical gap between groups. - Active filters get a 1px ink underline; counts in parentheses use `{colors.mute}`. **`footer`** - Background `{colors.canvas}` with a single 1px `{colors.hairline}` top divider. - Four columns: Resources / Help / Company / Promotions & Discounts, each with column header `{typography.body-strong}` `{colors.ink}` and link list `{typography.caption-md}` `{colors.mute}`. - Below the columns: a horizontal rule, then a fine-print row with `{typography.utility-xs}` `{colors.mute}` (copyright, locale switcher, terms, privacy, supply-chain act). ## Do's and Don'ts ### Do - Reserve `{typography.display-campaign}` exclusively for editorial campaign hero lockups — never use 96px Futura for section headers or product titles. - Use `{component.button-primary}` (`{colors.ink}` pill) as the single primary action per viewport. Pair it at most with `{component.button-secondary}` (`{colors.soft-cloud}` pill) for a soft alternative. - Stage every product photograph on `{colors.soft-cloud}` — the gray is the system's "studio." - Keep all CTAs pill-shaped at `{rounded.lg}` (30px). Never introduce a square or `{rounded.sm}` button. - Use `{colors.sale}` only on price rows — never on backgrounds, badges, or chrome. - Stack content sections at `{spacing.section}` (48px) rhythm with no decorative dividers between them; the photography's bleed-edge is the divider. - Anchor on-image CTAs with `{component.button-outline-on-image}` (white pill) at bottom-left — the system's universal "shop this image" position. ### Don't - Don't introduce drop shadows or card elevation. Cards sit flat on the page; the only depth cue is the 1px inset hairline on sticky bars. - Don't use any of the category accent colors (`{colors.accent-pink}`, `{colors.accent-purple-soft}`, `{colors.accent-teal}`) for primary chrome — they belong to swatch dots, soft tile fills, and editorial moments only. - Don't replace `{colors.ink}` with a near-black gray like `{colors.charcoal}` for a CTA — Nike's primary pill is true `#111111`. - Don't pad inside product cards. The image is full-bleed; metadata sits directly below with `{spacing.sm}` (8px) between rows. - Don't put two campaign-tile lockups in the same row at the same scale — Nike alternates a single full-bleed editorial tile with a 2-up or 4-up product/category grid. - Don't underline anything other than `{typography.link-md}` inline links and the active primary-nav indicator. Buttons, headings, and prices stay un-underlined. - Don't introduce a third button shape. Pill or icon-circular — that's the entire button shape vocabulary. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | ultrawide | 1920px+ | Content max-width holds at ~1440px; outer gutters grow to ~80px on each side | | desktop-large | 1440px | Default desktop layout — 3-up product grid, 4-up clothing strip, full primary nav | | desktop | 1200px | Same as large with slightly narrower outer gutters | | desktop-small | 1024px | Filter sidebar starts compressing; sport rail shows ~3 visible tiles | | tablet | 1023–961px | 3-up PLP collapses to 2-up; "Hide Filters" becomes a default toggle | | tablet-narrow | 960–640px | Primary nav center cluster collapses to a hamburger drawer; search pill becomes icon-only | | mobile-landscape | 639–600px | 2-up PLP collapses to 1-up; product cards become full-width with image and metadata stacking | | mobile | 599–320px | Single-column everything; campaign tiles render at full screen width with shorter Futura sizes (~64px) | ### Touch Targets All interactive elements meet WCAG AAA (44×44px minimum). Pills (`{component.button-primary}`, `{component.button-secondary}`) sit at 48px height with 32px horizontal padding. Icon-circular buttons (`{component.button-icon-circular}`) sit at 40px — Nike's PDP carousel paddle and wishlist heart sit just under AAA but above AA at 40×40, with hit-target padding extending the tappable area to 48px+. Filter-chip pills are 40px height with 16px padding. ### Collapsing Strategy - **Primary nav:** desktop center cluster → mobile drawer triggered by hamburger at left of the swoosh. - **PLP grid:** 3-up → 2-up → 1-up at 1023, 599, and below; gutters drop from `{spacing.sm}` to `{spacing.xs}` on mobile. - **Filter sidebar:** 220px fixed → "Hide Filters" toggle → off-canvas full-screen filter drawer at mobile. - **Sport rail:** desktop horizontal scroll with ~5 visible → mobile horizontal scroll with ~1.5 visible (peek-next-card pattern). - **Section spacing:** `{spacing.section}` 48px desktop → 32px tablet → 24px mobile to keep editorial rhythm tight on small screens. - **Editorial campaign headline:** desktop 96px → tablet 64px → mobile 48px, line-height stays at 0.9 across all sizes. ### Image Behavior - Product imagery is responsive at the same 1:1 ratio across all breakpoints — the image scales, the ratio doesn't. - Editorial campaign tiles use art-direction crops: a 16:9 wide hero on desktop swaps to a 4:5 portrait on mobile so the figure stays centered and the headline still has burn-in space. - All non-critical product imagery is lazy-loaded as the user scrolls into the next grid row. ## Iteration Guide 1. Focus on ONE component at a time. Pull its YAML entry from the front matter and verify every property resolves. 2. Reference component names and tokens directly (`{colors.ink}`, `{component.button-primary-active}`, `{rounded.lg}`) — do not paraphrase color names or radii in prose. 3. Run `npx @google/design.md lint DESIGN.md` after edits — `broken-ref`, `contrast-ratio`, and `orphaned-tokens` warnings flag issues automatically. 4. Add new variants as separate component entries (`-active`, `-disabled`, `-focused`) — do not bury them inside prose. Nike's pressed state (`scale(0.5) opacity 0.5`) is intentional and must be its own entry, not a hover stand-in. 5. Default body to `{typography.body-md}`; reach for `{typography.body-strong}` for product names and primary nav links; reserve `{typography.display-campaign}` strictly for hero campaign lockups. 6. Keep `{colors.ink}` scarce per viewport — if more than one solid-black pill or block appears in the same fold, neutralize one to `{component.button-secondary}` or `{component.button-outline-on-image}`. 7. When introducing a new component, ask whether it can be expressed with the existing pill + flat-card + photography-on-`{colors.soft-cloud}` vocabulary before adding new tokens. The system's strength is that it almost never needs new ones. ## Known Gaps - **Mobile screenshots not captured** — responsive behavior described above synthesizes Nike's known mobile pattern (hamburger drawer, 1-up grid, headline downscale) from desktop evidence and the breakpoint list extracted from tokens. - **Hover states not documented** by system policy — Nike's CSS uses `--pds-color-element-hover` and `--pds-color-text-hover` tokens but these are not included here. - **Dialog / modal styling** beyond the geo-selector and the country-confirmation pill pair could not be confirmed from the captured surfaces; bag, wishlist, and login overlays are not documented. - **Form field styling** for checkout, sign-up, and address forms is not present in the captured surfaces — only the search pill is documented. - **Bag and wishlist** icon-state variants (filled count badges) not visible in the captured pages.
Shopify Admin
Polar Cold Dark
Shopify Spec
复制
为全球商户服务的极速电商后台系统,冷冬极夜黑中泛起极光般的薄荷绿与翡翠绿,极极秩序感。
商户绿
极夜冷背景
网格卡片面板
--- version: alpha name: Shopifi-Inspired-design-analysis description: An inspired interpretation of Shopifi's design language — a cinematic commerce platform that runs two parallel design tracks. The marketing-hero and product-narrative pages live on near-black canvases with full-bleed photography of merchants, giant Neue Haas Grotesk display type at thin weights, and a single black-pill CTA stroked in white. The transactional pages (pricing, signup, dashboards) flip to a cream-mint canvas with pastel aloe and pistachio greens, the same pill button vocabulary, and Inter for UI body. The two tracks share typographic DNA but diverge sharply in canvas polarity — and that choice is the brand. colors: primary: "#000000" ink: "#000000" on-primary: "#ffffff" on-dark: "#ffffff" canvas-night: "#000000" canvas-night-elevated: "#0a0a0a" canvas-light: "#ffffff" canvas-cream: "#fbfbf5" surface-elevated-dark: "#1e2c31" shade-30: "#d4d4d8" shade-40: "#a1a1aa" shade-50: "#71717a" shade-60: "#52525b" shade-70: "#3f3f46" hairline-light: "#e4e4e7" hairline-dark: "#1e2c31" aloe-10: "#c1fbd4" pistachio-10: "#d4f9e0" link-cool-1: "#9dabad" link-cool-2: "#9797a2" link-cool-3: "#bdbdca" link-mint: "#99b3ad" typography: display-xxl: fontFamily: "NeueHaasGrotesk Display, Helvetica, Arial, sans-serif" fontSize: 96px fontWeight: 330 lineHeight: 1.0 letterSpacing: 2.4px fontFeature: ss03 display-xl: fontFamily: "NeueHaasGrotesk Display, Helvetica, Arial, sans-serif" fontSize: 70px fontWeight: 330 lineHeight: 1.0 letterSpacing: 0 fontFeature: ss03 display-lg: fontFamily: "NeueHaasGrotesk Display, Helvetica, Arial, sans-serif" fontSize: 55px fontWeight: 330 lineHeight: 1.16 letterSpacing: 0 fontFeature: ss03 display-md: fontFamily: "NeueHaasGrotesk Display, Helvetica, Arial, sans-serif" fontSize: 48px fontWeight: 330 lineHeight: 1.14 letterSpacing: 0 fontFeature: ss03 heading-xl: fontFamily: "NeueHaasGrotesk Display, Helvetica, Arial, sans-serif" fontSize: 28px fontWeight: 500 lineHeight: 1.28 letterSpacing: 0.42px fontFeature: ss03 heading-lg: fontFamily: "NeueHaasGrotesk Display, Helvetica, Arial, sans-serif" fontSize: 24px fontWeight: 400 lineHeight: 1.14 letterSpacing: 0.36px fontFeature: ss03 heading-md: fontFamily: "NeueHaasGrotesk Display, Helvetica, Arial, sans-serif" fontSize: 20px fontWeight: 500 lineHeight: 1.4 letterSpacing: 0.3px fontFeature: ss03 heading-sm: fontFamily: "NeueHaasGrotesk Display, Helvetica, Arial, sans-serif" fontSize: 18px fontWeight: 500 lineHeight: 1.25 letterSpacing: 0.72px fontFeature: ss03 body-lg: fontFamily: "Inter Variable, Inter, Helvetica, Arial, sans-serif" fontSize: 18px fontWeight: 550 lineHeight: 1.56 letterSpacing: 0 fontFeature: ss03 body-md: fontFamily: "Inter Variable, Inter, Helvetica, Arial, sans-serif" fontSize: 16px fontWeight: 420 lineHeight: 1.5 letterSpacing: 0 fontFeature: ss03 body-strong: fontFamily: "Inter Variable, Inter, Helvetica, Arial, sans-serif" fontSize: 16px fontWeight: 550 lineHeight: 1.5 letterSpacing: 0 fontFeature: ss03 caption: fontFamily: "Inter Variable, Inter, Helvetica, Arial, sans-serif" fontSize: 14px fontWeight: 500 lineHeight: 1.49 letterSpacing: 0.28px fontFeature: ss03 micro: fontFamily: "Inter Variable, Inter, Helvetica, Arial, sans-serif" fontSize: 13px fontWeight: 500 lineHeight: 1.5 letterSpacing: -0.13px fontFeature: ss03 eyebrow-cap: fontFamily: "Inter Variable, Inter, Helvetica, Arial, sans-serif" fontSize: 12px fontWeight: 400 lineHeight: 1.2 letterSpacing: 0.72px fontFeature: ss03 code: fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace" fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 fontFeature: ss03 rounded: xs: 4px sm: 5px md: 8px lg: 12px xl: 20px pill: 9999px spacing: xxs: 2px xs: 4px sm: 8px md: 12px lg: 16px xl: 24px xxl: 32px huge: 64px components: button-primary-pill: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.body-md}" rounded: "{rounded.pill}" padding: 12px 24px button-primary-pill-pressed: backgroundColor: "{colors.shade-70}" textColor: "{colors.on-primary}" typography: "{typography.body-md}" rounded: "{rounded.pill}" padding: 12px 24px button-outline-on-dark: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-primary}" typography: "{typography.body-md}" rounded: "{rounded.pill}" padding: 12px 26px button-outline-on-light: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.pill}" padding: 12px 24px button-aloe-pill: backgroundColor: "{colors.aloe-10}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.pill}" padding: 12px 24px text-input: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 10px 12px card-pricing: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-pricing-featured: backgroundColor: "{colors.aloe-10}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-feature-cinematic: backgroundColor: "{colors.canvas-night-elevated}" textColor: "{colors.on-primary}" typography: "{typography.body-lg}" rounded: "{rounded.lg}" padding: 32px card-pistachio-band: backgroundColor: "{colors.pistachio-10}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.lg}" padding: 32px card-photo-frame: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-primary}" typography: "{typography.body-md}" rounded: "{rounded.xl}" padding: 0px pill-tag-mint: backgroundColor: "{colors.aloe-10}" textColor: "{colors.ink}" typography: "{typography.eyebrow-cap}" rounded: "{rounded.pill}" padding: 4px 12px pill-tag-shade: backgroundColor: "{colors.shade-30}" textColor: "{colors.ink}" typography: "{typography.eyebrow-cap}" rounded: "{rounded.pill}" padding: 4px 12px nav-bar-light: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.xs}" padding: 16px 24px nav-bar-dark: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-primary}" typography: "{typography.body-md}" rounded: "{rounded.xs}" padding: 16px 24px link-on-dark: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-primary}" typography: "{typography.body-md}" rounded: "{rounded.xs}" padding: 0px footer-dark: backgroundColor: "{colors.canvas-night}" textColor: "{colors.on-primary}" typography: "{typography.caption}" rounded: "{rounded.xs}" padding: 64px 24px footer-light: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.caption}" rounded: "{rounded.xs}" padding: 64px 24px --- ## Overview Shopifi runs two parallel design tracks that share typographic DNA and a single button vocabulary, but diverge in canvas polarity. The marketing track lives on `{colors.canvas-night}` (`#000000`) — full-bleed cinematic photography of merchants, giant `{typography.display-xxl}` headlines in Neue Haas Grotesk Display set at weight 330 (a thin, almost editorial cut), and a single CTA: a white-stroked black pill with the form `button-outline-on-dark`. The pages read like the spread of a high-end print magazine: lots of black, lots of negative space, photography that doesn't compete with text, and one and only one action per band. The transactional track flips to `{colors.canvas-light}` and `{colors.canvas-cream}` (an off-white that's barely warmer than pure white). Pricing tiers, comparison tables, and signup flows sit on this lighter canvas, with the same pill button system but in inverse polarity (a solid black pill with white text, or a `{colors.aloe-10}` mint pill for the featured / "Start free trial" tier). The accents — `{colors.aloe-10}` mint and `{colors.pistachio-10}` pistachio — show up only on the light track, never on the cinematic dark hero pages. Typography is split across three families. **Neue Haas Grotesk Display** at thin weights (330–500) handles every display, headline, and editorial moment — the brand's identity is that thin display cut. **Inter Variable** at 420–550 weights handles every UI body, button label, caption, and form field — utility text that doesn't fight the display. **ui-monospace** appears only in code blocks and rare technical eyebrows. Across all three families, the OpenType `ss03` stylistic set is enabled — it's the brand's character-level signature, applied universally. **Key Characteristics:** - Two-canvas system: `{colors.canvas-night}` for cinematic marketing, `{colors.canvas-light}` / `{colors.canvas-cream}` for transactional surfaces — never blended. - Pill-shape (`{rounded.pill}`) is the only button shape across both tracks; rounded rectangles do not exist for buttons. - Thin-weight (330) display typography is the signature; `{typography.display-xxl}` at 96px / weight 330 is the brand's loudest visual. - Aloe and pistachio greens (`{colors.aloe-10}`, `{colors.pistachio-10}`) are reserved for the light track — they signal commerce, growth, transactional success. - Photography is full-bleed, edge-to-edge, never inset in cards on the cinematic track; merchants and storefront imagery do the heavy visual lifting that gradients and illustrations would do elsewhere. - The OpenType `ss03` stylistic set is enabled across every text role — a character-level unifier that tracks across both tracks. - Tight letter-spacing on display sizes (2.4px positive tracking on 96px display) gives the thin weight extra optical air. ## Colors > **Source pages:** home (`/`), `/start`, `/website/builder`, `/pricing`. ### Brand & Accent - **Aloe** (`{colors.aloe-10}` — `#c1fbd4`): The featured-tier and "growth" accent. Used as a pill button background on light surfaces and as a feature-card fill in the pricing comparison band. - **Pistachio** (`{colors.pistachio-10}` — `#d4f9e0`): Softer than aloe; used as a wide section band fill on the light track to signal a different category of feature without leaving the green family. - **Cool Link Tones** (`{colors.link-cool-1}` `#9dabad`, `{colors.link-cool-2}` `#9797a2`, `{colors.link-cool-3}` `#bdbdca`, `{colors.link-mint}` `#99b3ad`): Muted footer / tertiary link colors used on dark surfaces to create a quiet hierarchy below the primary white type. ### Surface - **Canvas Night** (`{colors.canvas-night}` — `#000000`): Pure black hero, cinematic feature pages, footer. - **Canvas Night Elevated** (`{colors.canvas-night-elevated}` — `#0a0a0a`): Cards on cinematic surfaces, video frames. - **Surface Elevated Dark** (`{colors.surface-elevated-dark}` — `#1e2c31`): Dark teal-shifted surface used on a small subset of dark cards to introduce subtle depth without breaking the black. - **Canvas Light** (`{colors.canvas-light}` — `#ffffff`): Pricing, signup, comparison tables. - **Canvas Cream** (`{colors.canvas-cream}` — `#fbfbf5`): Slightly warm off-white used on the pricing-page background canvas — invisibly different from `#ffffff` but adds editorial warmth. - **Hairline Light** (`{colors.hairline-light}` — `#e4e4e7`): 1px borders on light cards, table dividers. - **Hairline Dark** (`{colors.hairline-dark}` — `#1e2c31`): 1px borders on the rare dark cards that have visible chrome. ### Shade Ladder - **Shade-30** (`{colors.shade-30}` — `#d4d4d8`): Tag / chip background on light, footer hairline on dark. - **Shade-40** (`{colors.shade-40}` — `#a1a1aa`): Tertiary text on light, secondary text on dark. - **Shade-50** (`{colors.shade-50}` — `#71717a`): Secondary text on light. - **Shade-60** (`{colors.shade-60}` — `#52525b`): Tertiary text on light, deep on dark. - **Shade-70** (`{colors.shade-70}` — `#3f3f46`): Pressed-state of the primary pill button; deep dark surface accent. ### Text - **Ink** (`{colors.ink}` — `#000000`): All text on light canvas. - **On Primary** (`{colors.on-primary}` — `#ffffff`): All text on dark canvas + filled-pill labels. ## Typography ### Font Family The display tier is **Neue Haas Grotesk Display** at thin weights (330–500). When unavailable, fall back to **Helvetica** at light weight, then Arial. The thin-weight cut is the brand — no substitution should default to weight 400+. The UI tier is **Inter Variable** at 420–550 — a variable font with sub-weight precision that lets the system span body (420), strong (550), and caption (500) without jumping to heavier tiers. Inter is open-source via Google Fonts. The code tier is **ui-monospace**, the system mono — preferred over a webfont mono to avoid unnecessary downloads. The OpenType `ss03` stylistic set is enabled across every role. It alters specific glyph forms (lowercase `a`, `g`, single-story numerals) for a slightly more geometric character. Apply via `font-feature-settings: "ss03"` on the body element or root. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xxl}` | 96px | 330 | 1.0 | 2.4px | Cinematic hero headline | | `{typography.display-xl}` | 70px | 330 | 1.0 | 0 | Section opener on cinematic pages | | `{typography.display-lg}` | 55px | 330 | 1.16 | 0 | Pricing-page page title | | `{typography.display-md}` | 48px | 330 | 1.14 | 0 | Sub-section headline on light track | | `{typography.heading-xl}` | 28px | 500 | 1.28 | 0.42px | Card title / pricing tier name | | `{typography.heading-lg}` | 24px | 400 | 1.14 | 0.36px | Compact card title | | `{typography.heading-md}` | 20px | 500 | 1.4 | 0.3px | Section sub-heading | | `{typography.heading-sm}` | 18px | 500 | 1.25 | 0.72px | Eyebrow / mini-section label | | `{typography.body-lg}` | 18px | 550 | 1.56 | 0 | Marketing body lead, large body | | `{typography.body-md}` | 16px | 420 | 1.5 | 0 | Default UI body, pill-button labels | | `{typography.body-strong}` | 16px | 550 | 1.5 | 0 | Emphasized body run | | `{typography.caption}` | 14px | 500 | 1.49 | 0.28px | Helper copy, footnotes | | `{typography.micro}` | 13px | 500 | 1.5 | -0.13px | Pricing fine print | | `{typography.eyebrow-cap}` | 12px | 400 | 1.2 | 0.72px | All-caps eyebrow above large headlines | | `{typography.code}` | 16px | 400 | 1.5 | 0 | Code blocks | ### Principles - **Display thinness is the brand.** Always render display sizes at weight 330 — never 400+. The thinness is a deliberate editorial choice that makes the giant size feel quiet. - **Display in NHGD, body in Inter.** Don't push body roles up to NHGD; don't push display roles down to Inter. - **Tracking lifts on display.** The 96px hero gets +2.4px positive tracking — the thin glyphs need air. At 70px and below, tracking returns to 0. ### Note on Font Substitutes Open substitutes for Neue Haas Grotesk Display: **Helvetica Now Display** (proprietary) or **Inter Display** at light weights (open-source) are the closest matches. Avoid Helvetica Neue at default weight — it's too heavy for the brand's thin tier. **Inter Variable** is open-source via Google Fonts and is the canonical body face — no substitute needed. ## Layout ### Spacing System - **Base unit**: 8px (with denser sub-units 1, 2, 3, 4 for fine work). - **Tokens**: `{spacing.xxs}` 2px · `{spacing.xs}` 4px · `{spacing.sm}` 8px · `{spacing.md}` 12px · `{spacing.lg}` 16px · `{spacing.xl}` 24px · `{spacing.xxl}` 32px · `{spacing.huge}` 64px. - **Section padding**: `{spacing.huge}` 64–128px on cinematic marketing pages (extreme negative space is the point); collapses to ~48px on transactional pages where density takes priority. - **Card internal padding**: `{spacing.xxl}` 32px on pricing cards; `{spacing.xl}` 24px on compact tag rows. ### Grid & Container - Cinematic hero pages use a wide max-width container (~1440–1600px) with edge-bleeding photography that escapes the container. - Pricing collapses through 4-up → 2-up → 1-up tiers based on viewport. - Body content centers in a ~720–840px reading column on long-form pages. ### Whitespace Philosophy The cinematic track treats whitespace as the brand's most valuable asset — sections often have 128–192px of vertical air between content blocks, with photography filling the rest. The transactional track tightens to ~48–64px between bands because users are scanning, comparing, and acting. The contrast between the two whitespace philosophies is part of the brand voice. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 | Flat, no shadow | Default surface | | 1 | `0 1px 2px rgba(255,255,255,0.05), inset 0 1px 0 rgba(255,255,255,0.04)` | Subtle inset highlight on dark cards (a top-edge sheen) | | 2 | `0 0 0 1px rgba(255,255,255,0.08), 0 1px 3px rgba(0,0,0,0.3), 0 5px 10px rgba(0,0,0,0.2)` | Dark elevated cards with hairline + drop shadow stack | | 3 | `0 8px 8px rgba(0,0,0,0.1), 0 4px 4px rgba(0,0,0,0.1), 0 2px 2px rgba(0,0,0,0.1), 0 0 0 1px rgba(0,0,0,0.1)` | Stacked-shadow card on light surfaces; layered tiny shadows produce a soft halo | | 4 | `0 25px 50px -12px rgba(0,0,0,0.25)` | Modal / floating panel on light | ### Decorative Depth On the cinematic track, depth comes from photography — full-bleed merchant imagery layered behind cards, with subtle inset top-edge highlights creating the illusion of light hitting a glass surface. On the light track, the layered tiny-shadow stack (Level 3) produces a soft, paper-like halo around pricing cards — depth without harshness. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.xs}` | 4px | Inputs, hairline tags | | `{rounded.sm}` | 5px | Image containers (small) | | `{rounded.md}` | 8px | Form inputs, video frames, smaller cards | | `{rounded.lg}` | 12px | Pricing cards, feature cards | | `{rounded.xl}` | 20px (top-only on some asymmetric cards) | Hero photo frames, cinematic card chrome | | `{rounded.pill}` | 9999px | All buttons, pill tags, mint chips | ### Photography Geometry Photography is full-bleed with no border. On cinematic pages it escapes the container entirely; on transactional pages it sits inside `{rounded.lg}` containers with no shadow. Avatar treatments in customer-logo strips are simple greyscale wordmarks at uniform height (~24–32px), aligned in a single horizontal strip. ## Components ### Buttons **`button-primary-pill`** — the dominant CTA across the system. - Background `{colors.primary}` (black), text `{colors.on-primary}`, type `{typography.body-md}`, padding `{spacing.md} {spacing.xl}` (12px 24px), rounded `{rounded.pill}` 9999px. - Pressed state `button-primary-pill-pressed`: background lifts to `{colors.shade-70}`. **`button-outline-on-dark`** — the cinematic hero CTA. - Background `{colors.canvas-night}` (transparent on the canvas), 2px solid `{colors.on-primary}` border, text `{colors.on-primary}`, same pill geometry. **`button-outline-on-light`** — the light-track equivalent. - Background `{colors.canvas-light}`, 1px solid `{colors.ink}` border, text `{colors.ink}`, same pill geometry. **`button-aloe-pill`** — the featured CTA on pricing pages. - Background `{colors.aloe-10}`, text `{colors.ink}`, same pill geometry. Used for the "Start free trial" tier. ### Cards & Containers **`card-pricing`** — the standard tier card on the pricing page. - Background `{colors.canvas-light}`, padding `{spacing.xxl}`, rounded `{rounded.lg}` 12px, 1px `{colors.hairline-light}` border. Title in `{typography.heading-xl}`, price in `{typography.display-md}`, body in `{typography.body-md}`, CTA pinned to the bottom as `button-primary-pill`. **`card-pricing-featured`** — the highlighted pricing tier. - Background `{colors.aloe-10}`, otherwise identical to `card-pricing`. The mint fill (rather than a brand-color border) is the brand's distinctive featured-tier choice. **`card-feature-cinematic`** — feature card on the cinematic track. - Background `{colors.canvas-night-elevated}`, text `{colors.on-primary}`, rounded `{rounded.lg}`, often with a top-edge inset highlight (Level 1 elevation). Holds full-bleed photography or a single large statement. **`card-pistachio-band`** — wide horizontal band card used to highlight a category of features on the light track. - Background `{colors.pistachio-10}`, text `{colors.ink}`, rounded `{rounded.lg}` 12px, padding `{spacing.xxl}`. **`card-photo-frame`** — full-bleed photography container on cinematic pages. - Background `{colors.canvas-night}`, padding 0, rounded `{rounded.xl}` 20px (often top-only). The photo IS the content; no inner padding, no overlay text inside the card. ### Inputs & Forms **`text-input`** — standard text input on light surfaces. - Background `{colors.canvas-light}`, text `{colors.ink}`, type `{typography.body-md}`, padding `{spacing.sm}+ {spacing.md}` (10px 12px), rounded `{rounded.md}` 8px, 1px `{colors.hairline-light}` border. ### Navigation **`nav-bar-light`** — top nav on light pages. - Background `{colors.canvas-light}`, text `{colors.ink}`, padding `{spacing.lg} {spacing.xl}`. Logo wordmark on the left, nav items center, two pill buttons on the right (`button-outline-on-light` for "Log in", `button-primary-pill` for "Start free trial"). **`nav-bar-dark`** — top nav on cinematic pages. - Background `{colors.canvas-night}`, text `{colors.on-primary}`, otherwise identical structure. Two pill buttons on the right (`button-outline-on-dark` for both, with the rightmost subtly more prominent via type weight). ### Pills, Tags, and Chips **`pill-tag-mint`** — small tag on light surfaces, signaling a feature category. - Background `{colors.aloe-10}`, text `{colors.ink}`, type `{typography.eyebrow-cap}`, padding `{spacing.xs} {spacing.md}`, rounded `{rounded.pill}`. **`pill-tag-shade`** — neutral tag on light surfaces. - Background `{colors.shade-30}`, text `{colors.ink}`, otherwise same shape as `pill-tag-mint`. ### Signature Components **Cinematic Photography Layer** — full-bleed merchant photos on the hero. No overlay scrim, no text-on-image; instead, the type sits in clean negative space above or below the photo. The brand treats photography as an editorial spread, not as decoration. **Stacked Tiny Shadows (Level 3 Elevation)** — pricing cards on the light track use 4 stacked tiny drop shadows (each 1–8px Y offset, 10% black) to produce a soft, layered paper halo. This is the brand's distinctive depth on light. **`link-on-dark`** — inline link on cinematic pages. - Color `{colors.on-primary}`, no underline by default (links rely on context); for tertiary footer links, color shifts to one of the cool muted tones (`{colors.link-cool-1}` etc.) with a persistent underline. **`footer-dark`** — full-page-width footer on the cinematic track. - Background `{colors.canvas-night}`, text `{colors.on-primary}`, type `{typography.caption}`, padding `{spacing.huge} {spacing.xl}`. Contains 4–5 columns of muted-tone link groups, social icons, and a small legal row. **`footer-light`** — equivalent on the transactional track. - Background `{colors.canvas-light}`, text `{colors.ink}`, otherwise same structure. ## Do's and Don'ts ### Do - Reserve `{colors.aloe-10}` and `{colors.pistachio-10}` for the light track only — they don't appear on cinematic black pages. - Always use `{rounded.pill}` for buttons; never `{rounded.md}` or `{rounded.lg}`. - Render display tiers at weight 330; bumping to 400 or 500 breaks the brand's thin-display signature. - Use full-bleed photography on cinematic pages — let it escape the container. - Apply `font-feature-settings: "ss03"` globally; the stylistic set is the brand's typographic signature. - Pair black canvas with white type and white-stroked outline pills; pair light canvas with black type and filled-black pills. ### Don't - Don't introduce a third canvas color — stick to black or light/cream. Greys, beiges, and blues are not in the system. - Don't add drop shadows on cinematic dark cards beyond the subtle inset top-highlight; the cinematic track wants flat blackness. - Don't shrink display tiers below `{typography.display-md}` (48px) on hero surfaces; below that they read as section heads, not display. - Don't put aloe / pistachio greens behind type — they're surface fills, not text colors. - Don't replace the pill shape with a rounded-rectangle button anywhere. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | Wide | ≥ 1440px | Full cinematic hero with edge-bleeding photography; pricing 4-up | | Desktop | 1024–1440px | Default content max-width; pricing 4-up tightens | | Tablet | 768–1023px | Pricing 2-up; cinematic hero photography crops | | Mobile | < 768px | Pricing 1-up; hamburger nav; display-xxl drops to ~56–64px | ### Touch Targets - Pill buttons hit ≥ 44×44px on mobile via 12px vertical padding × 16px line-height. WCAG AAA compliant. - Form fields stay at the 44px minimum height across all breakpoints. ### Collapsing Strategy - Display sizes scale down through the breakpoint stair: 96 → 70 → 55 → 48 → 36px on mobile. - Cinematic photography crops aggressively at smaller widths, prioritizing focal subject over edge-bleed. - Pricing tiers stair-step 4-up → 2-up → 1-up; the featured aloe tier stays visually distinguished at every step. - Top nav collapses to hamburger below 768px; menu inherits canvas polarity. ### Image Behavior Photography uses responsive `srcset` with art-direction crops at major breakpoints. Mobile crops favor close subjects; wide crops favor environmental / storefront context. ## Iteration Guide 1. Focus on ONE component at a time. 2. Reference component names and tokens directly (`{colors.aloe-10}`, `{button-primary-pill}-pressed`, `{rounded.pill}`). 3. Run `npx @google/design.md lint DESIGN.md` after edits. 4. Add new variants as separate entries. 5. Default body to `{typography.body-md}`; reserve `{typography.body-lg}` for marketing leads. 6. Keep the two canvas tracks separated — when designing a new page, choose cinematic OR transactional, not both. 7. The pill shape is non-negotiable; new button variants vary in fill / border / canvas, never in shape.
Spotify Player
Content-First Dark
Spotify Spec
复制
纯暗色调的极简数字唱机界面,通过标志性的 Spotify 绿亮线聚焦核心控制,界面完全为音乐封面让路。
纯黑视听室
声压亮绿
圆角专辑卡片
--- version: alpha name: Spotify Design System description: Immersive, content-first dark UI built around Spotify Green accents, pill-and-circle controls, and a global typography stack. colors: primary: "#1ed760" canvas: "#121212" surface-card: "#181818" surface-soft: "#1f1f1f" ink: "#ffffff" body: "#b3b3b3" muted: "#7c7c7c" hairline: "#4d4d4d" spotify-green: "#1ed760" near-black: "#121212" dark-surface: "#181818" mid-dark: "#1f1f1f" white: "#ffffff" silver: "#b3b3b3" negative-red: "#f3727f" warning-orange: "#ffa42b" announcement-blue: "#539df5" typography: display-xl: fontSize: "24px" fontWeight: "700" lineHeight: "1.2" use: "Section Title" body-lg: fontSize: "18px" fontWeight: "600" lineHeight: "1.3" use: "Feature Heading" body-md: fontSize: "16px" fontWeight: "400" lineHeight: "1.5" use: "Body" button: fontSize: "14px" fontWeight: "700" lineHeight: "1" letterSpacing: "1.5px" use: "Button Uppercase" --- # Design System Inspired by Spotify ## 1. Visual Theme & Atmosphere Spotify's web interface is a dark, immersive music player that wraps listeners in a near-black cocoon (`#121212`, `#181818`, `#1f1f1f`) where album art and content become the primary source of color. The design philosophy is "content-first darkness" — the UI recedes into shadow so that music, podcasts, and playlists can glow. Every surface is a shade of charcoal, creating a theater-like environment where the only true color comes from the iconic Spotify Green (`#1ed760`) and the album artwork itself. The typography uses SpotifyMixUI and SpotifyMixUITitle — proprietary fonts from the CircularSp family (Circular by Lineto, customized for Spotify) with an extensive fallback stack that includes Arabic, Hebrew, Cyrillic, Greek, Devanagari, and CJK fonts, reflecting Spotify's global reach. The type system is compact and functional: 700 (bold) for emphasis and navigation, 600 (semibold) for secondary emphasis, and 400 (regular) for body. Buttons use uppercase with positive letter-spacing (1.4px–2px) for a systematic, label-like quality. What distinguishes Spotify is its pill-and-circle geometry. Primary buttons use 500px–9999px radius (full pill), circular play buttons use 50% radius, and search inputs are 500px pills. Combined with heavy shadows (`rgba(0,0,0,0.5) 0px 8px 24px`) on elevated elements and a unique inset border-shadow combo (`rgb(18,18,18) 0px 1px 0px, rgb(124,124,124) 0px 0px 0px 1px inset`), the result is an interface that feels like a premium audio device — tactile, rounded, and built for touch. **Key Characteristics:** - Near-black immersive dark theme (`#121212`–`#1f1f1f`) — UI disappears behind content - Spotify Green (`#1ed760`) as singular brand accent — never decorative, always functional - SpotifyMixUI/CircularSp font family with global script support - Pill buttons (500px–9999px) and circular controls (50%) — rounded, touch-optimized - Uppercase button labels with wide letter-spacing (1.4px–2px) - Heavy shadows on elevated elements (`rgba(0,0,0,0.5) 0px 8px 24px`) - Semantic colors: negative red (`#f3727f`), warning orange (`#ffa42b`), announcement blue (`#539df5`) - Album art as the primary color source — the UI is achromatic by design ## 2. Color Palette & Roles ### Primary Brand - **Spotify Green** (`#1ed760`): Primary brand accent — play buttons, active states, CTAs - **Near Black** (`#121212`): Deepest background surface - **Dark Surface** (`#181818`): Cards, containers, elevated surfaces - **Mid Dark** (`#1f1f1f`): Button backgrounds, interactive surfaces ### Text - **White** (`#ffffff`): `--text-base`, primary text - **Silver** (`#b3b3b3`): Secondary text, muted labels, inactive nav - **Near White** (`#cbcbcb`): Slightly brighter secondary text - **Light** (`#fdfdfd`): Near-pure white for maximum emphasis ### Semantic - **Negative Red** (`#f3727f`): `--text-negative`, error states - **Warning Orange** (`#ffa42b`): `--text-warning`, warning states - **Announcement Blue** (`#539df5`): `--text-announcement`, info states ### Surface & Border - **Dark Card** (`#252525`): Elevated card surface - **Mid Card** (`#272727`): Alternate card surface - **Border Gray** (`#4d4d4d`): Button borders on dark - **Light Border** (`#7c7c7c`): Outlined button borders, muted links - **Separator** (`#b3b3b3`): Divider lines - **Light Surface** (`#eeeeee`): Light-mode buttons (rare) - **Spotify Green Border** (`#1db954`): Green accent border variant ### Shadows - **Heavy** (`rgba(0,0,0,0.5) 0px 8px 24px`): Dialogs, menus, elevated panels - **Medium** (`rgba(0,0,0,0.3) 0px 8px 8px`): Cards, dropdowns - **Inset Border** (`rgb(18,18,18) 0px 1px 0px, rgb(124,124,124) 0px 0px 0px 1px inset`): Input border-shadow combo ## 3. Typography Rules ### Font Families - **Title**: `SpotifyMixUITitle`, fallbacks: `CircularSp-Arab, CircularSp-Hebr, CircularSp-Cyrl, CircularSp-Grek, CircularSp-Deva, Helvetica Neue, helvetica, arial, Hiragino Sans, Hiragino Kaku Gothic ProN, Meiryo, MS Gothic` - **UI / Body**: `SpotifyMixUI`, same fallback stack ### Hierarchy | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes | |------|------|------|--------|-------------|----------------|-------| | Section Title | SpotifyMixUITitle | 24px (1.50rem) | 700 | normal | normal | Bold title weight | | Feature Heading | SpotifyMixUI | 18px (1.13rem) | 600 | 1.30 (tight) | normal | Semibold section heads | | Body Bold | SpotifyMixUI | 16px (1.00rem) | 700 | normal | normal | Emphasized text | | Body | SpotifyMixUI | 16px (1.00rem) | 400 | normal | normal | Standard body | | Button Uppercase | SpotifyMixUI | 14px (0.88rem) | 600–700 | 1.00 (tight) | 1.4px–2px | `text-transform: uppercase` | | Button | SpotifyMixUI | 14px (0.88rem) | 700 | normal | 0.14px | Standard button | | Nav Link Bold | SpotifyMixUI | 14px (0.88rem) | 700 | normal | normal | Navigation | | Nav Link | SpotifyMixUI | 14px (0.88rem) | 400 | normal | normal | Inactive nav | | Caption Bold | SpotifyMixUI | 14px (0.88rem) | 700 | 1.50–1.54 | normal | Bold metadata | | Caption | SpotifyMixUI | 14px (0.88rem) | 400 | normal | normal | Metadata | | Small Bold | SpotifyMixUI | 12px (0.75rem) | 700 | 1.50 | normal | Tags, counts | | Small | SpotifyMixUI | 12px (0.75rem) | 400 | normal | normal | Fine print | | Badge | SpotifyMixUI | 10.5px (0.66rem) | 600 | 1.33 | normal | `text-transform: capitalize` | | Micro | SpotifyMixUI | 10px (0.63rem) | 400 | normal | normal | Smallest text | ### Principles - **Bold/regular binary**: Most text is either 700 (bold) or 400 (regular), with 600 used sparingly. This creates a clear visual hierarchy through weight contrast rather than size variation. - **Uppercase buttons as system**: Button labels use uppercase + wide letter-spacing (1.4px–2px), creating a systematic "label" voice distinct from content text. - **Compact sizing**: The range is 10px–24px — narrower than most systems. Spotify's type is compact and functional, designed for scanning playlists, not reading articles. - **Global script support**: The extensive fallback stack (Arabic, Hebrew, Cyrillic, Greek, Devanagari, CJK) reflects Spotify's 180+ market reach. ## 4. Component Stylings ### Buttons **Dark Pill** - Background: `#1f1f1f` - Text: `#ffffff` or `#b3b3b3` - Padding: 8px 16px - Radius: 9999px (full pill) - Use: Navigation pills, secondary actions **Dark Large Pill** - Background: `#181818` - Text: `#ffffff` - Padding: 0px 43px - Radius: 500px - Use: Primary app navigation buttons **Light Pill** - Background: `#eeeeee` - Text: `#181818` - Radius: 500px - Use: Light-mode CTAs (cookie consent, marketing) **Outlined Pill** - Background: transparent - Text: `#ffffff` - Border: `1px solid #7c7c7c` - Padding: 4px 16px 4px 36px (asymmetric for icon) - Radius: 9999px - Use: Follow buttons, secondary actions **Circular Play** - Background: `#1f1f1f` - Text: `#ffffff` - Padding: 12px - Radius: 50% (circle) - Use: Play/pause controls ### Cards & Containers - Background: `#181818` or `#1f1f1f` - Radius: 6px–8px - No visible borders on most cards - Hover: slight background lightening - Shadow: `rgba(0,0,0,0.3) 0px 8px 8px` on elevated ### Inputs - Search input: `#1f1f1f` background, `#ffffff` text - Radius: 500px (pill) - Padding: 12px 96px 12px 48px (icon-aware) - Focus: border becomes `#000000`, outline `1px solid` ### Navigation - Dark sidebar with SpotifyMixUI 14px weight 700 for active, 400 for inactive - `#b3b3b3` muted color for inactive items, `#ffffff` for active - Circular icon buttons (50% radius) - Spotify logo top-left in green ## 5. Layout Principles ### Spacing System - Base unit: 8px - Scale: 1px, 2px, 3px, 4px, 5px, 6px, 8px, 10px, 12px, 14px, 15px, 16px, 20px ### Grid & Container - Sidebar (fixed) + main content area - Grid-based album/playlist cards - Full-width now-playing bar at bottom - Responsive content area fills remaining space ### Whitespace Philosophy - **Dark compression**: Spotify packs content densely — playlist grids, track lists, and navigation are all tightly spaced. The dark background provides visual rest between elements without needing large gaps. - **Content density over breathing room**: This is an app, not a marketing site. Every pixel serves the listening experience. ### Border Radius Scale - Minimal (2px): Badges, explicit tags - Subtle (4px): Inputs, small elements - Standard (6px): Album art containers, cards - Comfortable (8px): Sections, dialogs - Medium (10px–20px): Panels, overlay elements - Large (100px): Large pill buttons - Pill (500px): Primary buttons, search input - Full Pill (9999px): Navigation pills, search - Circle (50%): Play buttons, avatars, icons ## 6. Depth & Elevation | Level | Treatment | Use | |-------|-----------|-----| | Base (Level 0) | `#121212` background | Deepest layer, page background | | Surface (Level 1) | `#181818` or `#1f1f1f` | Cards, sidebar, containers | | Elevated (Level 2) | `rgba(0,0,0,0.3) 0px 8px 8px` | Dropdown menus, hover cards | | Dialog (Level 3) | `rgba(0,0,0,0.5) 0px 8px 24px` | Modals, overlays, menus | | Inset (Border) | `rgb(18,18,18) 0px 1px 0px, rgb(124,124,124) 0px 0px 0px 1px inset` | Input borders | **Shadow Philosophy**: Spotify uses notably heavy shadows for a dark-themed app. The 0.5 opacity shadow at 24px blur creates a dramatic "floating in darkness" effect for dialogs and menus, while the 0.3 opacity at 8px blur provides a more subtle card lift. The unique inset border-shadow combination on inputs creates a recessed, tactile quality. ## 7. Do's and Don'ts ### Do - Use near-black backgrounds (`#121212`–`#1f1f1f`) — depth through shade variation - Apply Spotify Green (`#1ed760`) only for play controls, active states, and primary CTAs - Use pill shape (500px–9999px) for all buttons — circular (50%) for play controls - Apply uppercase + wide letter-spacing (1.4px–2px) on button labels - Keep typography compact (10px–24px range) — this is an app, not a magazine - Use heavy shadows (`0.3–0.5 opacity`) for elevated elements on dark backgrounds - Let album art provide color — the UI itself is achromatic ### Don't - Don't use Spotify Green decoratively or on backgrounds — it's functional only - Don't use light backgrounds for primary surfaces — the dark immersion is core - Don't skip the pill/circle geometry on buttons — square buttons break the identity - Don't use thin/subtle shadows — on dark backgrounds, shadows need to be heavy to be visible - Don't add additional brand colors — green + achromatic grays is the complete palette - Don't use relaxed line-heights — Spotify's typography is compact and dense - Don't expose raw gray borders — use shadow-based or inset borders instead ## 8. Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |------|-------|-------------| | Mobile Small | <425px | Compact mobile layout | | Mobile | 425–576px | Standard mobile | | Tablet | 576–768px | 2-column grid | | Tablet Large | 768–896px | Expanded layout | | Desktop Small | 896–1024px | Sidebar visible | | Desktop | 1024–1280px | Full desktop layout | | Large Desktop | >1280px | Expanded grid | ### Collapsing Strategy - Sidebar: full → collapsed → hidden - Album grid: 5 columns → 3 → 2 → 1 - Now-playing bar: maintained at all sizes - Search: pill input maintained, width adjusts - Navigation: sidebar → bottom bar on mobile ## 9. Agent Prompt Guide ### Quick Color Reference - Background: Near Black (`#121212`) - Surface: Dark Card (`#181818`) - Text: White (`#ffffff`) - Secondary text: Silver (`#b3b3b3`) - Accent: Spotify Green (`#1ed760`) - Border: `#4d4d4d` - Error: Negative Red (`#f3727f`) ### Example Component Prompts - "Create a dark card: #181818 background, 8px radius. Title at 16px SpotifyMixUI weight 700, white text. Subtitle at 14px weight 400, #b3b3b3. Shadow rgba(0,0,0,0.3) 0px 8px 8px on hover." - "Design a pill button: #1f1f1f background, white text, 9999px radius, 8px 16px padding. 14px SpotifyMixUI weight 700, uppercase, letter-spacing 1.4px." - "Build a circular play button: Spotify Green (#1ed760) background, #000000 icon, 50% radius, 12px padding." - "Create search input: #1f1f1f background, white text, 500px radius, 12px 48px padding. Inset border: rgb(124,124,124) 0px 0px 0px 1px inset." - "Design navigation sidebar: #121212 background. Active items: 14px weight 700, white. Inactive: 14px weight 400, #b3b3b3." ### Iteration Guide 1. Start with #121212 — everything lives in near-black darkness 2. Spotify Green for functional highlights only (play, active, CTA) 3. Pill everything — 500px for large, 9999px for small, 50% for circular 4. Uppercase + wide tracking on buttons — the systematic label voice 5. Heavy shadows (0.3–0.5 opacity) for elevation — light shadows are invisible on dark 6. Album art provides all the color — the UI stays achromatic
PlayStation Store
Dark Chrome Console
PlayStation Spec
复制
索尼主打次世代游戏视听的深灰铬金属格调,使用高光青蓝色进行层级标记,富有未来的数字娱乐风。
游戏主机深灰
高光青蓝
卡片三轨流布局
--- version: alpha name: PlayStation-design-analysis description: | A three-surface marketing system organized around alternating black, white, and PlayStation Blue chapters that scroll past the viewer like a console launch trailer. Each section has a single editorial purpose — hero photography, console product render, PS Plus tier callout, news strip — and each owns one of three full-bleed canvas modes. The chrome is unusually quiet for a gaming brand: bright PlayStation Blue (`#0070d1`) carries every primary CTA as a fully-rounded pill, the proprietary SST face renders display copy at a signature weight 300 (light) for an airy, premium feel, and a crisp 8px-radius secondary card system carries product info on either canvas mode. The system never decorates — no gradient backgrounds on chrome, no atmospheric mesh, no drop shadows beyond a faint section-divide. Imagery does all the heavy lifting: console glamour shots, game key art, and PS Plus tier illustrations occupy 60-90% of every section, with copy compressed into a small editorial slot. colors: primary: "#0070d1" primary-pressed: "#0064b7" primary-active: "#004d8d" on-primary: "#ffffff" link-light: "#0064b7" link-dark: "#53b1ff" commerce: "#d53b00" commerce-pressed: "#aa2f00" commerce-link-base: "#d63d00" on-commerce: "#ffffff" ink: "#000000" ink-deep: "#121314" ink-elevated: "#181818" charcoal: "#1f2024" body-light: "rgba(0,0,0,0.6)" mute-light: "#6b6b6b" ash-light: "#cccccc" body-dark: "rgba(255,255,255,0.7)" mute-dark: "rgba(229,229,229,0.55)" ash-dark: "rgba(229,229,229,0.2)" canvas-light: "#ffffff" surface-soft: "#f3f3f3" surface-card: "#f5f7fa" surface-filter: "rgba(245,247,250,0.3)" canvas-dark: "#000000" surface-dark-elevated: "#121314" surface-dark-card: "#181818" hairline-light: "#f3f3f3" hairline-dark: "rgba(229,229,229,0.2)" on-dark: "#ffffff" on-dark-mute: "#cccccc" warning: "#c81b3a" ps-plus-gold-start: "#ffce21" ps-plus-gold-mid: "#f5a623" ps-plus-gold-end: "#ee8e00" marathon-yellow: "#deff20" typography: display-xl: fontFamily: PlayStation SST fontSize: 54px fontWeight: 300 lineHeight: 1.25 letterSpacing: -0.1px display-lg: fontFamily: PlayStation SST fontSize: 44px fontWeight: 300 lineHeight: 1.25 letterSpacing: 0.1px display-md: fontFamily: PlayStation SST fontSize: 35px fontWeight: 300 lineHeight: 1.25 letterSpacing: 0 heading-xl: fontFamily: PlayStation SST fontSize: 28px fontWeight: 300 lineHeight: 1.25 letterSpacing: 0.1px heading-lg: fontFamily: PlayStation SST fontSize: 22px fontWeight: 300 lineHeight: 1.25 letterSpacing: 0.1px heading-md: fontFamily: PlayStation SST fontSize: 18px fontWeight: 600 lineHeight: 1 letterSpacing: 0 body-md: fontFamily: PlayStation SST fontSize: 18px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0.1px body-strong: fontFamily: PlayStation SST fontSize: 18px fontWeight: 500 lineHeight: 1.25 letterSpacing: 0.4px body-sm: fontFamily: PlayStation SST fontSize: 16px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 caption-md: fontFamily: PlayStation SST fontSize: 14px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 caption-sm: fontFamily: PlayStation SST fontSize: 12px fontWeight: 500 lineHeight: 1.5 letterSpacing: 0 link-md: fontFamily: PlayStation SST fontSize: 18px fontWeight: 400 lineHeight: 1.5 letterSpacing: 0 button-lg: fontFamily: PlayStation SST fontSize: 18px fontWeight: 700 lineHeight: 1.25 letterSpacing: 0.45px button-md: fontFamily: PlayStation SST fontSize: 14px fontWeight: 700 lineHeight: 1.25 letterSpacing: 0.324px rounded: none: 0px sm: 4px md: 8px lg: 16px full: 9999px spacing: xxs: 4px xs: 8px sm: 12px md: 16px lg: 24px xl: 32px xxl: 48px section: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.button-lg}" rounded: "{rounded.full}" padding: 12px 28px height: 48px button-primary-pressed: backgroundColor: "{colors.primary-pressed}" textColor: "{colors.on-primary}" typography: "{typography.button-lg}" rounded: "{rounded.full}" button-commerce: backgroundColor: "{colors.commerce}" textColor: "{colors.on-commerce}" typography: "{typography.button-lg}" rounded: "{rounded.full}" padding: 12px 28px height: 48px button-commerce-pressed: backgroundColor: "{colors.commerce-pressed}" textColor: "{colors.on-commerce}" typography: "{typography.button-lg}" rounded: "{rounded.full}" button-secondary-light: backgroundColor: "transparent" textColor: "{colors.ink}" typography: "{typography.button-lg}" rounded: "{rounded.full}" padding: 12px 28px height: 48px button-secondary-dark: backgroundColor: "transparent" textColor: "{colors.on-dark}" typography: "{typography.button-lg}" rounded: "{rounded.full}" padding: 12px 28px height: 48px button-disabled: backgroundColor: "{colors.surface-soft}" textColor: "{colors.ash-light}" rounded: "{rounded.full}" text-input: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.sm}" padding: 12px 16px height: 48px text-input-focused: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" rounded: "{rounded.sm}" filter-pill: backgroundColor: "{colors.surface-filter}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.full}" padding: 8px 16px filter-pill-active: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.button-md}" rounded: "{rounded.full}" product-card: backgroundColor: "{colors.surface-card}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 24px product-card-dark: backgroundColor: "{colors.surface-dark-card}" textColor: "{colors.on-dark}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 24px game-tile: backgroundColor: "{colors.surface-dark-elevated}" textColor: "{colors.on-dark}" typography: "{typography.body-sm}" rounded: "{rounded.md}" padding: 0px feature-card: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.md}" padding: 32px hero-band-blue: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.display-md}" rounded: "{rounded.none}" padding: 96px 48px hero-band-dark: backgroundColor: "{colors.canvas-dark}" textColor: "{colors.on-dark}" typography: "{typography.display-xl}" rounded: "{rounded.none}" padding: 96px 48px hero-band-light: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.display-xl}" rounded: "{rounded.none}" padding: 96px 48px ps-plus-banner: backgroundColor: "{colors.surface-dark-elevated}" textColor: "{colors.on-dark}" typography: "{typography.heading-xl}" rounded: "{rounded.md}" padding: 48px 32px carousel-paddle: backgroundColor: "rgba(255,255,255,0.16)" textColor: "{colors.on-dark}" rounded: "{rounded.full}" size: 48px pagination-dot: backgroundColor: "{colors.ash-dark}" rounded: "{rounded.full}" size: 8px pagination-dot-active: backgroundColor: "{colors.on-dark}" rounded: "{rounded.full}" size: 8px badge-info: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.caption-sm}" rounded: "{rounded.full}" padding: 4px 10px primary-nav: backgroundColor: "{colors.canvas-dark}" textColor: "{colors.on-dark}" typography: "{typography.body-strong}" rounded: "{rounded.none}" height: 48px sub-nav: backgroundColor: "{colors.canvas-dark}" textColor: "{colors.on-dark}" typography: "{typography.caption-md}" rounded: "{rounded.none}" height: 40px footer-section: backgroundColor: "{colors.primary}" textColor: "{colors.on-primary}" typography: "{typography.caption-md}" rounded: "{rounded.none}" padding: 48px 32px support-search-bar: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.full}" padding: 12px 24px height: 56px support-row: backgroundColor: "{colors.canvas-light}" textColor: "{colors.ink}" typography: "{typography.body-md}" rounded: "{rounded.none}" padding: 16px 0px link-inline: textColor: "{colors.link-light}" typography: "{typography.link-md}" --- ## Overview PlayStation's marketing system reads like a console launch trailer scrolling past the viewer in chapters. Each section is a full-bleed band — pure black `{colors.canvas-dark}`, true white `{colors.canvas-light}`, or PlayStation Blue `{colors.primary}` — and each chapter owns one editorial moment: hero console photography, a games-coming-soon strip, the PlayStation Plus tier banner, the "30 Years of PlayStation" anniversary band, the news strip from the PlayStation Blog. There is no decorative chrome between chapters; the section background change IS the divider. Sections stack at `{spacing.section}` (96px) rhythm with the next band's color taking over the page edge-to-edge. The system has two distinct surface modes that alternate down the page: a **dark canvas mode** for editorial product moments (hero, "ON PLAYSTATION" band, marathon game pages) and a **light canvas mode** for utility surfaces (PS5 games listing, support pages, news index). Both modes use the same chrome vocabulary — fully-rounded `{rounded.full}` pill buttons, 8px-radius `{rounded.md}` cards, the proprietary PlayStation SST face — only the surface and on-surface colors change. The third surface mode is the **PlayStation Blue band** (`{colors.primary}` — `#0070d1`) reserved for the highest-priority moments: the Marathon launch CTA strip, the footer, and any "Action Required" banner. The typography is the system's most distinctive choice. PlayStation SST renders display headlines at **weight 300** (light) — unusual for a gaming brand that could easily reach for bold geometric display faces. The light weight gives the chrome an airy, almost editorial quality that lets the imagery speak; copy is information rather than decoration. Heading sizes drop in tight increments (54 → 44 → 35 → 28 → 22 → 18) and body settles at 18px with 1.5 line-height for comfortable long-form reading on support and games pages. **Key Characteristics:** - Three-canvas chapter system: `{colors.canvas-dark}` (black), `{colors.canvas-light}` (white), `{colors.primary}` (PlayStation Blue) alternating down the page - PlayStation Blue (`{colors.primary}` — `#0070d1`) is the universal primary CTA — fully-rounded pill at `{rounded.full}` (9999px) - Commerce orange (`{colors.commerce}` — `#d53b00`) is the secondary CTA reserved for "Buy now" / "Pre-order" / store actions - PlayStation SST display tier renders at **weight 300** with -0.1px to +0.4px tracking — the brand's signature airy editorial voice - 8px-radius (`{rounded.md}`) for product cards and feature panels; 4px-radius (`{rounded.sm}`) for inputs; pills (`{rounded.full}`) for every CTA - Game tiles, console renders, and PS Plus tier illustrations occupy 60-90% of each section — imagery does the storytelling - Color-block page rhythm (one observed band sequence): dark hero → light console showcase → dark "Great PS4 & PS5 games" rail → light "Discover PlayStation Plus" tier band → light "30 years of PlayStation" callout → dark "ON PLAYSTATION" band → light news strip → blue footer ## Colors > **Source pages:** `/en-tr/` (home), `/en-tr/ps5/games/` (PS5 games listing), `/en-tr/games/marathon/` (single game page), `/tr-tr/support/account/` (support center). The chrome palette is identical across all four pages; the support page uses the light-canvas mode exclusively while marketing pages alternate. ### Brand & Accent - **PlayStation Blue** (`{colors.primary}` — `#0070d1`): the brand's universal primary. Every primary CTA pill, the active filter chip, the footer surface, badge fills, and inline link color on dark surfaces. - **PlayStation Blue Pressed** (`{colors.primary-pressed}` — `#0064b7`): pressed state for the primary pill — also doubles as the inline link color on light surfaces. - **PlayStation Blue Active** (`{colors.primary-active}` — `#004d8d`): deeply-pressed state for the primary button. - **Commerce Orange** (`{colors.commerce}` — `#d53b00`): the secondary CTA reserved for store/buy/pre-order actions. The only warm color in the system. - **Commerce Orange Pressed** (`{colors.commerce-pressed}` — `#aa2f00`): pressed state for commerce buttons. - **Marathon Yellow** (`{colors.marathon-yellow}` — `#deff20`): a single high-saturation game-page accent extracted from Marathon's product palette — used only inside the dedicated `/marathon/` game page chrome and not part of the system's general accent vocabulary. ### Surface - **Canvas Dark** (`{colors.canvas-dark}` — `#000000`): pure black hero band, primary nav background, footer base. The dominant surface for editorial product moments. - **Surface Dark Elevated** (`{colors.surface-dark-elevated}` — `#121314`): inset dark panels, PS Plus tier banner background, "ON PLAYSTATION" gradient end. - **Surface Dark Card** (`{colors.surface-dark-card}` — `#181818`): game tile fill, dark product card background. - **Canvas Light** (`{colors.canvas-light}` — `#ffffff`): true white console-showcase band, support page body, news strip background. - **Soft Surface** (`{colors.surface-soft}` — `#f3f3f3`): hairline-soft band fill on light pages, divider rule on light surfaces. - **Surface Card** (`{colors.surface-card}` — `#f5f7fa`): cool-blue-tinted product card and tier-card background on light canvas. - **Surface Filter** (`{colors.surface-filter}` — `rgba(245,247,250,0.3)`): translucent fill for filter-pill default state on light canvas. - **Hairline Light** (`{colors.hairline-light}` — `#f3f3f3`): 1px divider rule on light pages. - **Hairline Dark** (`{colors.hairline-dark}` — `rgba(229,229,229,0.2)`): translucent 1px divider on dark canvas. ### Text - **Ink** (`{colors.ink}` — `#000000`): primary text on `{colors.canvas-light}`. Headlines, button text, support body. - **Ink Deep** (`{colors.ink-deep}` — `#121314`): warmer near-black for in-card titles on dark surfaces and deep-shadow gradients. - **Ink Elevated** (`{colors.ink-elevated}` — `#181818`): the lightest of the dark-canvas inks, used for elevated card backgrounds. - **Body Light** (`{colors.body-light}` — `rgba(0,0,0,0.6)`): translucent body text on light canvas — the system's default paragraph color. - **Mute Light** (`{colors.mute-light}` — `#6b6b6b`): metadata text and footer link captions on light canvas. - **Ash Light** (`{colors.ash-light}` — `#cccccc`): disabled-state text and lowest-emphasis utility on light surfaces. - **On Dark** (`{colors.on-dark}` — `#ffffff`): primary text on `{colors.canvas-dark}` — headlines, button text on dark hero bands. - **Body Dark** (`{colors.body-dark}` — `rgba(255,255,255,0.7)`): translucent body text on dark canvas. - **On Dark Mute** (`{colors.on-dark-mute}` — `#cccccc`): secondary text and disabled state on dark surfaces. - **Mute Dark** (`{colors.mute-dark}` — `rgba(229,229,229,0.55)`): captions and metadata on dark canvas. ### Semantic - **Warning** (`{colors.warning}` — `#c81b3a`): validation errors and destructive confirmation copy. - **Link Light** (`{colors.link-light}` — `#0064b7`): inline body-prose anchor link on light canvas — same hex as `{colors.primary-pressed}`. - **Link Dark** (`{colors.link-dark}` — `#53b1ff`): inline body-prose anchor link on dark canvas — a brightened blue for dark-mode legibility. ### Brand Gradient - **PlayStation Plus Gold Gradient** — a horizontal three-stop gold gradient `{colors.ps-plus-gold-start}` (`#ffce21`) → `{colors.ps-plus-gold-mid}` (`#f5a623`) → `{colors.ps-plus-gold-end}` (`#ee8e00`) that anchors the PS Plus banner on the home page. The only gradient in the system; reserved exclusively for PS Plus chrome. ## Typography ### Font Family - **PlayStation SST** is the proprietary brand sans-serif used across every text role on the site. It carries weights 300 (light), 400 (regular), 500 (medium), 600 (semibold), and 700 (bold), and falls back through `sst` → `Arial` → `Helvetica`. The brand's distinctive choice is using **weight 300 (light) for display headlines** — unusual for a gaming brand and the source of the system's editorial, airy character. - **SST** appears as a secondary cut for in-product surfaces, falling back to Helvetica → Arial. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display-xl}` | 54px | 300 | 1.25 | -0.1px | Hero headline ("Discover all PS5 consoles and accessories") | | `{typography.display-lg}` | 44px | 300 | 1.25 | 0.1px | Section headline ("Great PS4 & PS5 games out now or coming soon") | | `{typography.display-md}` | 35px | 300 | 1.25 | 0 | Mid-section headline, game-page sub-hero | | `{typography.heading-xl}` | 28px | 300 | 1.25 | 0.1px | "30 Years of PlayStation" callout, in-band sub-heading | | `{typography.heading-lg}` | 22px | 300 | 1.25 | 0.1px | News card title, support category title | | `{typography.heading-md}` | 18px | 600 | 1 | 0 | Card label, navigation menu heading, in-product strong title | | `{typography.body-md}` | 18px | 400 | 1.5 | 0.1px | Body copy, paragraph text, support article body | | `{typography.body-strong}` | 18px | 500 | 1.25 | 0.4px | Inline emphasis, primary nav link, button label (large) | | `{typography.body-sm}` | 16px | 400 | 1.5 | 0 | Card description, secondary body | | `{typography.caption-md}` | 14px | 400 | 1.5 | 0 | Footer link, metadata, sub-nav text | | `{typography.caption-sm}` | 12px | 500 | 1.5 | 0 | Smallest utility text, badge label | | `{typography.link-md}` | 18px | 400 | 1.5 | 0 | Inline body-prose anchor link | | `{typography.button-lg}` | 18px | 700 | 1.25 | 0.45px | Primary CTA pill | | `{typography.button-md}` | 14px | 700 | 1.25 | 0.324px | Compact pill, filter chip, secondary CTA | ### Principles The hierarchy works on a 1.25-line-height ladder almost exclusively — even body sits at 1.5 instead of the typical 1.6 — which keeps long-form support pages tight and console showcases efficient. The weight contrast between display (300) and button (700) is dramatic: a single 18px chrome line might host a heavyweight CTA next to a feather-light 22px headline, giving the system its editorial gaming-magazine feel. ### Note on Font Substitutes PlayStation SST is proprietary. The closest open-source substitutes: - **Roboto Light (300)** for the display tier — its slightly looser letter-spacing matches SST's display optical fit. - **Inter** at weights 400/500/600 for body and chrome — the closest geometric sans match for SST's body cut. - **Source Sans Pro Light (300)** as an alternative for the display tier when Roboto reads too utilitarian. When substituting, preserve the +0.1px to +0.45px tracking on display and button tiers — the spacing is part of what makes PlayStation SST feel premium at the light weight. ## Layout ### Spacing System - **Base unit:** 8px (with finer 4/12px steps for tight inline gaps). - **Tokens (front matter):** `{spacing.xxs}` (4px) · `{spacing.xs}` (8px) · `{spacing.sm}` (12px) · `{spacing.md}` (16px) · `{spacing.lg}` (24px) · `{spacing.xl}` (32px) · `{spacing.xxl}` (48px) · `{spacing.section}` (96px). - **Universal section rhythm:** every page in the set uses `{spacing.section}` (96px) as the vertical gap between major content blocks. Card grids use `{spacing.lg}` (24px) gutters; in-card padding sits at `{spacing.lg}` to `{spacing.xl}` depending on density. - **Hero band padding:** 96px vertical / 48px horizontal — the largest spacing in the system, reserved for full-bleed surface chapters. ### Grid & Container - **Max width:** ~1280px content area for body text on desktop with 24px gutters that expand to ~48px at ultrawide. Hero bands and game-tile rails go full-bleed with no max-width constraint on imagery. - **Game tile carousel:** 4-up at desktop with horizontal scroll on the same row, collapsing to 3-up at 1024px and 2-up at 768px. Each tile uses 16:9 cover art at `{rounded.md}`. - **Console showcase grid:** desktop 5-column thumbnail strip below the main hero render, collapsing to 3-up + horizontal scroll at tablet. - **Support page:** desktop 2-column 30/70 split (sidebar nav + article body), collapsing to single-column with the sidebar promoted to a top accordion at mobile. - **News strip:** 3-up card grid at desktop, 2-up at tablet, 1-up at mobile. ### Whitespace Philosophy Whitespace is structural and band-defined. The 96px `{spacing.section}` between chapters reads as silence between trailer cuts — there's no decorative wash, no gradient transition, no mid-section divider. Inside a section, content is left-aligned in a tight column with the imagery breathing in the right 60-70% of the band. Paragraph text is comfortable at 1.5 line-height but column widths stay narrow (~520px at desktop) to keep long-form copy readable. ## Elevation & Depth | Level | Treatment | Use | |---|---|---| | 0 — Flat | No border, no shadow | Default for hero bands, footer, full-bleed sections — the dominant treatment | | 1 — Hairline divider | 1px solid `{colors.hairline-light}` or `{colors.hairline-dark}` | Card borders, support row dividers, footer column rules | | 2 — Soft active shadow | `0 4px 12px rgba(0,0,0,0.16)` | Active/pressed CTAs, lifted product card | | 3 — Section gradient | Soft top-to-bottom darkening from `{colors.surface-dark-elevated}` to `{colors.canvas-dark}` | "ON PLAYSTATION" band — only place a gradient appears on chrome | The system has effectively no resting shadow on cards; depth is built from surface-color contrast across band chapters. Cards lift only on press. ### Decorative Depth Depth comes from the alternating-band rhythm and from the imagery itself: - **Console product photography** — DualSense controller and PS5 console renders shot on neutral white with crisp edge lighting, full-bleed inside the light-canvas band. - **Game key art** — full-bleed cinematic stills (Marathon, the latest blockbuster releases) inside dark-canvas bands with title lockup overlaid in the lower-left. - **PS Plus tier banner** — a subtle horizontal gold gradient (`{colors.ps-plus-gold-start}` → `{colors.ps-plus-gold-end}`) sits as the only chrome gradient in the system, anchoring the "Discover PlayStation Plus" CTA. - **"ON PLAYSTATION" gradient band** — top-to-bottom deepening from `{colors.surface-dark-elevated}` (`#121314`) to `{colors.canvas-dark}` (`#000000`) creates a cinematic dimming effect under the anniversary callout. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | Hero bands, primary nav, footer, sub-nav, support article body — every full-bleed structural surface | | `{rounded.sm}` | 4px | Text inputs, support search field utilities | | `{rounded.md}` | 8px | Game tiles, product cards, feature cards, PS Plus banner | | `{rounded.lg}` | 16px | Rare large container with extra-soft corners (e.g., dialog cards) | | `{rounded.full}` | 9999px | Every CTA pill (primary / commerce / secondary), filter chips, pagination dots, carousel paddles | The radius vocabulary works on a 4 / 8 / pill rhythm for chrome with structural surfaces staying flat at 0px. ### Photography Geometry - **Hero console render:** large centered console + DualSense composition on white, ~70% width of the band, with copy slot to the left. - **Game tiles:** 16:9 key art at `{rounded.md}` (8px), 4-up rail at desktop with horizontal carousel. - **Marathon game page hero:** full-bleed cinematic 16:9 still with the "MARATHON" wordmark in the lower-left at light weight, brand yellow `{colors.marathon-yellow}` accent on a few small UI tags. - **News card thumbnails:** 16:9 imagery at `{rounded.md}` with a small text block below. - **Avatar / brand icons:** 32–40px circles for sub-nav social row. ## Components > **No hover states documented** per system policy. Each spec covers Default and Active/Pressed only. ### Buttons **`button-primary`** — the universal PlayStation CTA - Background `{colors.primary}` (PlayStation Blue), text `{colors.on-primary}`, type `{typography.button-lg}`, padding `12px 28px`, height ~48px, rounded `{rounded.full}`. - Used for "Add to bag", "Sign up", "Learn more", "Subscribe" — every primary action across both light and dark canvases. - Pressed state lives in `button-primary-pressed` — background drops to `{colors.primary-pressed}` (`#0064b7`). **`button-commerce`** — orange store CTA - Background `{colors.commerce}` (`#d53b00`), text `{colors.on-commerce}`, type `{typography.button-lg}`, padding `12px 28px`, height ~48px, rounded `{rounded.full}`. - Reserved for "Buy now", "Pre-order", "Add to cart" — store actions only. The only warm color in the system. - Pressed state lives in `button-commerce-pressed` — background drops to `{colors.commerce-pressed}`. **`button-secondary-light`** — outline variant on light canvas - Background transparent, text `{colors.ink}`, 1px solid `{colors.ash-light}` border, type `{typography.button-lg}`, padding `12px 28px`, height ~48px, rounded `{rounded.full}`. - Lower-emphasis CTA on white surfaces ("Learn more →", "Watch trailer"). **`button-secondary-dark`** — outline variant on dark canvas - Background transparent, text `{colors.on-dark}`, 1px solid `{colors.hairline-dark}`, type `{typography.button-lg}`, padding `12px 28px`, height ~48px, rounded `{rounded.full}`. - Same role as the light variant but inverted for use on `{colors.canvas-dark}` hero bands. **`button-disabled`** - Background `{colors.surface-soft}`, text `{colors.ash-light}`, rounded `{rounded.full}` — flat soft gray. ### Filter & Tab Chips **`filter-pill`** + **`filter-pill-active`** - Default: background `{colors.surface-filter}` (translucent), text `{colors.ink}`, type `{typography.button-md}`, padding `8px 16px`, rounded `{rounded.full}`. - Active: background flips to `{colors.canvas-light}` (opaque white) — the chip "lifts" from the translucent default. - Used in the PS5 games filter strip ("All", "Coming Soon", "PlayStation VR2", "Recently Released"). ### Inputs & Forms **`text-input`** + **`text-input-focused`** - Default: background `{colors.canvas-light}`, text `{colors.ink}`, 1px solid `{colors.ash-light}`, type `{typography.body-md}`, padding `12px 16px`, height ~48px, rounded `{rounded.sm}` (4px). - Focused: 2px solid `{colors.primary}` border, no halo (relies on the border weight increase as the focus signal). **`support-search-bar`** — the support-page signature search field - Background `{colors.canvas-light}`, text `{colors.ink}`, type `{typography.body-md}`, padding `12px 24px`, height ~56px, rounded `{rounded.full}`. - Sits at the top of the support page hero with a magnifier icon at the left edge and "Search the support center" placeholder. ### Cards & Containers **`product-card`** — light-canvas product/feature card - Container: background `{colors.surface-card}` (`#f5f7fa` cool-blue-tinted), 1px solid `{colors.hairline-light}` (rare; usually borderless), padding `{spacing.lg}` (24px), rounded `{rounded.md}` (8px). - Used for the "PlayStation Store" sale callout, news cards, and PS Plus tier comparison cards on light canvas. **`product-card-dark`** — dark-canvas product card - Container: background `{colors.surface-dark-card}` (`#181818`), padding `{spacing.lg}`, rounded `{rounded.md}`. - Used for game-detail cards and dark-canvas feature panels. **`game-tile`** — game/console thumbnail tile - Container: background `{colors.surface-dark-elevated}`, padding 0, rounded `{rounded.md}`. - Layout: 16:9 cover art at full bleed inside the radius, with title + platform tag overlaid at the bottom-left in `{typography.body-sm}`. - Used in the "Great PS4 & PS5 games" rail and the PS5 games listing grid. **`feature-card`** — light-canvas marketing card - Container: background `{colors.canvas-light}`, padding `{spacing.xl}` (32px), rounded `{rounded.md}`. - Used for the "PlayStation Store" hero card and similar feature panels with a small product icon, title, body, and CTA. **`hero-band-blue`** — the PlayStation Blue full-bleed band - Background `{colors.primary}`, text `{colors.on-primary}` in `{typography.display-md}`, padding `96px 48px`, rounded `{rounded.none}`. - The Marathon launch CTA strip and the footer surface use this band. The band's defining purpose is "this is the action moment of the page." **`hero-band-dark`** — full-bleed dark hero - Background `{colors.canvas-dark}` (with optional gradient end at `{colors.surface-dark-elevated}`), text `{colors.on-dark}` in `{typography.display-xl}`, padding `96px 48px`, rounded `{rounded.none}`. - The home-page hero, the game-detail page hero, and the "ON PLAYSTATION" anniversary band. **`hero-band-light`** — full-bleed white hero - Background `{colors.canvas-light}`, text `{colors.ink}` in `{typography.display-xl}`, padding `96px 48px`, rounded `{rounded.none}`. - The console showcase band ("Discover all PS5 consoles and accessories") and the support page top. **`ps-plus-banner`** — PlayStation Plus tier callout - Background `{colors.surface-dark-elevated}` with the `{colors.ps-plus-gold-start}` → `{colors.ps-plus-gold-end}` gold gradient as a horizontal accent bar across the top, text `{colors.on-dark}` in `{typography.heading-xl}`, padding `48px 32px`, rounded `{rounded.md}`. - The "Discover PlayStation Plus" full-width banner on the home page. **`carousel-paddle`** — circular carousel control - Background `rgba(255,255,255,0.16)`, icon `{colors.on-dark}`, rounded `{rounded.full}`, size 48px. - Anchored to the left/right edge of the game tile carousel. **`pagination-dot`** + **`pagination-dot-active`** - 8px circle at `{rounded.full}`. Default fill `{colors.ash-dark}`; active fill `{colors.on-dark}`. - Carousel position indicator below the game tile rail. ### Inline **`badge-info`** — small info tag - Background `{colors.primary}`, text `{colors.on-primary}` in `{typography.caption-sm}`, padding `4px 10px`, rounded `{rounded.full}`. - "New", "Pre-order", "Coming Soon" labels overlaid on game tiles. **`link-inline`** — body-prose anchor link - `{colors.link-light}` text on light canvas / `{colors.link-dark}` on dark canvas, no underline by default. Inline body links inside support article paragraphs. ### Navigation **`primary-nav`** - Background `{colors.canvas-dark}`, text `{colors.on-dark}`, height ~48px, type `{typography.body-strong}`, rounded `{rounded.none}`. - Layout (desktop): PlayStation P-logo at far-left, centered nav row ("Games · PS5 · PS4 · PS VR2 · Subscriptions · Hardware · Mobile · News · Shop · Support"), right cluster (search-glyph + locale + cart icon + user-avatar circle). **`sub-nav`** — secondary nav strip - Background `{colors.canvas-dark}`, text `{colors.on-dark}` in `{typography.caption-md}`, height ~40px, rounded `{rounded.none}`. - Sits directly below the primary nav on PS5 games / single game / PS Plus pages with section-specific anchor links. **Top Nav (Mobile)** - Hamburger menu icon at left, P-logo at center, search + cart icons at right. Primary nav collapses into a full-screen dark drawer that slides from the left. ### Footer **`footer-section`** - Background `{colors.primary}` (PlayStation Blue), text `{colors.on-primary}` in `{typography.caption-md}`, padding `{spacing.xxl}` (48px) vertical. - Layout: large PlayStation wordmark at top-left, multi-column link grid (locale selector, store links, account, support, social), bottom row with terms / privacy fine-print in `{typography.caption-sm}`. - The footer's blue surface is the system's "we're done — return to the brand" anchor. ### Support-page-specific **`support-row`** — support article-list row - Background `{colors.canvas-light}`, text `{colors.ink}` in `{typography.body-md}`, padding `16px 0`, with a 1px `{colors.hairline-light}` bottom rule. - Used for FAQ / category-listing rows on the support page with a small chevron-right icon at the right edge. ## Do's and Don'ts ### Do - Reserve `{colors.primary}` (PlayStation Blue) for primary CTAs and the footer surface only. The blue band is precious — at most one full-bleed blue band per page. - Reserve `{colors.commerce}` (orange) for store/buy/pre-order CTAs only. It is never used on marketing chrome or hero pills. - Use PlayStation SST at weight 300 for display headings (54 / 44 / 35 / 28 / 22). The light weight is the brand voice. - Stack content sections at `{spacing.section}` (96px) rhythm with the next band's surface color taking over the page edge-to-edge — no decorative dividers between bands. - Use `{rounded.full}` (9999px) on every CTA pill and `{rounded.md}` (8px) on every product card. The two-radius vocabulary is the entire shape system aside from inputs. - Pair full-bleed game key art and console renders inside dark or light bands; let imagery occupy 60-90% of the band's vertical height. - Use `{component.ps-plus-banner}` with the gold gradient exclusively for the PlayStation Plus tier callout — never decorate other components with the gold. ### Don't - Don't introduce drop shadows on resting cards. The system is flat-on-canvas; cards lift only on press. - Don't replace `{colors.primary}` with another shade of blue. The brand blue is precise — `#0070d1` for default and `#0064b7` for pressed. - Don't use `{colors.commerce}` (orange) on marketing/hero CTAs. It's reserved exclusively for store actions. - Don't introduce a sans-serif body font, italic, or monospace style. PlayStation SST carries every text role. - Don't soften pill geometry. CTAs are always `{rounded.full}` — no medium-radius buttons. - Don't use the gold PS Plus gradient on anything that isn't the PS Plus banner. It is a tier-specific brand asset. - Don't put a gradient on chrome. The only allowed gradient is the gold PS Plus accent and the soft top-to-bottom darkening of the "ON PLAYSTATION" band. ## Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |---|---|---| | ultrawide | 1920px+ | Hero band stays at content max-width 1280px; outer gutters grow to ~80px | | desktop-large | 1440px | Default desktop — 4-up game tile carousel, full primary nav | | desktop | 1280px | Same layout with narrower outer gutters | | desktop-small | 1024px | Game tile rail collapses to 3-up; sub-nav remains horizontal | | tablet | 768px | Game tiles → 2-up; primary nav becomes hamburger drawer | | mobile | 480px | Single-column everything; hero `{typography.display-xl}` scales 54px → ~32px | | mobile-narrow | 320px | Section padding tightens to 32px; hero further scales to ~28px | ### Touch Targets All interactive elements meet WCAG AAA (≥ 44×44px). `{component.button-primary}` and `{component.button-commerce}` sit at 48px height with 28px horizontal padding (effective ~48×100px tappable). `{component.text-input}` sits at 48px. `{component.support-search-bar}` sits at 56px. `{component.filter-pill}` is ~36–40px height with 16px padding extending to 44px tappable via inline padding. `{component.carousel-paddle}` is exactly 48×48 circular. ### Collapsing Strategy - **Primary nav:** desktop horizontal cluster → tablet hamburger drawer at 768px. The right-cluster icons (search, cart, account) stay visible at every breakpoint. - **Sub-nav:** desktop horizontal anchor row → tablet horizontal scroll → mobile select dropdown. - **Game tile carousel:** 4-up → 3-up → 2-up at 1024 and 768px; carousel paddles stay visible at every desktop breakpoint, hide on mobile in favor of touch-swipe. - **Hero bands:** stay full-bleed at every breakpoint; only the internal content column reflows from 2-column (text-left + image-right) to single-column (text above image). - **Console showcase:** desktop 5-up thumbnail strip → tablet 3-up + horizontal scroll → mobile 1-up with paddle. - **Support page:** desktop 30/70 split (sidebar + body) → tablet sidebar promoted to top accordion → mobile fully collapsed accordion. - **Section padding:** `{spacing.section}` (96px) desktop → 64px tablet → 48px mobile. - **Hero headline:** `{typography.display-xl}` (54px) at desktop, scaling 44px / 32px / 28px down the breakpoint stack. ### Image Behavior - Hero imagery (console renders, game key art) uses art-direction crops on mobile so the central subject stays centered when the band collapses to single-column. - Game tile cover art preserves 16:9 ratio at every breakpoint; only the column count changes. - Console showcase thumbnails maintain their natural aspect (~1:1 product render) across breakpoints. - All non-critical imagery is lazy-loaded as the user scrolls into the next chapter. ## Iteration Guide 1. Focus on ONE component at a time. Pull its YAML entry and verify every property resolves. 2. Reference component names and tokens directly (`{colors.primary}`, `{component.button-primary-pressed}`, `{rounded.full}`) — do not paraphrase. 3. Run `npx @google/design.md lint DESIGN.md` after edits — `broken-ref`, `contrast-ratio`, and `orphaned-tokens` warnings flag issues automatically. 4. Add new variants as separate component entries (`-pressed`, `-disabled`) — do not bury them inside prose. 5. Default body to `{typography.body-md}` (18px / 400 / 1.5); reach for `{typography.display-xl}` strictly for the page-top hero headline; use `{typography.body-strong}` for primary nav links. 6. Keep `{colors.primary}` scarce per viewport — at most one full-bleed PlayStation Blue band per page. 7. When introducing a new component, ask whether it can be expressed with the existing pill + 8px-radius card + full-bleed-band vocabulary before adding new tokens. The system's strength is that it almost never needs new ones. ## Known Gaps - **Mobile screenshots not captured** — responsive behavior synthesizes PlayStation's known mobile pattern (hamburger drawer, single-column band reflow, hero downscale) from desktop evidence and the breakpoint stack. - **Hover states not documented** by system policy. - **Sign-in / authentication chrome** (login modal, account dashboard, profile pages) not in the captured pages. - **PlayStation Store** in-store browsing surfaces (PDP / cart / checkout) are not in the captured set — those use a more dense data-table layout that this document does not describe. - **Game-page-specific theming** — the `/marathon/` page uses `{colors.marathon-yellow}` as a chapter accent. Other game pages may pull in their own per-title brand colors that vary outside the documented system. - **Form validation states** (success / error inline messages) not present in the captured surfaces beyond the `{colors.warning}` color token.
Tesla Drive
Stark Subtraction
Tesla Spec
复制
特斯拉著名的极致减法界面,全屏车载摄影大背景中仅漂浮透明毛玻璃菜单与亮红线框。
极致全大写减法
电驱蓝点缀
透明毛玻璃层
--- version: alpha name: Tesla Design System description: Cinematic car photography layout built with Universal Sans typography, Electric Blue CTAs, and a clean minimalist white grid. colors: primary: "#3E6AE1" canvas: "#ffffff" surface-card: "#F4F4F4" surface-soft: "#ffffff" ink: "#171A20" body: "#393C41" muted: "#5C5E62" hairline: "#EEEEEE" electric-blue: "#3E6AE1" pure-white: "#FFFFFF" light-ash: "#F4F4F4" carbon-dark: "#171A20" graphite: "#393C41" pewter: "#5C5E62" silver-fog: "#8E8E8E" cloud-gray: "#EEEEEE" typography: display-xl: fontSize: "40px" fontWeight: "500" lineHeight: "1.1" use: "Display Title" body-lg: fontSize: "14px" fontWeight: "500" lineHeight: "1.4" use: "Navigation Labels" body-md: fontSize: "14px" fontWeight: "400" lineHeight: "1.6" use: "Body Text" button: fontSize: "14px" fontWeight: "600" lineHeight: "1" use: "Action Button" --- # Design System Inspired by Tesla ## 1. Visual Theme & Atmosphere Tesla's website is an exercise in radical subtraction — a digital showroom where the product is everything and the interface is almost nothing. The page opens with a full-viewport hero that fills the entire screen with cinematic car photography: three vehicles arranged on polished concrete against a hazy cityscape sky, with a single model name floating above in translucent white type. There are no decorative borders, no gradients, no patterns, no shadows. The UI exists only to provide just enough navigational structure to get out of the way. Every pixel that isn't product imagery is white space, and that restraint is the design system's most powerful statement. The color philosophy is almost ascetic: a single blue (`#3E6AE1`) for primary calls to action, three shades of dark gray for text hierarchy, and white for everything else. The entire emotional weight is carried by photography — sprawling landscape shots, studio-lit vehicle profiles, and atmospheric environmental compositions that stretch edge-to-edge across each viewport-height section. The UI chrome dissolves into the imagery. The navigation bar floats above the hero with no visible background, border, or shadow — the TESLA wordmark and five navigation labels simply exist in the space, trusting the content beneath them to provide sufficient contrast. Typography recently transitioned from Gotham to Universal Sans — a custom family split into "Display" for headlines and "Text" for body/UI elements — unifying the website, mobile app, and in-car software into a single typographic voice. The Display variant renders hero titles at 40px weight 500, while the Text variant handles everything from navigation (14px/500) to body copy (14px/400). The font carries a geometric precision with slightly humanist terminals that feels engineered rather than designed — exactly matching Tesla's brand identity of technology that doesn't need to announce itself. There are no text shadows, no text gradients, no decorative type treatments. Every letterform earns its place through clarity alone. **Key Characteristics:** - Full-viewport hero sections (100vh) dominated by cinematic car photography with minimal overlay UI - Near-zero UI decoration: no shadows, no gradients, no borders, no patterns anywhere on the page - Single accent color — Electric Blue (`#3E6AE1`) — used exclusively for primary CTA buttons - Universal Sans font family (Display + Text) unifying web, app, and in-car interfaces - Photography-first presentation where product imagery carries all emotional weight - Frosted-glass navigation concept with transparent/white nav that floats over hero content - 0.33s cubic-bezier transitions as the universal timing for all interactive state changes - Carousel-driven hero with dot indicators and edge arrow navigation for multiple vehicle showcases - "Ask a Question" persistent chatbot bar anchored to the viewport bottom ## 2. Color Palette & Roles ### Primary - **Electric Blue** (`#3E6AE1`): Primary CTA button background — a confident, mid-saturation blue (rgb 62, 106, 225) that stands alone as the only chromatic color in the entire interface. Used exclusively for "Order Now" and other primary action buttons - **Pure White** (`#FFFFFF`): Dominant background color for all surfaces, panels, navigation, and secondary button fills — the canvas that lets photography breathe ### Secondary & Accent - **Promo Blue** (`#3E6AE1`): Blue also serves for promotional text ("0% APR Available") displayed over hero imagery in the same hue as the CTA — creating a visual link between incentive messaging and action - No secondary accent colors exist. Tesla deliberately avoids color variety to maintain extreme visual discipline ### Surface & Background - **White Canvas** (`#FFFFFF`): Page background, navigation panel, dropdown menus, and all surface containers - **Light Ash** (`#F4F4F4`): Subtle alternate surface for section differentiation — barely perceptible shift from pure white (rgb 244, 244, 244) - **Carbon Dark** (`#171A20`): Dark surface color for hero text overlays and potential dark-mode contexts (rgb 23, 26, 32) — a warm near-black with a blue undertone - **Frosted Glass** (`rgba(255, 255, 255, 0.75)`): Semi-transparent white for navigation backdrop-filter effects on scroll ### Neutrals & Text - **Carbon Dark** (`#171A20`): Primary heading and navigation text — the darkest text value (rgb 23, 26, 32), used for model names, nav labels, and hero titles on light backgrounds - **Graphite** (`#393C41`): Body text and secondary content (rgb 57, 60, 65) — the default paragraph color, slightly warmer than pure gray - **Pewter** (`#5C5E62`): Tertiary text for sub-links, secondary navigation links like "Learn" and "Order" (rgb 92, 94, 98) - **Silver Fog** (`#8E8E8E`): Placeholder text in input fields and disabled states (rgb 142, 142, 142) - **Cloud Gray** (`#EEEEEE`): Light borders and divider lines (rgb 238, 238, 238) - **Pale Silver** (`#D0D1D2`): Subtle UI borders and delineation (rgb 208, 209, 210) ### Semantic & Accent - Tesla's marketing site avoids semantic color coding (no green/red/yellow status indicators). Error, success, and warning states follow standard browser defaults in form contexts - The blue CTA (`#3E6AE1`) serves as the sole interactive color signal ### Gradient System - No gradients are used anywhere in the interface - Depth is achieved entirely through photography, whitespace, and the binary contrast between full-bleed imagery and clean white surfaces - The navigation achieves layering through opacity (frosted glass effect) rather than gradient or shadow ## 3. Typography Rules ### Font Family - **Display**: `Universal Sans Display`, -apple-system, Arial, sans-serif — used for hero titles and large model names. A geometric sans-serif with precisely engineered proportions, recently replacing Gotham to unify Tesla's digital ecosystem (website, mobile app, vehicle interface) - **Text/UI**: `Universal Sans Text`, -apple-system, Arial, sans-serif — used for navigation, body copy, buttons, and all UI text. Optimized for legibility at smaller sizes with slightly wider proportions than the Display variant - **No OpenType features** detected — typography is completely unembellished - **No italic variants** observed on the marketing site ### Hierarchy | Role | Size | Weight | Line Height | Letter Spacing | Notes | |------|------|--------|-------------|----------------|-------| | Hero Title | 40px (2.50rem) | 500 | 48px (1.20) | normal | Universal Sans Display, white on dark hero imagery | | Product Name | 17px (1.06rem) | 500 | 20px (1.18) | normal | Universal Sans Text, model names in nav panel and cards | | Nav Item | 14px (0.88rem) | 500 | 16.8px (1.20) | normal | Universal Sans Text, primary navigation labels | | Body Text | 14px (0.88rem) | 400 | 20px (1.43) | normal | Universal Sans Text, paragraph and descriptive content | | Button Label | 14px (0.88rem) | 500 | 16.8px (1.20) | normal | Universal Sans Text, CTA button text | | Sub-link | 14px (0.88rem) | 400 | 20px (1.43) | normal | Tertiary links (Learn, Order, Experience) | | Promo Text | 22px (1.38rem) | 400 | 20px (0.91) | normal | White promotional text on hero ("0% APR Available") | | Category Label | 16px (est.) | 500 | — | normal | White text labels on category cards ("Sport Sedan") | ### Principles - **"Normal" letter-spacing everywhere**: Unlike most modern tech brands that use negative tracking for headlines, Tesla uses default letter-spacing at every level. This reflects a philosophy that the typeface should speak for itself without manipulation - **Weight restraint**: Only two weights appear — 500 (medium) for headings/UI and 400 (regular) for body. No bold (700), no light (300). The system avoids typographic drama - **Unified font sizing**: Most UI text clusters at 14px with only hero titles (40px) and promo text (22px) breaking away. This extreme uniformity creates a sense of engineered consistency - **Display vs Text split**: The two-variant system (Display for hero, Text for UI) creates subtle optical correction without visible stylistic difference — they appear as the same typeface at different sizes - **No text transforms**: No uppercase text appears in the main navigation or CTAs — the lowercase approach reinforces Tesla's understated confidence ## 4. Component Stylings ### Buttons All buttons use barely-rounded rectangles (4px border-radius) — creating a sharp, technical aesthetic that mirrors the precision of the vehicles. **Primary CTA** — The main action button: - Default: bg `#3E6AE1` (Electric Blue), text `#FFFFFF`, fontSize 14px, fontWeight 500, padding 4px with inner content centering, borderRadius 4px, minHeight 40px, width 200px - Border: 3px solid transparent (reserves space for focus/active border animation) - Box Shadow: `rgba(0,0,0,0) 0px 0px 0px 2px inset` (invisible at rest, animates to visible on focus) - Transition: `border-color 0.33s, background-color 0.33s, color 0.33s, box-shadow 0.25s` - Hover: subtle darkening of blue background - Used for: "Order Now" calls to action **Secondary CTA** — The alternative action button: - Default: bg `#FFFFFF`, text `#393C41` (Graphite), same dimensions and border pattern as primary - Transition: identical timing to primary (0.33s) - Used for: "View Inventory" alongside primary CTA **Nav Button** — Top navigation items: - Default: bg transparent, text `#171A20` (Carbon Dark), fontSize 14px, fontWeight 500, borderRadius 4px, padding 4px 16px, minHeight 32px - Transition: `color 0.33s, background-color 0.33s` - Active/expanded: subtle background highlight - Used for: "Vehicles", "Energy", "Charging", "Discover", "Shop" **Text Link** — In-content actions: - Default: text `#5C5E62` (Pewter), fontSize 14px, fontWeight 400, no background, no border - Hover: underline decoration with box-shadow transition - Transition: `box-shadow 0.33s cubic-bezier(0.5, 0, 0, 0.75), color 0.33s` - Used for: "Learn", "Order", "Experience", "New", "Pre-Owned" links in dropdown panel ### Cards & Containers **Vehicle Card** (Navigation panel): - Background: transparent (inherits panel white) - Border: none - Shadow: none - Content: vehicle image (transparent PNG) + model name centered below + two text links - Layout: 3-column grid within the dropdown panel - No hover animation on the card itself — interaction is via the text links beneath **Category Card** (Homepage lower section): - Background: full-bleed landscape photography - Border radius: approximately 12px (subtly rounded) - Overflow: hidden (clips image to rounded corners) - Text: white label in top-left corner ("Sport Sedan", "Midsize SUV") - Size: large format, approximately 2:1 aspect ratio - No shadow, no border, no overlay gradient — text relies on image darkness for contrast ### Inputs & Forms - Background: transparent - Text color: `#171A20` (Carbon Dark) - Placeholder color: `#8E8E8E` (Silver Fog) - Border: minimal, inherits from browser defaults - Font: Universal Sans Text, 14px - The "Ask a Question" chatbot input bar sits at the viewport bottom with a clean white background and subtle border ### Navigation - **Desktop**: Centered horizontal nav with TESLA wordmark (spaced uppercase letters) on the left, five category buttons center-aligned, and three icon buttons (help, globe/language, account) on the right - **Background**: White (transitions from transparent over dark hero to opaque white on scroll via class toggle `tds-site-header--white-background`) - **Dropdown panel**: Full-width white panel with 3-column vehicle grid + right sidebar text links, no shadow, no border — appears seamlessly below the nav - **Sticky behavior**: `sticky-without-slide` class — stays at top without slide-in animation - **Mobile**: Hamburger collapse pattern - **No visible separator** between nav and content — the nav blends with the hero ### Image Treatment - **Hero**: Full-viewport (100vh) sections with cinematic photography — edge-to-edge, no padding, no margin - **Vehicle images**: Transparent PNG renders on white background in dropdown panel, studio-quality 3/4 angle shots - **Category cards**: Landscape photography with approximately 2:1 ratio, rounded corners (12px) - **Carousel**: Auto-advancing with dot indicators (3 dots) and left/right arrow navigation on edges - **Lazy loading**: Below-fold sections use lazy loading, rendering as blank white until scrolled into view ### Persistent Chat Bar - Anchored to viewport bottom, visible across all sections - White background with subtle border - Contains: chat icon + "Ask a Question" label + placeholder text ("What's Dog Mode?") + send icon + "Schedule a Drive Today" secondary CTA - Schedule CTA has a teal/blue icon accent ## 5. Layout Principles ### Spacing System - **Base unit**: 8px - **Common values**: 8px (0.5rem), 16px (1rem), 21.44px (1.34rem) - **Button padding**: 4px (minimal outer) with content centering via flexbox, 4px 16px for nav items - **Section padding**: Full-viewport sections with content centered vertically - **Card gap**: approximately 16px between category cards ### Grid & Container - **Max width**: approximately 1383px (full viewport width used for most content) - **Hero**: Full-bleed, edge-to-edge, 100vh sections - **Navigation panel**: 3-column grid for vehicle cards with right-aligned text sidebar (~70/30 split) - **Category cards**: 2-up horizontal layout (large left card + smaller right card) ### Whitespace Philosophy Tesla uses whitespace as a luxury signal. The generous vertical spacing between sections (each section is a full viewport height) means you can only see one "message" at a time — one car, one model name, one CTA pair. This creates a gallery-like browsing experience where each scroll is a deliberate transition, not a continuous feed. White space is not empty — it's the frame that elevates each vehicle to the status of art piece. ### Border Radius Scale | Value | Context | |-------|---------| | 0px | Most elements — sharp edges are the default | | 4px | Buttons (primary, secondary, nav items) — barely perceptible rounding | | ~12px | Category cards — noticeable but restrained rounding on larger surfaces | | 50% | Carousel dot indicators — perfect circles | ## 6. Depth & Elevation | Level | Treatment | Use | |-------|-----------|-----| | Level 0 (Flat) | No shadow, no border | Default state for all elements — cards, panels, buttons at rest | | Level 1 (Frost) | `rgba(255,255,255,0.75)` backdrop | Navigation bar on scroll — frosted glass transparency | | Level 2 (Overlay) | `rgba(128,128,128,0.65)` | Modal overlays and region/cookie popups | | Level 3 (Subtle) | `rgba(0,0,0,0.05)` | Minimal shadow hints on rare hover states | ### Shadow Philosophy Tesla's approach to elevation is essentially "none." The site avoids box-shadows entirely in its primary interface. Depth is communicated through three alternative strategies: 1. **Z-index layering**: The sticky navigation sits above hero content through positioning, not shadow 2. **Opacity-based transparency**: The frosted glass nav and overlay modals use background-color opacity rather than shadow to indicate layering 3. **Photography-as-depth**: The full-bleed images create their own visual depth through perspective, lighting, and composition — making UI shadows redundant ### Decorative Depth - No gradients, glows, or atmospheric effects on UI elements - The hero imagery itself provides all visual richness — sunset skies, reflected light on car surfaces, ground shadows from studio lighting - The carousel arrow buttons use a semi-transparent white background to float above the hero imagery without disrupting it ## 7. Do's and Don'ts ### Do - Let photography dominate every screen — the product IS the design - Use Electric Blue (`#3E6AE1`) exclusively for primary CTAs — never for decorative purposes - Maintain viewport-height sections for major content blocks — one message per screen - Keep typography at weight 400-500 only — no bold, no light, no extremes - Use 4px border-radius for all interactive elements — precision over playfulness - Trust whitespace as a luxury signal — never fill available space just because it's empty - Keep all transitions at 0.33s — consistency in motion is as important as consistency in color - Use transparent PNG vehicle imagery on white backgrounds for product showcases - Center CTAs horizontally below model names — the vertical rhythm is model → subtitle → buttons - Maintain the Display/Text font split — Display for hero-scale text only, Text for everything else ### Don't - Add shadows to any element — elevation through shadow contradicts the flat, gallery aesthetic - Use more than one chromatic color besides the blue CTA — the palette is intentionally monochrome-plus-one - Apply gradients, patterns, or decorative backgrounds to surfaces — white and photography are the only backgrounds - Use text larger than 40px on the web — the typography is deliberately restrained even at hero scale - Add borders to cards or containers — separation is achieved through spacing, not lines - Use uppercase text transforms — Tesla's confidence is expressed through lowercase calm - Introduce rounded-pill buttons or large border-radii — the 4px radius is deliberate and precise - Override the Universal Sans family with other typefaces — cross-platform consistency is a core brand value - Add hover animations with scale/translate transforms — Tesla's interactions are color-only (background and border transitions) - Clutter the viewport with multiple CTAs — every screen should have at most two action buttons ## 8. Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |------|-------|-------------| | Mobile | <768px | Single-column layout, hamburger nav replaces horizontal labels, hero text scales to ~28px, CTA buttons stack vertically, category cards become full-width | | Tablet | 768-1024px | 2-column nav panel, hero maintains full-viewport height, CTAs remain side-by-side, reduced horizontal padding | | Desktop | 1024-1440px | Full horizontal nav, 3-column vehicle grid in dropdown, hero at 40px, side-by-side CTAs at 200px/160px width | | Large Desktop | >1440px | Content remains centered, hero photography scales to fill wider viewports, max-width container for nav panel content | ### Touch Targets - Primary CTA buttons: 200px × 40px minimum (well above 44×44px WCAG requirement) - Nav buttons: minimum 32px height with 4px 16px padding — adequate touch targets - Carousel arrows: ~44px square white semi-transparent buttons at viewport edges - Text links ("Learn", "Order"): 14px text with adequate line-height spacing for touch ### Collapsing Strategy - **Navigation**: Horizontal category buttons (Vehicles, Energy, Charging, Discover, Shop) collapse to a hamburger/drawer menu on mobile - **Hero CTA pair**: Side-by-side buttons on desktop stack vertically on mobile - **Category cards**: 2-up horizontal layout collapses to single-column full-width on mobile - **Vehicle grid**: 3-column grid in desktop nav panel becomes 2-column on tablet, single-column on mobile - **Spacing**: Section vertical padding remains generous (viewport-height sections) but horizontal padding reduces ### Image Behavior - Hero images are fully responsive and fill the entire viewport at every breakpoint - Vehicle carousel images use `object-fit: cover` to maintain cinematic composition across widths - Transparent PNG vehicle images in the nav panel scale proportionally within their grid cells - Category card images maintain their landscape ratio and clip via `overflow: hidden` with border-radius ## 9. Agent Prompt Guide ### Quick Color Reference - Primary CTA: "Electric Blue (#3E6AE1)" - Background: "Pure White (#FFFFFF)" - Heading text: "Carbon Dark (#171A20)" - Body text: "Graphite (#393C41)" - Tertiary text: "Pewter (#5C5E62)" - Placeholder: "Silver Fog (#8E8E8E)" - Alternate surface: "Light Ash (#F4F4F4)" - Dark surface: "Carbon Dark (#171A20)" ### Example Component Prompts - "Create a hero section with a full-viewport background image, centered 'Model Y' title in Universal Sans Display at 40px weight 500 in white, a subtitle line below, and two buttons side by side: a primary Electric Blue (#3E6AE1) 'Order Now' button and a secondary white 'View Inventory' button, both with 4px border-radius and 40px height" - "Design a navigation bar with a spaced-letter wordmark on the left, five text buttons (14px, weight 500, Carbon Dark #171A20) centered, and three icon buttons on the right, all on a white background with no shadow or border" - "Build a vehicle card grid with 3 columns, each card showing a transparent-background car image above a model name (17px, weight 500, Carbon Dark) and two text links (14px, weight 400, Pewter #5C5E62) labeled 'Learn' and 'Order', on a pure white surface with no borders or shadows" - "Create a category card with full-bleed landscape photography, 12px border-radius, overflow hidden, and a white text label ('Sport Sedan') positioned in the top-left corner with no overlay gradient" - "Design a persistent bottom bar with a chat input ('Ask a Question' placeholder), a send icon, and a secondary CTA ('Schedule a Drive Today') with a teal icon, anchored to the viewport bottom on a white background" ### Iteration Guide When refining existing screens generated with this design system: 1. Focus on ONE component at a time — Tesla's system is so minimal that each element must be pixel-perfect 2. Reference specific color names and hex codes from this document — there are only 6-7 colors in the entire system 3. Use natural language descriptions, not CSS values — "barely rounded corners" not "border-radius: 4px" 4. Describe the desired "feel" alongside specific measurements — "gallery-like silence between sections" communicates the whitespace philosophy better than "margin-bottom: 100vh" 5. Always verify that photography is doing the emotional heavy-lifting — if the UI itself feels "designed," it's too much
Lambo Bull
True Black Void
Lamborghini Spec
复制
兰博基尼著名的漆黑大教堂格调,完全使用纯黑色填充整个画布,仅以纯金色与冷白粗体宣告狂野性能。
兰博黄金色
绝对纯黑画布
12度斜切边角
--- version: alpha name: Lamborghini Design System description: High-octane motorsport aesthetic using true absolute black surfaces, striking gold accents, and geometric LamboType typography. colors: primary: "#FFC000" canvas: "#000000" surface-card: "#202020" surface-soft: "#181818" ink: "#ffffff" body: "#F5F5F5" muted: "#7D7D7D" hairline: "#313131" lamborghini-gold: "#FFC000" absolute-black: "#000000" charcoal: "#202020" dark-iron: "#181818" gold-text: "#FFCE3E" cyan-pulse: "#29ABE2" link-blue: "#3860BE" typography: display-xl: fontSize: "120px" fontWeight: "700" lineHeight: "0.92" use: "Display Headlines" body-lg: fontSize: "18px" fontWeight: "600" lineHeight: "1.3" use: "Sub Headings" body-md: fontSize: "14px" fontWeight: "400" lineHeight: "1.5" use: "Body Copy" button: fontSize: "12px" fontWeight: "700" lineHeight: "1" use: "Primary CTA" --- # Design System Inspired by Lamborghini ## 1. Visual Theme & Atmosphere Lamborghini's website is a cathedral of darkness — a digital stage where jet-black surfaces stretch infinitely and every element emerges from the void like a machine under a spotlight. The page is almost entirely black. Not dark gray, not near-black — true, uncompromising black (`#000000`) that saturates the viewport and refuses to yield. Into this abyss, white type and Lamborghini Gold (`#FFC000`) are deployed with surgical precision, creating a visual language that feels like walking through a nighttime motorsport event where every surface absorbs light except the things that matter. The hero is a full-viewport video — dark, cinematic, immersive — showing event footage or vehicle reveals with the Lamborghini bull logo floating ethereally above. The navigation is minimal: a centered bull logo, a "MENU" hamburger on the left, and search/bookmark icons on the right, all rendered in white against the black canvas. There are no borders, no visible nav containers, no background color on the header — just white marks floating in darkness. The overall mood is nocturnal luxury: exclusive, theatrical, and deliberately intimidating. Each section transition is a scroll through darkness into the next revelation. Typography is the voice of this darkness. LamboType — a custom Neo-Grotesk typeface created by Character Type and design agency Strichpunkt — is used for everything from 120px uppercase display headlines to 10px micro labels. Its distinctive 12° angled terminals are inspired by the aerodynamic lines of Lamborghini's super sports cars, and its proportions range from Normal to Ultracompressed width. Headlines SHOUT in uppercase at enormous scales with tight line-heights (0.92 at 120px), creating dense blocks of text that feel stamped from steel. The typeface carries hexagonal geometric DNA — constructed from hexagons, three-armed stars, and circles — that echoes throughout the interface in the hexagonal pause button and UI icons. Built on Bootstrap grid with 68 Element Plus/UI components, the technical infrastructure is substantial beneath the theatrical surface. **Key Characteristics:** - True black (`#000000`) dominant surfaces with white and gold as the only relief colors - LamboType custom Neo-Grotesk font with 12° angled terminals inspired by aerodynamic car lines - Lamborghini Gold (`#FFC000`) as the sole accent color — used exclusively for primary CTA buttons - All-uppercase display typography at extreme scales (120px, 80px, 54px) with tight line-heights - Full-viewport video heroes with cinematic event/vehicle content - Zero border-radius on buttons — sharp, angular, uncompromising rectangles - Hexagonal motifs in UI elements (pause button, icon system) echoing brand geometry - Bootstrap grid system + Element Plus/UI 68 components underneath - Transparent ghost buttons with white borders at 50% opacity as the secondary CTA pattern ## 2. Color Palette & Roles ### Primary - **Lamborghini Gold** (`#FFC000`): The signature accent color — a warm, saturated amber-gold (rgb 255, 192, 0) used exclusively for primary action buttons ("Discover More", "Tickets", "Start Configuration"). The only chromatic color in the entire interface, it ignites against the black canvas like a headlight cutting through night - **Pure White** (`#FFFFFF`): Primary text color on dark surfaces, logo rendering, nav elements, and light-mode button fills — the voice that speaks from the darkness ### Secondary & Accent - **Dark Gold** (`#917300`): Hover/pressed state for gold buttons — a deep amber (rgb 145, 115, 0) that darkens the gold to signal interaction - **Gold Text** (`#FFCE3E`): Slightly lighter gold variant (rgb 255, 206, 62) used for inline text accents and highlighted labels - **Cyan Pulse** (`#29ABE2`): Electric blue-cyan (rgb 41, 171, 226) appearing as an informational accent and interactive element highlight - **Link Blue** (`#3860BE`): Medium blue (rgb 56, 96, 190) used universally for link hover states across all text colors ### Surface & Background - **Absolute Black** (`#000000`): The dominant surface color — used for page background, hero sections, header, footer, and most containers - **Charcoal** (`#202020`): Elevated dark surface (rgb 32, 32, 32) — the primary "dark gray" for cards, panels, and text containers sitting above the black canvas - **Dark Iron** (`#181818`): Subtle surface variant (rgb 24, 24, 24) — barely distinguishable from black, used for footer and deep sections - **Overlay Black** (`rgba(0,0,0,0.7)`): Semi-transparent overlay for modals and video dimming - **Near White** (`#F8F8F8`): Rare light surface (rgb 248, 248, 248) for content blocks in white-mode sections - **Mist** (`#E6E6E6`): Light gray surface for secondary light-mode containers ### Neutrals & Text - **Pure White** (`#FFFFFF`): Primary text on dark backgrounds — headlines, body, nav labels - **Smoke** (`#F5F5F5`): Secondary text on dark surfaces — slightly softer than pure white - **Graphite** (`#494949`): Dark gray text on light surfaces (rgb 73, 73, 73) - **Ash** (`#7D7D7D`): Mid-range gray for muted text, timestamps, and metadata (rgb 125, 125, 125) - **Steel** (`#969696`): Lighter gray for disabled text and subtle labels (rgb 150, 150, 150) - **Slate** (`#666666`): Alternative mid-gray for secondary content - **Iron** (`#555555`): Dark mid-gray for body text variants - **Shadow** (`#313131`): Very dark gray for text on dark surfaces where white is too strong ### Semantic & Accent - **Cyan Pulse** (`#29ABE2`): Used for informational highlights and interactive feedback - **Link Blue** (`#3860BE`): Universal hover state for all hyperlinks - **Teal Action** (`#1EAEDB`): Button hover background for transparent/ghost variants (rgb 30, 174, 219) ### Gradient System - No explicit gradients in the color palette — the dark-to-light progression is achieved through surface layering: `#000000` → `#181818` → `#202020` → `#494949` → `#7D7D7D` - Video heroes use natural atmospheric gradients from the content itself - Top-of-page gradient: subtle dark-to-darker fade at the edges of full-bleed imagery ## 3. Typography Rules ### Font Family - **Display & UI**: `LamboType`, Roboto, Helvetica Neue, Arial — custom Neo-Grotesk typeface by Character Type for Lamborghini's 2024 brand refresh. Available in widths from Normal to Ultracompressed and weights from Light (300) to Black. Features 12° angled terminals inspired by aerodynamic car geometry, hexagonal construction logic, and support for 200+ languages including Latin, Cyrillic, and Greek - **Fallback/UI**: `Open Sans` — used for some button/form contexts as system fallback - **No italic variants** observed on the marketing site — the brand voice is always upright ### Hierarchy | Role | Size | Weight | Line Height | Letter Spacing | Notes | |------|------|--------|-------------|----------------|-------| | Hero Display | 120px (7.50rem) | 400 | 0.92 | normal | LamboType, uppercase, maximum impact | | Display 2 | 80px (5.00rem) | 400 | 1.13 | normal | LamboType, uppercase, major section titles | | Section Title | 54px (3.38rem) | 400 | 1.19 | normal | LamboType, uppercase | | Sub-section | 40px (2.50rem) | 400 | 1.15 | normal | LamboType, uppercase | | Feature Heading | 27px (1.69rem) | 400 | 1.37 | normal | LamboType, uppercase | | Card Title | 24px (1.50rem) | 400 | — | normal | LamboType | | Body Large | 18px (1.13rem) | 400 | 1.56 | normal | LamboType, mixed case and uppercase variants | | Body / UI | 16px (1.00rem) | 400/700 | 1.50 | normal/0.16px | LamboType, primary body text | | Button Large | 16px (1.00rem) | 400 | 1.50 | normal | Gold CTA buttons | | Button Standard | 14.4px (0.90rem) | 300/700 | 1.00 | 0.14–0.2px | LamboType, uppercase, ghost buttons | | Button Small | 13px (0.81rem) | 300/500 | 1.20 | 0.13–0.2px | LamboType, compact button variant | | Caption | 14px (0.88rem) | 600/700 | 1.14–1.50 | -0.42px | LamboType, uppercase, negative tracking | | Label | 12px (0.75rem) | 400/500 | 1.83 | 0.96px | LamboType, uppercase badges and micro labels | | Micro | 10px (0.63rem) | 400 | 1.00–2.00 | 0.225px | LamboType, uppercase, smallest text | ### Principles - **ALL-CAPS is the default voice**: Display and feature headings are universally uppercase. This creates a shouting, commanding tone that matches the brand's aggression - **Extreme scale range**: From 120px heroes to 10px micro labels — a 12:1 ratio that creates dramatic visual hierarchy - **Tight line-heights at scale**: Display sizes use 0.92-1.19 line-height, creating dense, compressed blocks of type that feel stamped rather than typeset - **Weight 400 dominates**: Unlike many design systems that use bold for emphasis, Lamborghini's regular weight carries the headlines — the typeface itself is so distinctive it doesn't need weight variation - **Negative tracking on captions**: -0.42px letter-spacing on 14px captions creates a compressed, technical aesthetic - **Positive tracking on micro text**: +0.225px at 10px ensures legibility at the smallest sizes - **Single typeface discipline**: LamboType handles everything — the 12° angled terminals and hexagonal geometry provide visual coherence across all sizes ## 4. Component Stylings ### Buttons All buttons use **zero border-radius** — sharp, angular rectangles that echo the aggressive lines of Lamborghini vehicles. **Gold Accent CTA** — The primary action: - Default: bg `#FFC000` (Lamborghini Gold), text `#000000`, padding 24px, fontSize 16px, fontWeight 400, borderRadius 0px, no border - Hover: bg `#917300` (Dark Gold), darkens significantly - Class: `btn-accent btn-large` - Used for: "Discover More", "Tickets", "Start Configuration" **Transparent Ghost** — The secondary action on dark backgrounds: - Default: bg transparent, text `#FFFFFF`, border 1px solid `#FFFFFF`, padding 16px, opacity 0.5 - Hover: bg `#1EAEDB` (Teal Action), text white, opacity 0.7 - Focus: bg `#1EAEDB`, border 1px solid `#000000`, outline 2px solid `#000000` - Used for: secondary CTAs on hero sections and dark panels **White Filled** — Light-mode primary: - Default: bg `#FFFFFF`, text `#202020`, no border - Used for: CTAs on dark sections where gold isn't appropriate **Black Filled** — Dark filled variant: - Default: bg `#000000`, text `#202020` - Used for: Inverted CTA on light sections **Gray Neutral** — Subtle action: - Default: bg `#969696`, text `#202020` - Used for: secondary/tertiary actions, badge-like buttons ### Cards & Containers - Background: `#202020` (Charcoal) on black canvas, or `#000000` on lighter sections - Border: `0px 1px solid #202020` bottom borders for section dividers - Border-radius: 0px (completely sharp corners) - Shadow: minimal, uses overlay opacity for depth - Content: full-bleed photography + overlaid text in white ### Inputs & Forms - Minimal form presence on the marketing site - Switch elements: border-radius 20px (the only rounded element), border 1px solid `#DDDDDD` - Cookie banner input style: white text on black with `#7D7D7D` borders ### Navigation - **Desktop**: Centered bull logo, "MENU" hamburger with icon on left, search icon + bookmarks icon on right - **Background**: Transparent (inherits black page background) - **Sticky**: Fixed to top, floats above content - **No visible borders or shadows** — elements float in the darkness - **"MENU" label**: White text at 14px weight 400, uppercase, accompanies hamburger icon - **Hexagonal motifs**: Pause button on hero sections uses hexagonal outline shape ### Image Treatment - **Hero**: Full-viewport video sections (100vh) with cinematic event/vehicle footage - **Event photography**: Full-bleed aerial shots of Lamborghini Arena events - **Vehicle imagery**: High-contrast studio shots on dark backgrounds, full-width - **Aspect ratios**: Predominantly 16:9 and wider for cinematic feel - **Dark gradient overlays**: Subtle darkening at top/bottom edges of video to ensure text legibility ### Distinctive Components - **Hexagonal Pause Button**: Video control uses a hexagonal outline (matching the brand's geometric DNA from the typeface), positioned bottom-right of hero sections - **Progress Bar**: Thin white line at bottom of hero sections indicating video/slide progress - **Badge/Tag**: bg `#969696`, text white, padding 8px, fontSize 10px, borderRadius 2px — tiny metallic pills ## 5. Layout Principles ### Spacing System - **Base unit**: 8px - **Full scale**: 2px, 4px, 5px, 8px, 10px, 12px, 15px, 16px, 20px, 24px, 32px, 40px, 48px, 56px - **Button padding**: 16px (ghost), 24px (gold accent) - **Section padding**: 48–56px vertical, 40px horizontal - **Small spacing**: 2–5px for fine adjustments (badge padding, border spacing) ### Grid & Container - **Framework**: Bootstrap grid system (container + row + col) - **Max width**: 1440px (largest breakpoint) - **Columns**: Standard 12-column Bootstrap grid - **Full-bleed**: Hero sections break out of grid to fill viewport edge-to-edge - **Content areas**: Centered within 1200px max-width containers ### Whitespace Philosophy Lamborghini uses darkness as whitespace. The generous black expanses between content blocks serve the same function as white space in a light design — creating breathing room that elevates each element to the status of exhibit. A model name floating in the middle of a black viewport has the same visual weight as a gallery piece on a white wall. The absence of color IS the design. ### Border Radius Scale | Value | Context | |-------|---------| | 0px | Default for everything — buttons, cards, containers, images | | 1px | Subtle span elements | | 2px | Badges, close buttons, cookie elements — barely perceptible | | 20px | Toggle switches only — the sole rounded element | ## 6. Depth & Elevation | Level | Treatment | Use | |-------|-----------|-----| | Level 0 (Abyss) | `#000000` flat | Page background, deepest layer | | Level 1 (Surface) | `#181818` or `#202020` | Cards, content panels, elevated sections | | Level 2 (Overlay) | `rgba(0,0,0,0.7)` | Modal backdrops, video dimming | | Level 3 (Fog) | `rgba(0,0,0,0.5)` | Lighter overlays, hover states | | Level 4 (Mist) | `rgba(0,0,0,0.25)` | Subtle depth hints | ### Shadow Philosophy Lamborghini achieves depth through surface color layering rather than shadows. On a black canvas, traditional drop shadows are invisible — instead, the system creates elevation by shifting from absolute black to progressively lighter dark grays: `#000000` → `#181818` → `#202020` → `#494949`. This "darkness gradient" approach means that elevated elements are literally lighter than their surroundings, inverting the traditional shadow model. ### Decorative Depth - Full-bleed video provides atmospheric depth through cinematic lighting - The hexagonal pause button floats with a thin white outline stroke - Progress bars at hero section bottoms create a subtle horizon line - No gradients, glows, or blur effects on UI elements — the photography provides all visual richness ## 7. Do's and Don'ts ### Do - Use absolute black (`#000000`) as the primary background — never dark gray as a substitute - Apply Lamborghini Gold (`#FFC000`) exclusively for primary CTA buttons — never for decorative purposes - Set all display headings in uppercase with LamboType — the brand voice is always SHOUTING - Use zero border-radius on buttons and cards — sharp angles are non-negotiable - Maintain tight line-heights (0.92–1.19) on display type to create dense, architectural text blocks - Use the transparent ghost button (white border, 50% opacity) as the secondary CTA on dark backgrounds - Let full-viewport video/photography carry emotional weight — UI is infrastructure, not decoration - Reserve hexagonal geometry for UI icons and the video control button - Use weight 400 (regular) for headlines — the typeface is distinctive enough without bold emphasis - Keep the gray palette achromatic — all neutrals are pure gray without color tinting ### Don't - Introduce additional accent colors beyond gold — the monochrome-plus-gold system is sacred - Apply border-radius to buttons or cards — curved edges contradict the angular vehicle aesthetic - Use LamboType in italic or decorative styles — the brand is always upright and direct - Add gradients to buttons or surfaces — depth comes from surface layering, not blending - Use light backgrounds as the primary canvas — darkness is the default state, light is the exception - Mix lowercase into display headings — the uppercase convention communicates authority and power - Add hover animations with scale or translate — interactions should be color-only (background/opacity shifts) - Use Open Sans for display text — LamboType must handle all visible typography - Create busy layouts with many small elements — Lamborghini's design is about singular, bold statements - Apply shadows to elements — on a black canvas, shadows are meaningless; use surface color shifts instead ## 8. Responsive Behavior ### Breakpoints | Name | Width | Key Changes | |------|-------|-------------| | Mobile Small | <425px | Single column, reduced type scale, stacked buttons | | Mobile | 425-576px | Single column, hamburger nav, hero text ~40px | | Tablet Small | 576-768px | 2-column grid begins, padding adjusts | | Tablet | 768-1024px | 2-column layout, expanded hero, vehicle cards side-by-side | | Desktop | 1024-1280px | Full navigation, 3+ column grids, display text at 80px | | Desktop Large | 1280-1440px | Full layout, hero at 120px display, max-width containers | | Wide | >1440px | Content centered, margins expand, hero fills viewport | ### Touch Targets - Gold CTA buttons: 48px+ minimum height with 24px padding (exceeds WCAG 44×44px) - Ghost buttons: 48px+ with 16px padding - Hamburger menu: large touch target (~48px square) - Hexagonal pause button: approximately 48px diameter ### Collapsing Strategy - **Navigation**: Always hamburger-based ("MENU" + icon) — no horizontal nav expansion on any breakpoint - **Hero video**: Maintains full-viewport height across all breakpoints, adjusting object-fit - **Display type**: Scales from 120px (desktop) → 80px (tablet) → 54px/40px (mobile) - **Button layout**: Side-by-side on desktop, stacks vertically on mobile - **Grid columns**: 3-column → 2-column → 1-column progression - **Section spacing**: Reduces from 56px → 40px → 24px vertical padding ### Image Behavior - Hero videos use `object-fit: cover` to maintain cinematic framing at all sizes - Vehicle images scale within their containers with maintained aspect ratios - Event photography crops to viewport width on narrow screens - Background images darken at edges to maintain text contrast on all viewports ## 9. Agent Prompt Guide ### Quick Color Reference - Primary CTA: "Lamborghini Gold (#FFC000)" - Background: "Absolute Black (#000000)" - Surface: "Charcoal (#202020)" - Heading text: "Pure White (#FFFFFF)" - Body text: "Ash (#7D7D7D)" - Link hover: "Link Blue (#3860BE)" - Accent: "Cyan Pulse (#29ABE2)" - Border: "Pure White (#FFFFFF) at 50% opacity" ### Example Component Prompts - "Create a hero section with a full-viewport black background, the model name 'TEMERARIO' in LamboType at 120px uppercase weight 400 white text with 0.92 line-height, centered vertically, with a Lamborghini Gold (#FFC000) 'Discover More' button below — sharp corners, 0px radius, 24px padding, black text" - "Design a transparent ghost button with 1px solid white border at 50% opacity, white text at 14.4px uppercase with 0.2px letter-spacing, padding 16px, on a black background — hover state changes to Teal Action (#1EAEDB) background with 70% opacity" - "Build a navigation bar with zero visible background on absolute black, a centered bull logo, 'MENU' text label with hamburger icon on the left, and search + bookmark icons on the right — all in white, sticky position" - "Create a news card grid on charcoal (#202020) background with white headlines at 27px uppercase, body text in #7D7D7D at 16px, and a white underlined 'Read More' link that turns #3860BE on hover" - "Design a section divider using a 1px solid bottom border in #202020 on a black canvas — the elevation difference is purely through surface color shift, not shadow" ### Iteration Guide When refining existing screens generated with this design system: 1. Focus on ONE component at a time — Lamborghini's system is extreme and every element must feel aggressive 2. Reference specific color names and hex codes from this document — the palette has only about 5 active colors 3. Use natural language descriptions, not CSS values — "sharp-cut golden rectangle" not "border-radius: 0px; background: #FFC000" 4. Describe the desired "feel" alongside specific measurements — "floating in total darkness" communicates the black canvas better than "background: #000000" 5. Remember that UPPERCASE IS THE DEFAULT — if text isn't uppercase at display sizes, it probably should be
Nintendo.com
Console Chrome
Nintendo 2001 Spec
复制
千禧年经典的“游戏机金属”网页重现,运用拉丝灰蓝色双坡度立体框、半调圆点矩阵与亮红按钮。
千禧拉丝蓝
任天堂正红
半调网格圆点
--- version: alpha name: Nintendo.com (2001) Analysis description: An analysis of Nintendo.com's 2001 design language — a brushed-periwinkle "console chrome" interface where every panel is a beveled metal plate, navigation glows amber over a halftone-dotted carbon bar, and bold outlined display type sits on circuit-board hero fields. A Y2K hardware aesthetic that treats the web page like the faceplate of a game system. colors: primary: "#e60012" # Nintendo Red — racetrack logo, alert signal: "#f68d1f" # Signal Orange — forward cues, submit, "Play It On" amber: "#ecab37" # Amber — utility buttons, info-box tabs, badges nav-gold: "#e48600" # Nav Gold — top-nav menu links canvas: "#7a8aba" # Periwinkle metallic — primary interface body canvas-soft: "#9fbee7" # Pale Sky — secondary-nav strip, light inset panels sky: "#9fbee7" # Pale Sky alias lavender: "#acace7" # Pale Lavender — home hero field ice: "#c0d5e6" # Pale Ice — news hero field periwinkle: "#8ba1d4" # Light Periwinkle — raised mid panels chrome-indigo: "#3d4f97" # Chrome Indigo — beveled borders, tab edges muted-indigo: "#60619c" # Muted Indigo — inactive tabs, secondary chrome platinum: "#dedede" # Platinum Gray — list-row / inset content surface surface: "#ffffff" # White — content cards, list-row highlight carbon: "#21242e" # Carbon Navy — nav bar, dark buttons, footer, ink hairline: "#5a5f8c" # blended bevel divider ink: "#21242e" # primary text on light ink-soft: "#3d4f97" # secondary text / chrome labels on-primary: "#ffffff" # text on dark/red/orange chrome systems-teal: "#206479" # Systems hero circuit-board cyan games-red: "#a7282b" # Games F-1 racing hero error: "#e60012" # validation / destructive (shares brand red) typography: nav-link: fontFamily: Arial fontSize: 13px fontWeight: 700 lineHeight: 1 letterSpacing: 0.5px ui-label: fontFamily: Arial fontSize: 11px fontWeight: 700 lineHeight: 1.1 letterSpacing: 0.5px display: fontFamily: Arial Black fontSize: 44px fontWeight: 900 lineHeight: 1 letterSpacing: 0 hero-tagline: fontFamily: Arial fontSize: 15px fontWeight: 700 lineHeight: 1.3 letterSpacing: 0 body: fontFamily: Arial fontSize: 12px fontWeight: 400 lineHeight: 1.4 letterSpacing: 0 link: fontFamily: Arial fontSize: 12px fontWeight: 700 lineHeight: 1.4 letterSpacing: 0 micro: fontFamily: Arial fontSize: 10px fontWeight: 400 lineHeight: 1.3 letterSpacing: 0 rounded: none: 0px xs: 2px sm: 4px md: 6px lg: 10px full: 9999px spacing: xxs: 2px xs: 4px sm: 8px md: 12px lg: 16px xl: 24px xxl: 32px section: 48px components: nav-bar: backgroundColor: "{colors.carbon}" textColor: "{colors.nav-gold}" typography: "{typography.nav-link}" rounded: "{rounded.none}" padding: "{spacing.sm}" height: 28px subnav-strip: backgroundColor: "{colors.canvas-soft}" textColor: "{colors.ink}" typography: "{typography.ui-label}" rounded: "{rounded.none}" padding: "{spacing.xs}" logo-pill: backgroundColor: "{colors.surface}" textColor: "{colors.primary}" typography: "{typography.display}" rounded: "{rounded.full}" padding: "{spacing.xs}" button-primary: backgroundColor: "{colors.amber}" textColor: "{colors.carbon}" typography: "{typography.ui-label}" rounded: "{rounded.xs}" padding: "{spacing.md}" button-primary-pressed: backgroundColor: "{colors.nav-gold}" textColor: "{colors.carbon}" typography: "{typography.ui-label}" rounded: "{rounded.xs}" padding: "{spacing.md}" button-submit: backgroundColor: "{colors.signal}" textColor: "{colors.on-primary}" typography: "{typography.ui-label}" rounded: "{rounded.xs}" padding: "{spacing.lg}" button-secondary: backgroundColor: "{colors.carbon}" textColor: "{colors.on-primary}" typography: "{typography.ui-label}" rounded: "{rounded.none}" padding: "{spacing.md}" button-icon-arrow: backgroundColor: "{colors.signal}" textColor: "{colors.on-primary}" rounded: "{rounded.full}" size: 22px button-arrow-chip: backgroundColor: "{colors.signal}" textColor: "{colors.on-primary}" rounded: "{rounded.xs}" padding: "{spacing.xs}" size: 18px search-field: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xs}" padding: "{spacing.xs}" height: 20px text-input: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xs}" padding: "{spacing.xs}" height: 20px select-dropdown: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.xs}" padding: "{spacing.xs}" height: 24px field-label: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.link}" rounded: "{rounded.none}" padding: "{spacing.xxs}" form-panel: backgroundColor: "{colors.platinum}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: "{spacing.lg}" dotted-divider: backgroundColor: "{colors.muted-indigo}" textColor: "{colors.muted-indigo}" rounded: "{rounded.none}" height: 1px hero-panel: backgroundColor: "{colors.lavender}" textColor: "{colors.surface}" typography: "{typography.display}" rounded: "{rounded.md}" padding: "{spacing.lg}" section-label-bar: backgroundColor: "{colors.canvas}" textColor: "{colors.ink}" typography: "{typography.ui-label}" rounded: "{rounded.none}" padding: "{spacing.sm}" news-row: backgroundColor: "{colors.platinum}" textColor: "{colors.ink-soft}" typography: "{typography.link}" rounded: "{rounded.sm}" padding: "{spacing.sm}" featured-tile: backgroundColor: "{colors.carbon}" textColor: "{colors.on-primary}" typography: "{typography.micro}" rounded: "{rounded.sm}" padding: "{spacing.xxs}" poll-panel: backgroundColor: "{colors.periwinkle}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.md}" padding: "{spacing.md}" radio-option: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.full}" size: 12px info-box: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.sm}" padding: "{spacing.md}" promo-card: backgroundColor: "{colors.lavender}" textColor: "{colors.ink}" typography: "{typography.display}" rounded: "{rounded.sm}" padding: "{spacing.md}" system-tile: backgroundColor: "{colors.periwinkle}" textColor: "{colors.ink}" typography: "{typography.ui-label}" rounded: "{rounded.sm}" padding: "{spacing.sm}" link-row-card: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.body}" rounded: "{rounded.sm}" padding: "{spacing.sm}" calendar-widget: backgroundColor: "{colors.surface}" textColor: "{colors.ink}" typography: "{typography.micro}" rounded: "{rounded.sm}" padding: "{spacing.sm}" left-rail-tab: backgroundColor: "{colors.carbon}" textColor: "{colors.canvas-soft}" typography: "{typography.ui-label}" rounded: "{rounded.none}" padding: "{spacing.xs}" footer-bar: backgroundColor: "{colors.carbon}" textColor: "{colors.canvas-soft}" typography: "{typography.micro}" rounded: "{rounded.none}" padding: "{spacing.lg}" esrb-badge: backgroundColor: "{colors.amber}" textColor: "{colors.carbon}" typography: "{typography.micro}" rounded: "{rounded.xs}" padding: "{spacing.xxs}" esrb-rating-square: backgroundColor: "{colors.surface}" textColor: "{colors.carbon}" typography: "{typography.ui-label}" rounded: "{rounded.xs}" size: 20px mascot-bubble: backgroundColor: "{colors.surface}" textColor: "{colors.carbon}" typography: "{typography.micro}" rounded: "{rounded.lg}" padding: "{spacing.sm}" # ─── Examples (illustrative) — kit-mirror demonstration surfaces ─── ex-pricing-tier: description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface." backgroundColor: "{colors.canvas-soft}" textColor: "{colors.ink}" borderColor: "{colors.hairline}" rounded: "{rounded.lg}" padding: "{spacing.md}" ex-pricing-tier-featured: description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)." backgroundColor: "{colors.ink}" textColor: "{colors.on-primary}" rounded: "{rounded.lg}" padding: "{spacing.md}" ex-product-selector: description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)." backgroundColor: "{colors.surface}" rounded: "{rounded.lg}" padding: "{spacing.md}" ex-cart-drawer: description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)." backgroundColor: "{colors.surface}" rounded: "{rounded.lg}" padding: "{spacing.md}" item-divider: "{colors.hairline}" ex-app-shell-row: description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator." backgroundColor: "{colors.canvas}" activeIndicator: "{colors.primary}" rounded: "{rounded.sm}" padding: "{spacing.sm} {spacing.md}" ex-data-table-cell: description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm." headerBackground: "{colors.canvas-soft}" headerTypography: "{typography.ui-label}" bodyTypography: "{typography.body}" cellPadding: "{spacing.xs} {spacing.sm}" rowBorder: "{colors.hairline}" ex-auth-form-card: description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside." backgroundColor: "{colors.surface}" rounded: "{rounded.lg}" padding: "{spacing.md}" ex-modal-card: description: "Modal dialog surface — same chrome as feature-card with elevated shadow." backgroundColor: "{colors.surface}" rounded: "{rounded.lg}" padding: "{spacing.md}" ex-empty-state-card: description: "Empty-state illustration frame." backgroundColor: "{colors.canvas-soft}" rounded: "{rounded.lg}" padding: "{spacing.xl}" captionTypography: "{typography.body}" ex-toast: description: "Toast notification surface — feature-card shape + medium shadow." backgroundColor: "{colors.surface}" rounded: "{rounded.md}" padding: "{spacing.sm} {spacing.md}" typography: "{typography.body}" --- ## Overview Nintendo.com circa 2001 is the web rendered as **console hardware**. Where most sites of the era reached for either grunge texture or corporate gradients, this interface builds itself out of **brushed-periwinkle metal plates** — every region is a discrete beveled panel, edge-lit with a brighter highlight on top and a `{colors.chrome-indigo}` shadow line beneath, as if stamped from the same injection-molded plastic as a Game Boy. The whole page reads as one machine faceplate: a body of `{colors.canvas}` periwinkle chrome carrying inset modules, with the corners of the largest panels physically **chamfered** (cut at 45°) rather than rounded, reinforcing the manufactured-object feeling. The system runs on a tight three-voice contrast. The structural voice is the cool periwinkle-to-indigo chrome (`{colors.canvas}`, `{colors.periwinkle}`, `{colors.chrome-indigo}`). The authority voice is `{colors.carbon}` carbon-navy — the top navigation bar, the right-rail action buttons, and the footer, all near-black slabs printed with a faint **halftone dot-matrix texture** that evokes a speaker grille. The energy voice is warm and reserved for one job only: telling you where to go. `{colors.nav-gold}` lights the primary menu words, `{colors.amber}` fills the utility chips and badges, and `{colors.signal}` orange marks every "forward" cue — the round arrow buttons, the chevron chips beside each headline, the Submit button. Warmth in this system always means *action*; the cool chrome never carries it. Atmosphere comes from the **hero fields**, which break the periwinkle calm with full-bleed product photography over textured backdrops — a circuit-board cyan on Systems, a motion-blurred racetrack red on Games, a soft lavender wash on Home — each topped with chunky `{typography.display}` wordmarks rendered in white with a heavy outline and hard drop shadow, the visual signature of game-box cover type. A pixel-eared Mario leans in from the masthead with a "Welcome to Nintendo.com!" speech bubble, anchoring the entire machine to the brand's playful character voice. **Key Characteristics:** - Every UI region is a **beveled metal plate** in `{colors.canvas}` periwinkle, edge-lit on top and shadow-lined with `{colors.chrome-indigo}` below — the page is assembled, not laid out. - **Chamfered (cut-corner) panel geometry** on the largest modules; most chrome is sharp-edged (`{rounded.none}`), with rounding reserved for the logo pill, radio dots, and circle-arrow badges (`{rounded.full}`). - A **carbon-navy command layer** (`{colors.carbon}`) with halftone-dot texture carries the top nav, right-rail buttons, and footer. - Warmth is rationed as **directional signal only**: `{colors.nav-gold}` for menu words, `{colors.amber}` for utility chips/badges, `{colors.signal}` for every forward/Submit cue. - **Photographic hero fields** cycle a page-specific accent tint (`{colors.lavender}` home → `{colors.systems-teal}` systems → `{colors.games-red}` games) under outlined `{typography.display}` box-art wordmarks. - A dense, **modular grid** — masthead, dual nav bars, hero, then a two-thirds content column of stacked list/feature panels beside a one-third right action rail — packed with minimal whitespace. - **Character-led**: the Mario mascot speech-bubble masthead and ESRB badge frame the chrome with brand personality and regulatory trust marks. ## Colors The palette is a **cool metallic chassis with rationed warm signal**. Read it as three layers: the periwinkle chrome that everything is built from, the carbon command slabs, and the warm wayfinding accents that are the only saturated color in the steady-state interface. ### Brand & Accent - **Nintendo Red** (`{colors.primary}` — #e60012): The racetrack logo wordmark and the brand's anchor hue. Used sparingly as pure brand identity and doubled as the validation/alert color. Never a surface fill outside the logo plate. - **Signal Orange** (`{colors.signal}` — #f68d1f): The "go forward" color. Fills every round arrow button, every chevron chip beside a headline, the Submit button, and the "Play It On" platform badges. If something advances you, it is orange. - **Amber** (`{colors.amber}` — #ecab37): Utility energy. Fills the Code Bank / Game Finder / Go chips, the info-box header tabs, the sweepstakes stars, and the ESRB Privacy-Certified badge. Distinguished from Signal Orange by being more golden and reserved for *tools and marks* rather than *forward motion*. - **Nav Gold** (`{colors.nav-gold}` — #e48600): The deeper orange-gold reserved exclusively for the primary navigation words (Games, Systems, News, Nsider, Downloads) glowing on the carbon bar. ### Surface - **Periwinkle Metallic** (`{colors.canvas}` — #7a8aba): The primary interface body — the brushed-metal chrome that every module is inset into. - **Light Periwinkle** (`{colors.periwinkle}` — #8ba1d4): Raised mid panels (poll panel, system tiles) — one step brighter than canvas for elevation. - **Pale Sky** (`{colors.sky}` / `{colors.canvas-soft}` — #9fbee7): The secondary-nav strip and light inset panel fills. - **Pale Lavender** (`{colors.lavender}` — #acace7): The home hero field and side promo cards. - **Pale Ice** (`{colors.ice}` — #c0d5e6): The News hero panel field. - **Chrome Indigo** (`{colors.chrome-indigo}` — #3d4f97): The beveled border / shadow line under every plate, and the leading angled edge of nav tabs. - **Muted Indigo** (`{colors.muted-indigo}` — #60619c): Inactive tabs and recessed chrome. - **Platinum Gray** (`{colors.platinum}` — #dedede): The list-row and inset content surface — news headlines and archive rows sit on this cool platinum. - **White** (`{colors.surface}` — #ffffff): Content cards, form fields, the logo pill, and list-row highlight. ### Text - **Carbon Navy** (`{colors.ink}` — #21242e): Primary text on light chrome, and the fill of the dark command layer (nav bar, rail buttons, footer). - **Chrome Indigo** (`{colors.ink-soft}` — #3d4f97): Secondary text and small-caps chrome labels. - **White** (`{colors.on-primary}` — #ffffff): Text on carbon, red, and orange chrome. ### Semantic - **Error / Alert** (`{colors.error}` — #e60012): Validation and destructive states reuse the brand red. - **Systems Teal** (`{colors.systems-teal}` — #206479): Page-accent tint — the Systems hero's circuit-board cyan field. - **Games Red** (`{colors.games-red}` — #a7282b): Page-accent tint — the Games hero's motion-blurred racetrack field. ## Typography ### Font Family The era's web-safe reality is **Arial / Helvetica** throughout — there are no webfonts. The system gets its character not from typeface choice but from *treatment*: tight uppercase tracking on every chrome label, and a heavy outlined-and-shadowed display style for hero wordmarks that mimics console box-art logotype. Body copy is plain small Arial; links are the same family at bold weight in `{colors.ink-soft}`. The micro-labels (vertical left-rail tabs, footer fine print) render with the soft pixelation characteristic of small bitmap-rendered Arial of the period — for a faithful reproduction, pair Arial with a pixel face such as **Silkscreen** or **VT323** at the 10–11px label sizes. ### Hierarchy | Token | Size | Weight | Line Height | Letter Spacing | Use | |---|---|---|---|---|---| | `{typography.display}` | 44px | 900 | 1 | 0 | Hero box-art wordmarks (white, heavy outline + hard drop shadow) | | `{typography.hero-tagline}` | 15px | 700 | 1.3 | 0 | Hero supporting line ("Gorgeous graphics, great sound…") | | `{typography.nav-link}` | 13px | 700 | 1 | 0.5px | Primary nav menu words, uppercase | | `{typography.ui-label}` | 11px | 700 | 1.1 | 0.5px | Section header labels, panel titles, button text — uppercase | | `{typography.link}` | 12px | 700 | 1.4 | 0 | News headline links, "Read More" | | `{typography.body}` | 12px | 400 | 1.4 | 0 | Descriptions, poll text, info-box copy | | `{typography.micro}` | 10px | 400 | 1.3 | 0 | Footer copyright, calendar cells, fine print | ### Principles - **Uppercase + tracking is the chrome voice.** Every structural label — nav words, panel headers ("Official News", "Featured Sites", "Player's Poll"), button text — is uppercase Arial Bold with a half-pixel of tracking. It reads like silkscreened legends on a controller. - **Display type is outlined, never flat.** Hero wordmarks always carry a thick contrasting outline and a hard offset shadow so they pop off the photographic field — the box-art convention. - **Body stays small and quiet.** At 12px, descriptive copy never competes with the chrome; the hierarchy is carried entirely by the labels and the photography. ### Note on Font Substitutes Arial is freely available system-wide and needs no substitute. To recreate the period bitmap rendering of micro-labels, layer a pixel font (**Silkscreen**, **VT323**, or **Press Start 2P** for the chunkiest legends) at 10–11px and disable anti-aliasing. The display wordmarks are bespoke logotypes; the closest open substitute is **Archivo Black** (italicized) or **Arial Black** with a CSS text-stroke outline and `text-shadow` offset. ## Layout ### Spacing System - **Base unit**: 8px (`{spacing.sm}`) — the gutter rhythm between list rows and grid cells. - **Tokens**: `{spacing.xxs}` 2px · `{spacing.xs}` 4px · `{spacing.sm}` 8px · `{spacing.md}` 12px · `{spacing.lg}` 16px · `{spacing.xl}` 24px · `{spacing.xxl}` 32px · `{spacing.section}` 48px - Panels carry **12px interior padding** (`{spacing.md}`); larger content modules use **16px** (`{spacing.lg}`). Inter-module gaps run 16–24px. The layout is deliberately dense — whitespace is a structural seam between plates, not a luxury. ### Grid & Container - **Fixed-width canvas** ~780–830px wide (a desktop-era fixed table layout, centered). No fluid scaling — the interface is sized to a single target window like an application. - **Masthead row**: Mario mascot + speech bubble (left) and search module (right) float above the chrome. - **Dual nav bars**: a carbon primary bar (logo + 5 section words + Code Bank / Game Finder utility chips) stacked over a periwinkle secondary strip (Parents, Customer Service, Corporate, Global, Privacy, Store, Contact). - **Body**: a full-width hero panel, then a **two-column split** — a ~two-thirds content column of stacked panels (Official News list, Featured Sites 2×2 grid, etc.) beside a ~one-third **right action rail** (Login / Subscribe / Newsletter / Help buttons, an info box, a side promo card). - **Left rail**: a thin vertical strip of rotated tabs (Top Ten, Top Rentals, Player's Choice, ESRB Ratings) clipped to the chrome edge. ### Whitespace Philosophy Empty space is **engineered seam**, not breathing room. Modules butt against each other separated by thin `{colors.chrome-indigo}` bevel lines and a few pixels of canvas, so the eye reads grouped plates. The density is intentional: it makes the page feel like a packed control panel where everything is one click away. ### Responsive Strategy #### Breakpoints | Name | Width | Key Changes | |---|---|---| | Desktop (only) | ~780–830px fixed | The native, sole target — a fixed-width application-style layout | | Narrow window | < 780px | Horizontal scroll (no reflow); the table layout does not collapse | This is a **pre-responsive, fixed-canvas** design. It was authored for a single desktop window size and does not reflow. A faithful *modern* re-implementation would preserve the fixed chrome metaphor on desktop and, below ~720px, stack the right action rail beneath the content column and collapse the dual nav bars into a single carbon bar with a disclosure toggle. #### Touch Targets Not a consideration in the original (mouse-only era); buttons and chips are 18–28px tall. A modern port must enlarge the `{components.button-primary}`, `{components.button-icon-arrow}`, and `{components.radio-option}` hit areas to a 44×44px minimum. #### Collapsing Strategy On a modern narrow viewport: dual nav bars → single carbon bar + menu disclosure; two-column body → single stacked column with the right rail moving below content; the left rotated-tab strip → a horizontal scroll chip row or removed; fixed hero → fluid full-bleed hero retaining the outlined wordmark. #### Image Behavior Hero fields are **full-bleed photographic plates** clipped to the panel's beveled rectangle; featured-site and game tiles are fixed-pixel thumbnails (~95×60px) in a tight grid. No lazy loading (era predates it). Product renders sit on textured backdrops rather than transparent cutouts. ## Elevation & Depth Depth in this system is **physical bevel simulation**, not soft shadow. There is no blurred drop-shadow vocabulary; instead every plate is given the illusion of being a raised piece of molded plastic. | Level | Treatment | Use | |---|---|---| | 0 — Inset | Recessed into canvas; darker `{colors.chrome-indigo}` top edge, lighter bottom edge | List rows, form fields, the canvas body itself | | 1 — Plate | Flush panel; lighter top highlight, `{colors.chrome-indigo}` shadow line beneath | Content panels, system tiles, info box | | 2 — Raised chip | Beveled button with bright top edge + hard bottom shadow | Utility chips, Go/Submit buttons, nav tabs | | 3 — Command slab | `{colors.carbon}` near-black with halftone texture, sits "above" the chrome | Top nav bar, right-rail buttons, footer | ### Decorative Depth Depth is also carried by **texture and photography**: the halftone dot-matrix on carbon slabs reads as a recessed speaker grille; hero fields use motion-blur, circuit-board patterns, and product renders with their own cast shadows to create literal pictorial depth; chamfered corners on the outer chrome suggest a machined faceplate edge. The left-rail rotated tabs appear to tuck *behind* the main chrome, a small but effective layered cue. ## Shapes ### Border Radius Scale | Token | Value | Use | |---|---|---| | `{rounded.none}` | 0px | The default — nav bar, footer, most chrome plates (sharp / chamfered, not rounded) | | `{rounded.xs}` | 2px | Utility buttons, form fields, badges | | `{rounded.sm}` | 4px | Small panels, featured tiles, list rows | | `{rounded.md}` | 6px | Content panels, hero panel | | `{rounded.lg}` | 10px | Outer section panels, mascot bubble | | `{rounded.full}` | 9999px | Logo racetrack pill, radio dots, circle-arrow badges | The signature is **sharpness with rationed roundness**. The chrome is hard-edged and frequently *chamfered* (corners cut at 45° rather than curved) — this is the manufactured-faceplate look. Roundness appears only where it signals a physical control: the fully-pill logo, the round radio buttons, and the round Signal-Orange arrow badges. A modern reproduction should resist the urge to soften every corner; the tension between sharp plates and the few pill elements is the whole character. ### Photography Geometry Hero photography fills beveled rectangles at roughly 4:1 (banner) and 16:9 proportions, full-bleed within the panel. Featured-site and game thumbnails are near-4:3 fixed tiles (~95×60px) framed by a 1–2px `{colors.chrome-indigo}` edge with `{rounded.sm}` corners. The mascot is a transparent cutout overlapping the masthead, breaking the rectangular grid for personality. ## Components > No hover states are documented. Each spec below covers Default and (where extracted) Pressed/Active. Variants live as separate `components:` entries. ### Navigation **`nav-bar`** — Primary top navigation - `{colors.carbon}` slab with a faint halftone-dot texture, ~28px tall, carrying the `{components.logo-pill}` at left, the five `{colors.nav-gold}` section words in `{typography.nav-link}` uppercase, and the amber Code Bank / Game Finder utility chips at right. Sharp corners (`{rounded.none}`), `{spacing.sm}` padding. **`subnav-strip`** — Secondary navigation - A `{colors.canvas-soft}` pale-sky strip directly beneath the nav bar, carrying utility links (Parents, Customer Service, Corporate, Global, Privacy, Store, Contact) in `{typography.ui-label}` `{colors.ink}`, separated by thin dividers. Sharp, `{spacing.xs}` padding. **`left-rail-tab`** — Rotated section tabs - A thin vertical strip of `{colors.carbon}` tabs (Top Ten, Top Rentals, Player's Choice, ESRB Ratings) with vertically-rotated `{typography.ui-label}` text in `{colors.canvas-soft}`, clipped to the left chrome edge. Sharp corners, `{spacing.xs}` padding. ### Brand & Masthead **`logo-pill`** — Nintendo racetrack logo - The wordmark in `{colors.primary}` red set inside a white `{rounded.full}` racetrack pill, outlined. Sits at the left of the nav bar. `{spacing.xs}` padding. **`mascot-bubble`** — Mario welcome speech bubble - A white `{rounded.lg}` rounded-rectangle speech bubble with a tail, carrying "Welcome to Nintendo.com!" in `{typography.micro}` `{colors.carbon}`, paired with the Mario cutout in the masthead. `{spacing.sm}` padding. ### Buttons **`button-primary`** — Amber utility / Go chip - `{colors.amber}` fill, `{colors.carbon}` text in `{typography.ui-label}`, `{rounded.xs}` corners, `{spacing.md}` padding, with a beveled top highlight. The everyday tool button (Code Bank, Game Finder, Go). - Pressed state in **`button-primary-pressed`** — fill deepens to `{colors.nav-gold}`. **`button-submit`** — Forward / Submit - `{colors.signal}` orange fill, `{colors.on-primary}` white text in `{typography.ui-label}`, `{rounded.xs}`, `{spacing.lg}` padding. The "commit" action (poll Submit, Go on archives). **`button-secondary`** — Right-rail action button - `{colors.carbon}` near-black slab, `{colors.on-primary}` white text in `{typography.ui-label}`, sharp `{rounded.none}` corners, `{spacing.md}` padding, with a small leading icon. Used for Login / Subscribe / Newsletter / Help in the right rail. **`button-icon-arrow`** — Round forward arrow - A 22px `{colors.signal}` orange `{rounded.full}` disc with a white chevron — the primary "go" affordance on hero panels and section links. **`button-arrow-chip`** — Headline chevron chip - An 18px `{colors.signal}` orange `{rounded.xs}` chip with a white forward chevron, sitting at the right end of each `{components.news-row}` to advance to the article. ### Inputs & Forms **`search-field`** — Masthead search input - White `{colors.surface}` field, `{colors.ink}` text in `{typography.body}`, `{rounded.xs}` corners, 1px `{colors.hairline}` border, ~20px tall, paired with an "All" category dropdown and an amber Go chip. **`text-input`** — Generic text field - Same chassis as `search-field`: white fill, `{colors.ink}` text, `{rounded.xs}`, `{colors.hairline}` 1px border, `{spacing.xs}` padding. Used in the Login form (Username / Password / E-mail), news-archive keyword, and date fields. **`select-dropdown`** — Native select ("Click to choose") - A white `{colors.surface}` field with `{colors.ink}` text in `{typography.body}`, `{rounded.xs}` corners, and a hard 1px `{colors.carbon}` border (sharper than the inputs) closing on a beveled native dropdown-chevron button at the right edge. ~24px tall, `{spacing.xs}` padding. Used for the Register form's Month / Year pickers. **`field-label`** — Inline form label - A bold `{colors.ink}` label in `{typography.link}` (Arial Bold 12px) sitting left of its input (Username, Password, E-mail, Month, Year). `{rounded.none}`, `{spacing.xxs}` padding. **`radio-option`** — Poll radio button - A 12px white `{rounded.full}` radio dot with a `{colors.hairline}` ring, paired with `{typography.body}` option text. Used in the Player's Poll. **`form-panel`** — Form container (Login / Register) - A `{colors.platinum}` light-gray `{rounded.md}` panel holding a form, capped by a `{components.section-label-bar}` header (≡ LOG IN / ≡ REGISTER). `{spacing.lg}` interior. The Login page pairs two side by side. **`dotted-divider`** — Dotted hairline rule - A 1px dotted `{colors.muted-indigo}` separator rule used between form sub-sections (the "Note:" line, "Forgot Your Password?"). A recurring Y2K-chrome detail — dotted rather than solid. ### Cards & Panels **`hero-panel`** — Photographic hero plate - A `{rounded.md}` beveled rectangle filled with full-bleed product photography over a page-tinted field (`{colors.lavender}` / `{colors.systems-teal}` / `{colors.games-red}`), topped with an outlined `{typography.display}` wordmark and a `{components.button-icon-arrow}` call-to-action. `{spacing.lg}` interior. **`section-label-bar`** — Panel header - A `{colors.canvas}` header strip with a small grid/list glyph and an uppercase `{typography.ui-label}` title ("Official News", "Featured Sites", "Player's Poll"). Sharp corners, `{spacing.sm}` padding. Caps every content module. **`news-row`** — Headline list row - A `{colors.platinum}` `{rounded.sm}` row with a small category icon, a `{typography.link}` headline in `{colors.ink-soft}`, and a trailing `{components.button-arrow-chip}`. `{spacing.sm}` padding. Stacked into the Official News / Other Headlines lists. **`featured-tile`** — Featured-site thumbnail - A `{colors.carbon}`-framed `{rounded.sm}` tile (~95×60px) holding a screenshot thumbnail with a `{typography.micro}` URL caption (e.g. www.pokemon.com). Tight `{spacing.xxs}` padding, arranged in a 2×2 grid. **`poll-panel`** — Player's Poll module - A `{colors.periwinkle}` raised `{rounded.md}` panel posing a question, listing `{components.radio-option}` choices, and closing with a `{components.button-submit}`. `{spacing.md}` interior. **`info-box`** — "What Is" explainer card - A white `{colors.surface}` `{rounded.sm}` card with an amber header tab ("What Is — Game Finder") and `{typography.body}` explanatory copy. `{spacing.md}` padding. Sits in the right rail. **`promo-card`** — Side product promo - A `{colors.lavender}` `{rounded.sm}` card carrying an outlined product wordmark (e.g. Game Boy Advance) over a small product render, in the right rail. `{spacing.md}` padding. **`system-tile`** — Hardware grid tile (Systems page) - A `{colors.periwinkle}` `{rounded.sm}` tile holding a console render over a circuit-board backdrop with an outlined system name (Nintendo 64, Super Nintendo, Game Boy). `{spacing.sm}` padding, arranged in a 2×3 grid. **`link-row-card`** — Utility link card (Systems page) - A white `{rounded.sm}` card with an amber label tab (Technical Help, Store Locator, Online Store), a character icon, and a one-line `{typography.body}` description. `{spacing.sm}` padding. **`calendar-widget`** — Month calendar (News page) - A white `{rounded.sm}` grid calendar in `{typography.micro}`, with a `{colors.carbon}` caption header (e.g. "June 01"), highlighted event dates, and a month-select dropdown. `{spacing.sm}` padding. ### Badges & Footer **`esrb-badge`** — ESRB Privacy-Certified mark - A small `{colors.amber}` `{rounded.xs}` badge reading "ESRB — Privacy Certified" in `{typography.micro}` `{colors.carbon}`, pinned in the footer. **`esrb-rating-square`** — Game content-rating square - A 20px white `{rounded.xs}` square stamping the content-rating letter (E, T) in `{typography.ui-label}` `{colors.carbon}`, on each game card. **`footer-bar`** — Page footer - A `{colors.carbon}` chamfered slab with the "©1997–2001 Nintendo…" copyright in `{typography.micro}` `{colors.canvas-soft}`, the ESRB badge, and a privacy link. Sharp corners, `{spacing.lg}` padding. ### Examples (illustrative) > Kit-mirror demonstration surfaces. Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. **`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface. - Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding` **`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode). - Properties: `backgroundColor`, `textColor`, `rounded`, `padding` **`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery). - Properties: `backgroundColor`, `rounded`, `padding` **`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart). - Properties: `backgroundColor`, `rounded`, `padding`, `item-divider` **`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator. - Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding` **`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm. - Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder` **`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside. - Properties: `backgroundColor`, `rounded`, `padding` **`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow. - Properties: `backgroundColor`, `rounded`, `padding` **`ex-empty-state-card`** — Empty-state illustration frame. - Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography` **`ex-toast`** — Toast notification surface — feature-card shape + medium shadow. - Properties: `backgroundColor`, `rounded`, `padding`, `typography` ## Do's and Don'ts ### Do - Build every region as a **beveled plate**: a `{colors.canvas}` body with a brighter top edge and a `{colors.chrome-indigo}` shadow line beneath. The "assembled machine" feel depends on it. - Reserve warm color for **wayfinding only** — `{colors.nav-gold}` for nav words, `{colors.amber}` for utility/badges, `{colors.signal}` for forward/Submit. Cool chrome never carries action color. - Keep structural labels **uppercase Arial Bold with 0.5px tracking** (`{typography.ui-label}`) — it is the silkscreen-legend voice of the whole system. - Render hero wordmarks as **outlined + drop-shadowed `{typography.display}`** over full-bleed photographic fields tinted per page. - Use `{colors.carbon}` with halftone texture for the **command layer** (nav, right rail, footer) to separate "system controls" from "content." - Let panels **butt together** with thin bevel seams; density is the intended texture. - Default corners to **sharp/chamfered** (`{rounded.none}`); spend roundness only on the logo pill, radio dots, and circle-arrow badges. ### Don't - Don't soften every corner — turning the sharp chrome into a uniformly rounded card system erases the manufactured-faceplate identity. - Don't introduce a **soft blurred drop-shadow** elevation language; depth here is hard bevels and pictorial photography, not Material elevation. - Don't let `{colors.signal}` and `{colors.amber}` bleed into decorative use — warm color must always mean "act here." - Don't add accent colors outside the page-tint heroes (`{colors.systems-teal}`, `{colors.games-red}`); the steady-state chrome is strictly cool periwinkle + carbon. - Don't widen body copy or whitespace into an airy modern layout; the packed, fixed-canvas density is the brand. - Don't flatten the dual-nav structure (gold primary words over the pale secondary strip) into one bar — the layered command hierarchy is signature. - Don't render hero or system wordmarks as flat text; without the outline + shadow they lose the box-art reference entirely.