DESIGN.md · git:20260406.de6bec6 · 2026-04-06 · sha256 bf8eb7daff821dfe

DESIGN.md git:20260406.de6bec6A

Immutable. This exact content never changes and is served at /api/v1/blob/bf8eb7daff821dfe.

# PanGuard AI — Design System

## Visual Theme & Atmosphere

Dark, professional security dashboard. Calm authority — not flashy or alarming.
Think "mission control" not "gaming UI". Dense but readable. Information-first.
The sage green conveys "protected" without being aggressive.

Density: High (security dashboards need lots of data visible at once)
Mood: Confident, calm, vigilant
Philosophy: Show status at a glance, details on demand

## Color Palette & Roles

| Role | Token | Hex | Usage |
|------|-------|-----|-------|
| Primary/Accent | `--sage` | #8B9A8E | Buttons, active states, "protected" indicators, links |
| Background L0 | `--bg-base` | #1A1614 | Page background |
| Background L1 | `--bg-card` | #242220 | Cards, sidebar |
| Background L2 | `--bg-raised` | #2E2C2A | Hover states, inputs, raised surfaces |
| Border | `--border` | #3A3836 | Card borders, dividers |
| Text Primary | `--text-primary` | #F5F1E8 | Headings, key values, labels |
| Text Muted | `--text-muted` | #A09A94 | Secondary text, descriptions, timestamps |
| Success | `--ok` | #2ED573 | Clean status, passed checks, connected |
| Warning | `--warn` | #FBBF24 | Suspicious, medium severity, pending |
| Danger | `--danger` | #EF4444 | Critical threats, errors, blocked |
| Sage Glow | `--glow` | rgba(139,154,142,0.15) | Subtle card glow on hover |

Severity colors:
- CRITICAL: `--danger` #EF4444
- HIGH: #F97316 (orange)
- MEDIUM: `--warn` #FBBF24
- LOW: `--sage` #8B9A8E
- INFORMATIONAL: `--text-muted` #A09A94

## Typography Rules

| Level | Font | Size | Weight | Color | Use |
|-------|------|------|--------|-------|-----|
| Page title | Space Grotesk | 20px | 700 | `--text-primary` | Page headings |
| Section title | Space Grotesk | 14px | 600 | `--text-muted` | Section labels, uppercase, 0.5px tracking |
| KPI value | Space Grotesk | 28px | 700 | varies by status | Big numbers on cards |
| Body | Inter | 13px | 400 | `--text-primary` | Default text |
| Label | Inter | 11px | 500 | `--text-muted` | Card labels, uppercase, 0.8px tracking |
| Monospace | JetBrains Mono | 12px | 400 | `--text-primary` | Event logs, rule IDs, timestamps |
| CJK | Noto Sans TC | matches level | matches level | matches level | Traditional Chinese text |

Font loading: Google Fonts — Space Grotesk (700), Inter (400,500), JetBrains Mono (400)

## Component Stylings

### Cards (KPI, status)
```
background: var(--bg-card)
border: 1px solid var(--border)
border-radius: 12px
padding: 16px 18px
box-shadow: var(--glow)
transition: border-color 0.2s
hover: border-color var(--sage)
```

### Status Badge
```
padding: 4px 12px
border-radius: 20px
font-size: 11px
font-weight: 600
text-transform: uppercase
letter-spacing: 0.5px

PROTECTED: background rgba(46,213,115,0.15), color var(--ok)
LEARNING: background rgba(251,191,36,0.15), color var(--warn)
OFFLINE: background rgba(239,68,68,0.15), color var(--danger)
```

### Sidebar Navigation Item
```
display: flex, align-items: center, gap: 10px
padding: 10px 20px
font-size: 13px, font-weight: 500
color: var(--text-muted)
border-left: 3px solid transparent
hover: background var(--bg-raised), color var(--text-primary)
active: color var(--sage), border-left-color var(--sage), background rgba(139,154,142,0.08)
```

### Event Log Item
```
padding: 10px 16px
border-bottom: 1px solid var(--border)
font-family: JetBrains Mono, monospace
font-size: 12px
border-left: 3px solid (varies by severity)
  CRITICAL: var(--danger)
  HIGH: #F97316
  SUSPICIOUS: var(--warn)
  CLEAN: var(--ok)
```

### Buttons
```
Primary: background var(--sage), color #1A1614, border-radius 8px, padding 8px 16px, font-weight 600
Secondary: background var(--bg-raised), color var(--text-primary), border 1px solid var(--border)
Danger: background rgba(239,68,68,0.15), color var(--danger)
All: font-size 13px, transition all 0.15s
```

## Layout Principles

Spacing scale: 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 64
Grid: CSS Grid, auto-fit, minmax(180px, 1fr) for KPI cards
Sidebar: fixed 220px width
Main content: flex-1, padding 24px 28px, overflow-y auto
Max content width: none (dashboard is full-width)

### Dashboard Page Layout
```
+-- Sidebar (220px) --+-- Main Content (flex-1) ---------------+
| Logo                 | Status Bar (PROTECTED | 172 rules)     |
| Dashboard (active)   | KPI Cards Grid (4 cards)               |
| Threats              |   [Rules Active] [Threats] [TC] [Scan] |
| Rules                | Threat Timeline (chart area)            |
| Skills               | Recent Events (log list)                |
| Threat Cloud         | TC Flywheel Status                      |
| Settings             |                                         |
+----------------------+-----------------------------------------+
```

## Depth & Elevation

Three levels only:
- L0: Page background (--bg-base) — the void
- L1: Cards, sidebar (--bg-card) — primary surfaces
- L2: Hover states, modals (--bg-raised) — interactive surfaces

Shadow: `0 0 20px rgba(139,154,142,0.15)` on card hover only. No other shadows.
No gradients. No blur effects. Clean flat surfaces with border separation.

## Do's and Don'ts

DO:
- Use sage green sparingly — it's the accent, not the background
- Show numbers prominently (28px bold) with labels below (11px muted)
- Use monospace for technical content (rule IDs, hashes, timestamps)
- Left-align everything. No centered text except status badges.
- Show severity with colored left-border on event items

DON'T:
- No emojis anywhere in the UI
- No rounded avatars or profile pictures
- No gradients or glass effects
- No animation except subtle transitions (0.15s)
- No more than 3 colors visible in any single card
- Don't use red for anything except actual threats/errors

## Responsive Behavior

Breakpoints:
- Desktop (>1024px): Full sidebar + main layout
- Tablet (768-1024px): Collapsed sidebar (icons only), main expands
- Mobile (<768px): No sidebar, bottom tab navigation, stacked cards

The dashboard is primarily desktop. Mobile is secondary.

## Dashboard Pages

### 1. Dashboard (Overview)
- Status hero: large "PROTECTED" or "LEARNING" badge with mode description
- 4 KPI cards: Rules Active, Threats Detected, TC Rules Synced, Skills Monitored
- Recent events log (last 20 events, auto-scroll)
- Uptime counter

### 2. Threats
- Threat event timeline (table, sortable)
- Severity filter chips
- Each row: timestamp, rule ID, severity badge, matched pattern (truncated), action taken

### 3. Rules
- All loaded ATR rules in a searchable table
- Columns: ID, Title, Severity, Category, scan_target, Status
- Filter by category, severity, scan_target
- Show total count prominently

### 4. Skills
- Installed skills from all platforms
- Whitelist status (green dot = whitelisted, yellow = unknown, red = blacklisted)
- Last audit date, risk score

### 5. Threat Cloud
- Connection status (connected/disconnected with colored dot)
- Rules received count
- Threats uploaded count
- Last sync timestamp
- Flywheel visualization: threats in → rules out

### 6. Settings
- Guard mode (learning/protection)
- TC endpoint + upload toggle
- AI layer config (Ollama/Claude/OpenAI)
- Dashboard port
- Language (EN/ZH-TW)

## Agent Prompt Guide

When building PanGuard dashboard components:
- Background: #1A1614, Cards: #242220, Borders: #3A3836
- Accent: #8B9A8E (sage green), Text: #F5F1E8
- Success: #2ED573, Warning: #FBBF24, Danger: #EF4444
- Font: Space Grotesk for headings, Inter for body, JetBrains Mono for code
- All cards: 12px radius, 1px border, sage glow on hover
- Severity left-borders: critical=red, high=orange, medium=yellow, low=sage