flock-core 0.5.0b50__py3-none-any.whl → 0.5.0b51__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of flock-core might be problematic. Click here for more details.

Files changed (116) hide show
  1. flock/dashboard/launcher.py +1 -1
  2. flock/frontend/README.md +678 -0
  3. flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
  4. flock/frontend/index.html +12 -0
  5. flock/frontend/package-lock.json +4347 -0
  6. flock/frontend/package.json +48 -0
  7. flock/frontend/src/App.tsx +79 -0
  8. flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +587 -0
  9. flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +387 -0
  10. flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +640 -0
  11. flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
  12. flock/frontend/src/components/common/BuildInfo.tsx +39 -0
  13. flock/frontend/src/components/common/EmptyState.module.css +115 -0
  14. flock/frontend/src/components/common/EmptyState.tsx +128 -0
  15. flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
  16. flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
  17. flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
  18. flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
  19. flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
  20. flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
  21. flock/frontend/src/components/controls/PublishControl.css +547 -0
  22. flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
  23. flock/frontend/src/components/controls/PublishControl.tsx +432 -0
  24. flock/frontend/src/components/details/DetailWindowContainer.tsx +62 -0
  25. flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
  26. flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
  27. flock/frontend/src/components/details/MessageHistoryTab.tsx +299 -0
  28. flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
  29. flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
  30. flock/frontend/src/components/details/RunStatusTab.tsx +307 -0
  31. flock/frontend/src/components/details/tabs.test.tsx +1015 -0
  32. flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
  33. flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
  34. flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
  35. flock/frontend/src/components/filters/FilterBar.module.css +29 -0
  36. flock/frontend/src/components/filters/FilterBar.test.tsx +133 -0
  37. flock/frontend/src/components/filters/FilterBar.tsx +33 -0
  38. flock/frontend/src/components/filters/FilterPills.module.css +79 -0
  39. flock/frontend/src/components/filters/FilterPills.test.tsx +173 -0
  40. flock/frontend/src/components/filters/FilterPills.tsx +67 -0
  41. flock/frontend/src/components/filters/TimeRangeFilter.module.css +91 -0
  42. flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
  43. flock/frontend/src/components/filters/TimeRangeFilter.tsx +105 -0
  44. flock/frontend/src/components/graph/AgentNode.test.tsx +75 -0
  45. flock/frontend/src/components/graph/AgentNode.tsx +322 -0
  46. flock/frontend/src/components/graph/GraphCanvas.tsx +406 -0
  47. flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
  48. flock/frontend/src/components/graph/MessageNode.test.tsx +62 -0
  49. flock/frontend/src/components/graph/MessageNode.tsx +116 -0
  50. flock/frontend/src/components/graph/MiniMap.tsx +47 -0
  51. flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
  52. flock/frontend/src/components/layout/DashboardLayout.css +407 -0
  53. flock/frontend/src/components/layout/DashboardLayout.tsx +300 -0
  54. flock/frontend/src/components/layout/Header.module.css +88 -0
  55. flock/frontend/src/components/layout/Header.tsx +52 -0
  56. flock/frontend/src/components/modules/EventLogModule.test.tsx +401 -0
  57. flock/frontend/src/components/modules/EventLogModule.tsx +396 -0
  58. flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +17 -0
  59. flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
  60. flock/frontend/src/components/modules/ModuleRegistry.ts +85 -0
  61. flock/frontend/src/components/modules/ModuleWindow.tsx +155 -0
  62. flock/frontend/src/components/modules/registerModules.ts +20 -0
  63. flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
  64. flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
  65. flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
  66. flock/frontend/src/components/settings/SettingsPanel.css +327 -0
  67. flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
  68. flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
  69. flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
  70. flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
  71. flock/frontend/src/hooks/useModulePersistence.ts +154 -0
  72. flock/frontend/src/hooks/useModules.ts +139 -0
  73. flock/frontend/src/hooks/usePersistence.ts +139 -0
  74. flock/frontend/src/main.tsx +13 -0
  75. flock/frontend/src/services/api.ts +213 -0
  76. flock/frontend/src/services/indexeddb.test.ts +793 -0
  77. flock/frontend/src/services/indexeddb.ts +794 -0
  78. flock/frontend/src/services/layout.test.ts +437 -0
  79. flock/frontend/src/services/layout.ts +146 -0
  80. flock/frontend/src/services/themeApplicator.ts +140 -0
  81. flock/frontend/src/services/themeService.ts +77 -0
  82. flock/frontend/src/services/websocket.test.ts +595 -0
  83. flock/frontend/src/services/websocket.ts +685 -0
  84. flock/frontend/src/store/filterStore.test.ts +242 -0
  85. flock/frontend/src/store/filterStore.ts +103 -0
  86. flock/frontend/src/store/graphStore.test.ts +186 -0
  87. flock/frontend/src/store/graphStore.ts +414 -0
  88. flock/frontend/src/store/moduleStore.test.ts +253 -0
  89. flock/frontend/src/store/moduleStore.ts +57 -0
  90. flock/frontend/src/store/settingsStore.ts +188 -0
  91. flock/frontend/src/store/streamStore.ts +68 -0
  92. flock/frontend/src/store/uiStore.test.ts +54 -0
  93. flock/frontend/src/store/uiStore.ts +110 -0
  94. flock/frontend/src/store/wsStore.ts +34 -0
  95. flock/frontend/src/styles/index.css +15 -0
  96. flock/frontend/src/styles/scrollbar.css +47 -0
  97. flock/frontend/src/styles/variables.css +488 -0
  98. flock/frontend/src/test/setup.ts +1 -0
  99. flock/frontend/src/types/filters.ts +14 -0
  100. flock/frontend/src/types/graph.ts +55 -0
  101. flock/frontend/src/types/modules.ts +7 -0
  102. flock/frontend/src/types/theme.ts +55 -0
  103. flock/frontend/src/utils/mockData.ts +85 -0
  104. flock/frontend/src/utils/performance.ts +16 -0
  105. flock/frontend/src/utils/transforms.test.ts +860 -0
  106. flock/frontend/src/utils/transforms.ts +323 -0
  107. flock/frontend/src/vite-env.d.ts +17 -0
  108. flock/frontend/tsconfig.json +27 -0
  109. flock/frontend/tsconfig.node.json +11 -0
  110. flock/frontend/vite.config.ts +25 -0
  111. flock/frontend/vitest.config.ts +11 -0
  112. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/METADATA +1 -1
  113. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/RECORD +116 -6
  114. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/WHEEL +0 -0
  115. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/entry_points.txt +0 -0
  116. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1980 @@
1
+ # Flock Flow Dashboard Design System
2
+
3
+ **Version:** 1.0.0
4
+ **Last Updated:** October 2025
5
+ **Inspired by:** AutoGen Studio, Flowise AI, and 2025 dark-themed dashboard best practices
6
+
7
+ ---
8
+
9
+ ## Table of Contents
10
+
11
+ 1. [Design Principles](#design-principles)
12
+ 2. [Color System](#color-system)
13
+ 3. [Typography](#typography)
14
+ 4. [Spacing System](#spacing-system)
15
+ 5. [Shadows & Elevation](#shadows--elevation)
16
+ 6. [Border & Radius](#border--radius)
17
+ 7. [Motion & Transitions](#motion--transitions)
18
+ 8. [Component Specifications](#component-specifications)
19
+ 9. [Graph-Specific Design](#graph-specific-design)
20
+ 10. [Usage Guidelines](#usage-guidelines)
21
+ 11. [Code Examples](#code-examples)
22
+
23
+ ---
24
+
25
+ ## Design Principles
26
+
27
+ ### Core Values
28
+ 1. **Dark-First Design**: Optimized for extended viewing sessions with reduced eye strain
29
+ 2. **Information Hierarchy**: Critical data accessible within 5 seconds
30
+ 3. **Premium Aesthetic**: Modern, sleek, professional appearance
31
+ 4. **Depth & Dimension**: Glassmorphism and elevation for spatial clarity
32
+ 5. **Purposeful Motion**: Smooth, meaningful animations that enhance UX
33
+ 6. **Developer-Focused**: Clear visual feedback for complex AI workflows
34
+
35
+ ### Visual Philosophy
36
+ - Use depth (shadows, blur) to establish hierarchy
37
+ - Limit color to convey meaning (status, type, interaction)
38
+ - Embrace negative space for breathing room
39
+ - Maintain consistent rhythm through spacing
40
+ - Prioritize readability over decoration
41
+
42
+ ---
43
+
44
+ ## Color System
45
+
46
+ ### Foundation Colors
47
+
48
+ #### Background Layers
49
+ ```css
50
+ --color-bg-base: #0a0a0b; /* App background - deepest layer */
51
+ --color-bg-elevated: #121214; /* Canvas, main content areas */
52
+ --color-bg-surface: #1a1a1e; /* Cards, panels, raised surfaces */
53
+ --color-bg-overlay: #232329; /* Modals, popovers, tooltips */
54
+ --color-bg-float: #2a2a32; /* Floating windows, dropdowns */
55
+ ```
56
+
57
+ #### Primary Brand Colors
58
+ ```css
59
+ --color-primary-50: #eef2ff;
60
+ --color-primary-100: #e0e7ff;
61
+ --color-primary-200: #c7d2fe;
62
+ --color-primary-300: #a5b4fc;
63
+ --color-primary-400: #818cf8;
64
+ --color-primary-500: #6366f1; /* Primary brand - accent actions */
65
+ --color-primary-600: #4f46e5; /* Primary hover */
66
+ --color-primary-700: #4338ca;
67
+ --color-primary-800: #3730a3;
68
+ --color-primary-900: #312e81;
69
+ ```
70
+
71
+ #### Secondary/Accent Colors
72
+ ```css
73
+ --color-secondary-50: #fdf4ff;
74
+ --color-secondary-100: #fae8ff;
75
+ --color-secondary-200: #f5d0fe;
76
+ --color-secondary-300: #f0abfc;
77
+ --color-secondary-400: #e879f9;
78
+ --color-secondary-500: #d946ef; /* Secondary accent */
79
+ --color-secondary-600: #c026d3; /* Secondary hover */
80
+ --color-secondary-700: #a21caf;
81
+ --color-secondary-800: #86198f;
82
+ --color-secondary-900: #701a75;
83
+ ```
84
+
85
+ #### Tertiary/Utility Colors
86
+ ```css
87
+ --color-tertiary-50: #ecfeff;
88
+ --color-tertiary-100: #cffafe;
89
+ --color-tertiary-200: #a5f3fc;
90
+ --color-tertiary-300: #67e8f9;
91
+ --color-tertiary-400: #22d3ee;
92
+ --color-tertiary-500: #06b6d4; /* Tertiary accent - info states */
93
+ --color-tertiary-600: #0891b2;
94
+ --color-tertiary-700: #0e7490;
95
+ --color-tertiary-800: #155e75;
96
+ --color-tertiary-900: #164e63;
97
+ ```
98
+
99
+ ### Semantic Colors
100
+
101
+ #### Status Colors
102
+ ```css
103
+ /* Success */
104
+ --color-success-light: #6ee7b7;
105
+ --color-success: #10b981;
106
+ --color-success-dark: #047857;
107
+ --color-success-bg: rgba(16, 185, 129, 0.1);
108
+ --color-success-border: rgba(16, 185, 129, 0.3);
109
+
110
+ /* Warning */
111
+ --color-warning-light: #fbbf24;
112
+ --color-warning: #f59e0b;
113
+ --color-warning-dark: #d97706;
114
+ --color-warning-bg: rgba(245, 158, 11, 0.1);
115
+ --color-warning-border: rgba(245, 158, 11, 0.3);
116
+
117
+ /* Error */
118
+ --color-error-light: #f87171;
119
+ --color-error: #ef4444;
120
+ --color-error-dark: #dc2626;
121
+ --color-error-bg: rgba(239, 68, 68, 0.1);
122
+ --color-error-border: rgba(239, 68, 68, 0.3);
123
+
124
+ /* Info */
125
+ --color-info-light: #60a5fa;
126
+ --color-info: #3b82f6;
127
+ --color-info-dark: #2563eb;
128
+ --color-info-bg: rgba(59, 130, 246, 0.1);
129
+ --color-info-border: rgba(59, 130, 246, 0.3);
130
+
131
+ /* Running/Active */
132
+ --color-active-light: #818cf8;
133
+ --color-active: #6366f1;
134
+ --color-active-dark: #4f46e5;
135
+ --color-active-bg: rgba(99, 102, 241, 0.1);
136
+ --color-active-border: rgba(99, 102, 241, 0.3);
137
+
138
+ /* Idle/Neutral */
139
+ --color-idle-light: #94a3b8;
140
+ --color-idle: #64748b;
141
+ --color-idle-dark: #475569;
142
+ --color-idle-bg: rgba(100, 116, 139, 0.1);
143
+ --color-idle-border: rgba(100, 116, 139, 0.3);
144
+ ```
145
+
146
+ ### Text Colors
147
+
148
+ ```css
149
+ --color-text-primary: #f8fafc; /* Primary content, headings */
150
+ --color-text-secondary: #cbd5e1; /* Secondary content, labels */
151
+ --color-text-tertiary: #94a3b8; /* Tertiary content, metadata */
152
+ --color-text-muted: #64748b; /* Muted text, placeholders */
153
+ --color-text-disabled: #475569; /* Disabled states */
154
+ --color-text-on-primary: #ffffff; /* Text on primary color bg */
155
+ --color-text-on-dark: #0f172a; /* Text on light backgrounds */
156
+ ```
157
+
158
+ ### Border & Divider Colors
159
+
160
+ ```css
161
+ --color-border-subtle: #1e293b; /* Subtle borders, minimal contrast */
162
+ --color-border-default: #334155; /* Default borders */
163
+ --color-border-strong: #475569; /* Emphasized borders */
164
+ --color-border-focus: #6366f1; /* Focus states */
165
+ --color-border-error: #ef4444; /* Error states */
166
+ --color-divider: rgba(148, 163, 184, 0.1); /* Section dividers */
167
+ ```
168
+
169
+ ### Graph-Specific Colors
170
+
171
+ #### Agent Node Colors
172
+ ```css
173
+ --color-node-agent-bg: #1e293b;
174
+ --color-node-agent-border: #3b82f6;
175
+ --color-node-agent-border-selected: #6366f1;
176
+ --color-node-agent-text: #f8fafc;
177
+ --color-node-agent-badge: #334155;
178
+ --color-node-agent-badge-text: #94a3b8;
179
+ ```
180
+
181
+ #### Message Node Colors
182
+ ```css
183
+ --color-node-message-bg: #422006;
184
+ --color-node-message-border: #f59e0b;
185
+ --color-node-message-border-selected: #d946ef;
186
+ --color-node-message-text: #fef3c7;
187
+ --color-node-message-metadata: #a16207;
188
+ ```
189
+
190
+ #### Edge Colors
191
+ ```css
192
+ --color-edge-default: #475569;
193
+ --color-edge-active: #6366f1;
194
+ --color-edge-message: #f59e0b;
195
+ --color-edge-error: #ef4444;
196
+ --color-edge-label-bg: rgba(26, 26, 30, 0.95);
197
+ --color-edge-label-text: #cbd5e1;
198
+ ```
199
+
200
+ ### Overlay & Glassmorphism Colors
201
+
202
+ ```css
203
+ --color-glass-bg: rgba(26, 26, 30, 0.8);
204
+ --color-glass-border: rgba(148, 163, 184, 0.1);
205
+ --color-overlay-backdrop: rgba(10, 10, 11, 0.7);
206
+ --color-modal-backdrop: rgba(10, 10, 11, 0.85);
207
+ ```
208
+
209
+ ### Accessibility Compliance
210
+
211
+ All color combinations meet WCAG 2.1 AA standards:
212
+ - **Normal text (16px+)**: Minimum 4.5:1 contrast ratio
213
+ - **Large text (24px+)**: Minimum 3:1 contrast ratio
214
+ - **Interactive elements**: Minimum 3:1 contrast ratio
215
+ - **Focus indicators**: Minimum 3:1 contrast ratio
216
+
217
+ **Tested Combinations:**
218
+ - `--color-text-primary` on `--color-bg-base`: 14.2:1 ✓
219
+ - `--color-text-secondary` on `--color-bg-elevated`: 9.8:1 ✓
220
+ - `--color-primary-500` on `--color-bg-surface`: 4.6:1 ✓
221
+ - `--color-text-on-primary` on `--color-primary-500`: 7.1:1 ✓
222
+
223
+ ---
224
+
225
+ ## Typography
226
+
227
+ ### Font Families
228
+
229
+ ```css
230
+ --font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI',
231
+ 'Roboto', 'Helvetica Neue', Arial, sans-serif;
232
+ --font-family-mono: 'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco',
233
+ 'Courier New', monospace;
234
+ --font-family-display: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
235
+ ```
236
+
237
+ **Recommended Web Fonts:**
238
+ ```html
239
+ <!-- Include in index.html -->
240
+ <link rel="preconnect" href="https://fonts.googleapis.com">
241
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
242
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
243
+ ```
244
+
245
+ ### Font Sizes
246
+
247
+ ```css
248
+ /* Display Sizes (hero sections, large headings) */
249
+ --font-size-display-2xl: 72px; /* 4.5rem */
250
+ --font-size-display-xl: 60px; /* 3.75rem */
251
+ --font-size-display-lg: 48px; /* 3rem */
252
+ --font-size-display-md: 36px; /* 2.25rem */
253
+
254
+ /* Heading Sizes */
255
+ --font-size-h1: 32px; /* 2rem */
256
+ --font-size-h2: 24px; /* 1.5rem */
257
+ --font-size-h3: 20px; /* 1.25rem */
258
+ --font-size-h4: 18px; /* 1.125rem */
259
+ --font-size-h5: 16px; /* 1rem */
260
+ --font-size-h6: 14px; /* 0.875rem */
261
+
262
+ /* Body Sizes */
263
+ --font-size-body-xl: 20px; /* 1.25rem */
264
+ --font-size-body-lg: 18px; /* 1.125rem */
265
+ --font-size-body: 16px; /* 1rem - Base size */
266
+ --font-size-body-sm: 14px; /* 0.875rem */
267
+ --font-size-body-xs: 12px; /* 0.75rem */
268
+
269
+ /* Utility Sizes */
270
+ --font-size-caption: 12px; /* 0.75rem */
271
+ --font-size-overline: 10px; /* 0.625rem */
272
+ --font-size-tiny: 10px; /* 0.625rem */
273
+ ```
274
+
275
+ ### Font Weights
276
+
277
+ ```css
278
+ --font-weight-light: 300;
279
+ --font-weight-regular: 400;
280
+ --font-weight-medium: 500;
281
+ --font-weight-semibold: 600;
282
+ --font-weight-bold: 700;
283
+ ```
284
+
285
+ ### Line Heights
286
+
287
+ ```css
288
+ /* Tight (for headings) */
289
+ --line-height-tight: 1.1;
290
+
291
+ /* Snug (for large body text) */
292
+ --line-height-snug: 1.375;
293
+
294
+ /* Normal (default for body text) */
295
+ --line-height-normal: 1.5;
296
+
297
+ /* Relaxed (for long-form content) */
298
+ --line-height-relaxed: 1.625;
299
+
300
+ /* Loose (for improved readability) */
301
+ --line-height-loose: 2;
302
+ ```
303
+
304
+ ### Letter Spacing
305
+
306
+ ```css
307
+ --letter-spacing-tight: -0.02em; /* Headings, display text */
308
+ --letter-spacing-normal: 0; /* Body text */
309
+ --letter-spacing-wide: 0.025em; /* Small text, labels */
310
+ --letter-spacing-wider: 0.05em; /* Overlines, uppercase labels */
311
+ --letter-spacing-widest: 0.1em; /* Extra emphasis */
312
+ ```
313
+
314
+ ### Typography Scale Application
315
+
316
+ #### Headings
317
+ ```css
318
+ h1 {
319
+ font-size: var(--font-size-h1);
320
+ font-weight: var(--font-weight-bold);
321
+ line-height: var(--line-height-tight);
322
+ letter-spacing: var(--letter-spacing-tight);
323
+ color: var(--color-text-primary);
324
+ }
325
+
326
+ h2 {
327
+ font-size: var(--font-size-h2);
328
+ font-weight: var(--font-weight-semibold);
329
+ line-height: var(--line-height-tight);
330
+ letter-spacing: var(--letter-spacing-tight);
331
+ color: var(--color-text-primary);
332
+ }
333
+
334
+ h3 {
335
+ font-size: var(--font-size-h3);
336
+ font-weight: var(--font-weight-semibold);
337
+ line-height: var(--line-height-snug);
338
+ color: var(--color-text-primary);
339
+ }
340
+
341
+ h4 {
342
+ font-size: var(--font-size-h4);
343
+ font-weight: var(--font-weight-medium);
344
+ line-height: var(--line-height-snug);
345
+ color: var(--color-text-primary);
346
+ }
347
+
348
+ h5, h6 {
349
+ font-size: var(--font-size-h5);
350
+ font-weight: var(--font-weight-medium);
351
+ line-height: var(--line-height-normal);
352
+ color: var(--color-text-secondary);
353
+ }
354
+ ```
355
+
356
+ #### Body Text
357
+ ```css
358
+ body {
359
+ font-family: var(--font-family-sans);
360
+ font-size: var(--font-size-body);
361
+ font-weight: var(--font-weight-regular);
362
+ line-height: var(--line-height-normal);
363
+ color: var(--color-text-primary);
364
+ }
365
+ ```
366
+
367
+ #### Code & Monospace
368
+ ```css
369
+ code, pre {
370
+ font-family: var(--font-family-mono);
371
+ font-size: 0.9em;
372
+ line-height: var(--line-height-relaxed);
373
+ }
374
+ ```
375
+
376
+ ---
377
+
378
+ ## Spacing System
379
+
380
+ ### Base Scale (8px grid)
381
+
382
+ ```css
383
+ --spacing-0: 0;
384
+ --spacing-0-5: 2px; /* 0.125rem - Hairline spacing */
385
+ --spacing-1: 4px; /* 0.25rem */
386
+ --spacing-1-5: 6px; /* 0.375rem */
387
+ --spacing-2: 8px; /* 0.5rem */
388
+ --spacing-3: 12px; /* 0.75rem */
389
+ --spacing-4: 16px; /* 1rem - Base unit */
390
+ --spacing-5: 20px; /* 1.25rem */
391
+ --spacing-6: 24px; /* 1.5rem */
392
+ --spacing-8: 32px; /* 2rem */
393
+ --spacing-10: 40px; /* 2.5rem */
394
+ --spacing-12: 48px; /* 3rem */
395
+ --spacing-16: 64px; /* 4rem */
396
+ --spacing-20: 80px; /* 5rem */
397
+ --spacing-24: 96px; /* 6rem */
398
+ --spacing-32: 128px; /* 8rem */
399
+ --spacing-40: 160px; /* 10rem */
400
+ --spacing-48: 192px; /* 12rem */
401
+ --spacing-56: 224px; /* 14rem */
402
+ --spacing-64: 256px; /* 16rem */
403
+ ```
404
+
405
+ ### Semantic Spacing Tokens
406
+
407
+ ```css
408
+ /* Component Internal Spacing */
409
+ --space-component-xs: var(--spacing-2); /* 8px - Tight internal spacing */
410
+ --space-component-sm: var(--spacing-3); /* 12px - Small components */
411
+ --space-component-md: var(--spacing-4); /* 16px - Default component padding */
412
+ --space-component-lg: var(--spacing-6); /* 24px - Large components */
413
+ --space-component-xl: var(--spacing-8); /* 32px - Extra large components */
414
+
415
+ /* Layout Spacing */
416
+ --space-layout-xs: var(--spacing-4); /* 16px - Minimal section spacing */
417
+ --space-layout-sm: var(--spacing-6); /* 24px - Small section spacing */
418
+ --space-layout-md: var(--spacing-8); /* 32px - Default section spacing */
419
+ --space-layout-lg: var(--spacing-12); /* 48px - Large section spacing */
420
+ --space-layout-xl: var(--spacing-16); /* 64px - Extra large section spacing */
421
+ --space-layout-2xl: var(--spacing-24); /* 96px - Maximum section spacing */
422
+
423
+ /* Gap Spacing (for flexbox/grid) */
424
+ --gap-xs: var(--spacing-1); /* 4px */
425
+ --gap-sm: var(--spacing-2); /* 8px */
426
+ --gap-md: var(--spacing-3); /* 12px */
427
+ --gap-lg: var(--spacing-4); /* 16px */
428
+ --gap-xl: var(--spacing-6); /* 24px */
429
+ ```
430
+
431
+ ### Usage Guidelines
432
+
433
+ - Use 8px base grid for all spacing decisions
434
+ - Prefer semantic tokens over raw values
435
+ - Maintain consistent rhythm vertically and horizontally
436
+ - Use larger spacing for separation, smaller for grouping
437
+ - Desktop layouts: favor `--space-layout-md` and above
438
+ - Mobile layouts: favor `--space-component-*` tokens
439
+
440
+ ---
441
+
442
+ ## Shadows & Elevation
443
+
444
+ ### Shadow Scale
445
+
446
+ ```css
447
+ /* Subtle shadows for minimal elevation */
448
+ --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
449
+
450
+ /* Small elevation - buttons, cards at rest */
451
+ --shadow-sm: 0 2px 4px -1px rgba(0, 0, 0, 0.5),
452
+ 0 1px 2px -1px rgba(0, 0, 0, 0.3);
453
+
454
+ /* Medium elevation - dropdowns, popovers */
455
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.6),
456
+ 0 2px 4px -1px rgba(0, 0, 0, 0.4);
457
+
458
+ /* Large elevation - modals, floating panels */
459
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.7),
460
+ 0 4px 6px -2px rgba(0, 0, 0, 0.5);
461
+
462
+ /* Extra large elevation - important overlays */
463
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.8),
464
+ 0 10px 10px -5px rgba(0, 0, 0, 0.6);
465
+
466
+ /* 2XL elevation - critical modals, focus states */
467
+ --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.9);
468
+ ```
469
+
470
+ ### Glow Effects (for focus, active states)
471
+
472
+ ```css
473
+ --shadow-glow-primary: 0 0 0 3px rgba(99, 102, 241, 0.3);
474
+ --shadow-glow-secondary: 0 0 0 3px rgba(217, 70, 239, 0.3);
475
+ --shadow-glow-success: 0 0 0 3px rgba(16, 185, 129, 0.3);
476
+ --shadow-glow-error: 0 0 0 3px rgba(239, 68, 68, 0.3);
477
+ --shadow-glow-warning: 0 0 0 3px rgba(245, 158, 11, 0.3);
478
+ ```
479
+
480
+ ### Inner Shadows (for inset, pressed states)
481
+
482
+ ```css
483
+ --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.5);
484
+ --shadow-inner-lg: inset 0 4px 8px 0 rgba(0, 0, 0, 0.6);
485
+ ```
486
+
487
+ ### Elevation Levels
488
+
489
+ Use elevation to establish visual hierarchy:
490
+
491
+ 1. **Level 0** (Baseline): Background, canvas - no shadow
492
+ 2. **Level 1** (Subtle): `--shadow-xs` - Cards at rest, subtle separation
493
+ 3. **Level 2** (Raised): `--shadow-sm` - Buttons, interactive elements
494
+ 4. **Level 3** (Floating): `--shadow-md` - Dropdowns, tooltips, suggestions
495
+ 5. **Level 4** (Overlay): `--shadow-lg` - Modals, sheets, detail windows
496
+ 6. **Level 5** (Priority): `--shadow-xl` - Critical dialogs, important notifications
497
+ 7. **Level 6** (Maximum): `--shadow-2xl` - Alerts requiring immediate attention
498
+
499
+ ---
500
+
501
+ ## Border & Radius
502
+
503
+ ### Border Widths
504
+
505
+ ```css
506
+ --border-width-0: 0;
507
+ --border-width-1: 1px; /* Default border */
508
+ --border-width-2: 2px; /* Emphasized border */
509
+ --border-width-3: 3px; /* Strong border */
510
+ --border-width-4: 4px; /* Extra strong border */
511
+ ```
512
+
513
+ ### Border Radius
514
+
515
+ ```css
516
+ --radius-none: 0;
517
+ --radius-sm: 4px; /* Subtle rounding - badges, pills */
518
+ --radius-md: 6px; /* Default rounding - buttons, inputs */
519
+ --radius-lg: 8px; /* Large rounding - cards, panels */
520
+ --radius-xl: 12px; /* Extra large rounding - modals */
521
+ --radius-2xl: 16px; /* 2XL rounding - feature cards */
522
+ --radius-3xl: 24px; /* 3XL rounding - hero elements */
523
+ --radius-full: 9999px; /* Pill shape - badges, avatars */
524
+ --radius-circle: 50%; /* Perfect circle - status indicators */
525
+ ```
526
+
527
+ ### Border Styles
528
+
529
+ ```css
530
+ --border-style-solid: solid;
531
+ --border-style-dashed: dashed;
532
+ --border-style-dotted: dotted;
533
+ ```
534
+
535
+ ### Common Border Combinations
536
+
537
+ ```css
538
+ /* Subtle border */
539
+ --border-subtle: var(--border-width-1) solid var(--color-border-subtle);
540
+
541
+ /* Default border */
542
+ --border-default: var(--border-width-1) solid var(--color-border-default);
543
+
544
+ /* Strong border */
545
+ --border-strong: var(--border-width-2) solid var(--color-border-strong);
546
+
547
+ /* Focus border */
548
+ --border-focus: var(--border-width-2) solid var(--color-border-focus);
549
+
550
+ /* Error border */
551
+ --border-error: var(--border-width-2) solid var(--color-border-error);
552
+ ```
553
+
554
+ ---
555
+
556
+ ## Motion & Transitions
557
+
558
+ ### Duration
559
+
560
+ ```css
561
+ --duration-instant: 0ms;
562
+ --duration-fast: 100ms; /* Micro-interactions, hovers */
563
+ --duration-normal: 200ms; /* Default transitions */
564
+ --duration-slow: 300ms; /* Complex state changes */
565
+ --duration-slower: 400ms; /* Page transitions, reveals */
566
+ --duration-slowest: 500ms; /* Dramatic effects */
567
+ ```
568
+
569
+ ### Easing Functions
570
+
571
+ ```css
572
+ /* Standard ease curves */
573
+ --ease-linear: linear;
574
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
575
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
576
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
577
+
578
+ /* Custom curves for premium feel */
579
+ --ease-smooth: cubic-bezier(0.4, 0, 0.6, 1); /* Smooth, natural */
580
+ --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55); /* Playful bounce */
581
+ --ease-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275); /* Elastic snap */
582
+ --ease-sharp: cubic-bezier(0.4, 0, 0.6, 1); /* Sharp, decisive */
583
+ ```
584
+
585
+ ### Common Transitions
586
+
587
+ ```css
588
+ --transition-colors: color var(--duration-fast) var(--ease-smooth),
589
+ background-color var(--duration-fast) var(--ease-smooth),
590
+ border-color var(--duration-fast) var(--ease-smooth);
591
+
592
+ --transition-opacity: opacity var(--duration-normal) var(--ease-out);
593
+
594
+ --transition-transform: transform var(--duration-normal) var(--ease-smooth);
595
+
596
+ --transition-shadow: box-shadow var(--duration-normal) var(--ease-out);
597
+
598
+ --transition-all: all var(--duration-normal) var(--ease-smooth);
599
+
600
+ --transition-base: var(--duration-normal) var(--ease-smooth);
601
+ ```
602
+
603
+ ### Animation Guidelines
604
+
605
+ 1. **Hover States**: Use `--duration-fast` with `--ease-smooth`
606
+ 2. **Focus States**: Use `--duration-normal` with `--ease-out`
607
+ 3. **Loading States**: Use `--duration-slow` with `--ease-linear`
608
+ 4. **Page Transitions**: Use `--duration-slower` with `--ease-in-out`
609
+ 5. **Micro-interactions**: Keep under 200ms for responsiveness
610
+ 6. **Respect prefers-reduced-motion**: Disable animations for accessibility
611
+
612
+ ```css
613
+ @media (prefers-reduced-motion: reduce) {
614
+ * {
615
+ animation-duration: 0.01ms !important;
616
+ animation-iteration-count: 1 !important;
617
+ transition-duration: 0.01ms !important;
618
+ }
619
+ }
620
+ ```
621
+
622
+ ---
623
+
624
+ ## Component Specifications
625
+
626
+ ### Buttons
627
+
628
+ #### Primary Button
629
+ ```css
630
+ .button-primary {
631
+ /* Layout */
632
+ padding: var(--space-component-sm) var(--space-component-lg);
633
+ border-radius: var(--radius-md);
634
+
635
+ /* Typography */
636
+ font-family: var(--font-family-sans);
637
+ font-size: var(--font-size-body-sm);
638
+ font-weight: var(--font-weight-semibold);
639
+ line-height: var(--line-height-normal);
640
+
641
+ /* Colors */
642
+ background: var(--color-primary-500);
643
+ color: var(--color-text-on-primary);
644
+ border: var(--border-width-0);
645
+
646
+ /* Effects */
647
+ box-shadow: var(--shadow-sm);
648
+ transition: var(--transition-colors), var(--transition-shadow);
649
+ cursor: pointer;
650
+ }
651
+
652
+ .button-primary:hover {
653
+ background: var(--color-primary-600);
654
+ box-shadow: var(--shadow-md);
655
+ }
656
+
657
+ .button-primary:active {
658
+ background: var(--color-primary-700);
659
+ box-shadow: var(--shadow-xs);
660
+ transform: translateY(1px);
661
+ }
662
+
663
+ .button-primary:focus-visible {
664
+ outline: none;
665
+ box-shadow: var(--shadow-glow-primary);
666
+ }
667
+
668
+ .button-primary:disabled {
669
+ background: var(--color-bg-surface);
670
+ color: var(--color-text-disabled);
671
+ cursor: not-allowed;
672
+ box-shadow: none;
673
+ }
674
+ ```
675
+
676
+ #### Secondary Button
677
+ ```css
678
+ .button-secondary {
679
+ /* Layout */
680
+ padding: var(--space-component-sm) var(--space-component-lg);
681
+ border-radius: var(--radius-md);
682
+
683
+ /* Typography */
684
+ font-family: var(--font-family-sans);
685
+ font-size: var(--font-size-body-sm);
686
+ font-weight: var(--font-weight-semibold);
687
+
688
+ /* Colors */
689
+ background: transparent;
690
+ color: var(--color-text-secondary);
691
+ border: var(--border-default);
692
+
693
+ /* Effects */
694
+ transition: var(--transition-colors), var(--transition-shadow);
695
+ cursor: pointer;
696
+ }
697
+
698
+ .button-secondary:hover {
699
+ background: var(--color-bg-surface);
700
+ color: var(--color-text-primary);
701
+ border-color: var(--color-border-strong);
702
+ }
703
+
704
+ .button-secondary:active {
705
+ background: var(--color-bg-elevated);
706
+ }
707
+ ```
708
+
709
+ #### Ghost Button
710
+ ```css
711
+ .button-ghost {
712
+ /* Layout */
713
+ padding: var(--space-component-sm) var(--space-component-md);
714
+ border-radius: var(--radius-md);
715
+
716
+ /* Typography */
717
+ font-size: var(--font-size-body-sm);
718
+ font-weight: var(--font-weight-medium);
719
+
720
+ /* Colors */
721
+ background: transparent;
722
+ color: var(--color-text-secondary);
723
+ border: none;
724
+
725
+ /* Effects */
726
+ transition: var(--transition-colors);
727
+ cursor: pointer;
728
+ }
729
+
730
+ .button-ghost:hover {
731
+ background: var(--color-bg-surface);
732
+ color: var(--color-text-primary);
733
+ }
734
+ ```
735
+
736
+ #### Danger Button
737
+ ```css
738
+ .button-danger {
739
+ /* Same as primary but with error colors */
740
+ background: var(--color-error);
741
+ color: var(--color-text-on-primary);
742
+ /* ... rest same as primary */
743
+ }
744
+
745
+ .button-danger:hover {
746
+ background: var(--color-error-dark);
747
+ }
748
+ ```
749
+
750
+ #### Icon Button
751
+ ```css
752
+ .button-icon {
753
+ /* Layout */
754
+ width: 32px;
755
+ height: 32px;
756
+ padding: var(--spacing-2);
757
+ border-radius: var(--radius-md);
758
+
759
+ /* Display */
760
+ display: inline-flex;
761
+ align-items: center;
762
+ justify-content: center;
763
+
764
+ /* Colors */
765
+ background: transparent;
766
+ color: var(--color-text-secondary);
767
+ border: none;
768
+
769
+ /* Effects */
770
+ transition: var(--transition-colors);
771
+ cursor: pointer;
772
+ }
773
+
774
+ .button-icon:hover {
775
+ background: var(--color-bg-surface);
776
+ color: var(--color-text-primary);
777
+ }
778
+ ```
779
+
780
+ ### Input Fields
781
+
782
+ ```css
783
+ .input {
784
+ /* Layout */
785
+ width: 100%;
786
+ padding: var(--space-component-sm) var(--space-component-md);
787
+ border-radius: var(--radius-md);
788
+
789
+ /* Typography */
790
+ font-family: var(--font-family-sans);
791
+ font-size: var(--font-size-body-sm);
792
+ line-height: var(--line-height-normal);
793
+
794
+ /* Colors */
795
+ background: var(--color-bg-elevated);
796
+ color: var(--color-text-primary);
797
+ border: var(--border-default);
798
+
799
+ /* Effects */
800
+ transition: var(--transition-colors), var(--transition-shadow);
801
+ }
802
+
803
+ .input::placeholder {
804
+ color: var(--color-text-muted);
805
+ }
806
+
807
+ .input:hover {
808
+ border-color: var(--color-border-strong);
809
+ }
810
+
811
+ .input:focus {
812
+ outline: none;
813
+ border-color: var(--color-border-focus);
814
+ box-shadow: var(--shadow-glow-primary);
815
+ }
816
+
817
+ .input:disabled {
818
+ background: var(--color-bg-base);
819
+ color: var(--color-text-disabled);
820
+ cursor: not-allowed;
821
+ }
822
+
823
+ .input.error {
824
+ border-color: var(--color-border-error);
825
+ box-shadow: var(--shadow-glow-error);
826
+ }
827
+ ```
828
+
829
+ ### Dropdown/Select
830
+
831
+ ```css
832
+ .select {
833
+ /* Layout */
834
+ width: 100%;
835
+ padding: var(--space-component-sm) var(--space-component-md);
836
+ padding-right: var(--spacing-8); /* Room for arrow */
837
+ border-radius: var(--radius-md);
838
+
839
+ /* Typography */
840
+ font-size: var(--font-size-body-sm);
841
+
842
+ /* Colors */
843
+ background: var(--color-bg-elevated);
844
+ color: var(--color-text-primary);
845
+ border: var(--border-default);
846
+
847
+ /* Effects */
848
+ cursor: pointer;
849
+ appearance: none;
850
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2394a3b8' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
851
+ background-repeat: no-repeat;
852
+ background-position: right var(--spacing-3) center;
853
+ transition: var(--transition-colors), var(--transition-shadow);
854
+ }
855
+
856
+ .select:hover {
857
+ border-color: var(--color-border-strong);
858
+ }
859
+
860
+ .select:focus {
861
+ outline: none;
862
+ border-color: var(--color-border-focus);
863
+ box-shadow: var(--shadow-glow-primary);
864
+ }
865
+ ```
866
+
867
+ ### Cards
868
+
869
+ ```css
870
+ .card {
871
+ /* Layout */
872
+ padding: var(--space-component-lg);
873
+ border-radius: var(--radius-lg);
874
+
875
+ /* Colors */
876
+ background: var(--color-bg-surface);
877
+ border: var(--border-subtle);
878
+
879
+ /* Effects */
880
+ box-shadow: var(--shadow-xs);
881
+ transition: var(--transition-shadow);
882
+ }
883
+
884
+ .card:hover {
885
+ box-shadow: var(--shadow-sm);
886
+ }
887
+
888
+ .card-interactive {
889
+ cursor: pointer;
890
+ }
891
+
892
+ .card-interactive:hover {
893
+ box-shadow: var(--shadow-md);
894
+ border-color: var(--color-border-default);
895
+ }
896
+ ```
897
+
898
+ ### Modals & Floating Windows
899
+
900
+ ```css
901
+ .modal-backdrop {
902
+ /* Overlay */
903
+ position: fixed;
904
+ inset: 0;
905
+ background: var(--color-modal-backdrop);
906
+ backdrop-filter: blur(4px);
907
+ z-index: 1000;
908
+
909
+ /* Animation */
910
+ animation: fadeIn var(--duration-normal) var(--ease-out);
911
+ }
912
+
913
+ .modal {
914
+ /* Layout */
915
+ position: fixed;
916
+ top: 50%;
917
+ left: 50%;
918
+ transform: translate(-50%, -50%);
919
+ width: 90%;
920
+ max-width: 600px;
921
+ max-height: 80vh;
922
+ padding: var(--space-layout-md);
923
+ border-radius: var(--radius-xl);
924
+
925
+ /* Colors - Glassmorphism */
926
+ background: var(--color-glass-bg);
927
+ border: var(--border-width-1) solid var(--color-glass-border);
928
+ backdrop-filter: blur(16px);
929
+ -webkit-backdrop-filter: blur(16px);
930
+
931
+ /* Effects */
932
+ box-shadow: var(--shadow-2xl);
933
+ z-index: 1001;
934
+
935
+ /* Animation */
936
+ animation: scaleIn var(--duration-slow) var(--ease-smooth);
937
+ }
938
+
939
+ .modal-header {
940
+ /* Layout */
941
+ padding-bottom: var(--space-component-lg);
942
+ margin-bottom: var(--space-component-lg);
943
+ border-bottom: var(--border-width-1) solid var(--color-divider);
944
+
945
+ /* Display */
946
+ display: flex;
947
+ align-items: center;
948
+ justify-content: space-between;
949
+ }
950
+
951
+ .modal-title {
952
+ font-size: var(--font-size-h3);
953
+ font-weight: var(--font-weight-semibold);
954
+ color: var(--color-text-primary);
955
+ }
956
+
957
+ .modal-body {
958
+ overflow-y: auto;
959
+ max-height: calc(80vh - 160px);
960
+ }
961
+
962
+ .modal-footer {
963
+ /* Layout */
964
+ padding-top: var(--space-component-lg);
965
+ margin-top: var(--space-component-lg);
966
+ border-top: var(--border-width-1) solid var(--color-divider);
967
+
968
+ /* Display */
969
+ display: flex;
970
+ gap: var(--gap-md);
971
+ justify-content: flex-end;
972
+ }
973
+
974
+ @keyframes fadeIn {
975
+ from { opacity: 0; }
976
+ to { opacity: 1; }
977
+ }
978
+
979
+ @keyframes scaleIn {
980
+ from {
981
+ opacity: 0;
982
+ transform: translate(-50%, -50%) scale(0.95);
983
+ }
984
+ to {
985
+ opacity: 1;
986
+ transform: translate(-50%, -50%) scale(1);
987
+ }
988
+ }
989
+ ```
990
+
991
+ ### Badges & Pills
992
+
993
+ ```css
994
+ .badge {
995
+ /* Layout */
996
+ display: inline-flex;
997
+ align-items: center;
998
+ padding: var(--spacing-1) var(--spacing-2);
999
+ border-radius: var(--radius-sm);
1000
+
1001
+ /* Typography */
1002
+ font-size: var(--font-size-caption);
1003
+ font-weight: var(--font-weight-medium);
1004
+ line-height: 1;
1005
+
1006
+ /* Colors */
1007
+ background: var(--color-bg-overlay);
1008
+ color: var(--color-text-secondary);
1009
+ border: var(--border-subtle);
1010
+ }
1011
+
1012
+ /* Badge variants */
1013
+ .badge-primary {
1014
+ background: var(--color-primary-bg);
1015
+ color: var(--color-primary-500);
1016
+ border-color: var(--color-primary-border);
1017
+ }
1018
+
1019
+ .badge-success {
1020
+ background: var(--color-success-bg);
1021
+ color: var(--color-success);
1022
+ border-color: var(--color-success-border);
1023
+ }
1024
+
1025
+ .badge-warning {
1026
+ background: var(--color-warning-bg);
1027
+ color: var(--color-warning);
1028
+ border-color: var(--color-warning-border);
1029
+ }
1030
+
1031
+ .badge-error {
1032
+ background: var(--color-error-bg);
1033
+ color: var(--color-error);
1034
+ border-color: var(--color-error-border);
1035
+ }
1036
+
1037
+ .badge-pill {
1038
+ border-radius: var(--radius-full);
1039
+ padding: var(--spacing-1) var(--spacing-3);
1040
+ }
1041
+ ```
1042
+
1043
+ ### Tabs
1044
+
1045
+ ```css
1046
+ .tabs-container {
1047
+ /* Layout */
1048
+ display: flex;
1049
+ gap: var(--gap-sm);
1050
+ padding: var(--space-component-sm) var(--space-component-md);
1051
+ border-bottom: var(--border-subtle);
1052
+ }
1053
+
1054
+ .tab {
1055
+ /* Layout */
1056
+ position: relative;
1057
+ padding: var(--space-component-sm) var(--space-component-md);
1058
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
1059
+
1060
+ /* Typography */
1061
+ font-size: var(--font-size-body-sm);
1062
+ font-weight: var(--font-weight-medium);
1063
+
1064
+ /* Colors */
1065
+ background: transparent;
1066
+ color: var(--color-text-muted);
1067
+ border: none;
1068
+
1069
+ /* Effects */
1070
+ cursor: pointer;
1071
+ transition: var(--transition-colors);
1072
+ }
1073
+
1074
+ .tab:hover {
1075
+ color: var(--color-text-secondary);
1076
+ background: var(--color-bg-surface);
1077
+ }
1078
+
1079
+ .tab-active {
1080
+ color: var(--color-text-primary);
1081
+ background: var(--color-bg-surface);
1082
+ }
1083
+
1084
+ .tab-active::after {
1085
+ content: '';
1086
+ position: absolute;
1087
+ bottom: -1px;
1088
+ left: 0;
1089
+ right: 0;
1090
+ height: 2px;
1091
+ background: var(--color-primary-500);
1092
+ }
1093
+
1094
+ .tab-content {
1095
+ padding: var(--space-component-lg);
1096
+ }
1097
+ ```
1098
+
1099
+ ### Tooltips
1100
+
1101
+ ```css
1102
+ .tooltip {
1103
+ /* Layout */
1104
+ position: absolute;
1105
+ padding: var(--spacing-2) var(--spacing-3);
1106
+ border-radius: var(--radius-md);
1107
+ max-width: 240px;
1108
+
1109
+ /* Typography */
1110
+ font-size: var(--font-size-caption);
1111
+ line-height: var(--line-height-normal);
1112
+
1113
+ /* Colors */
1114
+ background: var(--color-bg-float);
1115
+ color: var(--color-text-secondary);
1116
+ border: var(--border-subtle);
1117
+
1118
+ /* Effects */
1119
+ box-shadow: var(--shadow-md);
1120
+ z-index: 2000;
1121
+ pointer-events: none;
1122
+
1123
+ /* Animation */
1124
+ opacity: 0;
1125
+ transform: translateY(-4px);
1126
+ transition: opacity var(--duration-fast) var(--ease-out),
1127
+ transform var(--duration-fast) var(--ease-out);
1128
+ }
1129
+
1130
+ .tooltip.visible {
1131
+ opacity: 1;
1132
+ transform: translateY(0);
1133
+ }
1134
+ ```
1135
+
1136
+ ### Loading States
1137
+
1138
+ ```css
1139
+ .spinner {
1140
+ width: 20px;
1141
+ height: 20px;
1142
+ border: 2px solid var(--color-border-subtle);
1143
+ border-top-color: var(--color-primary-500);
1144
+ border-radius: 50%;
1145
+ animation: spin var(--duration-slowest) linear infinite;
1146
+ }
1147
+
1148
+ @keyframes spin {
1149
+ to { transform: rotate(360deg); }
1150
+ }
1151
+
1152
+ .skeleton {
1153
+ background: linear-gradient(
1154
+ 90deg,
1155
+ var(--color-bg-surface) 0%,
1156
+ var(--color-bg-overlay) 50%,
1157
+ var(--color-bg-surface) 100%
1158
+ );
1159
+ background-size: 200% 100%;
1160
+ animation: shimmer 1.5s ease-in-out infinite;
1161
+ border-radius: var(--radius-md);
1162
+ }
1163
+
1164
+ @keyframes shimmer {
1165
+ 0% { background-position: 200% 0; }
1166
+ 100% { background-position: -200% 0; }
1167
+ }
1168
+ ```
1169
+
1170
+ ---
1171
+
1172
+ ## Graph-Specific Design
1173
+
1174
+ ### Agent Node Styling
1175
+
1176
+ ```css
1177
+ .agent-node {
1178
+ /* Layout */
1179
+ min-width: 180px;
1180
+ max-width: 240px;
1181
+ padding: var(--space-component-md);
1182
+ border-radius: var(--radius-lg);
1183
+
1184
+ /* Colors */
1185
+ background: var(--color-node-agent-bg);
1186
+ border: var(--border-width-2) solid var(--color-node-agent-border);
1187
+
1188
+ /* Effects */
1189
+ box-shadow: var(--shadow-sm);
1190
+ cursor: pointer;
1191
+ transition: var(--transition-shadow), var(--transition-colors);
1192
+ }
1193
+
1194
+ .agent-node:hover {
1195
+ box-shadow: var(--shadow-md);
1196
+ border-color: var(--color-primary-400);
1197
+ }
1198
+
1199
+ .agent-node.selected {
1200
+ border-color: var(--color-node-agent-border-selected);
1201
+ box-shadow: var(--shadow-lg), var(--shadow-glow-primary);
1202
+ }
1203
+
1204
+ .agent-node-header {
1205
+ display: flex;
1206
+ justify-content: space-between;
1207
+ align-items: center;
1208
+ margin-bottom: var(--spacing-2);
1209
+ }
1210
+
1211
+ .agent-node-title {
1212
+ font-size: var(--font-size-body-sm);
1213
+ font-weight: var(--font-weight-semibold);
1214
+ color: var(--color-text-primary);
1215
+ }
1216
+
1217
+ .agent-node-status {
1218
+ width: 12px;
1219
+ height: 12px;
1220
+ border-radius: var(--radius-circle);
1221
+ flex-shrink: 0;
1222
+ }
1223
+
1224
+ .agent-node-status.running {
1225
+ background: var(--color-active);
1226
+ box-shadow: 0 0 8px var(--color-active);
1227
+ animation: pulse 2s ease-in-out infinite;
1228
+ }
1229
+
1230
+ .agent-node-status.idle {
1231
+ background: var(--color-idle);
1232
+ }
1233
+
1234
+ .agent-node-status.error {
1235
+ background: var(--color-error);
1236
+ box-shadow: 0 0 8px var(--color-error);
1237
+ }
1238
+
1239
+ @keyframes pulse {
1240
+ 0%, 100% { opacity: 1; }
1241
+ 50% { opacity: 0.6; }
1242
+ }
1243
+
1244
+ .agent-node-subscriptions {
1245
+ display: flex;
1246
+ flex-wrap: wrap;
1247
+ gap: var(--gap-xs);
1248
+ margin-bottom: var(--spacing-2);
1249
+ }
1250
+
1251
+ .agent-node-subscription-badge {
1252
+ padding: var(--spacing-0-5) var(--spacing-1-5);
1253
+ background: var(--color-node-agent-badge);
1254
+ color: var(--color-node-agent-badge-text);
1255
+ font-size: var(--font-size-overline);
1256
+ font-weight: var(--font-weight-medium);
1257
+ border-radius: var(--radius-sm);
1258
+ }
1259
+
1260
+ .agent-node-stats {
1261
+ display: flex;
1262
+ gap: var(--gap-md);
1263
+ font-size: var(--font-size-caption);
1264
+ color: var(--color-text-tertiary);
1265
+ }
1266
+
1267
+ .agent-node-stat {
1268
+ display: flex;
1269
+ align-items: center;
1270
+ gap: var(--gap-xs);
1271
+ }
1272
+ ```
1273
+
1274
+ ### Message Node Styling
1275
+
1276
+ ```css
1277
+ .message-node {
1278
+ /* Layout */
1279
+ min-width: 160px;
1280
+ max-width: 200px;
1281
+ padding: var(--space-component-sm);
1282
+ border-radius: var(--radius-md);
1283
+
1284
+ /* Colors */
1285
+ background: var(--color-node-message-bg);
1286
+ border: var(--border-width-2) solid var(--color-node-message-border);
1287
+
1288
+ /* Effects */
1289
+ box-shadow: var(--shadow-sm);
1290
+ cursor: pointer;
1291
+ transition: var(--transition-shadow), var(--transition-colors);
1292
+ }
1293
+
1294
+ .message-node:hover {
1295
+ box-shadow: var(--shadow-md);
1296
+ border-color: var(--color-warning-light);
1297
+ }
1298
+
1299
+ .message-node.selected {
1300
+ border-color: var(--color-node-message-border-selected);
1301
+ box-shadow: var(--shadow-lg), var(--shadow-glow-secondary);
1302
+ }
1303
+
1304
+ .message-node-type {
1305
+ font-size: var(--font-size-caption);
1306
+ font-weight: var(--font-weight-semibold);
1307
+ color: var(--color-node-message-text);
1308
+ margin-bottom: var(--spacing-1-5);
1309
+ }
1310
+
1311
+ .message-node-preview {
1312
+ font-size: var(--font-size-overline);
1313
+ color: var(--color-node-message-metadata);
1314
+ margin-bottom: var(--spacing-1-5);
1315
+ overflow: hidden;
1316
+ text-overflow: ellipsis;
1317
+ white-space: nowrap;
1318
+ }
1319
+
1320
+ .message-node-metadata {
1321
+ font-size: var(--font-size-tiny);
1322
+ color: var(--color-text-muted);
1323
+ opacity: 0.7;
1324
+ }
1325
+ ```
1326
+
1327
+ ### Edge Styling
1328
+
1329
+ ```css
1330
+ .react-flow__edge-path {
1331
+ stroke: var(--color-edge-default);
1332
+ stroke-width: 2;
1333
+ transition: stroke var(--duration-fast);
1334
+ }
1335
+
1336
+ .react-flow__edge:hover .react-flow__edge-path {
1337
+ stroke: var(--color-edge-active);
1338
+ stroke-width: 3;
1339
+ }
1340
+
1341
+ .react-flow__edge.selected .react-flow__edge-path {
1342
+ stroke: var(--color-edge-active);
1343
+ stroke-width: 3;
1344
+ }
1345
+
1346
+ .react-flow__edge.message-edge .react-flow__edge-path {
1347
+ stroke: var(--color-edge-message);
1348
+ }
1349
+
1350
+ .react-flow__edge.error-edge .react-flow__edge-path {
1351
+ stroke: var(--color-edge-error);
1352
+ }
1353
+
1354
+ .react-flow__edge-text {
1355
+ font-size: var(--font-size-overline);
1356
+ font-weight: var(--font-weight-medium);
1357
+ fill: var(--color-edge-label-text);
1358
+ }
1359
+
1360
+ .react-flow__edge-textbg {
1361
+ fill: var(--color-edge-label-bg);
1362
+ rx: var(--radius-sm);
1363
+ }
1364
+
1365
+ /* Animated flow for active edges */
1366
+ .react-flow__edge.animated .react-flow__edge-path {
1367
+ stroke-dasharray: 5;
1368
+ animation: dashdraw 0.5s linear infinite;
1369
+ }
1370
+
1371
+ @keyframes dashdraw {
1372
+ to { stroke-dashoffset: -10; }
1373
+ }
1374
+ ```
1375
+
1376
+ ### Graph Canvas & Background
1377
+
1378
+ ```css
1379
+ .react-flow__renderer {
1380
+ background: var(--color-bg-elevated);
1381
+ }
1382
+
1383
+ /* Dot pattern background */
1384
+ .react-flow__background {
1385
+ background-color: var(--color-bg-elevated);
1386
+ background-image: radial-gradient(
1387
+ circle,
1388
+ var(--color-border-subtle) 1px,
1389
+ transparent 1px
1390
+ );
1391
+ background-size: 20px 20px;
1392
+ }
1393
+
1394
+ /* Alternative: Grid pattern */
1395
+ .react-flow__background.grid {
1396
+ background-image:
1397
+ linear-gradient(var(--color-border-subtle) 1px, transparent 1px),
1398
+ linear-gradient(90deg, var(--color-border-subtle) 1px, transparent 1px);
1399
+ background-size: 20px 20px;
1400
+ }
1401
+ ```
1402
+
1403
+ ### MiniMap Styling
1404
+
1405
+ ```css
1406
+ .react-flow__minimap {
1407
+ background: var(--color-bg-surface);
1408
+ border: var(--border-default);
1409
+ border-radius: var(--radius-lg);
1410
+ box-shadow: var(--shadow-md);
1411
+ }
1412
+
1413
+ .react-flow__minimap-mask {
1414
+ fill: var(--color-primary-500);
1415
+ fill-opacity: 0.1;
1416
+ stroke: var(--color-primary-500);
1417
+ stroke-width: 2;
1418
+ }
1419
+
1420
+ .react-flow__minimap-node {
1421
+ fill: var(--color-bg-overlay);
1422
+ stroke: var(--color-border-default);
1423
+ stroke-width: 1;
1424
+ }
1425
+ ```
1426
+
1427
+ ### Controls & Panels
1428
+
1429
+ ```css
1430
+ .react-flow__controls {
1431
+ background: var(--color-bg-surface);
1432
+ border: var(--border-subtle);
1433
+ border-radius: var(--radius-lg);
1434
+ box-shadow: var(--shadow-md);
1435
+ }
1436
+
1437
+ .react-flow__controls-button {
1438
+ background: transparent;
1439
+ border-bottom: var(--border-subtle);
1440
+ color: var(--color-text-secondary);
1441
+ transition: var(--transition-colors);
1442
+ }
1443
+
1444
+ .react-flow__controls-button:hover {
1445
+ background: var(--color-bg-overlay);
1446
+ color: var(--color-text-primary);
1447
+ }
1448
+
1449
+ .react-flow__controls-button:last-child {
1450
+ border-bottom: none;
1451
+ }
1452
+ ```
1453
+
1454
+ ---
1455
+
1456
+ ## Usage Guidelines
1457
+
1458
+ ### Color Usage
1459
+
1460
+ 1. **Backgrounds**
1461
+ - Use `--color-bg-base` for app shell and canvas
1462
+ - Use `--color-bg-elevated` for main content areas
1463
+ - Use `--color-bg-surface` for cards and panels
1464
+ - Use `--color-bg-overlay` for modals and floating elements
1465
+
1466
+ 2. **Text**
1467
+ - Use `--color-text-primary` for headings and important content
1468
+ - Use `--color-text-secondary` for body text and labels
1469
+ - Use `--color-text-tertiary` for captions and metadata
1470
+ - Use `--color-text-muted` for placeholders and disabled states
1471
+
1472
+ 3. **Interactive Elements**
1473
+ - Use `--color-primary-*` for primary actions (CTAs, selections)
1474
+ - Use `--color-secondary-*` for secondary actions
1475
+ - Use semantic colors (`success`, `error`, `warning`, `info`) for status
1476
+
1477
+ 4. **Borders**
1478
+ - Use `--color-border-subtle` for minimal separation
1479
+ - Use `--color-border-default` for standard borders
1480
+ - Use `--color-border-strong` for emphasized boundaries
1481
+
1482
+ ### Typography Usage
1483
+
1484
+ 1. **Hierarchy**
1485
+ - Use `h1` for page titles (rare, one per page)
1486
+ - Use `h2` for section headings
1487
+ - Use `h3` for subsection headings
1488
+ - Use `h4-h6` for nested content hierarchy
1489
+
1490
+ 2. **Body Text**
1491
+ - Use `--font-size-body` (16px) for main content
1492
+ - Use `--font-size-body-sm` (14px) for UI elements
1493
+ - Use `--font-size-caption` (12px) for metadata
1494
+
1495
+ 3. **Monospace**
1496
+ - Use for code blocks, file paths, technical data
1497
+ - Maintain readability with adequate line-height
1498
+
1499
+ ### Spacing Usage
1500
+
1501
+ 1. **Component Spacing**
1502
+ - Use `--space-component-*` tokens for padding within components
1503
+ - Maintain consistent internal rhythm
1504
+
1505
+ 2. **Layout Spacing**
1506
+ - Use `--space-layout-*` tokens for margins between sections
1507
+ - Larger spacing creates stronger separation
1508
+
1509
+ 3. **Gap Spacing**
1510
+ - Use `--gap-*` tokens for flexbox/grid gaps
1511
+ - Smaller gaps for related items, larger for distinct groups
1512
+
1513
+ ### Accessibility Best Practices
1514
+
1515
+ 1. **Color Contrast**
1516
+ - All text meets WCAG AA standards (4.5:1 minimum)
1517
+ - Interactive elements have 3:1 contrast with background
1518
+
1519
+ 2. **Focus States**
1520
+ - Always provide visible focus indicators
1521
+ - Use `--shadow-glow-*` for focus shadows
1522
+ - Never remove outlines without replacement
1523
+
1524
+ 3. **Motion**
1525
+ - Respect `prefers-reduced-motion` media query
1526
+ - Keep animations purposeful and brief
1527
+ - Avoid flashing or rapid motion
1528
+
1529
+ 4. **Touch Targets**
1530
+ - Minimum 44x44px for interactive elements
1531
+ - Provide adequate spacing between touch targets
1532
+
1533
+ 5. **Semantic HTML**
1534
+ - Use proper heading hierarchy
1535
+ - Use buttons for actions, links for navigation
1536
+ - Provide ARIA labels where needed
1537
+
1538
+ ---
1539
+
1540
+ ## Code Examples
1541
+
1542
+ ### Setting Up CSS Variables
1543
+
1544
+ ```css
1545
+ /* styles/tokens.css */
1546
+ :root {
1547
+ /* Import all design tokens */
1548
+
1549
+ /* Colors */
1550
+ --color-bg-base: #0a0a0b;
1551
+ --color-bg-elevated: #121214;
1552
+ --color-bg-surface: #1a1a1e;
1553
+
1554
+ --color-text-primary: #f8fafc;
1555
+ --color-text-secondary: #cbd5e1;
1556
+
1557
+ --color-primary-500: #6366f1;
1558
+ --color-primary-600: #4f46e5;
1559
+
1560
+ /* ... all other tokens ... */
1561
+
1562
+ /* Typography */
1563
+ --font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
1564
+ --font-size-body: 16px;
1565
+ --font-weight-regular: 400;
1566
+ --line-height-normal: 1.5;
1567
+
1568
+ /* Spacing */
1569
+ --spacing-2: 8px;
1570
+ --spacing-4: 16px;
1571
+ --spacing-6: 24px;
1572
+
1573
+ /* Shadows */
1574
+ --shadow-sm: 0 2px 4px -1px rgba(0, 0, 0, 0.5);
1575
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.6);
1576
+
1577
+ /* Transitions */
1578
+ --duration-fast: 100ms;
1579
+ --duration-normal: 200ms;
1580
+ --ease-smooth: cubic-bezier(0.4, 0, 0.6, 1);
1581
+ }
1582
+ ```
1583
+
1584
+ ### Applying to Components (React/TypeScript)
1585
+
1586
+ ```typescript
1587
+ // components/Button.tsx
1588
+ import React from 'react';
1589
+ import './Button.css';
1590
+
1591
+ interface ButtonProps {
1592
+ variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
1593
+ size?: 'sm' | 'md' | 'lg';
1594
+ children: React.ReactNode;
1595
+ onClick?: () => void;
1596
+ disabled?: boolean;
1597
+ }
1598
+
1599
+ export const Button: React.FC<ButtonProps> = ({
1600
+ variant = 'primary',
1601
+ size = 'md',
1602
+ children,
1603
+ onClick,
1604
+ disabled,
1605
+ }) => {
1606
+ return (
1607
+ <button
1608
+ className={`button button-${variant} button-${size}`}
1609
+ onClick={onClick}
1610
+ disabled={disabled}
1611
+ >
1612
+ {children}
1613
+ </button>
1614
+ );
1615
+ };
1616
+ ```
1617
+
1618
+ ```css
1619
+ /* components/Button.css */
1620
+ .button {
1621
+ /* Base styles using design tokens */
1622
+ font-family: var(--font-family-sans);
1623
+ font-weight: var(--font-weight-semibold);
1624
+ border-radius: var(--radius-md);
1625
+ border: none;
1626
+ cursor: pointer;
1627
+ transition: var(--transition-colors), var(--transition-shadow);
1628
+
1629
+ /* Prevent text selection */
1630
+ user-select: none;
1631
+ }
1632
+
1633
+ /* Size variants */
1634
+ .button-sm {
1635
+ padding: var(--spacing-1-5) var(--spacing-3);
1636
+ font-size: var(--font-size-caption);
1637
+ }
1638
+
1639
+ .button-md {
1640
+ padding: var(--space-component-sm) var(--space-component-lg);
1641
+ font-size: var(--font-size-body-sm);
1642
+ }
1643
+
1644
+ .button-lg {
1645
+ padding: var(--space-component-md) var(--space-component-xl);
1646
+ font-size: var(--font-size-body);
1647
+ }
1648
+
1649
+ /* Variant styles */
1650
+ .button-primary {
1651
+ background: var(--color-primary-500);
1652
+ color: var(--color-text-on-primary);
1653
+ box-shadow: var(--shadow-sm);
1654
+ }
1655
+
1656
+ .button-primary:hover:not(:disabled) {
1657
+ background: var(--color-primary-600);
1658
+ box-shadow: var(--shadow-md);
1659
+ }
1660
+
1661
+ .button-primary:active:not(:disabled) {
1662
+ background: var(--color-primary-700);
1663
+ transform: translateY(1px);
1664
+ }
1665
+
1666
+ .button-primary:focus-visible {
1667
+ outline: none;
1668
+ box-shadow: var(--shadow-glow-primary);
1669
+ }
1670
+
1671
+ .button:disabled {
1672
+ opacity: 0.5;
1673
+ cursor: not-allowed;
1674
+ }
1675
+ ```
1676
+
1677
+ ### Using with Inline Styles (Current Approach)
1678
+
1679
+ ```typescript
1680
+ // For components that currently use inline styles
1681
+ const AgentNode: React.FC<NodeProps> = ({ data, selected }) => {
1682
+ return (
1683
+ <div
1684
+ style={{
1685
+ // Use CSS variables in inline styles
1686
+ padding: 'var(--space-component-md)',
1687
+ border: `var(--border-width-2) solid ${
1688
+ selected
1689
+ ? 'var(--color-node-agent-border-selected)'
1690
+ : 'var(--color-node-agent-border)'
1691
+ }`,
1692
+ borderRadius: 'var(--radius-lg)',
1693
+ backgroundColor: 'var(--color-node-agent-bg)',
1694
+ minWidth: '180px',
1695
+ boxShadow: selected
1696
+ ? 'var(--shadow-lg)'
1697
+ : 'var(--shadow-sm)',
1698
+ cursor: 'pointer',
1699
+ transition: 'var(--transition-shadow), var(--transition-colors)',
1700
+ }}
1701
+ >
1702
+ {/* Content */}
1703
+ </div>
1704
+ );
1705
+ };
1706
+ ```
1707
+
1708
+ ### Graph Component Example
1709
+
1710
+ ```typescript
1711
+ // components/graph/GraphCanvas.tsx
1712
+ import { ReactFlow, Background, Controls, MiniMap } from '@xyflow/react';
1713
+ import '@xyflow/react/dist/style.css';
1714
+ import './GraphCanvas.css';
1715
+
1716
+ export const GraphCanvas = () => {
1717
+ return (
1718
+ <div className="graph-container">
1719
+ <ReactFlow
1720
+ /* ... props ... */
1721
+ >
1722
+ <Background
1723
+ variant="dots"
1724
+ gap={20}
1725
+ size={1}
1726
+ color="var(--color-border-subtle)"
1727
+ />
1728
+ <Controls />
1729
+ <MiniMap
1730
+ nodeColor={(node) => {
1731
+ if (node.type === 'agent') return 'var(--color-node-agent-border)';
1732
+ if (node.type === 'message') return 'var(--color-node-message-border)';
1733
+ return 'var(--color-border-default)';
1734
+ }}
1735
+ />
1736
+ </ReactFlow>
1737
+ </div>
1738
+ );
1739
+ };
1740
+ ```
1741
+
1742
+ ```css
1743
+ /* components/graph/GraphCanvas.css */
1744
+ .graph-container {
1745
+ width: 100%;
1746
+ height: 100%;
1747
+ background: var(--color-bg-elevated);
1748
+ }
1749
+
1750
+ /* Override ReactFlow defaults with our design tokens */
1751
+ .react-flow {
1752
+ background: var(--color-bg-elevated);
1753
+ }
1754
+
1755
+ .react-flow__node {
1756
+ font-family: var(--font-family-sans);
1757
+ }
1758
+
1759
+ .react-flow__edge-path {
1760
+ stroke: var(--color-edge-default);
1761
+ stroke-width: 2;
1762
+ transition: stroke var(--duration-fast) var(--ease-smooth);
1763
+ }
1764
+
1765
+ .react-flow__edge:hover .react-flow__edge-path {
1766
+ stroke: var(--color-edge-active);
1767
+ }
1768
+
1769
+ .react-flow__handle {
1770
+ width: 8px;
1771
+ height: 8px;
1772
+ background: var(--color-primary-500);
1773
+ border: 2px solid var(--color-bg-elevated);
1774
+ }
1775
+
1776
+ .react-flow__handle:hover {
1777
+ background: var(--color-primary-400);
1778
+ }
1779
+ ```
1780
+
1781
+ ### Modal Example with Glassmorphism
1782
+
1783
+ ```typescript
1784
+ // components/Modal.tsx
1785
+ import React from 'react';
1786
+ import './Modal.css';
1787
+
1788
+ interface ModalProps {
1789
+ isOpen: boolean;
1790
+ onClose: () => void;
1791
+ title: string;
1792
+ children: React.ReactNode;
1793
+ }
1794
+
1795
+ export const Modal: React.FC<ModalProps> = ({
1796
+ isOpen,
1797
+ onClose,
1798
+ title,
1799
+ children
1800
+ }) => {
1801
+ if (!isOpen) return null;
1802
+
1803
+ return (
1804
+ <div className="modal-backdrop" onClick={onClose}>
1805
+ <div className="modal" onClick={(e) => e.stopPropagation()}>
1806
+ <div className="modal-header">
1807
+ <h3 className="modal-title">{title}</h3>
1808
+ <button className="modal-close" onClick={onClose}>
1809
+ ×
1810
+ </button>
1811
+ </div>
1812
+ <div className="modal-body">
1813
+ {children}
1814
+ </div>
1815
+ </div>
1816
+ </div>
1817
+ );
1818
+ };
1819
+ ```
1820
+
1821
+ ```css
1822
+ /* components/Modal.css */
1823
+ .modal-backdrop {
1824
+ position: fixed;
1825
+ inset: 0;
1826
+ background: var(--color-modal-backdrop);
1827
+ backdrop-filter: blur(4px);
1828
+ display: flex;
1829
+ align-items: center;
1830
+ justify-content: center;
1831
+ z-index: 1000;
1832
+ animation: fadeIn var(--duration-normal) var(--ease-out);
1833
+ }
1834
+
1835
+ .modal {
1836
+ width: 90%;
1837
+ max-width: 600px;
1838
+ max-height: 80vh;
1839
+ padding: var(--space-layout-md);
1840
+ border-radius: var(--radius-xl);
1841
+
1842
+ /* Glassmorphism effect */
1843
+ background: var(--color-glass-bg);
1844
+ border: var(--border-width-1) solid var(--color-glass-border);
1845
+ backdrop-filter: blur(16px);
1846
+ -webkit-backdrop-filter: blur(16px);
1847
+
1848
+ box-shadow: var(--shadow-2xl);
1849
+ animation: scaleIn var(--duration-slow) var(--ease-smooth);
1850
+ }
1851
+
1852
+ .modal-header {
1853
+ display: flex;
1854
+ align-items: center;
1855
+ justify-content: space-between;
1856
+ padding-bottom: var(--space-component-lg);
1857
+ margin-bottom: var(--space-component-lg);
1858
+ border-bottom: var(--border-width-1) solid var(--color-divider);
1859
+ }
1860
+
1861
+ .modal-title {
1862
+ font-size: var(--font-size-h3);
1863
+ font-weight: var(--font-weight-semibold);
1864
+ color: var(--color-text-primary);
1865
+ margin: 0;
1866
+ }
1867
+
1868
+ .modal-close {
1869
+ background: transparent;
1870
+ border: none;
1871
+ color: var(--color-text-secondary);
1872
+ font-size: var(--font-size-h2);
1873
+ cursor: pointer;
1874
+ padding: var(--spacing-1);
1875
+ line-height: 1;
1876
+ transition: var(--transition-colors);
1877
+ }
1878
+
1879
+ .modal-close:hover {
1880
+ color: var(--color-error);
1881
+ }
1882
+
1883
+ .modal-body {
1884
+ overflow-y: auto;
1885
+ max-height: calc(80vh - 120px);
1886
+ color: var(--color-text-secondary);
1887
+ }
1888
+
1889
+ @keyframes fadeIn {
1890
+ from { opacity: 0; }
1891
+ to { opacity: 1; }
1892
+ }
1893
+
1894
+ @keyframes scaleIn {
1895
+ from {
1896
+ opacity: 0;
1897
+ transform: scale(0.95);
1898
+ }
1899
+ to {
1900
+ opacity: 1;
1901
+ transform: scale(1);
1902
+ }
1903
+ }
1904
+ ```
1905
+
1906
+ ---
1907
+
1908
+ ## Implementation Roadmap
1909
+
1910
+ ### Phase 1: Foundation Setup
1911
+ 1. Create `styles/tokens.css` with all CSS variables
1912
+ 2. Import tokens in main `index.css`
1913
+ 3. Add web font imports to `index.html`
1914
+ 4. Set up base styles (body, headings, etc.)
1915
+
1916
+ ### Phase 2: Component Conversion
1917
+ 1. Convert existing inline styles to use CSS variables
1918
+ 2. Create reusable component CSS classes
1919
+ 3. Update AgentNode and MessageNode components
1920
+ 4. Update DetailWindow and modal components
1921
+
1922
+ ### Phase 3: Graph Styling
1923
+ 1. Apply design tokens to ReactFlow components
1924
+ 2. Implement node hover and selection states
1925
+ 3. Style edges with consistent colors
1926
+ 4. Update MiniMap and Controls
1927
+
1928
+ ### Phase 4: Polish & Refinement
1929
+ 1. Add smooth transitions and animations
1930
+ 2. Implement glassmorphism effects
1931
+ 3. Test accessibility compliance
1932
+ 4. Optimize for performance
1933
+ 5. Create component documentation
1934
+
1935
+ ---
1936
+
1937
+ ## Design System Maintenance
1938
+
1939
+ ### Version Control
1940
+ - Document all changes to design tokens
1941
+ - Maintain backwards compatibility where possible
1942
+ - Use semantic versioning for major changes
1943
+
1944
+ ### Adding New Tokens
1945
+ 1. Follow existing naming conventions
1946
+ 2. Update this documentation
1947
+ 3. Test across all components
1948
+ 4. Consider accessibility implications
1949
+
1950
+ ### Deprecating Tokens
1951
+ 1. Mark as deprecated in documentation
1952
+ 2. Provide migration path
1953
+ 3. Maintain for at least one major version
1954
+ 4. Remove with clear announcement
1955
+
1956
+ ---
1957
+
1958
+ ## Resources & References
1959
+
1960
+ ### Inspiration Sources
1961
+ - **AutoGen Studio**: Clean, developer-focused UI with excellent information hierarchy
1962
+ - **Flowise AI**: Modern flow-based design with strong visual feedback
1963
+ - **VS Code Dark+**: Premium dark theme with great contrast ratios
1964
+ - **Vercel Design**: Minimalist, high-contrast, excellent typography
1965
+
1966
+ ### Design Tools
1967
+ - **Figma**: For design mockups and prototypes
1968
+ - **Contrast Checker**: WebAIM for accessibility validation
1969
+ - **Color Palette Generator**: Coolors.co, Adobe Color
1970
+
1971
+ ### Web Standards
1972
+ - **WCAG 2.1 AA**: Accessibility guidelines
1973
+ - **Web Content Accessibility Guidelines**: https://www.w3.org/WAI/WCAG21/quickref/
1974
+ - **MDN Web Docs**: CSS reference and best practices
1975
+
1976
+ ---
1977
+
1978
+ **End of Design System Specification v1.0.0**
1979
+
1980
+ *This design system is a living document. Contributions, feedback, and improvements are welcome.*