「春は暁、夏は夜、秋は夕暮れ、冬はつとめて」— 清少納言『枕草子』
For every season, there is a time; for every mode, a theme. Just as the seasons flow naturally, our design shifts between darkness and light.
| File | Who reads it | What it defines |
|---|---|---|
README.md |
Humans | What the project is |
AGENTS.md |
Coding agents | How to build the project |
DESIGN.md |
Design agents + AI | How the project should look and feel |
A developer productivity dashboard for managing AI coding agent sessions. The interface presents a three-panel layout: left sidebar (session tree), main content (session viewer), and overlay elements (command palette, search, filters).
Dark-themed terminal aesthetic — developer tool vibes, high information density, low visual noise. Inspired by Tokyo Night color palette: deep navy surfaces with teal accents, warm markdown text colors.
The color system uses CSS custom properties (variables) referenced via var(--*) in Less and rgb(var(--color-*) / <alpha>) in Tailwind. This enables seamless dark/light theme switching with full alpha compositing support.
「闇の中でこそ、光は輝く」— 光の中にこそ闇があるように、色は文脈によって意味を変える。
The primary theme. Deep space atmosphere with carefully chosen accent colors that glow against dark backgrounds.
:root {
/* Surface Colors (RGB space-separated for alpha) */
--color-background: 26 27 38 /* #1A1B26 — Deep space background (Tokyo Night base) */
--color-foreground: 229 229 231 /* #E5E5E7 — Primary text on dark */
--color-card: 36 37 54 /* #242536 — Elevated surfaces (sidebar panels) */
--color-card-foreground: 229 229 231 /* #E5E5E7 — Text on cards */
--color-popover: 36 37 54 /* #242536 — Dropdowns, menus, tooltips */
--color-surface: 37 38 54 /* #252636 — Subtle surface areas */
--color-surface-dark: 30 31 46 /* #1E1F2E — Deeper surfaces */
/* Interactive Colors */
--color-primary: 229 229 231 /* #E5E5E7 — Primary UI elements */
--color-primary-foreground: 26 27 38 /* #1A1B26 — Text on primary */
--color-secondary: 44 45 59 /* #2C2D3B — Secondary backgrounds */
--color-secondary-foreground: 229 229 231 /* #E5E5E7 — Text on secondary */
--color-accent: 44 45 59 /* Same as secondary */
/* Semantic Brand Accent */
--accent: #8abeb7 /* Teal — Main interactive accent */
--accent-rgb: 138, 190, 183 /* RGB version for rgba() */
--border: #5f87ff /* Soft blue accent for borders */
--borderAccent: #00d7ff /* Cyan for highlighted borders */
--borderMuted: #505050 /* Subtle borders */
--color-ring: 138 190 183 /* Teal focus ring */
/* State Colors */
--color-success: 126 231 135 /* #7EE787 — Success indicators (tool success) */
--color-warning: 255 166 87 /* #FFA657 — Warning indicators */
--color-destructive: 239 68 68 /* #EF4444 — Error/destructive actions */
--color-info: 86 156 214 /* #569CD6 — Info indicators */
--color-purple: 199 146 234 /* #C792EA — Purple accent (custom messages) */
/* Subtle Backgrounds (used for code blocks, inputs, etc.) */
--bg-subtle: rgba(0, 0, 0, 0.12)
--bg-inset: rgba(0, 0, 0, 0.2)
--bg-inset-hover: rgba(0, 0, 0, 0.3)
}
Activated via .theme-light class. Maintains the same semantic structure with inverted luminance.
.theme-light {
--color-background: 248 249 250 /* #F8F9FA — Light background */
--color-foreground: 26 27 46 /* #1A1B2E — Dark text */
--color-card: 255 255 255 /* #FFFFFF — White cards */
--color-secondary: 232 233 237 /* #E8E9ED — Light secondary */
--color-muted: 232 233 237 /* #E8E9ED */
--color-muted-foreground: 107 114 128 /* #6B7280 — Gray text */
--color-destructive: 220 38 38 /* #DC2626 */
--color-border: 209 213 219 /* #D1D5DB */
--color-ring: 13 148 136 /* #0D9488 — Teal focus ring */
--accent: #0d9488 /* Teal accent (darker for light bg) */
--color-purple: 139 92 246 /* #8B5CF6 */
}
Used across messages, markdown, and tool displays:
/* Message Bubbles */
--text: #e5e5e7 /* Primary text */
--text-secondary: #d4d4d8 /* Secondary text */
--userMessageBg: #343541 /* User message background (chat-like) */
--userMessageText: #e5e5e7 /* User message text */
--customMessageBg: #2d2838 /* Hook/custom message background (purple tint) */
--customMessageLabel: #9575cd /* Custom message label color */
/* Thinking Block Colors */
--thinkingText: #9ca3af /* Thinking text (muted gray) */
--thinkingOff: #505050 /* Thinking level: off */
--thinkingMinimal: #6e6e6e /* Thinking level: minimal */
--thinkingLow: #5f87af /* Thinking level: low */
--thinkingMedium: #81a2be /* Thinking level: medium */
--thinkingHigh: #b294bb /* Thinking level: high */
--thinkingXhigh: #d183e8 /* Thinking level: x-high */
Colors that communicate tool state and type:
/* Tool States */
--toolPendingBg: #282832 /* Pending tool execution */
--toolSuccessBg: #283228 /* Successful tool execution */
--toolErrorBg: #3c2828 /* Failed tool execution */
/* Tool Type Colors (8-color palette, inspired by One Dark) */
--tool-color-read: #61afef /* Blue — Read operations */
--tool-color-edit: #e5c07b /* Yellow — Edit operations */
--tool-color-write: #c678dd /* Purple — Write operations */
--tool-color-bash: #98c379 /* Green — Bash commands */
--tool-color-search: #56b6c2 /* Cyan — Search */
--tool-color-web-fetch: #d19a66 /* Orange — Web fetch */
/* Full palette for tool categorization */
--tool-palette-0: #e06c75 /* Red */
--tool-palette-1: #d19a66 /* Orange */
--tool-palette-2: #56b6c2 /* Cyan */
--tool-palette-3: #c678dd /* Purple */
--tool-palette-4: #98c379 /* Green */
--tool-palette-5: #ff6ac1 /* Pink */
--tool-palette-6: #9cdcfe /* Light blue */
--tool-palette-7: #e5c07b /* Yellow */
Used for rendered markdown content within session messages:
--mdHeading: #f0c674 /* Gold — Headings */
--mdLink: #81a2be /* Steel blue — Links */
--mdLinkUrl: #666666 /* Gray — Link URLs */
--mdCode: #8abeb7 /* Teal — Inline code */
--mdCodeBlock: #b5bd68 /* Green — Code blocks */
--mdCodeBlockBorder: #808080 /* Gray — Code block borders */
--mdQuote: #808080 /* Gray — Blockquote text */
--mdQuoteBorder: #808080 /* Gray — Blockquote border */
--mdHr: #808080 /* Gray — Horizontal rules */
--mdListBullet: #8abeb7 /* Teal — List bullets */
/* Diff Colors */
--toolDiffAdded: #b5bd68 /* Green — Added lines */
--toolDiffRemoved: #cc6666 /* Red — Removed lines */
--toolDiffContext: #808080 /* Gray — Context lines */
Base syntax colors with support for multiple themes:
/* Default (VS Dark-like) */
--syntaxComment: #6A9955 /* Green — Comments */
--syntaxKeyword: #569CD6 /* Blue — Keywords */
--syntaxFunction: #DCDCAA /* Yellowish — Functions */
--syntaxVariable: #9CDCFE /* Light blue — Variables */
--syntaxString: #CE9178 /* Orange-brown — Strings */
--syntaxNumber: #B5CEA8 /* Light green — Numbers */
--syntaxType: #4EC9B0 /* Teal — Types */
--syntaxOperator: #D4D4D4 /* White — Operators */
--syntaxPunctuation: #D4D4D4 /* White — Punctuation */
Apply via data-code-theme attribute:
| Theme | Description |
|---|---|
monokai |
Vibrant, high contrast — #F92672 pink keywords |
dracula |
Purple-pink aesthetic — #FF79C6 keywords |
one-dark |
Classic Atom — #61AFEF blue functions |
/* Primary Text */
--font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI',
'PingFang SC', 'Microsoft YaHei', 'Noto Sans CJK SC',
'Helvetica Neue', Arial, sans-serif;
/* Monospace (Code, Terminal, Paths) */
--font-family-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro',
Menlo, Consolas, 'DejaVu Sans Mono', monospace;Base: 16px (1rem) — Body text, inputs
Small: 11px — Code blocks, tree nodes, tool headers, labels
Micro: 10px — Timestamps, hints, status labels, collapsed hints
Tiny: 12px — Search results, compaction, model changes
Large: 14px — Empty states, search bar
Code: 11px — Code block content, line numbers
--line-height: 18px — Base line height (used as padding unit in messages)
1.4 — Thinking blocks, tool output
1.5–1.6 — Assistant text, markdown paragraphs
1.65 — Markdown content base
「言は短く、心は深く」— Words should be short, but hearts deep. Density wins.
Spacing uses a 4px grid with semantic naming:
4px — Tight padding (tool toggle, search button)
6px — Small gaps (filter buttons, tool meta)
8px — Base gap (flex gaps, padding, margins)
10px — Section spacing (sidebar controls)
12px — Medium padding (code blocks, tool execution, search bar)
16px — Large padding (session viewer, tool arguments, assistant text)
20px — Viewers padding
24px — Section margins (session header)
40px — Empty state padding
Messages: gap 16px between messages (--line-height)
Session content: max-width 1200px, centered
3px — Inline code, FTS snippet highlights
4px — Buttons, tool toggles, filter buttons, tree nodes
6px — Input fields, search inputs, command wrappers
8px — Code blocks, tool execution cards, search bar, hover previews, compaction
10px — User message bubbles (chat-like rounded corners)
32px — Pill chips (padded pill shapes, `rounded-full`)
Sharp corners for code/data, rounded for interactions, pill for status.
/* Layered depth system */
Subtle: 0 1px 2px rgba(0,0,0,0.04) /* Tool cards */
Base: 0 4px 12px rgba(var(--shadow-rgb), 0.3) /* Search bar */
Sidebar: 4px 0 12px rgba(var(--shadow-rgb), 0.4) /* Sidebar shadow */
Float: 0 8px 24px rgba(var(--shadow-rgb), 0.4) /* Hover previews */
Card float: 0 4px 24px rgba(var(--shadow-rgb), 0.2) /* Glass cards */
Lift hover: 0 8px 32px rgba(var(--shadow-rgb), 0.3) /* Glass card hover */
┌─────────────────────────────────────────────────────┐
│ [ Sidebar (resizable) ] │ [ Main Content Area ] │
│ │ │
│ • Session Tree │ • Session Messages │
│ • Search Bar │ • Tools & Code Blocks │
│ • Filter Pills │ • Thinking Blocks │
│ • View Mode Toggle │ • Command Palette (overlay) │
│ │ • Search (overlay) │
└─────────────────────────────────────────────────────┘
The application supports multiple primary views that share the same sidebar + viewer architecture:
| View | Description | Screenshot |
|---|---|---|
| Session Tree | Default view — hierarchical session display | Dark/light modes |
| Dashboard | Stats, charts, activity overview (modal overlay) | Light theme |
| Kanban Board | Session board organized by labels/status | Light theme |
| Favorites Panel | Bookmarked sessions grid | Dark theme |
| Settings Modal | Full-screen settings with categories | Light theme |
.session-sidebar {
background: card;
flex-shrink: 0;
border-right: 1px solid rgba(accent, 0.15);
box-shadow: 4px 0 12px rgba(shadow, 0.4);
position: absolute;
z-index: 20;
}- Resizable via drag handle with animated reveal (opacity + height + width)
- Contains: filters, search, session tree
- Filter pills: compact, uppercase labels, active state uses accent background
Default: Transparent, no visual footprint
Hover: Background rgba(accent, 0.05), inner line appears
Resizing: Background rgba(accent, 0.1), inner bar expands, accent color
.session-viewer {
padding: 20px;
}
.messages {
max-width: 1200px;
margin: 0 auto;
gap: 16px;
}/* Tauri drag region */
[data-tauri-drag-region] {
-webkit-app-region: drag;
app-region: drag;
user-select: none;
}- macOS traffic light buttons: standard red/yellow/green dots (Tauri handles)
- Window title: "Pi Session Manager" or contextual (e.g. "Kanban Board")
- Drag region spans the top bar area
- Window controls use
no-dragclass to remain interactive
.disconnected { bg: red-500/15, text: red-400, border-b: red-500/20 }
.connecting { bg: amber-500/15, text: amber-400, border-b: amber-500/20 }
.reconnected { bg: green-500/15, text: green-400, border-b: green-500/20 }- Position: fixed top, full-width,
z-50, above all content - Height: compact (
py-1.5, ~24px),text-xs,font-medium - Icons:
Loader2(spinner, animating) for connecting,WifiOfffor disconnected - Auto-dismiss: 2s flash on reconnection
- Demo mode: banner hidden
/* Overlay backdrop */
backdrop-filter: blur(8px);- Layout: Centered modal over blurred backdrop
- Header: Date title ("Saturday, March 14, 2026") + mode toggle ("Low/1/5", "Detailed mode")
- Stats Cards: 4 cards in a row — Sessions, Messages, Tokens, Projects
- Each card: icon (top-left), large number (2xl, ~24px), label (xs, muted)
- Card bg: white (light) / card (dark), subtle shadow
- Project Progress Bar: Horizontal bar showing project distribution (green fill = 100%)
- Hour Distribution: Bar chart — 24h x-axis, activity y-axis
- Bars: green fill, peak hours highlighted
- Session List: Bottom scrollable list
- Each row: time, user icon, model name, token count
- Compact, table-like layout
/* Full-screen modal */
.position: fixed, inset: 0, z-40
.backdrop: bg-black/50 (optional blur)- Layout: Two-panel — left nav (200px) + right content (flex)
- Left Nav: Vertical list of categories, active state highlighted (blue bg)
- Right Panel: Scrollable content, sections separated by horizontal rules
- Toggle Switches: Rounded pill, bg-gray when off, blue when on
- Radio Groups: Circular selectors for mutually exclusive options
- Sliders: Track + thumb, shows current value label
- Example: Terminal font size slider 10px–20px with live preview
- External Terminal Selector: List of options (iTerm2, Terminal.app, tmux)
- Each option: icon + name, radio button prefix, selected = blue ring
- Bottom Actions: "Reset Settings" (destructive) | "Cancel" | "Save" (primary)
┌──────────────────────────────────────────────────────────┐
│ [🍔] All Projects ▼ [🔍 Search sessions...] 4062 │
├────────────────┬─────────────────────────────────────────┤
│ Project Filter │ Unlabeled 待处理 进行中 已完成 重复│
│ │ (4047) (5) (3) (3) (1) │
│ 📁 All Prj │ ┌─────┐ ┌─────┐ ┌─────┐ │
│ pi-session │ │card │ │card │ │card │ │
│ dengwenyu │ │card │ │card │ │card │ │
│ ... │ │card │ └─────┘ └─────┘ │
└────────────────┴─────────────────────────────────────────┘
- Top Toolbar: Project dropdown + search input + session count
- Left Sidebar: Project list with folder icons, session/msg counts, selected = blue bg + checkmark
- Columns: 5 columns with colored dot indicators:
- Unlabeled (gray), 待处理 (orange), 进行中 (blue), 已完成 (green), 重复 (red)
- Column header: colored dot + name + count in parentheses
- Task Cards: White cards, 8px radius, subtle shadow
- Content: Title (bold), description (muted, truncated), stats row
- Stats: comment count, timestamp, source tag (e.g. "AI/pi-session-manager")
- Card hover: subtle lift effect
.stat-card {
glass-card + glass-card-hover; /* See Glassmorphism section */
border-radius: 8px (rounded-lg);
padding: 12px (p-3);
position: relative; overflow: hidden;
}- Icon: Top-left, 24px (p-2) rounded-lg, colored bg at 15% opacity + 10% shadow
- Hover: scale 1.1 + rotate 3deg with motion-transform
- Trend Badge:
bg-background/80,border-foreground/5,backdrop-blur-sm, 10px, pill (rounded-full)- Colors:
text-success(↑),text-destructive(↓),text-muted-foreground(neutral)
- Colors:
- Value:
text-xl(~20px),font-bold,text-gradient(gradient overlay) - Label: 10–11px,
text-muted-foreground,uppercase tracking-wider font-medium - Hover Effects:
- Radial gradient overlay:
circle at top right, 8% color opacity - Bottom glow line: 2px, linear gradient from transparent → 60% color → transparent
- Shadow glow:
0 0 30px rgba(color, 0.25)per color variant
- Radial gradient overlay:
Color Variants (glow classes):
| Color Hex | Usage | Glow |
|---|---|---|
#569cd6 |
Sessions | Blue glow |
#7ee787 |
Messages | Green glow |
#ffa657 |
Tokens | Orange glow |
#ff6b6b |
Cost/Errors | Red glow |
| Icon | Label | Color |
|---|---|---|
Activity / BarChart3 |
Sessions / Activity | Blue (#569cd6) |
MessageSquare |
Messages | Green (#7ee787) |
Zap |
Avg Session | Teal |
DollarSign |
Total Cost | Orange (#ffa657) |
Clock |
Time Distribution | Purple |
- Activity Heatmap (
ActivityHeatmap.tsx): GitHub-style contribution grid- Cell: ~12px square, 2px gap, 2px radius
- Levels: gray→green→dark green (5 levels: 0%, 25%, 50%, 75%, 100%)
- Token Trend Line Chart (
TokenTrendChart.tsx): Area chart with gradient fill - Top Models Bar Chart (
TopModelsChart.tsx): Horizontal bars with model name labels - Message Distribution: Pie/donut showing user vs assistant ratio
- Time Distribution: Hourly breakdown, vertical bars
- Projects Chart: Project-level stats comparison
- Session Length Chart: Duration distribution
「グラフは心の鏡」— Charts reflect the heart of the data.
.kanban-card {
bg: card;
border: 1px solid rgba(border, 0.4); /* border-border/40 */
border-radius: 6px (rounded-md);
padding: 10px (p-2.5);
cursor: pointer;
motion-surface + motion-color;
}
.kanban-card.selected {
border: primary/50;
bg: primary/5;
ring: 1px primary/20;
}
.kanban-card.dragging {
opacity: 0.5;
box-shadow: shadow-lg;
}
.kanban-card.overlay {
transform: rotate(2deg) scale(1.05);
box-shadow: shadow-xl;
}- Card Content:
- Title: truncate, ~13px, body font
- Description: muted text, 2-line max with line-clamp
- Stats row:
MessageSquareicon + count,Clockicon + relative time (12m,3h,2d) - Project tag: source label (e.g. "AI/pi-session-manager"), 10px, muted
- Tag badges: colored pills with tag names (from
TagBadge.tsx)
- Drag & Drop:
@dnd-kit/sortable— card transforms, shadow overlay, rotation
/* Column Header */
.kanban-column-header {
display: flex; align-items: center; gap: 8px;
padding: 12px;
font-size: 13px; font-weight: 600;
}
.column-dot { width: 8px; height: 8px; border-radius: 50%; }
.column-count { font-size: 11px; color: muted-foreground; margin-left: auto; }- Column dot colors:
- Unlabeled:
#9ca3af(gray) - 待处理:
#f59e0b(amber/orange) - 进行中:
#3b82f6(blue) - 已完成:
#22c55e(green) - 重复:
#ef4444(red)
- Unlabeled:
- Card Stack: Vertical list, 8px gap between cards
- Drop Zone: Dashed border on hover during drag
/* Modal Container */
.settings-modal {
position: fixed; inset: 0; z-index: 40;
display: flex; align-items: center; justify-content: center;
}
.settings-backdrop {
position: absolute; inset: 0;
bg: black/50; animation: ui-fade-in;
}
.settings-container {
position: relative; z-index: 10;
display: flex; flex-direction: column;
max-width: 800px; max-height: 80vh;
bg: card; border-radius: 12px;
box-shadow: 0 24px 48px rgba(shadow, 0.3);
animation: ui-zoom-in;
}Left Nav: Category list, 200px wide max
.settings-nav-item {
padding: 8px 12px; border-radius: 6px;
cursor: pointer; motion-color;
}
.settings-nav-item.active {
bg: rgba(accent, 0.12);
color: accent;
font-weight: 500;
}Form Components:
| Component | Visual | CSS Details |
|---|---|---|
SettingsToggleRow |
Label + pill switch | Switch: rounded-full 20px×36px, bg-gray-300→blue-500 transition |
SettingsRadioCardGroup |
Card-style radios | Each: border + icon + label, checked = accent ring |
SettingsOptionGroup |
Segmented buttons | Pill group, active = bg-primary text-primary-foreground |
SettingsSliderField |
Track + thumb | Track: 4px bg-muted, Thumb: 20px circle with shadow |
SettingsVisualSliderField |
Visual preview | Slider + live preview (e.g. font size sample) |
SettingsSelect |
Dropdown selector | Native <select> styled, 6px radius |
SettingsInput |
Text input | 1px border, 6px radius, focus ring on :focus |
SettingsField |
Labeled section | Label (12px, 600 weight) + description (muted, 11px) + control |
Terminal Settings Pattern (visible in screenshots):
.terminal-section { padding: 16px 0; }
.terminal-section-title { font-size: 14px; font-weight: 600; mb: 12px; }
.shell-option { display: flex; align-items: center; gap: 8px; padding: 6px 0; }
.font-size-slider { width: 100%; margin: 8px 0; }
.font-preview { font-family: mono; text-align: center; padding: 8px; bg: inset; border-radius: 6px; }| Dialog | Purpose | Style |
|---|---|---|
DeleteSessionConfirmDialog |
Destructive delete confirmation | Red accents, warning icon, path preview |
DeleteSessionPopover |
Quick delete from toolbar | Popover, compact |
ExportDialog |
Export sessions (JSON/Markdown) | File format selector, date range |
ForkDialog |
Fork/copy a session | Rename input, target path |
RenameDialog |
Rename session | Single input with validation |
All dialogs use:
- Backdrop:
bg-black/50+ fade-in animation - Container: Card bg, 8–12px radius, shadow-xl
- Actions: "Cancel" (secondary) + confirm (primary/accent or destructive for delete)
.onboarding-overlay {
position: fixed; inset: 0;
bg: black/60; backdrop-filter: blur(4px);
}
.onboarding-card {
max-width: 560px;
bg: card; border-radius: 16px;
padding: 32px;
animation: ui-zoom-in;
}- Multi-step wizard with progress dots
- Soft green theme accents (
#b5bd68) - Settings integration (
OnboardingServiceSettings.tsx)
┌─────────────────────────────────────────┐
│ 🔧 tool_name 12:34pm │
│ └────── Arguments (JSON collapsed) ────┘│
│ └────── $bash_command ──────────────────┘│
│ └────── Output/Result ──────────────────┘│
│ └────── Diff (add/remove/context) ──────┘│
└─────────────────────────────────────────┘
- Header: Tool name (accent color), icon (14px), timestamp (micro)
- States: pending (neutral bg), success (green tint), error (red tint)
- Border: 1px solid
rgba(accent, 0.12) - Padding: 8–12px internal
- Expandable: All sections can be expanded with smooth transitions
- Copy: Each section has a copy button (appears on hover)
User messages:
┌─────────────────────────┐
│ [user] badge 📋 12pm │
│ │
│ Message content... │
└─────────────────────────┘
Assistant messages:
[12:34pm]
Assistant text content...
┌─ Thinking block ──────┐
│ (collapsible/expandable)
└───────────────────────┘
┌─ Tool execution ──────┐
│ (see above) │
└───────────────────────┘
- User messages: max-height 380px, overflow scrollable, rounded 10px, chat-like
- Assistant messages: no wrapper, direct text flow
- Thinking block: collapsible, muted color, can contain nested markdown/code
- Timestamps: Micro size, 70% opacity, left-padded
┌──────────────────────────────────────┐
│ 📄 filename.jsx 📋 Copy │
├──────────────────────────────────────┤
│ 1 │ import { useState } from 'react';│
│ 2 │ │
│ 3 │ export default function App() { │
│ 4 │ return <div>Hello</div> │
│ 5 │ } │
└──────────────────────────────────────┘
- Wrapper:
bg-inset, 8px radius, 16px margin - Header: 8px 12px padding, language + filename in accent
- Line numbers: Right-aligned, muted color, mono font
- Content: 12px padding, mono font, syntax highlighting
- Scrollable variant: Inner scroll with thin scrollbar, no outer wrapper overflow
- Scrollbar: 8px height, rgba(accent, 0.3), hover to 0.5
├─ user "Can you help me?"
├─ assistant "Sure! Let me..."
│ ├─ read file.ts:15-20
│ ├─ bash npm run build
│ └─ write fix.ts (patch)
└─ compaction [Message history compacted]
- Height: 16px line, 2px vertical spacing
- Indentation: Prefix characters for tree structure
- Role colors: user (accent), assistant (success), tool (muted)
- Search match:
rgba(56, 189, 248, 0.12)background, sky-blue tint - Active: Accent background, 600 weight, accent color text
┌──────────────────────────────────┐
│ 🔍 Search... 3/12 ⬆⬇ ✕│
└──────────────────────────────────┘
- Position: Absolute, top-right of session viewer
- Size: min-width 320px
- Border: 1px solid
rgba(accent, 0.3)with shadow float - Input: bg-inset-hover, 6px radius
- Results: Accent color count, micro font
[ All ] [ Active ] [ Completed ] [ Archived ]
↑ inactive ↑ active (teal bg)
- Size: 4px 10px padding, 10px font
- Inactive: Transparent bg, muted text
- Active:
rgba(accent, 0.15)bg, accent text, 500 weight - Hover: Subtle rgba(accent, 0.05) bg
┌──────────────────────────────────────────┐
│ 🔍 Type a command or search... │
├──────────────────────────────────────────┤
│ SESSIONS │
│ ○ Recent session 1 │
│ ○ Recent session 2 │
│ │
│ ACTIONS │
│ ○ Delete session │
│ ○ Copy path │
└──────────────────────────────────────────┘
- Max height: 50vh with scroll
- Groups: Uppercase heading, muted-foreground, 12px font, 600 weight
- Items: 0.5rem 0.75rem padding, 6px radius, hover/selected use bg-subtle
「静と動の間に美がある」— Beauty lies between stillness and movement.
Instant: 80ms — Press effects, scale transforms
Fast: 140ms — Color changes, opacity, hover feedback
Base: 220ms — Surfaces (bg, border, shadow), transforms
Overlay: 320ms — Modal entry/exit, major state changes
Data: 480ms — Width changes, layout shifts
Standard: cubic-bezier(0.4, 0, 0.2, 1) — Default for most transitions
Enter: cubic-bezier(0.2, 0.8, 0.2, 1) — Spring-y, overshooting
Exit: cubic-bezier(0.4, 0, 1, 1) — Quick start, smooth end
Press: scale(0.96) — 4% compression on press
| Animation | Duration | Effect |
|---|---|---|
ui-fade-in |
base/overlay | Fade 0→1 |
ui-zoom-in |
overlay | Scale 0.95→1 + fade in |
ui-slide-in-from-top |
overlay | TranslateY -8px + fade |
ui-slide-in-from-left |
overlay | TranslateX -8px + fade |
ui-slide-in-from-right |
overlay | TranslateX +8px + fade |
highlight-pulse |
2s | Box-shadow pulse + bg flash |
blink |
0.8s | Typing cursor blink |
subagent-scale-in |
— | Scale from below + fade |
subagent-skeleton-shimmer |
— | Shimmer loading effect |
.motion-color — Color/border transitions (fast)
.motion-surface — Background/border/shadow transitions (base)
.motion-press — Transform/opacity with active scale(0.96)
.motion-width — Width transitions (data duration, 480ms)
When prefers-reduced-motion: reduce, all animation durations collapse to 1ms and scroll behavior to auto.
The design uses subtle glass effects for floating elements:
.glass {
bg: rgba(glass, 0.6);
backdrop-filter: blur(12px);
border: 1px solid rgba(highlight, 0.08);
}
.glass-card {
backdrop-filter: blur(16px);
border: 1px solid rgba(highlight, 0.06);
box-shadow: 0 4px 24px rgba(shadow, 0.2), 0 1px 2px rgba(highlight, 0.03) inset;
}
.glass-card-hover:hover {
transform: translateY(-2px);
box-shadow: 0 8px 32px rgba(shadow, 0.3), ...;
}
Status-based glow effects for visual feedback:
.glow-blue — info (blue) — Informational states
.glow-green — success (green) — Success/complete states
.glow-orange — warning (orange)— Warning/pending states
.glow-red — destructive (red)— Error/failure states
.focus-ring:focus-visible {
box-shadow:
0 0 0 2px rgb(var(--color-ring) / 0.62),
0 0 0 1px rgb(var(--color-background) / 0.9);
}- Teal ring (the accent color)
- 2px width with 1px inner offset
- Visible only on
:focus-visible(keyboard navigation)
All components support env(safe-area-inset-*) for mobile notches and keyboards.
- Mobile: hide scrollbars, use active feedback (scale 0.96)
- All interactive elements: minimum 32px touch target
- Body text: ≥4.5:1 (WCAG AA)
- Large text (≥18px): ≥3:1
- Focus ring: ≥3:1
- Use Tailwind's
bg-background,text-foreground,borderetc. for theme-aware coloring - Apply glassmorphism sparingly — only for floating overlays (search bar, hover previews)
- Use tool type colors consistently (blue=read, green=bash, purple=write, yellow=edit)
- Keep animations under 320ms except data-heavy transitions
- Use
prefers-reduced-motionchecks for all animations - Use
--bg-insetand--bg-subtlefor code blocks, inputs, and nested surfaces - Apply 8px border radius consistently for cards and code blocks
- Use 11px monospace for all code, path, and tree content
- Layer shadows for depth — subtle for inline, float for overlays
- Mix rounded (10px) and sharp (0px) corners in the same view
- Use solid colors — always use RGBA or CSS variables for theme flexibility
- Exceed 480ms for non-data animations — keeps the UI feeling snappy
- Use more than 8px gap between elements inside cards
- Override line heights below 1.3 for readability
- Use bright saturated colors on dark backgrounds without alpha blending
- Ignore
prefers-reduced-motion— always include the media query - Add custom colors without defining them in
_variables.lessor_themes.less
| File | Purpose |
|---|---|
src/styles/_variables.less |
CSS custom properties, font stacks, all color tokens |
src/styles/_themes.less |
Light theme variables (dark is default in :root) |
src/styles/_base.less |
Reset, typography, drag regions, safe heights |
src/styles/_layout.less |
Sidebar, session viewer, resize handle |
src/styles/_messages.less |
User/assistant messages, thinking blocks, compaction |
src/styles/_markdown.less |
Markdown typography, syntax highlighting, code themes |
src/styles/_tool-execution.less |
Tool cards, diffs, bash commands, arguments |
src/styles/_code-block.less |
Code blocks, line numbers, scrollable mode |
src/styles/_tree.less |
Session tree, nodes, search, status bar |
src/styles/_search.less |
Search bar, highlights, navigation |
src/styles/_cmdk.less |
Command palette (cmdk library integration) |
src/styles/_filters.less |
Filter pills, view mode toggle |
src/styles/_animations.less |
Keyframes, animation classes, reduced motion |
src/styles/_utilities.less |
Motion, focus, glassmorphism, glow, typography utilities |
src/styles/_mobile.less |
Mobile responsive overrides |
src/styles/_scroll-markers.less |
Scroll behavior |
src/styles/_flow.less |
Flow chart styles |
src/styles/_subagent.less |
Subagent-specific animations |
| Directory | Key Components | Design Notes |
|---|---|---|
components/dashboard/ |
StatCard, ActivityHeatmap, TokenTrendChart, TopModelsChart, RecentSessions |
Glass cards, stat cards with glow effects, charts |
components/kanban/ |
KanbanCard, KanbanColumn, KanbanContextMenu |
Drag-drop cards, colored column dots, sortable |
components/settings/ |
SettingsPanel, SettingsToggleRow, SettingsSliderField, SettingsRadioCardGroup |
Form inputs, modals, sliders, toggles |
components/dialogs/ |
DeleteSessionConfirmDialog, ExportDialog, ForkDialog, RenameDialog |
Modal dialogs, backdrop blur |
components/onboarding/ |
OnboardingStepContent |
Wizard overlay, multi-step progress |
components/ui/ |
Skeleton, TagBadge |
Loading states, tag pills |
components/session-tree/ |
Tree view, search | Hierarchy display |
components/tool-calls/ |
Tool execution cards | Expandable sections, diff rendering |
「一を聞いて十を知る」— Hear one, understand ten. Tokens are the seed of all design.
| Token | Value | Usage |
|---|---|---|
--accent |
#8abeb7 |
Interactive elements, focus ring, links in code |
--text |
#e5e5e7 |
Primary body text |
--body-bg |
rgb(26, 27, 38) |
Root background (Tokyo Night) |
--container-bg |
rgb(44, 45, 59) |
Card backgrounds |
--borderAccent |
#00d7ff |
Highlighted borders, compaction headers |
--success |
#b5bd68 |
Success states, tool success, assistant tree nodes |
--error |
#cc6666 |
Error states, tool errors |
| Element | Size | Weight | Color |
|---|---|---|---|
| Heading H1 | 1.5em | 600 | --mdHeading (gold) |
| Heading H2 | 1.35em | 600 | --mdHeading |
| Body | 16px | 400 | --text |
| Code | 11px | 400 | mono stack |
| Label | 10-12px | 500-600 | --muted-foreground |
| Timestamp | 10px | 400 | --muted-foreground, 70% opacity |
「美は細部に宿る」— Beauty dwells in details.
Auto-generated by analyzing _variables.less, _themes.less, and all _*.less style files in src/styles/. Last reviewed: 2026-04-07.