|
| 1 | +# openElement × Linear.app Design System |
| 2 | + |
| 3 | +> **Version**: 1.0.0 |
| 4 | +> **Date**: 2025-06-16 |
| 5 | +> **Designer**: AI Design Agent |
| 6 | +> **Reference**: linear.app |
| 7 | +> **Platform**: openElement Web Components (DSD-first) |
| 8 | +> **Font**: Inter (Google Fonts) / JetBrains Mono (Google Fonts) |
| 9 | +
|
| 10 | +--- |
| 11 | + |
| 12 | +## Quick Navigation |
| 13 | + |
| 14 | +| Section | Path | Description | |
| 15 | +|---------|------|-------------| |
| 16 | +| Design Tokens | [`tokens/`](./tokens/) | Colors, typography, spacing, radii — W3C + CSS formats | |
| 17 | +| Components | [`components/`](./components/) | Button, Card, Input, Nav, Badge, Icon specs | |
| 18 | +| Icons | [`icons/`](./icons/) | 6 feature icons (SVG, 24×24 viewBox) | |
| 19 | +| Mockups | [`mockups/`](./mockups/) | High-fidelity page mockups (PNG + SVG) | |
| 20 | +| Layout Specs | [`specs/`](./specs/) | Homepage, docs, design-system page specs | |
| 21 | +| Handoff | [`handoff/`](./handoff/) | Migration guide & QA checklist | |
| 22 | + |
| 23 | +--- |
| 24 | + |
| 25 | +## Design Philosophy |
| 26 | + |
| 27 | +1. **Canvas 即留白** — 深色背景本身就是留白,不用白色间隙 |
| 28 | +2. **Surface 阶梯** — 4 层表面(canvas → surface-1 → surface-2 → surface-3)构建层级 |
| 29 | +3. **Hairline 分隔** — 极细边框(1px, rgba(255,255,255,0.06))替代阴影 |
| 30 | +4. **顶部边缘高光** — 卡片顶部 1px 微弱白边,制造"像素渲染"感 |
| 31 | +5. **无渐变、无阴影、无氛围光** — 零装饰性渐变,零 drop-shadow |
| 32 | +6. **产品截图即主角** — 每个 section 以产品 UI 截图为核心视觉元素 |
| 33 | +7. **Typography 即品牌** — 激进的负字间距 + 精确的 weight 阶梯 |
| 34 | +8. **单色强调** — 只用 Indigo/Lavender 一个强调色 |
| 35 | +9. **紧凑按钮** — 8px 圆角,8px 14px padding,不是 pill |
| 36 | + |
| 37 | +--- |
| 38 | + |
| 39 | +## Color Palette |
| 40 | + |
| 41 | +### Dark Mode(唯一营销主题) |
| 42 | + |
| 43 | +| Token | Hex | Usage | |
| 44 | +|-------|-----|-------| |
| 45 | +| `--bg-canvas` | `#08080a` | Page background | |
| 46 | +| `--surface-1` | `#0d0f12` | Nav, secondary panels | |
| 47 | +| `--surface-2` | `#16191d` | Cards, code blocks | |
| 48 | +| `--surface-3` | `#212529` | Elevated elements, dropdowns | |
| 49 | +| `--brand` | `#5c7cfa` | Primary CTA, links, accent | |
| 50 | +| `--brand-hover` | `#4c6ef5` | Button hover | |
| 51 | +| `--brand-light` | `#748ffc` | Focus ring | |
| 52 | +| `--text-primary` | `#e9ecef` | Headlines, body | |
| 53 | +| `--text-secondary` | `#adb5bd` | Subtitles, descriptions | |
| 54 | +| `--text-muted` | `#868e96` | Captions, meta | |
| 55 | +| `--border` | `rgba(255,255,255,0.06)` | Hairline borders | |
| 56 | +| `--border-hover` | `rgba(255,255,255,0.10)` | Hover borders | |
| 57 | +| `--edge-highlight` | `rgba(255,255,255,0.08)` | Card top edge | |
| 58 | + |
| 59 | +### Light Mode(仅产品 UI 预览) |
| 60 | + |
| 61 | +| Token | Hex | Usage | |
| 62 | +|-------|-----|-------| |
| 63 | +| `--bg-canvas` | `#f8f9fa` | Page background | |
| 64 | +| `--surface-1` | `#ffffff` | Panels | |
| 65 | +| `--surface-2` | `#f1f3f5` | Cards | |
| 66 | +| `--text-primary` | `#12131a` | Headlines | |
| 67 | +| `--text-secondary` | `#626676` | Subtitles | |
| 68 | +| `--border` | `rgba(18,19,26,0.08)` | Hairline borders | |
| 69 | + |
| 70 | +--- |
| 71 | + |
| 72 | +## Typography Scale |
| 73 | + |
| 74 | +| Token | Size | Weight | Line-Height | Letter-Spacing | Usage | |
| 75 | +|-------|------|--------|-------------|----------------|-------| |
| 76 | +| Display XL | 80px | 600 | 0.95 | -0.04em | Hero headline | |
| 77 | +| Display LG | 56px | 600 | 1.05 | -0.03em | Section opener | |
| 78 | +| Display MD | 40px | 600 | 1.05 | -0.02em | Sub-section headline | |
| 79 | +| Headline | 28px | 600 | 1.20 | -0.01em | Pricing, CTA banner | |
| 80 | +| Card Title | 22px | 500 | 1.25 | -0.005em | Feature card title | |
| 81 | +| Subhead | 20px | 400 | 1.40 | -0.01em | Lead paragraphs | |
| 82 | +| Body LG | 18px | 400 | 1.50 | 0 | Hero subhead | |
| 83 | +| Body | 16px | 400 | 1.50 | 0 | Default body | |
| 84 | +| Body SM | 14px | 400 | 1.50 | 0 | Card body, footer | |
| 85 | +| Caption | 12px | 400 | 1.40 | 0 | Captions, meta | |
| 86 | +| Button | 14px | 500 | 1.20 | 0 | Button labels | |
| 87 | +| Eyebrow | 13px | 500 | 1.30 | +0.04em | Section labels | |
| 88 | +| Mono | 13px | 400 | 1.50 | 0 | Code snippets | |
| 89 | + |
| 90 | +> **Note**: Linear 在 Display 上只用 600,从不用 700+。这是其"克制的力量"的关键。 |
| 91 | +
|
| 92 | +--- |
| 93 | + |
| 94 | +## Spacing Scale |
| 95 | + |
| 96 | +| Token | Value | Usage | |
| 97 | +|-------|-------|-------| |
| 98 | +| `xxs` | 4px | Micro gaps | |
| 99 | +| `xs` | 8px | Button padding-y, icon gaps | |
| 100 | +| `sm` | 12px | Button gap, card gap | |
| 101 | +| `md` | 16px | Standard gap, card gap | |
| 102 | +| `lg` | 24px | Card padding, section gap | |
| 103 | +| `xl` | 32px | Page padding-x | |
| 104 | +| `xxl` | 48px | Large spacing | |
| 105 | +| `section` | 96px | Section separation | |
| 106 | + |
| 107 | +--- |
| 108 | + |
| 109 | +## Border Radius Scale |
| 110 | + |
| 111 | +| Token | Value | Usage | |
| 112 | +|-------|-------|-------| |
| 113 | +| `xs` | 4px | Small chips, badges | |
| 114 | +| `sm` | 6px | Inline tags | |
| 115 | +| `md` | 8px | Buttons, inputs, tabs | |
| 116 | +| `lg` | 12px | Cards, feature cards | |
| 117 | +| `xl` | 16px | Product panels, code blocks | |
| 118 | +| `pill` | 9999px | Status badges, tabs | |
| 119 | + |
| 120 | +--- |
| 121 | + |
| 122 | +## Breakpoints |
| 123 | + |
| 124 | +| Name | Width | Layout Changes | |
| 125 | +|------|-------|----------------| |
| 126 | +| Desktop | ≥ 1024px | 3-column feature grid, hero side-by-side | |
| 127 | +| Tablet | 768–1023px | 2-column feature grid, hero stacked | |
| 128 | +| Mobile | < 768px | 1-column, simplified nav, code panel hidden | |
| 129 | + |
| 130 | +--- |
| 131 | + |
| 132 | +## Files & Deliverables |
| 133 | + |
| 134 | +### Mockups |
| 135 | +- `01-homepage-hero.png` — Hero section (1440×900) |
| 136 | +- `02-homepage-features.png` — Feature grid (1440×900) |
| 137 | +- `03-design-system.png` — Design system page (1440×900) |
| 138 | +- `04-fullpage-concept.png` — Full homepage scroll (1440×2400) |
| 139 | +- `05-homepage-hero.svg` — Hero SVG (Figma-importable) |
| 140 | +- `06-homepage-features.svg` — Features SVG (Figma-importable) |
| 141 | +- `07-fullpage.svg` — Full page SVG (Figma-importable) |
| 142 | + |
| 143 | +### Tokens |
| 144 | +- `tokens/tokens.json` — W3C Design Tokens format |
| 145 | +- `tokens/tokens.css` — CSS Custom Properties |
| 146 | +- `tokens/tokens.md` — Token documentation |
| 147 | + |
| 148 | +### Components |
| 149 | +- `components/button.md` — 4 variants (primary, secondary, tertiary, inverse) |
| 150 | +- `components/card.md` — Top edge highlight, hover states |
| 151 | +- `components/input.md` — Focus ring, hairline border |
| 152 | +- `components/nav.md` — Sticky nav, backdrop blur, 56px height |
| 153 | +- `components/badge.md` — Pill status badge |
| 154 | +- `components/icon.md` — 16×16 / 24×24 / 32×32 sizes |
| 155 | + |
| 156 | +### Icons |
| 157 | +- `icons/elements-first.svg` — Layers icon |
| 158 | +- `icons/one-renderer.svg` — Git-branch icon |
| 159 | +- `icons/app-lifecycle.svg` — Workflow icon |
| 160 | +- `icons/trusted-boundary.svg` — Shield icon |
| 161 | +- `icons/gate-proven.svg` — Check-circle icon |
| 162 | +- `icons/web-standards.svg` — Globe icon |
| 163 | + |
| 164 | +--- |
| 165 | + |
| 166 | +## Version History |
| 167 | + |
| 168 | +| Version | Date | Changes | |
| 169 | +|---------|------|---------| |
| 170 | +| 1.0.0 | 2025-06-16 | Initial Linear.app style redesign | |
| 171 | + |
| 172 | +--- |
| 173 | + |
| 174 | +## Contact |
| 175 | + |
| 176 | +- **Framework**: [openelement.org](https://openelement.org) |
| 177 | +- **GitHub**: [github.com/open-element/openelement](https://github.com/open-element/openelement) |
0 commit comments