Professional trading UI design system. Load when designing or implementing panels, layouts, typography, color, data display, or interactions for trading applications.
Stack-agnostic. Does not define specific tokens, colors, or pixel values — those belong in your design system.
The intersection of three qualities:
The default theme is dark. The system must support user-customizable themes built on established community palettes — not invented color schemes.
Reference Platforms:
| Platform |
|---|
| What to Learn |
|---|
| Sierra Chart | Extreme data density, configurability, tiling efficiency |
| Bloomberg Terminal | Information architecture at scale, keyboard-driven workflows |
| Trading Technologies (TT) | Order management UX, ladder precision |
| CQG | Clean professional layout, efficient use of screen real estate |
| Vercel Dashboard | Dark aesthetic, typographic hierarchy, restrained color |
| Linear | Dark, dense, keyboard-first |
| ShadCN/ui | Component composition model, consistent design tokens |
Anti-Patterns:
| Anti-Pattern | Problem |
|---|---|
| Robinhood aesthetic | Hides complexity behind whitespace, gamifies trading, wastes density |
| TradingView chrome | Too much social chrome dilutes focus |
| Crypto exchange neon | Multiple bright hues make directional color meaningless |
| Generic dashboard look | Rounded corners, large padding, gradients — wastes 40%+ of screen |
| Electron bloat feel | Sluggish rendering, input lag — must feel instant |
Default compact, scale up only for readability. Every element must earn its screen space.
Benchmarks:
| Element | Target |
|---|---|
| Table row height | 20-28px |
| Panel padding | 4-8px |
| Inter-element gap | 2-4px |
| Font size (data) | 11-13px |
| Font size (labels) | 10-12px |
| Icon size | 12-16px |
Hierarchy through density:
The signal is price action, position state, and order status. Everything else is noise.
High-value attention spend:
Minimize or eliminate:
State communication — must be obvious without searching:
| State | Why |
|---|---|
| Connected / disconnected | Trading on stale data causes losses |
| Position direction and P&L | Core awareness at all times |
| Order status | Working, filled, or rejected |
| Data freshness | Stale prices look identical to live without indication |
| Error conditions | Hidden errors lead to missed trades |
Animation: Use only when it communicates information otherwise missed. Brief flash on price tick — acceptable. Panel slide-in transitions — not acceptable. Transitions under 100ms.
Exactly two chromatic hues: one for positive direction (buy/bid/profit/long), one for negative (sell/ask/loss/short). All other visual variation from a single neutral at graduated opacities. No blue, orange, yellow, purple in the base palette.
Neutral variation:
| Opacity | Role |
|---|---|
| 100% | Primary text, most important non-directional data |
| 70-80% | Secondary text, labels, headers |
| 40-50% | Tertiary text, timestamps, metadata |
| 20-30% | Disabled text, subtle indicators |
| 8-15% | Borders, dividers, row hover tints |
| 3-6% | Subtle background differentiation |
When you need a third color:
Opacity is the primary tool for hierarchy, state, and depth. Not new colors.
| Role | Opacity Approach |
|---|---|
| Background tinting | Directional hue at 5-10% |
| Borders | Neutral at 8-15% |
| Hover states | Current color + 5-10% neutral overlay |
| Active/selected | Current color + 10-15% neutral overlay |
| Disabled elements | Reduce to 30-40% |
| Text hierarchy | Same neutral at 100%, 70%, 45%, 25% |
| Directional backgrounds | Positive/negative hue at 8% for position rows |
Directional hue variants:
| Variant | Opacity | Use |
|---|---|---|
| Full | 100% | Text, icons — primary directional signal |
| Medium | 60-70% | Secondary directional elements |
| Subtle | 30-40% | Directional borders, outlines |
| Tint | 8-12% | Row/cell background tinting |
| Ghost | 3-5% | Hover backgrounds on directional elements |
If reaching for a new color value — stop. Can this be achieved with an opacity variant? If yes, use opacity. A new color in the palette is an architectural change.
The default canvas is near-black (3-6% brightness, not pure #000000). Data is the brightest thing on screen. Depth comes from a structured elevation system — not shadows, not gradients.
Elevation ladder (5 levels):
| Level | Name | Purpose |
|---|---|---|
| 0 | Base | App background — deepest layer, visible between panels |
| 1 | Panel | Primary content containers — where data lives |
| 2 | Raised | Cards, menus, dropdowns, popovers |
| 3 | Hover | Interactive feedback — hover state on any surface |
| 4 | Active | Selected/pressed state — highest emphasis background |
Elevation in context:
| UI Element | Level |
|---|---|
| App background (gaps between panels) | 0 (Base) |
| Panel content area | 1 (Panel) |
| Header bar, status bar | 1 (Panel) |
| Dropdown menus, context menus | 2 (Raised) |
| Tooltips, popovers | 2 (Raised) |
| Dialog/modal backdrop | Overlay (semi-transparent black) |
| Dialog/modal content | 2 (Raised) |
| Row on hover | 3 (Hover) |
| Selected row, active tab | 4 (Active) |
| Pressed button | 4 (Active) |
Principles:
Borders: Use the neutral at very low opacity rather than a distinct border color. Borders define panel boundaries without drawing attention.
Theming beyond dark:
Two font categories. No exceptions. No third font.
| Category | Font Type | Used For |
|---|---|---|
| Structural / Identity | Monospace | Headings, labels, navigation, buttons, status, panel titles, badges, all numeric data |
| Prose / Description | Sans-serif | Body paragraphs, tooltips, help text, long-form explanations |
The monospace font must support tabular figures (all digits same width), lining figures (baseline-aligned), and clear zero/O distinction at 11px. Recommended: JetBrains Mono, IBM Plex Mono, Iosevka, Berkeley Mono, Cascadia Code.
The boundary — where sans meets mono:
| Element | Font | Reasoning |
|---|---|---|
| "Positions" panel title | Sans | UI label, no numeric content |
| Order quantity "100" | Mono | Numeric, users compare quantities |
| "Cancel" button | Sans | Text action, no numeric content |
| "Buy 5 ES @ 4,512.25" button | Mono | Contains numbers users must verify |
| Timestamp "14:32:05" | Mono | Numeric sequence users scan |
Rule: if it contains a number the user needs to compare or scan, it's monospace.
Decimal alignment — the single most important typographic rule for trading data. In any numeric column, decimal points must align vertically.
Implementation: right-align numeric columns with consistent decimal places, use tabular figures, pad with non-breaking spaces if needed.
Size hierarchy:
| Level | Relative Size | Use |
|---|---|---|
| Primary | Base + 1-2px | Current price, total P&L, key metric |
| Standard | Base (11-13px) | Most data: quantities, prices, order details |
| Secondary | Base - 1px | Labels, column headers, timestamps |
| Tertiary | Base - 2px | Metadata, IDs, supplementary info |
Column layout:
No component should contain a raw color value, pixel measurement, or font specification. All visual properties reference semantic tokens.
| Category | Examples |
|---|---|
| Directional colors | positive, negative (bid/ask, buy/sell, profit/loss) |
| Surface levels | surface-base, surface-panel, surface-raised, surface-hover, surface-active |
| Text hierarchy | text-primary, text-secondary, text-tertiary, text-disabled |
| Borders | border-default, border-subtle |
| Spacing | space-xs, space-sm, space-md, space-lg, space-xl |
| Typography | font-ui, font-data, size-primary, size-standard, size-secondary |
Naming — by semantic role, not appearance:
| Wrong | Right |
|---|---|
green-500 | color-positive |
dark-bg | surface-base |
small-text | text-secondary |
gray-border | border-default |
In code review, any hardcoded color value, pixel measurement, or font name in component code is a defect. The only place raw values should exist is in the design system's token definition file.
Professional trading interfaces are modular panel systems, not page layouts.
Panel priority ordering:
| Priority | Panels | Collapse Behavior |
|---|---|---|
| Never collapse | Chart, order entry | Core function |
| Last to collapse | Positions, active orders | Active-state awareness |
| Early collapse | Watchlist, account info, alerts | Important but not moment-to-moment |
| First to collapse | Settings, logs, analytics | Reference panels checked periodically |
Collapsed panels show compact indicators with key counts (e.g., "Orders (3)").
Shell structure:
Panel internal structure:
Every panel must implement all five states:
| State | Visual Pattern |
|---|---|
| Loading (known layout) | Skeleton shimmer matching expected content shape |
| Loading (unknown) | Centered spinner with context text |
| Empty | Centered icon + helpful text + how to change |
| Error | Inline banner with actionable message and retry |
| Disconnected | Last data grayed/dimmed with stale warning and timestamp |
Disconnected state requires special attention:
State transitions are immediate. No fade animations between states.
When viewport shrinks below combined minimums:
Rules:
Minimum panel sizes (reference):
| Panel Type | Min Width | Min Height |
|---|---|---|
| Chart | 400px | 300px |
| Order entry | 250px | 200px |
| Positions | 300px | 100px |
| Order book | 200px | 200px |
| Watchlist | 200px | 100px |
Price:
Position:
Order:
P&L:
Alerts:
| Severity | Behavior | Dismissal |
|---|---|---|
| Info/fills | Transient toast | Auto-dismiss 3-5s |
| Warning | Non-blocking toast | Timed 10s or manual |
| Error | Prominent | Manual required |
| Persistent | Inline banner | Until condition resolves |
Errors must never auto-dismiss.
General:
Every critical action must be reachable by keyboard. The mouse is a fallback.
?)Trading-specific shortcuts:
| Action | Pattern |
|---|---|
| Place order | Submit current order entry form |
| Cancel all orders | Panic shortcut + one confirmation keystroke |
| Cancel last order | Single shortcut, no confirmation |
| Flatten position | Close all positions in current symbol |
| Switch symbol | Type-ahead from any context |
| Navigate panels | Directional shortcuts between panels |
Focus management:
Tooltips on every icon-only button: action name + keyboard shortcut. Appear after 300-500ms hover, disappear immediately on leave.
Confirmation requirements:
| Action | Required | Details Shown |
|---|---|---|
| Order placement (above threshold) | Yes | Side, quantity, symbol, price, type, estimated cost |
| Position close/flatten | Yes | Symbol, P&L, quantity |
| Cancel all orders | Yes | Count, symbols affected |
| Modify working order | Context-dependent | Original vs new highlighted |
Confirmation dialog design:
Prevention over confirmation:
Recovery:
Two approaches:
Composed — from existing primitives (text, row, column, button, input). Use for most widgets: PriceDisplay, PositionBadge, PnlDisplay, AlertBanner, NumericStepper, SymbolSearch, StatusIndicator.
Custom-rendered — canvas, WebGL, GPU primitives. Use only for performance-critical visualization: charts, DOM/order book with high-frequency updates, heatmaps, volume profiles.
Threshold: if composed maintains 60fps with your data volume, use composition.
ShadCN model compressed for trading:
| ShadCN Pattern | Trading Adaptation |
|---|---|
| Generous padding (px-4 py-2) | Minimal padding (px-2 py-1 or less) |
| Comfortable line-height | Tight line-height (1.2-1.3) |
| 14-16px body text | 11-13px data text |
| Card-based with gaps | Edge-to-edge panels, minimal gaps |
| Rounded corners | Zero radius on everything — no exceptions |
| Prominent hover states | Subtle hover (opacity shift, not color change) |
Standard trading widgets:
| Widget | Key Requirements |
|---|---|
| PriceDisplay | Monospace, directional color + icon, absolute + percentage change |
| PositionBadge | Direction, quantity, P&L — one dense row |
| PnlDisplay | Monospace, directional color + icon, realized/unrealized |
| NumericStepper | Step size = instrument tick, keyboard + scroll, min/max |
| SymbolSearch | Type-ahead, fuzzy match, recent history |
| StatusIndicator | Color-coded dot + label from tokens |
| AlertBanner | Severity levels, inline or toast, dismiss per severity |
| OrderTicket | Side toggle, quantity stepper, price input, type selector, directional submit |
Component checklist:
Contrast requirements:
| Element | Minimum Ratio | Standard |
|---|---|---|
| Body text (< 18px) | 4.5:1 | WCAG AA |
| Large text (>= 18px) | 3:1 | WCAG AA |
| Interactive boundaries | 3:1 | WCAG 2.1 |
| Focus indicators | 3:1 | WCAG 2.1 |
Test every text opacity level. Tertiary/disabled text most likely to fail.
Never color alone — every directional color needs reinforcement:
| Color Indicator | Required Reinforcement |
|---|---|
| Green price change | Up arrow/triangle icon |
| Red P&L | Down arrow/triangle icon |
| Buy/sell button colors | "Buy"/"Sell" text label |
| Position direction | "Long"/"Short" text badge |
| Status indicator | Status text label |
Focus indicators:
Cross-platform rendering: