430 lines
11 KiB
Markdown
430 lines
11 KiB
Markdown
|
|
# Storybook Editor Visual Design System
|
|||
|
|
|
|||
|
|
> A synthesis of Teenage Engineering's bold minimalism and Dieter Rams' functionalist precision.
|
|||
|
|
|
|||
|
|
## Design Principles
|
|||
|
|
|
|||
|
|
### Core Tenets
|
|||
|
|
|
|||
|
|
1. **Functional First** - Every element serves a purpose. No decoration for decoration's sake.
|
|||
|
|
2. **Grid-Based Precision** - All elements align to an 8px base grid. Spacing is deliberate.
|
|||
|
|
3. **Restrained + Energetic** - Sophisticated aubergine foundation with bold gold accents.
|
|||
|
|
4. **Tactile Clarity** - Interactions feel deliberate. Buttons have weight. Feedback is immediate.
|
|||
|
|
5. **Honest Materials** - Code is monospace. Text is sans-serif. No skeuomorphism.
|
|||
|
|
6. **Long-Lasting** - Timeless aesthetic that won't feel dated in 5 years.
|
|||
|
|
|
|||
|
|
### The Rams x TE Synthesis
|
|||
|
|
|
|||
|
|
| Dieter Rams (Braun) | Teenage Engineering | Our Synthesis |
|
|||
|
|
|---------------------|---------------------|---------------|
|
|||
|
|
| "Less, but better" | Bold, playful color | Minimal structure, bold accents |
|
|||
|
|
| Neutral grays | Signature orange | Aubergine + gold |
|
|||
|
|
| Pure function | Emotional response | Functional with character |
|
|||
|
|
| Unobtrusive | Visual delight | Delightful when needed |
|
|||
|
|
| Grid systems | Grid systems | 8px base grid |
|
|||
|
|
|
|||
|
|
## Color System
|
|||
|
|
|
|||
|
|
### Primary Palette
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Aubergine Foundation:
|
|||
|
|
├─ aubergine-900 #1a0f1e Background (darkest)
|
|||
|
|
├─ aubergine-800 #2b1a33 Surface (cards, panels)
|
|||
|
|
├─ aubergine-700 #3d2447 Surface hover
|
|||
|
|
├─ aubergine-600 #4f2e5b Borders
|
|||
|
|
├─ aubergine-500 #61386f Subtle highlights
|
|||
|
|
├─ aubergine-400 #805793 Active elements
|
|||
|
|
└─ aubergine-300 #9f76a7 Muted text
|
|||
|
|
|
|||
|
|
Gold Accents:
|
|||
|
|
├─ gold-500 #f4a261 Primary accent (TE orange-gold)
|
|||
|
|
├─ gold-400 #f6b47a Hover state
|
|||
|
|
└─ gold-300 #f8c594 Pressed state
|
|||
|
|
|
|||
|
|
Supporting:
|
|||
|
|
├─ cream #fdf8f3 High contrast text
|
|||
|
|
├─ warm-gray-100 #e8e3dd Secondary text
|
|||
|
|
├─ warm-gray-400 #8b8680 Muted text
|
|||
|
|
└─ warm-gray-700 #4a4845 Disabled elements
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Semantic Colors
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Success: #6a994e Muted olive green (validation passed)
|
|||
|
|
Warning: #f4a261 Gold (reuse accent)
|
|||
|
|
Error: #d62828 Deep red (parse errors)
|
|||
|
|
Info: #9f76a7 Light aubergine (hints)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Usage Guidelines
|
|||
|
|
|
|||
|
|
- **Backgrounds**: Always aubergine-900 or aubergine-800
|
|||
|
|
- **Text**: Cream for primary, warm-gray-100 for secondary
|
|||
|
|
- **Accents**: Gold only for interactive elements and key information
|
|||
|
|
- **Borders**: aubergine-600 for subtle division, gold-500 for focus
|
|||
|
|
- **Code**: Syntax highlighting uses muted versions of semantic colors
|
|||
|
|
|
|||
|
|
## Typography
|
|||
|
|
|
|||
|
|
### Typeface Stack
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
UI Text (Sans-Serif):
|
|||
|
|
Primary: Geist, system-ui, -apple-system, sans-serif
|
|||
|
|
Weights: 400 (regular), 500 (medium), 600 (semibold)
|
|||
|
|
|
|||
|
|
Code (Monospace):
|
|||
|
|
Primary: "Monaspace Neon", "Monaspace", monospace
|
|||
|
|
Weights: 400 (regular), 600 (semibold)
|
|||
|
|
Features: Enable 'calt' for texture healing, ligatures
|
|||
|
|
Fallback: "JetBrains Mono", "Fira Code", Consolas, monospace
|
|||
|
|
|
|||
|
|
Headings (Sans-Serif):
|
|||
|
|
Primary: Same as UI but always semibold (600)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Type Scale (8px base grid)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Heading 1: 24px / 32px semibold (Panel titles)
|
|||
|
|
Heading 2: 20px / 28px semibold (Section headers)
|
|||
|
|
Heading 3: 16px / 24px semibold (Subsections)
|
|||
|
|
|
|||
|
|
Body: 14px / 20px regular (Default text)
|
|||
|
|
Body Small: 12px / 16px regular (Secondary info)
|
|||
|
|
Caption: 11px / 16px regular (Labels, metadata)
|
|||
|
|
|
|||
|
|
Code: 13px / 20px regular (Monospace content)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Guidelines
|
|||
|
|
|
|||
|
|
- **Line Height**: 1.4–1.6 for readability
|
|||
|
|
- **Letter Spacing**: Default for body, +0.02em for labels/captions
|
|||
|
|
- **Hierarchy**: Size + weight + color (don't rely on size alone)
|
|||
|
|
- **Monospace**: Only for code, file paths, and data values
|
|||
|
|
|
|||
|
|
## Spacing System
|
|||
|
|
|
|||
|
|
### 8px Base Grid
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Micro: 4px (Icon padding, tight spacing)
|
|||
|
|
Small: 8px (Default gap between related elements)
|
|||
|
|
Medium: 16px (Section spacing)
|
|||
|
|
Large: 24px (Panel padding)
|
|||
|
|
XLarge: 32px (Major section separation)
|
|||
|
|
XXLarge: 48px (Page margins, hero spacing)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Application
|
|||
|
|
|
|||
|
|
- All element sizes divisible by 8px
|
|||
|
|
- Padding and margins follow the scale above
|
|||
|
|
- Icons are 16px or 24px
|
|||
|
|
- Buttons have 8px vertical padding, 16px horizontal
|
|||
|
|
- Panel padding is 24px
|
|||
|
|
|
|||
|
|
## Component Patterns
|
|||
|
|
|
|||
|
|
### Buttons
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Primary (Gold):
|
|||
|
|
├─ Background: gold-500
|
|||
|
|
├─ Text: aubergine-900 (dark text on light button)
|
|||
|
|
├─ Padding: 8px 16px
|
|||
|
|
├─ Border Radius: 4px
|
|||
|
|
├─ Hover: gold-400
|
|||
|
|
└─ Active: gold-300
|
|||
|
|
|
|||
|
|
Secondary (Ghost):
|
|||
|
|
├─ Background: transparent
|
|||
|
|
├─ Border: 1px solid aubergine-600
|
|||
|
|
├─ Text: cream
|
|||
|
|
├─ Hover: aubergine-700 background
|
|||
|
|
└─ Active: aubergine-600 background
|
|||
|
|
|
|||
|
|
Tertiary (Text Only):
|
|||
|
|
├─ Background: transparent
|
|||
|
|
├─ Text: gold-500
|
|||
|
|
├─ Hover: gold-400
|
|||
|
|
└─ Underline on hover
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Input Fields
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Text Input:
|
|||
|
|
├─ Background: aubergine-800
|
|||
|
|
├─ Border: 1px solid aubergine-600
|
|||
|
|
├─ Text: cream
|
|||
|
|
├─ Placeholder: warm-gray-400
|
|||
|
|
├─ Focus: Border gold-500, glow 0 0 0 2px gold-500/20%
|
|||
|
|
├─ Padding: 8px 12px
|
|||
|
|
└─ Border Radius: 4px
|
|||
|
|
|
|||
|
|
Code Input (Textarea):
|
|||
|
|
├─ Background: aubergine-900
|
|||
|
|
├─ Font: JetBrains Mono 13px
|
|||
|
|
├─ Padding: 16px
|
|||
|
|
└─ Syntax highlighting with muted semantic colors
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Panels/Cards
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Surface:
|
|||
|
|
├─ Background: aubergine-800
|
|||
|
|
├─ Border: 1px solid aubergine-600
|
|||
|
|
├─ Border Radius: 8px
|
|||
|
|
├─ Padding: 24px
|
|||
|
|
└─ Shadow: 0 2px 8px rgba(0,0,0,0.3)
|
|||
|
|
|
|||
|
|
Nested Surface:
|
|||
|
|
├─ Background: aubergine-700
|
|||
|
|
└─ Same border/radius but lighter
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Lists
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
File List / Tree:
|
|||
|
|
├─ Item height: 32px (divisible by 8)
|
|||
|
|
├─ Hover: aubergine-700 background
|
|||
|
|
├─ Selected: aubergine-600 + gold-500 left border (4px)
|
|||
|
|
├─ Text: cream for name, warm-gray-400 for metadata
|
|||
|
|
└─ Indent: 16px per level
|
|||
|
|
|
|||
|
|
Data List:
|
|||
|
|
├─ Row height: 40px
|
|||
|
|
├─ Alternating backgrounds: aubergine-800 / aubergine-750
|
|||
|
|
├─ Border: 1px solid aubergine-600 between rows
|
|||
|
|
└─ Hover: gold-500/10% overlay
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Status Indicators
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Validation Badge:
|
|||
|
|
├─ Success: 20px circle, green background, white checkmark
|
|||
|
|
├─ Error: 20px circle, red background, white X
|
|||
|
|
├─ Warning: 20px circle, gold background, dark !
|
|||
|
|
└─ Position: Top-right corner of validated element
|
|||
|
|
|
|||
|
|
Loading Spinner:
|
|||
|
|
├─ Size: 16px or 24px
|
|||
|
|
├─ Color: gold-500
|
|||
|
|
├─ Animation: Smooth rotation, 1s duration
|
|||
|
|
└─ Use sparingly (only for async operations)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Layout Architecture
|
|||
|
|
|
|||
|
|
### Grid System
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Base Grid: 8px
|
|||
|
|
Columns: 12 or 24 column system
|
|||
|
|
Gutter: 16px
|
|||
|
|
Max Width: 1600px (ultra-wide consideration)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Panel Proportions
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Three-Column Layout (File Browser | Editor | Inspector):
|
|||
|
|
├─ File Browser: 240px–320px (fixed, resizable)
|
|||
|
|
├─ Editor: Flex-grow (takes remaining space)
|
|||
|
|
└─ Inspector: 280px–400px (fixed, resizable)
|
|||
|
|
|
|||
|
|
Two-Column Layout (File Browser | Editor):
|
|||
|
|
├─ File Browser: 240px–320px
|
|||
|
|
└─ Editor: Flex-grow
|
|||
|
|
|
|||
|
|
Diagnostics Panel (Bottom):
|
|||
|
|
├─ Height: 200px–400px (resizable)
|
|||
|
|
└─ Full width
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Z-Index Layers
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. Base (0): Background, surfaces
|
|||
|
|
2. Content (1): Text, images, forms
|
|||
|
|
3. Overlays (10): Dropdowns, tooltips
|
|||
|
|
4. Modals (100): Dialogs, confirmations
|
|||
|
|
5. Notifications (1000): Toast messages, alerts
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Interaction Design
|
|||
|
|
|
|||
|
|
### Animation Principles
|
|||
|
|
|
|||
|
|
1. **Fast but Noticeable** - 150–200ms for most transitions
|
|||
|
|
2. **Easing**: ease-out for entrances, ease-in for exits
|
|||
|
|
3. **Purpose-Driven** - Animate only to provide feedback or guide attention
|
|||
|
|
4. **Consistent** - Same animation for same action across the app
|
|||
|
|
|
|||
|
|
### Micro-interactions
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Button Click:
|
|||
|
|
└─ 100ms scale down to 0.98, then return
|
|||
|
|
|
|||
|
|
Hover:
|
|||
|
|
└─ 150ms background color transition
|
|||
|
|
|
|||
|
|
Focus:
|
|||
|
|
└─ Immediate gold border + glow (no delay)
|
|||
|
|
|
|||
|
|
Panel Resize:
|
|||
|
|
└─ Live (no animation) - functional over flashy
|
|||
|
|
|
|||
|
|
Tab Switch:
|
|||
|
|
└─ 200ms fade (crossfade if content changes)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Feedback Patterns
|
|||
|
|
|
|||
|
|
- **Click**: Immediate visual response (scale/color change)
|
|||
|
|
- **Hover**: Subtle background change (150ms transition)
|
|||
|
|
- **Success**: Green flash + success icon (500ms)
|
|||
|
|
- **Error**: Red border pulse + shake animation (300ms)
|
|||
|
|
- **Loading**: Gold spinner appears after 300ms delay (don't flash for quick ops)
|
|||
|
|
|
|||
|
|
## Accessibility
|
|||
|
|
|
|||
|
|
### Contrast Ratios
|
|||
|
|
|
|||
|
|
- **Body text (cream on aubergine-900)**: 15.2:1 (AAA)
|
|||
|
|
- **Secondary text (warm-gray-100 on aubergine-900)**: 11.8:1 (AAA)
|
|||
|
|
- **Gold accent on aubergine-900**: 7.1:1 (AA Large)
|
|||
|
|
- **Buttons**: Ensure 4.5:1 minimum
|
|||
|
|
|
|||
|
|
### Keyboard Navigation
|
|||
|
|
|
|||
|
|
- **Tab order**: Logical, follows visual layout
|
|||
|
|
- **Focus indicators**: Gold border + glow (always visible)
|
|||
|
|
- **Shortcuts**: Display in tooltips, use standard conventions
|
|||
|
|
- **Escape**: Always closes modals/dialogs
|
|||
|
|
|
|||
|
|
### Screen Readers
|
|||
|
|
|
|||
|
|
- Semantic HTML where possible
|
|||
|
|
- ARIA labels for custom components
|
|||
|
|
- Status announcements for validation/errors
|
|||
|
|
- Descriptive button text (no "click here")
|
|||
|
|
|
|||
|
|
## Icon System
|
|||
|
|
|
|||
|
|
### Style
|
|||
|
|
|
|||
|
|
- **Outline style** (not filled) - more Rams than TE
|
|||
|
|
- **Stroke width**: 1.5px
|
|||
|
|
- **Sizes**: 16px, 24px (following grid)
|
|||
|
|
- **Color**: Inherits text color unless accent needed
|
|||
|
|
|
|||
|
|
### Common Icons
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Navigation:
|
|||
|
|
├─ Folder (closed/open)
|
|||
|
|
├─ File
|
|||
|
|
├─ Search
|
|||
|
|
├─ Settings
|
|||
|
|
└─ Home
|
|||
|
|
|
|||
|
|
Actions:
|
|||
|
|
├─ Plus (add)
|
|||
|
|
├─ X (close/remove)
|
|||
|
|
├─ Check (confirm)
|
|||
|
|
├─ Edit (pencil)
|
|||
|
|
└─ Save (disk or checkmark)
|
|||
|
|
|
|||
|
|
States:
|
|||
|
|
├─ Success (checkmark circle)
|
|||
|
|
├─ Error (X circle)
|
|||
|
|
├─ Warning (! triangle)
|
|||
|
|
└─ Info (i circle)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Dark Mode (Primary Mode)
|
|||
|
|
|
|||
|
|
The aubergine palette is designed dark-first. Light mode is not planned for v1, but if needed:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Light Mode Palette (Future):
|
|||
|
|
├─ Background: cream (#fdf8f3)
|
|||
|
|
├─ Surface: warm-gray-100 (#f5f1ec)
|
|||
|
|
├─ Text: aubergine-900
|
|||
|
|
├─ Accent: Slightly deeper gold (#e89350)
|
|||
|
|
└─ Borders: warm-gray-400
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Responsive Considerations
|
|||
|
|
|
|||
|
|
### Breakpoints
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Compact: < 1024px (Single panel focus mode)
|
|||
|
|
Standard: 1024–1440px (Two panels)
|
|||
|
|
Wide: > 1440px (Three panels comfortable)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Adaptive Layout
|
|||
|
|
|
|||
|
|
- **< 1024px**: File browser as overlay/drawer
|
|||
|
|
- **1024–1440px**: Two-panel default (browser + editor)
|
|||
|
|
- **> 1440px**: Three-panel comfortable
|
|||
|
|
|
|||
|
|
## Implementation Notes
|
|||
|
|
|
|||
|
|
### Iced Styling
|
|||
|
|
|
|||
|
|
```rust
|
|||
|
|
// Example theme structure
|
|||
|
|
pub struct StorybookTheme {
|
|||
|
|
pub palette: Palette,
|
|||
|
|
pub spacing: Spacing,
|
|||
|
|
pub typography: Typography,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pub struct Palette {
|
|||
|
|
pub aubergine_900: Color,
|
|||
|
|
pub gold_500: Color,
|
|||
|
|
// etc.
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### File Organization
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
storybook-editor/src/
|
|||
|
|
├─ theme/
|
|||
|
|
│ ├─ mod.rs (Theme struct)
|
|||
|
|
│ ├─ colors.rs (Color constants)
|
|||
|
|
│ ├─ typography.rs (Font definitions)
|
|||
|
|
│ └─ components.rs (Component styles)
|
|||
|
|
├─ components/
|
|||
|
|
│ ├─ button.rs
|
|||
|
|
│ ├─ input.rs
|
|||
|
|
│ └─ panel.rs
|
|||
|
|
└─ ui/
|
|||
|
|
└─ (Application views)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## References
|
|||
|
|
|
|||
|
|
- **Teenage Engineering**: Bold minimalism, grid precision, playful accents
|
|||
|
|
- **Dieter Rams**: "Less but better", functionalism, longevity
|
|||
|
|
- **Apple HIG**: Clarity, depth, deference
|
|||
|
|
- **Linear**: Modern dev tool aesthetic
|
|||
|
|
- **Figma**: Panel-based interface patterns
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*Version 1.0 - Initial design system for Storybook Editor*
|