@polderlabs/bizar-dash 3.0.0

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.
Files changed (59) hide show
  1. package/dist/assets/index-B5X9g8B4.css +1 -0
  2. package/dist/assets/index-LqQuSp9d.js +388 -0
  3. package/dist/assets/index-LqQuSp9d.js.map +1 -0
  4. package/dist/index.html +18 -0
  5. package/package.json +67 -0
  6. package/src/cli.mjs +228 -0
  7. package/src/server/agents-store.mjs +190 -0
  8. package/src/server/api.mjs +913 -0
  9. package/src/server/browser.mjs +40 -0
  10. package/src/server/diagnostics-store.mjs +138 -0
  11. package/src/server/mods-loader.mjs +361 -0
  12. package/src/server/projects-store.mjs +198 -0
  13. package/src/server/providers-store.mjs +183 -0
  14. package/src/server/schedules-runner.mjs +150 -0
  15. package/src/server/schedules-store.mjs +233 -0
  16. package/src/server/search-store.mjs +120 -0
  17. package/src/server/server.mjs +388 -0
  18. package/src/server/state.mjs +357 -0
  19. package/src/server/tailscale-store.mjs +113 -0
  20. package/src/server/tasks-store.mjs +275 -0
  21. package/src/server/tui.mjs +844 -0
  22. package/src/server/watcher.mjs +81 -0
  23. package/src/web/App.tsx +316 -0
  24. package/src/web/components/Button.tsx +55 -0
  25. package/src/web/components/Card.tsx +40 -0
  26. package/src/web/components/EmptyState.tsx +30 -0
  27. package/src/web/components/Modal.tsx +137 -0
  28. package/src/web/components/SearchModal.tsx +185 -0
  29. package/src/web/components/Spinner.tsx +19 -0
  30. package/src/web/components/StatusBadge.tsx +25 -0
  31. package/src/web/components/Tag.tsx +28 -0
  32. package/src/web/components/Toast.tsx +142 -0
  33. package/src/web/components/Topbar.tsx +203 -0
  34. package/src/web/index.html +17 -0
  35. package/src/web/lib/api.ts +71 -0
  36. package/src/web/lib/markdown.tsx +59 -0
  37. package/src/web/lib/types.ts +388 -0
  38. package/src/web/lib/utils.ts +79 -0
  39. package/src/web/lib/ws.ts +132 -0
  40. package/src/web/main.tsx +12 -0
  41. package/src/web/styles/main.css +3148 -0
  42. package/src/web/views/Agents.tsx +406 -0
  43. package/src/web/views/Chat.tsx +527 -0
  44. package/src/web/views/Config.tsx +683 -0
  45. package/src/web/views/Mods.tsx +350 -0
  46. package/src/web/views/Overview.tsx +350 -0
  47. package/src/web/views/Plans.tsx +667 -0
  48. package/src/web/views/Schedules.tsx +299 -0
  49. package/src/web/views/Settings.tsx +571 -0
  50. package/src/web/views/Tasks.tsx +761 -0
  51. package/templates/mod/FORMAT.md +76 -0
  52. package/templates/mod/hello-mod/README.md +19 -0
  53. package/templates/mod/hello-mod/agents/greeter.md +8 -0
  54. package/templates/mod/hello-mod/commands/hello.md +6 -0
  55. package/templates/mod/hello-mod/mod.json +20 -0
  56. package/templates/mod/hello-mod/routes/ping.mjs +9 -0
  57. package/templates/mod/hello-mod/views/HelloView.tsx +10 -0
  58. package/tsconfig.json +23 -0
  59. package/vite.config.ts +24 -0
@@ -0,0 +1,3148 @@
1
+ /* ─────────────────────────────────────────────────────────────────────
2
+ Bizar Dashboard — React + TypeScript + Vite edition (v2.6.0)
3
+ Norse-pantheon inspired. Polished UI. Inter typography. WCAG AA.
4
+ ───────────────────────────────────────────────────────────────────── */
5
+
6
+ /* ─── Reset ────────────────────────────────────────────────────────── */
7
+
8
+ *,
9
+ *::before,
10
+ *::after {
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ html,
15
+ body,
16
+ #root {
17
+ margin: 0;
18
+ padding: 0;
19
+ height: 100%;
20
+ }
21
+
22
+ body {
23
+ font-family:
24
+ 'Inter var', 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto,
25
+ 'Helvetica Neue', sans-serif;
26
+ font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
27
+ font-size: 14px;
28
+ line-height: 1.5;
29
+ background: var(--bg);
30
+ color: var(--text);
31
+ -webkit-font-smoothing: antialiased;
32
+ -moz-osx-font-smoothing: grayscale;
33
+ }
34
+
35
+ button,
36
+ input,
37
+ textarea,
38
+ select {
39
+ font-family: inherit;
40
+ font-size: inherit;
41
+ color: inherit;
42
+ }
43
+
44
+ a {
45
+ color: var(--accent);
46
+ text-decoration: none;
47
+ }
48
+ a:hover {
49
+ text-decoration: underline;
50
+ }
51
+
52
+ code,
53
+ pre,
54
+ .mono {
55
+ font-family: var(--mono);
56
+ }
57
+
58
+ ::selection {
59
+ background: var(--accent-bg);
60
+ color: var(--accent-2);
61
+ }
62
+
63
+ /* Scrollbars */
64
+ ::-webkit-scrollbar {
65
+ width: 10px;
66
+ height: 10px;
67
+ }
68
+ ::-webkit-scrollbar-track {
69
+ background: transparent;
70
+ }
71
+ ::-webkit-scrollbar-thumb {
72
+ background: var(--border);
73
+ border-radius: 6px;
74
+ border: 2px solid var(--bg);
75
+ }
76
+ ::-webkit-scrollbar-thumb:hover {
77
+ background: var(--border-strong);
78
+ }
79
+
80
+ /* Focus rings */
81
+ :focus-visible {
82
+ outline: 2px solid var(--accent);
83
+ outline-offset: 2px;
84
+ border-radius: 4px;
85
+ }
86
+
87
+ /* ─── Theme tokens ─────────────────────────────────────────────────── */
88
+
89
+ :root {
90
+ /* Surfaces */
91
+ --bg: #0b0e14;
92
+ --bg-elev: #12161f;
93
+ --bg-elev-2: #1a1f2b;
94
+ --bg-elev-3: #232a39;
95
+
96
+ /* Borders */
97
+ --border: #232a39;
98
+ --border-strong: #2d3648;
99
+
100
+ /* Text */
101
+ --text: #c9d1d9;
102
+ --text-dim: #8b95a8;
103
+ --text-strong: #f0f6fc;
104
+
105
+ /* Brand & status */
106
+ --accent: #8b5cf6;
107
+ --accent-2: #a78bfa;
108
+ --accent-3: #c4b5fd;
109
+ --accent-bg: rgba(139, 92, 246, 0.12);
110
+ --accent-border: rgba(139, 92, 246, 0.4);
111
+
112
+ --success: #34d399;
113
+ --warning: #fbbf24;
114
+ --error: #f87171;
115
+ --info: #60a5fa;
116
+
117
+ /* Syntax highlight (json tree) */
118
+ --syntax-key: #79c0ff;
119
+ --syntax-string: #a5d6ff;
120
+ --syntax-number: #ffa657;
121
+ --syntax-boolean: #ff7b72;
122
+ --syntax-null: #ff7b72;
123
+
124
+ /* Type scale */
125
+ --font-mono:
126
+ 'JetBrains Mono', 'Fira Code', 'SF Mono', 'Cascadia Code', Consolas,
127
+ monospace;
128
+ --font-sans:
129
+ 'Inter var', 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto,
130
+ sans-serif;
131
+
132
+ /* Spacing scale (8pt) */
133
+ --space-1: 4px;
134
+ --space-2: 8px;
135
+ --space-3: 12px;
136
+ --space-4: 16px;
137
+ --space-5: 20px;
138
+ --space-6: 24px;
139
+ --space-8: 32px;
140
+ --space-10: 40px;
141
+ --space-12: 48px;
142
+
143
+ /* Radius */
144
+ --radius-sm: 4px;
145
+ --radius: 8px;
146
+ --radius-md: 10px;
147
+ --radius-lg: 12px;
148
+ --radius-xl: 16px;
149
+
150
+ /* Shadows */
151
+ --shadow-1: 0 1px 2px rgba(0, 0, 0, 0.4);
152
+ --shadow-2: 0 4px 12px rgba(0, 0, 0, 0.45);
153
+ --shadow-3: 0 12px 32px rgba(0, 0, 0, 0.55);
154
+ --shadow-glow: 0 0 0 1px var(--accent-border), 0 8px 32px rgba(139, 92, 246, 0.15);
155
+
156
+ /* Motion */
157
+ --motion-fast: 120ms;
158
+ --motion-base: 180ms;
159
+ --motion-slow: 280ms;
160
+ --ease: cubic-bezier(0.4, 0, 0.2, 1);
161
+
162
+ color-scheme: dark;
163
+ }
164
+
165
+ [data-theme='light'] {
166
+ --bg: #f7f8fa;
167
+ --bg-elev: #ffffff;
168
+ --bg-elev-2: #f0f3f8;
169
+ --bg-elev-3: #e6ebf2;
170
+
171
+ --border: #e2e8f0;
172
+ --border-strong: #cbd5e1;
173
+
174
+ --text: #1f2937;
175
+ --text-dim: #64748b;
176
+ --text-strong: #0f172a;
177
+
178
+ --accent: #7c3aed;
179
+ --accent-2: #6d28d9;
180
+ --accent-3: #5b21b6;
181
+ --accent-bg: rgba(124, 58, 237, 0.08);
182
+ --accent-border: rgba(124, 58, 237, 0.3);
183
+
184
+ --success: #059669;
185
+ --warning: #d97706;
186
+ --error: #dc2626;
187
+ --info: #2563eb;
188
+
189
+ --syntax-key: #0969da;
190
+ --syntax-string: #0a3069;
191
+ --syntax-number: #953800;
192
+ --syntax-boolean: #cf222e;
193
+ --syntax-null: #cf222e;
194
+
195
+ --shadow-1: 0 1px 2px rgba(15, 23, 42, 0.06);
196
+ --shadow-2: 0 4px 12px rgba(15, 23, 42, 0.08);
197
+ --shadow-3: 0 12px 32px rgba(15, 23, 42, 0.12);
198
+
199
+ color-scheme: light;
200
+ }
201
+
202
+ /* ─── App shell ────────────────────────────────────────────────────── */
203
+
204
+ .app {
205
+ display: flex;
206
+ flex-direction: column;
207
+ height: 100vh;
208
+ background:
209
+ radial-gradient(circle at 0% 0%, var(--accent-bg), transparent 50%),
210
+ var(--bg);
211
+ background-attachment: fixed;
212
+ }
213
+
214
+ .content {
215
+ flex: 1;
216
+ overflow: auto;
217
+ padding: var(--space-6);
218
+ position: relative;
219
+ }
220
+
221
+ .view {
222
+ max-width: 1400px;
223
+ margin: 0 auto;
224
+ display: flex;
225
+ flex-direction: column;
226
+ gap: var(--space-5);
227
+ animation: view-in var(--motion-slow) var(--ease);
228
+ }
229
+
230
+ @keyframes view-in {
231
+ from {
232
+ opacity: 0;
233
+ transform: translateY(4px);
234
+ }
235
+ to {
236
+ opacity: 1;
237
+ transform: none;
238
+ }
239
+ }
240
+
241
+ .view-loading {
242
+ display: flex;
243
+ flex-direction: column;
244
+ gap: var(--space-3);
245
+ align-items: center;
246
+ justify-content: center;
247
+ min-height: 60vh;
248
+ color: var(--text-dim);
249
+ }
250
+
251
+ .loading {
252
+ display: flex;
253
+ flex-direction: column;
254
+ gap: var(--space-3);
255
+ align-items: center;
256
+ justify-content: center;
257
+ min-height: 100vh;
258
+ color: var(--text-dim);
259
+ }
260
+
261
+ .boot-error {
262
+ max-width: 560px;
263
+ margin: var(--space-12) auto;
264
+ padding: var(--space-6);
265
+ background: var(--bg-elev);
266
+ border: 1px solid var(--error);
267
+ border-radius: var(--radius-lg);
268
+ box-shadow: var(--shadow-2);
269
+ }
270
+ .boot-error h2 {
271
+ margin: 0 0 var(--space-3);
272
+ color: var(--error);
273
+ }
274
+ .boot-error code {
275
+ background: var(--bg);
276
+ padding: 2px 6px;
277
+ border-radius: var(--radius-sm);
278
+ font-size: 12px;
279
+ }
280
+
281
+ /* ─── Topbar ───────────────────────────────────────────────────────── */
282
+
283
+ .topbar {
284
+ display: flex;
285
+ align-items: center;
286
+ height: 56px;
287
+ flex-shrink: 0;
288
+ background: color-mix(in srgb, var(--bg-elev) 92%, transparent);
289
+ backdrop-filter: blur(10px);
290
+ border-bottom: 1px solid var(--border);
291
+ padding: 0 var(--space-5);
292
+ gap: var(--space-5);
293
+ position: sticky;
294
+ top: 0;
295
+ z-index: 10;
296
+ }
297
+
298
+ .brand {
299
+ display: flex;
300
+ align-items: center;
301
+ gap: var(--space-2);
302
+ user-select: none;
303
+ }
304
+
305
+ .brand-logo {
306
+ font-size: 22px;
307
+ line-height: 1;
308
+ filter: drop-shadow(0 0 12px rgba(139, 92, 246, 0.4));
309
+ }
310
+
311
+ .brand-title {
312
+ font-weight: 600;
313
+ font-size: 15px;
314
+ letter-spacing: -0.01em;
315
+ color: var(--text-strong);
316
+ }
317
+
318
+ .brand-version {
319
+ font-family: var(--font-mono);
320
+ font-size: 10px;
321
+ color: var(--text-dim);
322
+ padding: 2px 7px;
323
+ background: var(--bg-elev-2);
324
+ border: 1px solid var(--border);
325
+ border-radius: 999px;
326
+ font-weight: 500;
327
+ }
328
+
329
+ .tabs {
330
+ display: flex;
331
+ gap: 2px;
332
+ flex: 1;
333
+ overflow-x: auto;
334
+ scrollbar-width: none;
335
+ }
336
+ .tabs::-webkit-scrollbar {
337
+ display: none;
338
+ }
339
+
340
+ .tab {
341
+ display: inline-flex;
342
+ align-items: center;
343
+ gap: 6px;
344
+ background: transparent;
345
+ border: 1px solid transparent;
346
+ color: var(--text-dim);
347
+ padding: 6px 12px;
348
+ border-radius: 999px;
349
+ cursor: pointer;
350
+ font-size: 13px;
351
+ font-weight: 500;
352
+ white-space: nowrap;
353
+ transition:
354
+ background var(--motion-base) var(--ease),
355
+ color var(--motion-base) var(--ease),
356
+ border-color var(--motion-base) var(--ease),
357
+ transform var(--motion-fast) var(--ease);
358
+ }
359
+
360
+ .tab:hover {
361
+ color: var(--text);
362
+ background: var(--bg-elev-2);
363
+ }
364
+
365
+ .tab:active {
366
+ transform: scale(0.98);
367
+ }
368
+
369
+ .tab-active {
370
+ color: var(--accent-3);
371
+ background: var(--accent-bg);
372
+ border-color: var(--accent-border);
373
+ }
374
+
375
+ .tab-icon {
376
+ flex-shrink: 0;
377
+ }
378
+
379
+ .topbar-right {
380
+ display: flex;
381
+ align-items: center;
382
+ gap: var(--space-3);
383
+ }
384
+
385
+ .ws-status {
386
+ display: inline-flex;
387
+ align-items: center;
388
+ gap: 6px;
389
+ font-size: 11px;
390
+ font-family: var(--font-mono);
391
+ color: var(--text-dim);
392
+ padding: 4px 10px;
393
+ border-radius: 999px;
394
+ background: var(--bg-elev-2);
395
+ border: 1px solid var(--border);
396
+ text-transform: capitalize;
397
+ }
398
+
399
+ .ws-dot {
400
+ width: 8px;
401
+ height: 8px;
402
+ border-radius: 50%;
403
+ background: var(--text-dim);
404
+ position: relative;
405
+ }
406
+
407
+ .ws-connected .ws-dot {
408
+ background: var(--success);
409
+ box-shadow: 0 0 0 3px rgba(52, 211, 153, 0.15);
410
+ }
411
+ .ws-connecting .ws-dot {
412
+ background: var(--warning);
413
+ animation: pulse 1.4s ease-in-out infinite;
414
+ }
415
+ .ws-disconnected .ws-dot {
416
+ background: var(--error);
417
+ }
418
+
419
+ @keyframes pulse {
420
+ 0%,
421
+ 100% {
422
+ opacity: 1;
423
+ }
424
+ 50% {
425
+ opacity: 0.4;
426
+ }
427
+ }
428
+
429
+ /* ─── View headers ─────────────────────────────────────────────────── */
430
+
431
+ .view-header {
432
+ display: flex;
433
+ align-items: flex-start;
434
+ justify-content: space-between;
435
+ gap: var(--space-4);
436
+ flex-wrap: wrap;
437
+ }
438
+
439
+ .view-header-text {
440
+ display: flex;
441
+ flex-direction: column;
442
+ gap: 4px;
443
+ min-width: 0;
444
+ }
445
+
446
+ .view-title {
447
+ display: inline-flex;
448
+ align-items: center;
449
+ gap: var(--space-2);
450
+ font-size: 22px;
451
+ font-weight: 700;
452
+ letter-spacing: -0.01em;
453
+ color: var(--text-strong);
454
+ margin: 0;
455
+ }
456
+
457
+ .view-subtitle {
458
+ font-size: 13px;
459
+ color: var(--text-dim);
460
+ margin: 0;
461
+ }
462
+
463
+ .view-actions {
464
+ display: inline-flex;
465
+ align-items: center;
466
+ gap: var(--space-2);
467
+ flex-wrap: wrap;
468
+ }
469
+
470
+ /* ─── Cards ────────────────────────────────────────────────────────── */
471
+
472
+ .card {
473
+ background: var(--bg-elev);
474
+ border: 1px solid var(--border);
475
+ border-radius: var(--radius-lg);
476
+ padding: var(--space-4) var(--space-5);
477
+ display: flex;
478
+ flex-direction: column;
479
+ gap: var(--space-3);
480
+ transition:
481
+ border-color var(--motion-base) var(--ease),
482
+ transform var(--motion-base) var(--ease),
483
+ box-shadow var(--motion-base) var(--ease);
484
+ }
485
+
486
+ .card-elevated {
487
+ background: var(--bg-elev);
488
+ }
489
+
490
+ .card-outlined {
491
+ background: transparent;
492
+ }
493
+
494
+ .card-filled {
495
+ background: var(--bg-elev-2);
496
+ border-color: var(--border-strong);
497
+ }
498
+
499
+ .card-interactive {
500
+ cursor: pointer;
501
+ }
502
+
503
+ .card-interactive:hover {
504
+ border-color: var(--border-strong);
505
+ transform: translateY(-1px);
506
+ box-shadow: var(--shadow-2);
507
+ }
508
+
509
+ .card-title {
510
+ display: inline-flex;
511
+ align-items: center;
512
+ gap: 6px;
513
+ font-size: 13px;
514
+ font-weight: 600;
515
+ color: var(--text-strong);
516
+ margin: 0;
517
+ letter-spacing: -0.005em;
518
+ }
519
+
520
+ .card-meta {
521
+ font-size: 12px;
522
+ color: var(--text-dim);
523
+ }
524
+
525
+ /* ─── Buttons ──────────────────────────────────────────────────────── */
526
+
527
+ .btn {
528
+ display: inline-flex;
529
+ align-items: center;
530
+ justify-content: center;
531
+ gap: 6px;
532
+ border-radius: var(--radius);
533
+ cursor: pointer;
534
+ font-weight: 500;
535
+ white-space: nowrap;
536
+ transition:
537
+ background var(--motion-fast) var(--ease),
538
+ border-color var(--motion-fast) var(--ease),
539
+ color var(--motion-fast) var(--ease),
540
+ transform var(--motion-fast) var(--ease),
541
+ box-shadow var(--motion-fast) var(--ease);
542
+ }
543
+
544
+ .btn:active:not(:disabled) {
545
+ transform: scale(0.97);
546
+ }
547
+
548
+ .btn:disabled {
549
+ opacity: 0.55;
550
+ cursor: not-allowed;
551
+ }
552
+
553
+ .btn-size-sm {
554
+ padding: 4px 10px;
555
+ font-size: 12px;
556
+ }
557
+ .btn-size-md {
558
+ padding: 7px 14px;
559
+ font-size: 13px;
560
+ }
561
+ .btn-size-lg {
562
+ padding: 10px 18px;
563
+ font-size: 14px;
564
+ }
565
+
566
+ .btn-icon {
567
+ padding: 6px;
568
+ width: 30px;
569
+ height: 30px;
570
+ }
571
+
572
+ .btn-primary {
573
+ background: var(--accent);
574
+ color: white;
575
+ border: 1px solid var(--accent);
576
+ }
577
+ .btn-primary:hover:not(:disabled) {
578
+ background: var(--accent-2);
579
+ border-color: var(--accent-2);
580
+ }
581
+
582
+ .btn-accent {
583
+ background: var(--accent-bg);
584
+ color: var(--accent-2);
585
+ border: 1px solid var(--accent-border);
586
+ }
587
+
588
+ .btn-secondary {
589
+ background: var(--bg-elev-2);
590
+ color: var(--text);
591
+ border: 1px solid var(--border);
592
+ }
593
+ .btn-secondary:hover:not(:disabled) {
594
+ border-color: var(--border-strong);
595
+ background: var(--bg-elev-3);
596
+ }
597
+
598
+ .btn-ghost {
599
+ background: transparent;
600
+ color: var(--text-dim);
601
+ border: 1px solid transparent;
602
+ }
603
+ .btn-ghost:hover:not(:disabled) {
604
+ background: var(--bg-elev-2);
605
+ color: var(--text);
606
+ }
607
+
608
+ .btn-danger {
609
+ background: transparent;
610
+ color: var(--error);
611
+ border: 1px solid var(--error);
612
+ }
613
+ .btn-danger:hover:not(:disabled) {
614
+ background: rgba(248, 113, 113, 0.12);
615
+ }
616
+
617
+ .btn-loading {
618
+ pointer-events: none;
619
+ }
620
+
621
+ .btn-spinner {
622
+ width: 12px;
623
+ height: 12px;
624
+ border: 2px solid currentColor;
625
+ border-top-color: transparent;
626
+ border-radius: 50%;
627
+ animation: spin 0.7s linear infinite;
628
+ }
629
+
630
+ .hint-key {
631
+ opacity: 0.7;
632
+ margin-left: 2px;
633
+ }
634
+
635
+ .icon-btn {
636
+ display: inline-flex;
637
+ align-items: center;
638
+ justify-content: center;
639
+ width: 26px;
640
+ height: 26px;
641
+ border-radius: var(--radius-sm);
642
+ background: transparent;
643
+ color: var(--text-dim);
644
+ border: 1px solid transparent;
645
+ cursor: pointer;
646
+ transition: all var(--motion-fast) var(--ease);
647
+ }
648
+
649
+ .icon-btn:hover {
650
+ background: var(--bg-elev-2);
651
+ color: var(--text);
652
+ border-color: var(--border);
653
+ }
654
+
655
+ .icon-btn-danger:hover {
656
+ background: rgba(248, 113, 113, 0.12);
657
+ color: var(--error);
658
+ border-color: var(--error);
659
+ }
660
+
661
+ .w-full {
662
+ width: 100%;
663
+ }
664
+
665
+ /* ─── Form fields ──────────────────────────────────────────────────── */
666
+
667
+ .input,
668
+ .textarea,
669
+ .select {
670
+ background: var(--bg);
671
+ color: var(--text);
672
+ border: 1px solid var(--border);
673
+ border-radius: var(--radius);
674
+ padding: 7px 12px;
675
+ width: 100%;
676
+ font-size: 13px;
677
+ transition:
678
+ border-color var(--motion-fast) var(--ease),
679
+ box-shadow var(--motion-fast) var(--ease);
680
+ }
681
+
682
+ .textarea {
683
+ resize: vertical;
684
+ min-height: 80px;
685
+ font-family: var(--font-mono);
686
+ font-size: 12px;
687
+ line-height: 1.55;
688
+ }
689
+
690
+ .select {
691
+ appearance: none;
692
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'><path fill='%238b95a8' d='M2 4l4 4 4-4z'/></svg>");
693
+ background-repeat: no-repeat;
694
+ background-position: right 10px center;
695
+ padding-right: 30px;
696
+ }
697
+
698
+ [data-theme='light'] .select {
699
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'><path fill='%2364748b' d='M2 4l4 4 4-4z'/></svg>");
700
+ }
701
+
702
+ .select-sm {
703
+ padding: 4px 28px 4px 10px;
704
+ font-size: 12px;
705
+ height: 30px;
706
+ }
707
+
708
+ .input:focus,
709
+ .textarea:focus,
710
+ .select:focus {
711
+ outline: none;
712
+ border-color: var(--accent);
713
+ box-shadow: 0 0 0 3px var(--accent-bg);
714
+ }
715
+
716
+ .textarea.invalid {
717
+ border-color: var(--error);
718
+ }
719
+
720
+ .field {
721
+ display: flex;
722
+ flex-direction: column;
723
+ gap: var(--space-2);
724
+ margin-bottom: var(--space-4);
725
+ }
726
+
727
+ .field-label {
728
+ font-size: 12px;
729
+ font-weight: 500;
730
+ color: var(--text-dim);
731
+ letter-spacing: 0.01em;
732
+ }
733
+
734
+ .field-help {
735
+ font-size: 11px;
736
+ color: var(--text-dim);
737
+ }
738
+
739
+ .checkbox-row {
740
+ display: flex;
741
+ align-items: center;
742
+ gap: var(--space-2);
743
+ padding: 6px 0;
744
+ font-size: 13px;
745
+ cursor: pointer;
746
+ color: var(--text);
747
+ }
748
+
749
+ .checkbox-row input {
750
+ width: auto;
751
+ cursor: pointer;
752
+ accent-color: var(--accent);
753
+ }
754
+
755
+ .radio-row {
756
+ display: flex;
757
+ gap: var(--space-3);
758
+ }
759
+
760
+ .radio-label {
761
+ display: inline-flex;
762
+ align-items: center;
763
+ gap: 4px;
764
+ font-size: 13px;
765
+ cursor: pointer;
766
+ }
767
+
768
+ .radio-label input {
769
+ width: auto;
770
+ accent-color: var(--accent);
771
+ }
772
+
773
+ .capitalize {
774
+ text-transform: capitalize;
775
+ }
776
+
777
+ .tabular-nums {
778
+ font-variant-numeric: tabular-nums;
779
+ }
780
+
781
+ .text-error {
782
+ color: var(--error);
783
+ }
784
+
785
+ .muted {
786
+ color: var(--text-dim);
787
+ }
788
+
789
+ .text-sm {
790
+ font-size: 12px;
791
+ }
792
+
793
+ .ellipsis {
794
+ overflow: hidden;
795
+ text-overflow: ellipsis;
796
+ white-space: nowrap;
797
+ }
798
+
799
+ /* ─── Badges & tags ────────────────────────────────────────────────── */
800
+
801
+ .badge {
802
+ display: inline-flex;
803
+ align-items: center;
804
+ gap: 4px;
805
+ padding: 2px 8px;
806
+ border-radius: 999px;
807
+ font-size: 10px;
808
+ font-family: var(--font-mono);
809
+ font-weight: 500;
810
+ background: var(--bg-elev-2);
811
+ color: var(--text-dim);
812
+ border: 1px solid var(--border);
813
+ text-transform: uppercase;
814
+ letter-spacing: 0.04em;
815
+ }
816
+
817
+ .badge-dot::before {
818
+ content: '';
819
+ display: inline-block;
820
+ width: 6px;
821
+ height: 6px;
822
+ border-radius: 50%;
823
+ background: currentColor;
824
+ }
825
+
826
+ .badge-success {
827
+ color: var(--success);
828
+ border-color: rgba(52, 211, 153, 0.4);
829
+ }
830
+ .badge-warning {
831
+ color: var(--warning);
832
+ border-color: rgba(251, 191, 36, 0.4);
833
+ }
834
+ .badge-error {
835
+ color: var(--error);
836
+ border-color: rgba(248, 113, 113, 0.4);
837
+ }
838
+ .badge-info {
839
+ color: var(--info);
840
+ border-color: rgba(96, 165, 250, 0.4);
841
+ }
842
+ .badge-accent {
843
+ color: var(--accent-2);
844
+ border-color: var(--accent-border);
845
+ }
846
+ .badge-neutral {
847
+ color: var(--text-dim);
848
+ }
849
+
850
+ .tag {
851
+ display: inline-flex;
852
+ align-items: center;
853
+ gap: 4px;
854
+ padding: 1px 8px;
855
+ border-radius: 999px;
856
+ font-size: 10px;
857
+ font-family: var(--font-mono);
858
+ background: var(--accent-bg);
859
+ color: var(--accent-2);
860
+ border: 1px solid var(--accent-border);
861
+ }
862
+
863
+ .tag-remove {
864
+ background: transparent;
865
+ border: none;
866
+ color: inherit;
867
+ cursor: pointer;
868
+ padding: 0 0 0 2px;
869
+ font-size: 12px;
870
+ line-height: 1;
871
+ opacity: 0.7;
872
+ }
873
+ .tag-remove:hover {
874
+ opacity: 1;
875
+ }
876
+
877
+ /* ─── Spinner ──────────────────────────────────────────────────────── */
878
+
879
+ .spinner {
880
+ display: inline-block;
881
+ border: 2px solid var(--border);
882
+ border-top-color: var(--accent);
883
+ border-radius: 50%;
884
+ animation: spin 0.7s linear infinite;
885
+ }
886
+ .spinner-sm {
887
+ width: 12px;
888
+ height: 12px;
889
+ }
890
+ .spinner-md {
891
+ width: 18px;
892
+ height: 18px;
893
+ }
894
+ .spinner-lg {
895
+ width: 32px;
896
+ height: 32px;
897
+ border-width: 3px;
898
+ }
899
+
900
+ @keyframes spin {
901
+ to {
902
+ transform: rotate(360deg);
903
+ }
904
+ }
905
+
906
+ /* ─── Stat cards (Overview) ────────────────────────────────────────── */
907
+
908
+ .stat-grid {
909
+ display: grid;
910
+ grid-template-columns: repeat(4, 1fr);
911
+ gap: var(--space-4);
912
+ }
913
+
914
+ @media (max-width: 1100px) {
915
+ .stat-grid {
916
+ grid-template-columns: repeat(2, 1fr);
917
+ }
918
+ }
919
+ @media (max-width: 600px) {
920
+ .stat-grid {
921
+ grid-template-columns: 1fr;
922
+ }
923
+ }
924
+
925
+ .stat-card {
926
+ flex-direction: row;
927
+ align-items: center;
928
+ gap: var(--space-4);
929
+ padding: var(--space-4) var(--space-5);
930
+ }
931
+
932
+ .stat-card-icon {
933
+ width: 40px;
934
+ height: 40px;
935
+ border-radius: var(--radius);
936
+ background: var(--accent-bg);
937
+ color: var(--accent-2);
938
+ display: inline-flex;
939
+ align-items: center;
940
+ justify-content: center;
941
+ flex-shrink: 0;
942
+ }
943
+
944
+ .stat-card-body {
945
+ flex: 1;
946
+ display: flex;
947
+ flex-direction: column;
948
+ gap: 2px;
949
+ min-width: 0;
950
+ }
951
+
952
+ .stat-card-value {
953
+ font-size: 26px;
954
+ font-weight: 700;
955
+ color: var(--text-strong);
956
+ letter-spacing: -0.02em;
957
+ line-height: 1.05;
958
+ }
959
+
960
+ .stat-card-label {
961
+ font-size: 11px;
962
+ color: var(--text-dim);
963
+ text-transform: uppercase;
964
+ letter-spacing: 0.06em;
965
+ }
966
+
967
+ .stat-card-arrow {
968
+ color: var(--text-dim);
969
+ font-size: 18px;
970
+ transition: transform var(--motion-base) var(--ease);
971
+ }
972
+
973
+ .stat-card:hover .stat-card-arrow {
974
+ transform: translateX(2px);
975
+ color: var(--accent-2);
976
+ }
977
+
978
+ /* ─── Quick actions ────────────────────────────────────────────────── */
979
+
980
+ .quick-actions {
981
+ gap: var(--space-3);
982
+ }
983
+
984
+ .quick-actions-row {
985
+ display: flex;
986
+ flex-wrap: wrap;
987
+ gap: var(--space-2);
988
+ }
989
+
990
+ /* ─── Activity feed ────────────────────────────────────────────────── */
991
+
992
+ .overview-cols {
993
+ display: grid;
994
+ grid-template-columns: 1.4fr 1fr;
995
+ gap: var(--space-4);
996
+ }
997
+
998
+ @media (max-width: 1000px) {
999
+ .overview-cols {
1000
+ grid-template-columns: 1fr;
1001
+ }
1002
+ }
1003
+
1004
+ .activity-list {
1005
+ list-style: none;
1006
+ margin: 0;
1007
+ padding: 0;
1008
+ display: flex;
1009
+ flex-direction: column;
1010
+ gap: 2px;
1011
+ max-height: 360px;
1012
+ overflow-y: auto;
1013
+ }
1014
+
1015
+ .activity-item {
1016
+ display: grid;
1017
+ grid-template-columns: 60px 130px 1fr;
1018
+ gap: var(--space-3);
1019
+ padding: 8px var(--space-2);
1020
+ font-size: 12px;
1021
+ border-radius: var(--radius-sm);
1022
+ font-family: var(--font-mono);
1023
+ border-left: 2px solid var(--border);
1024
+ align-items: baseline;
1025
+ }
1026
+
1027
+ .activity-item:hover {
1028
+ background: var(--bg-elev-2);
1029
+ }
1030
+
1031
+ .activity-ts {
1032
+ color: var(--text-dim);
1033
+ white-space: nowrap;
1034
+ }
1035
+
1036
+ .activity-kind {
1037
+ color: var(--accent-2);
1038
+ }
1039
+
1040
+ .activity-msg {
1041
+ color: var(--text);
1042
+ word-break: break-word;
1043
+ overflow: hidden;
1044
+ text-overflow: ellipsis;
1045
+ }
1046
+
1047
+ .env-table,
1048
+ .about-table {
1049
+ display: grid;
1050
+ grid-template-columns: max-content 1fr;
1051
+ gap: 6px var(--space-4);
1052
+ margin: 0;
1053
+ font-size: 13px;
1054
+ }
1055
+
1056
+ .env-table dt,
1057
+ .about-table dt {
1058
+ color: var(--text-dim);
1059
+ font-size: 12px;
1060
+ }
1061
+
1062
+ .env-table dd,
1063
+ .about-table dd {
1064
+ margin: 0;
1065
+ color: var(--text);
1066
+ }
1067
+
1068
+ .overview-footer {
1069
+ display: flex;
1070
+ align-items: center;
1071
+ gap: 6px;
1072
+ font-size: 11px;
1073
+ color: var(--text-dim);
1074
+ padding-top: var(--space-3);
1075
+ border-top: 1px solid var(--border);
1076
+ }
1077
+
1078
+ /* ─── Empty state ──────────────────────────────────────────────────── */
1079
+
1080
+ .empty-state {
1081
+ display: flex;
1082
+ flex-direction: column;
1083
+ align-items: center;
1084
+ justify-content: center;
1085
+ gap: var(--space-2);
1086
+ padding: var(--space-8) var(--space-4);
1087
+ text-align: center;
1088
+ color: var(--text-dim);
1089
+ }
1090
+
1091
+ .empty-icon {
1092
+ color: var(--text-dim);
1093
+ opacity: 0.7;
1094
+ }
1095
+
1096
+ .empty-title {
1097
+ font-weight: 600;
1098
+ color: var(--text);
1099
+ font-size: 15px;
1100
+ margin-top: var(--space-2);
1101
+ }
1102
+
1103
+ .empty-message {
1104
+ font-size: 13px;
1105
+ max-width: 420px;
1106
+ }
1107
+
1108
+ .empty-action {
1109
+ margin-top: var(--space-3);
1110
+ }
1111
+
1112
+ /* ─── Chat ─────────────────────────────────────────────────────────── */
1113
+
1114
+ .chat-container {
1115
+ display: flex;
1116
+ flex-direction: column;
1117
+ gap: var(--space-3);
1118
+ flex: 1;
1119
+ min-height: 0;
1120
+ }
1121
+
1122
+ .chat-list {
1123
+ flex: 1;
1124
+ min-height: 400px;
1125
+ max-height: calc(100vh - 280px);
1126
+ overflow-y: auto;
1127
+ padding: var(--space-3);
1128
+ background: var(--bg-elev);
1129
+ border: 1px solid var(--border);
1130
+ border-radius: var(--radius-lg);
1131
+ display: flex;
1132
+ flex-direction: column;
1133
+ gap: var(--space-3);
1134
+ }
1135
+
1136
+ .chat-msg {
1137
+ background: var(--bg);
1138
+ border: 1px solid var(--border);
1139
+ border-radius: var(--radius-md);
1140
+ padding: var(--space-3) var(--space-4);
1141
+ max-width: 85%;
1142
+ animation: msg-in var(--motion-base) var(--ease);
1143
+ }
1144
+
1145
+ @keyframes msg-in {
1146
+ from {
1147
+ opacity: 0;
1148
+ transform: translateY(2px);
1149
+ }
1150
+ to {
1151
+ opacity: 1;
1152
+ transform: none;
1153
+ }
1154
+ }
1155
+
1156
+ .chat-msg-user {
1157
+ align-self: flex-end;
1158
+ background: var(--accent-bg);
1159
+ border-color: var(--accent-border);
1160
+ }
1161
+
1162
+ .chat-msg-assistant {
1163
+ align-self: flex-start;
1164
+ }
1165
+
1166
+ .chat-msg-system {
1167
+ align-self: center;
1168
+ max-width: 100%;
1169
+ font-size: 12px;
1170
+ color: var(--text-dim);
1171
+ border-style: dashed;
1172
+ }
1173
+
1174
+ .chat-msg-meta {
1175
+ display: flex;
1176
+ align-items: baseline;
1177
+ gap: var(--space-2);
1178
+ margin-bottom: 6px;
1179
+ font-size: 11px;
1180
+ font-family: var(--font-mono);
1181
+ color: var(--text-dim);
1182
+ }
1183
+
1184
+ .chat-msg-role {
1185
+ text-transform: uppercase;
1186
+ font-weight: 600;
1187
+ color: var(--accent-2);
1188
+ letter-spacing: 0.04em;
1189
+ }
1190
+
1191
+ .chat-msg-agent {
1192
+ color: var(--info);
1193
+ }
1194
+
1195
+ .chat-msg-ts {
1196
+ margin-left: auto;
1197
+ }
1198
+
1199
+ .chat-msg-body {
1200
+ font-size: 13px;
1201
+ line-height: 1.6;
1202
+ word-break: break-word;
1203
+ }
1204
+
1205
+ .chat-msg-body p {
1206
+ margin: 0 0 var(--space-2);
1207
+ }
1208
+ .chat-msg-body p:last-child {
1209
+ margin-bottom: 0;
1210
+ }
1211
+
1212
+ .chat-msg-body code {
1213
+ font-family: var(--font-mono);
1214
+ background: var(--bg);
1215
+ padding: 1px 6px;
1216
+ border-radius: var(--radius-sm);
1217
+ font-size: 12px;
1218
+ border: 1px solid var(--border);
1219
+ }
1220
+
1221
+ .chat-msg-body pre {
1222
+ background: var(--bg);
1223
+ padding: var(--space-3);
1224
+ border-radius: var(--radius);
1225
+ overflow-x: auto;
1226
+ border: 1px solid var(--border);
1227
+ font-size: 12px;
1228
+ }
1229
+
1230
+ .chat-msg-body pre code {
1231
+ background: transparent;
1232
+ border: none;
1233
+ padding: 0;
1234
+ }
1235
+
1236
+ .chat-msg-body a {
1237
+ color: var(--accent-2);
1238
+ }
1239
+
1240
+ .chat-msg-body ul,
1241
+ .chat-msg-body ol {
1242
+ margin: 0 0 var(--space-2);
1243
+ padding-left: var(--space-5);
1244
+ }
1245
+
1246
+ .chat-msg-body blockquote {
1247
+ border-left: 3px solid var(--accent-border);
1248
+ padding-left: var(--space-3);
1249
+ color: var(--text-dim);
1250
+ margin: 0 0 var(--space-2);
1251
+ }
1252
+
1253
+ .chat-composer {
1254
+ display: flex;
1255
+ flex-direction: column;
1256
+ gap: var(--space-2);
1257
+ }
1258
+
1259
+ .chat-composer-row {
1260
+ display: flex;
1261
+ gap: var(--space-2);
1262
+ align-items: flex-end;
1263
+ }
1264
+
1265
+ .chat-composer-row .chat-input {
1266
+ flex: 1;
1267
+ min-height: 60px;
1268
+ max-height: 200px;
1269
+ }
1270
+
1271
+ .chat-suggestions {
1272
+ display: flex;
1273
+ flex-direction: column;
1274
+ gap: 2px;
1275
+ padding: var(--space-2);
1276
+ background: var(--bg-elev);
1277
+ border: 1px solid var(--border);
1278
+ border-radius: var(--radius);
1279
+ max-height: 200px;
1280
+ overflow-y: auto;
1281
+ }
1282
+
1283
+ .chat-suggestion {
1284
+ display: flex;
1285
+ align-items: baseline;
1286
+ gap: var(--space-2);
1287
+ background: transparent;
1288
+ border: 1px solid transparent;
1289
+ color: var(--text);
1290
+ padding: 6px var(--space-2);
1291
+ border-radius: var(--radius-sm);
1292
+ text-align: left;
1293
+ cursor: pointer;
1294
+ font-size: 12px;
1295
+ transition: background var(--motion-fast) var(--ease);
1296
+ }
1297
+
1298
+ .chat-suggestion:hover {
1299
+ background: var(--bg-elev-2);
1300
+ }
1301
+
1302
+ .chat-suggestion-desc {
1303
+ color: var(--text-dim);
1304
+ font-size: 11px;
1305
+ }
1306
+
1307
+ /* ─── Agents grid ──────────────────────────────────────────────────── */
1308
+
1309
+ .agent-grid {
1310
+ display: grid;
1311
+ grid-template-columns: repeat(3, 1fr);
1312
+ gap: var(--space-4);
1313
+ }
1314
+
1315
+ @media (max-width: 1100px) {
1316
+ .agent-grid {
1317
+ grid-template-columns: repeat(2, 1fr);
1318
+ }
1319
+ }
1320
+ @media (max-width: 700px) {
1321
+ .agent-grid {
1322
+ grid-template-columns: 1fr;
1323
+ }
1324
+ }
1325
+
1326
+ .agent-card {
1327
+ gap: var(--space-2);
1328
+ }
1329
+
1330
+ .agent-card-head {
1331
+ display: flex;
1332
+ align-items: center;
1333
+ justify-content: space-between;
1334
+ gap: var(--space-2);
1335
+ }
1336
+
1337
+ .agent-card-name {
1338
+ font-weight: 600;
1339
+ font-family: var(--font-mono);
1340
+ color: var(--accent-2);
1341
+ font-size: 15px;
1342
+ }
1343
+
1344
+ .agent-card-desc {
1345
+ font-size: 12px;
1346
+ color: var(--text-dim);
1347
+ line-height: 1.5;
1348
+ min-height: 36px;
1349
+ }
1350
+
1351
+ .agent-card-meta {
1352
+ display: flex;
1353
+ justify-content: space-between;
1354
+ font-size: 11px;
1355
+ font-family: var(--font-mono);
1356
+ color: var(--text-dim);
1357
+ }
1358
+
1359
+ .agent-card-actions {
1360
+ display: flex;
1361
+ gap: var(--space-2);
1362
+ margin-top: var(--space-2);
1363
+ }
1364
+
1365
+ .invoke-form {
1366
+ display: flex;
1367
+ flex-direction: column;
1368
+ gap: var(--space-3);
1369
+ }
1370
+
1371
+ .invoke-form-meta {
1372
+ font-size: 11px;
1373
+ }
1374
+
1375
+ .invoke-form-desc {
1376
+ margin: 0;
1377
+ font-size: 13px;
1378
+ color: var(--text-dim);
1379
+ }
1380
+
1381
+ /* ─── Plans ────────────────────────────────────────────────────────── */
1382
+
1383
+ .new-plan-form {
1384
+ display: flex;
1385
+ gap: var(--space-2);
1386
+ align-items: center;
1387
+ flex-wrap: wrap;
1388
+ }
1389
+ .new-plan-form .input {
1390
+ flex: 1;
1391
+ min-width: 200px;
1392
+ }
1393
+
1394
+ .plans-layout {
1395
+ display: grid;
1396
+ grid-template-columns: 340px 1fr;
1397
+ gap: var(--space-4);
1398
+ min-height: 500px;
1399
+ }
1400
+
1401
+ @media (max-width: 1000px) {
1402
+ .plans-layout {
1403
+ grid-template-columns: 1fr;
1404
+ }
1405
+ }
1406
+
1407
+ .plans-list-col {
1408
+ display: flex;
1409
+ flex-direction: column;
1410
+ gap: var(--space-3);
1411
+ max-height: calc(100vh - 280px);
1412
+ overflow-y: auto;
1413
+ padding-right: 4px;
1414
+ }
1415
+
1416
+ .plans-canvas-col {
1417
+ display: flex;
1418
+ flex-direction: column;
1419
+ background: var(--bg-elev);
1420
+ border: 1px solid var(--border);
1421
+ border-radius: var(--radius-lg);
1422
+ overflow: hidden;
1423
+ min-height: 500px;
1424
+ }
1425
+
1426
+ .plan-card {
1427
+ gap: var(--space-2);
1428
+ }
1429
+
1430
+ .plan-card-selected {
1431
+ border-color: var(--accent);
1432
+ box-shadow: var(--shadow-glow);
1433
+ }
1434
+
1435
+ .plan-card-head {
1436
+ display: flex;
1437
+ align-items: center;
1438
+ justify-content: space-between;
1439
+ gap: var(--space-2);
1440
+ }
1441
+
1442
+ .plan-card-title {
1443
+ font-weight: 600;
1444
+ color: var(--text-strong);
1445
+ font-size: 14px;
1446
+ }
1447
+
1448
+ .plan-card-slug {
1449
+ font-size: 11px;
1450
+ color: var(--text-dim);
1451
+ }
1452
+
1453
+ .plan-card-meta {
1454
+ font-size: 11px;
1455
+ color: var(--text-dim);
1456
+ }
1457
+
1458
+ .plan-card-actions {
1459
+ display: flex;
1460
+ gap: var(--space-2);
1461
+ }
1462
+
1463
+ /* Plan canvas */
1464
+ .plan-canvas {
1465
+ display: flex;
1466
+ flex-direction: column;
1467
+ flex: 1;
1468
+ min-height: 0;
1469
+ }
1470
+
1471
+ .plan-canvas-header {
1472
+ display: flex;
1473
+ align-items: center;
1474
+ justify-content: space-between;
1475
+ gap: var(--space-3);
1476
+ padding: var(--space-3) var(--space-4);
1477
+ border-bottom: 1px solid var(--border);
1478
+ background: var(--bg-elev-2);
1479
+ }
1480
+
1481
+ .plan-canvas-title {
1482
+ font-weight: 600;
1483
+ font-size: 14px;
1484
+ color: var(--text-strong);
1485
+ }
1486
+
1487
+ .plan-canvas-meta {
1488
+ font-size: 11px;
1489
+ color: var(--text-dim);
1490
+ margin-top: 2px;
1491
+ font-family: var(--font-mono);
1492
+ }
1493
+
1494
+ .plan-canvas-actions {
1495
+ display: flex;
1496
+ gap: var(--space-2);
1497
+ }
1498
+
1499
+ .plan-canvas-area {
1500
+ flex: 1;
1501
+ position: relative;
1502
+ overflow: hidden;
1503
+ background: var(--bg);
1504
+ min-height: 360px;
1505
+ }
1506
+
1507
+ .canvas-root {
1508
+ position: absolute;
1509
+ inset: 0;
1510
+ cursor: grab;
1511
+ overflow: hidden;
1512
+ }
1513
+
1514
+ .canvas-grid-bg {
1515
+ position: absolute;
1516
+ inset: -2000px;
1517
+ background-image: radial-gradient(
1518
+ circle,
1519
+ var(--border) 1px,
1520
+ transparent 1px
1521
+ );
1522
+ background-size: 24px 24px;
1523
+ background-position: 2000px 2000px;
1524
+ opacity: 0.5;
1525
+ pointer-events: none;
1526
+ }
1527
+
1528
+ .canvas-inner {
1529
+ position: absolute;
1530
+ top: 0;
1531
+ left: 0;
1532
+ transform-origin: 0 0;
1533
+ }
1534
+
1535
+ .canvas-element {
1536
+ position: absolute;
1537
+ background: var(--bg-elev);
1538
+ border: 1px solid var(--border);
1539
+ border-radius: var(--radius);
1540
+ padding: var(--space-3);
1541
+ cursor: pointer;
1542
+ transition:
1543
+ border-color var(--motion-base) var(--ease),
1544
+ box-shadow var(--motion-base) var(--ease),
1545
+ transform var(--motion-fast) var(--ease);
1546
+ min-width: 140px;
1547
+ }
1548
+
1549
+ .canvas-element:hover {
1550
+ border-color: var(--accent-border);
1551
+ transform: translateY(-1px);
1552
+ box-shadow: var(--shadow-2);
1553
+ }
1554
+
1555
+ .canvas-element-selected {
1556
+ border-color: var(--accent);
1557
+ box-shadow: var(--shadow-glow);
1558
+ }
1559
+
1560
+ .canvas-element-type {
1561
+ font-family: var(--font-mono);
1562
+ font-size: 10px;
1563
+ color: var(--accent-2);
1564
+ text-transform: uppercase;
1565
+ letter-spacing: 0.05em;
1566
+ margin-bottom: 4px;
1567
+ }
1568
+
1569
+ .canvas-element-title {
1570
+ font-weight: 600;
1571
+ font-size: 13px;
1572
+ color: var(--text-strong);
1573
+ margin-bottom: 4px;
1574
+ }
1575
+
1576
+ .canvas-element-content {
1577
+ font-size: 11px;
1578
+ color: var(--text-dim);
1579
+ line-height: 1.5;
1580
+ white-space: pre-wrap;
1581
+ word-break: break-word;
1582
+ }
1583
+
1584
+ .canvas-connections {
1585
+ position: absolute;
1586
+ pointer-events: none;
1587
+ overflow: visible;
1588
+ }
1589
+
1590
+ .canvas-hint {
1591
+ position: absolute;
1592
+ bottom: var(--space-3);
1593
+ right: var(--space-3);
1594
+ font-size: 11px;
1595
+ color: var(--text-dim);
1596
+ background: var(--bg-elev);
1597
+ border: 1px solid var(--border);
1598
+ border-radius: var(--radius);
1599
+ padding: 4px 8px;
1600
+ pointer-events: none;
1601
+ }
1602
+
1603
+ .plan-canvas-empty {
1604
+ position: absolute;
1605
+ inset: 0;
1606
+ display: flex;
1607
+ align-items: center;
1608
+ justify-content: center;
1609
+ font-size: 13px;
1610
+ color: var(--text-dim);
1611
+ text-align: center;
1612
+ padding: var(--space-6);
1613
+ }
1614
+
1615
+ .plan-canvas-comments {
1616
+ border-top: 1px solid var(--border);
1617
+ padding: var(--space-3) var(--space-4);
1618
+ background: var(--bg-elev-2);
1619
+ max-height: 220px;
1620
+ overflow-y: auto;
1621
+ }
1622
+
1623
+ .plan-canvas-comments-title {
1624
+ display: flex;
1625
+ align-items: center;
1626
+ gap: 6px;
1627
+ font-size: 12px;
1628
+ font-weight: 600;
1629
+ color: var(--text);
1630
+ margin: 0 0 var(--space-2);
1631
+ }
1632
+
1633
+ .comment-list {
1634
+ list-style: none;
1635
+ margin: 0;
1636
+ padding: 0;
1637
+ display: flex;
1638
+ flex-direction: column;
1639
+ gap: var(--space-3);
1640
+ }
1641
+
1642
+ .comment-item {
1643
+ padding: var(--space-2) var(--space-3);
1644
+ background: var(--bg-elev);
1645
+ border: 1px solid var(--border);
1646
+ border-radius: var(--radius);
1647
+ }
1648
+
1649
+ .comment-head {
1650
+ display: flex;
1651
+ align-items: baseline;
1652
+ gap: var(--space-2);
1653
+ margin-bottom: 4px;
1654
+ }
1655
+
1656
+ .comment-author {
1657
+ font-size: 11px;
1658
+ font-weight: 600;
1659
+ color: var(--accent-2);
1660
+ }
1661
+
1662
+ .comment-time {
1663
+ font-size: 11px;
1664
+ }
1665
+
1666
+ .comment-text {
1667
+ font-size: 12px;
1668
+ color: var(--text);
1669
+ line-height: 1.5;
1670
+ }
1671
+
1672
+ .comment-thread {
1673
+ margin-top: var(--space-2);
1674
+ padding-left: var(--space-3);
1675
+ border-left: 2px solid var(--border);
1676
+ display: flex;
1677
+ flex-direction: column;
1678
+ gap: 4px;
1679
+ }
1680
+
1681
+ .comment-reply {
1682
+ display: flex;
1683
+ gap: var(--space-2);
1684
+ font-size: 11px;
1685
+ align-items: baseline;
1686
+ }
1687
+
1688
+ .comment-reply-text {
1689
+ color: var(--text-dim);
1690
+ }
1691
+
1692
+ /* ─── Projects ─────────────────────────────────────────────────────── */
1693
+
1694
+ .project-grid {
1695
+ display: grid;
1696
+ grid-template-columns: repeat(2, 1fr);
1697
+ gap: var(--space-4);
1698
+ }
1699
+
1700
+ @media (max-width: 900px) {
1701
+ .project-grid {
1702
+ grid-template-columns: 1fr;
1703
+ }
1704
+ }
1705
+
1706
+ .project-card {
1707
+ gap: var(--space-2);
1708
+ }
1709
+
1710
+ .project-card-active {
1711
+ border-color: var(--accent);
1712
+ box-shadow: var(--shadow-glow);
1713
+ }
1714
+
1715
+ .project-card-head {
1716
+ display: flex;
1717
+ align-items: center;
1718
+ justify-content: space-between;
1719
+ gap: var(--space-2);
1720
+ }
1721
+
1722
+ .project-card-path {
1723
+ font-size: 11px;
1724
+ color: var(--text-dim);
1725
+ word-break: break-all;
1726
+ }
1727
+
1728
+ .project-card-actions {
1729
+ display: flex;
1730
+ gap: var(--space-2);
1731
+ margin-top: var(--space-2);
1732
+ }
1733
+
1734
+ /* ─── Tasks kanban ─────────────────────────────────────────────────── */
1735
+
1736
+ .search-input {
1737
+ position: relative;
1738
+ display: inline-flex;
1739
+ align-items: center;
1740
+ }
1741
+ .search-input > svg {
1742
+ position: absolute;
1743
+ left: 10px;
1744
+ color: var(--text-dim);
1745
+ }
1746
+ .search-input .input {
1747
+ padding-left: 32px;
1748
+ width: 220px;
1749
+ }
1750
+ .search-input > .icon-btn {
1751
+ position: absolute;
1752
+ right: 4px;
1753
+ width: 20px;
1754
+ height: 20px;
1755
+ }
1756
+
1757
+ .kanban {
1758
+ display: grid;
1759
+ grid-template-columns: repeat(3, 1fr);
1760
+ gap: var(--space-4);
1761
+ align-items: start;
1762
+ }
1763
+
1764
+ @media (max-width: 900px) {
1765
+ .kanban {
1766
+ grid-template-columns: 1fr;
1767
+ }
1768
+ }
1769
+
1770
+ .kanban-column {
1771
+ background: var(--bg-elev);
1772
+ border: 1px solid var(--border);
1773
+ border-radius: var(--radius-lg);
1774
+ display: flex;
1775
+ flex-direction: column;
1776
+ max-height: calc(100vh - 240px);
1777
+ transition:
1778
+ border-color var(--motion-base) var(--ease),
1779
+ background var(--motion-base) var(--ease);
1780
+ }
1781
+
1782
+ .kanban-column-drop {
1783
+ border-color: var(--accent);
1784
+ background: var(--accent-bg);
1785
+ }
1786
+
1787
+ .kanban-col-header {
1788
+ display: flex;
1789
+ align-items: center;
1790
+ justify-content: space-between;
1791
+ padding: var(--space-3) var(--space-4);
1792
+ border-bottom: 1px solid var(--border);
1793
+ flex-shrink: 0;
1794
+ }
1795
+
1796
+ .kanban-col-count {
1797
+ font-size: 11px;
1798
+ color: var(--text-dim);
1799
+ background: var(--bg);
1800
+ padding: 2px 8px;
1801
+ border-radius: 999px;
1802
+ border: 1px solid var(--border);
1803
+ font-family: var(--font-mono);
1804
+ }
1805
+
1806
+ .kanban-col-body {
1807
+ flex: 1;
1808
+ overflow-y: auto;
1809
+ padding: var(--space-3);
1810
+ display: flex;
1811
+ flex-direction: column;
1812
+ gap: var(--space-2);
1813
+ min-height: 120px;
1814
+ }
1815
+
1816
+ .kanban-empty {
1817
+ text-align: center;
1818
+ color: var(--text-dim);
1819
+ font-size: 12px;
1820
+ padding: var(--space-5) 0;
1821
+ }
1822
+
1823
+ .kanban-col-footer {
1824
+ padding: var(--space-2) var(--space-3);
1825
+ border-top: 1px solid var(--border);
1826
+ flex-shrink: 0;
1827
+ }
1828
+
1829
+ .task-card {
1830
+ background: var(--bg);
1831
+ border: 1px solid var(--border);
1832
+ border-radius: var(--radius);
1833
+ padding: var(--space-3);
1834
+ cursor: pointer;
1835
+ border-left: 3px solid transparent;
1836
+ transition:
1837
+ border-color var(--motion-base) var(--ease),
1838
+ box-shadow var(--motion-base) var(--ease),
1839
+ transform var(--motion-fast) var(--ease),
1840
+ background var(--motion-base) var(--ease);
1841
+ }
1842
+
1843
+ .task-card:hover {
1844
+ border-color: var(--border-strong);
1845
+ transform: translateY(-1px);
1846
+ box-shadow: var(--shadow-2);
1847
+ }
1848
+
1849
+ .task-card-focused {
1850
+ outline: 2px solid var(--accent);
1851
+ outline-offset: -2px;
1852
+ }
1853
+
1854
+ .task-card.priority-high {
1855
+ border-left-color: var(--error);
1856
+ }
1857
+ .task-card.priority-low {
1858
+ border-left-color: var(--text-dim);
1859
+ }
1860
+ .task-card.priority-normal {
1861
+ border-left-color: var(--info);
1862
+ }
1863
+
1864
+ .task-card-head {
1865
+ display: flex;
1866
+ align-items: flex-start;
1867
+ gap: var(--space-2);
1868
+ margin-bottom: 6px;
1869
+ }
1870
+
1871
+ .priority-dot {
1872
+ width: 8px;
1873
+ height: 8px;
1874
+ border-radius: 50%;
1875
+ flex-shrink: 0;
1876
+ margin-top: 6px;
1877
+ }
1878
+
1879
+ .task-card-title {
1880
+ font-weight: 600;
1881
+ font-size: 13px;
1882
+ color: var(--text-strong);
1883
+ flex: 1;
1884
+ word-break: break-word;
1885
+ line-height: 1.4;
1886
+ }
1887
+
1888
+ .task-card-desc {
1889
+ font-size: 12px;
1890
+ color: var(--text-dim);
1891
+ line-height: 1.5;
1892
+ margin-bottom: var(--space-2);
1893
+ display: -webkit-box;
1894
+ -webkit-line-clamp: 2;
1895
+ -webkit-box-orient: vertical;
1896
+ overflow: hidden;
1897
+ }
1898
+
1899
+ .task-card-tags {
1900
+ display: flex;
1901
+ flex-wrap: wrap;
1902
+ gap: 4px;
1903
+ margin-bottom: var(--space-2);
1904
+ }
1905
+
1906
+ .task-card-footer {
1907
+ display: flex;
1908
+ align-items: center;
1909
+ justify-content: space-between;
1910
+ gap: var(--space-2);
1911
+ }
1912
+
1913
+ .task-card-time {
1914
+ font-size: 10px;
1915
+ font-family: var(--font-mono);
1916
+ }
1917
+
1918
+ .task-card-actions {
1919
+ display: inline-flex;
1920
+ gap: 2px;
1921
+ }
1922
+
1923
+ .task-form {
1924
+ display: flex;
1925
+ flex-direction: column;
1926
+ gap: var(--space-2);
1927
+ }
1928
+
1929
+ .task-form-row {
1930
+ display: grid;
1931
+ grid-template-columns: 1fr 1fr;
1932
+ gap: var(--space-3);
1933
+ }
1934
+
1935
+ .task-form-field {
1936
+ display: flex;
1937
+ flex-direction: column;
1938
+ gap: var(--space-2);
1939
+ }
1940
+
1941
+ @keyframes task-move {
1942
+ 0% {
1943
+ background: var(--accent-bg);
1944
+ }
1945
+ 100% {
1946
+ background: transparent;
1947
+ }
1948
+ }
1949
+
1950
+ /* ─── Config editor ────────────────────────────────────────────────── */
1951
+
1952
+ .config-grid {
1953
+ display: grid;
1954
+ grid-template-columns: 1fr 1fr;
1955
+ gap: var(--space-4);
1956
+ }
1957
+
1958
+ @media (max-width: 1000px) {
1959
+ .config-grid {
1960
+ grid-template-columns: 1fr;
1961
+ }
1962
+ }
1963
+
1964
+ .config-textarea {
1965
+ min-height: 360px;
1966
+ font-family: var(--font-mono);
1967
+ font-size: 12px;
1968
+ line-height: 1.55;
1969
+ width: 100%;
1970
+ white-space: pre;
1971
+ }
1972
+
1973
+ .config-textarea.invalid {
1974
+ border-color: var(--error);
1975
+ }
1976
+
1977
+ .json-tree {
1978
+ font-family: var(--font-mono);
1979
+ font-size: 12px;
1980
+ line-height: 1.6;
1981
+ white-space: pre;
1982
+ overflow-x: auto;
1983
+ max-height: 380px;
1984
+ overflow-y: auto;
1985
+ padding: var(--space-3);
1986
+ background: var(--bg);
1987
+ border: 1px solid var(--border);
1988
+ border-radius: var(--radius);
1989
+ }
1990
+
1991
+ .diff-card {
1992
+ gap: var(--space-2);
1993
+ }
1994
+
1995
+ .diff-view {
1996
+ font-size: 11px;
1997
+ line-height: 1.5;
1998
+ max-height: 300px;
1999
+ overflow-y: auto;
2000
+ padding: var(--space-3);
2001
+ background: var(--bg);
2002
+ border: 1px solid var(--border);
2003
+ border-radius: var(--radius);
2004
+ }
2005
+
2006
+ .diff-line {
2007
+ padding: 0 var(--space-2);
2008
+ white-space: pre;
2009
+ }
2010
+
2011
+ .diff-line-removed {
2012
+ color: var(--error);
2013
+ background: rgba(248, 113, 113, 0.08);
2014
+ }
2015
+
2016
+ .diff-line-added {
2017
+ color: var(--success);
2018
+ background: rgba(52, 211, 153, 0.08);
2019
+ }
2020
+
2021
+ /* ─── Settings view ────────────────────────────────────────────────── */
2022
+
2023
+ .settings-grid {
2024
+ display: grid;
2025
+ grid-template-columns: 1fr 1fr;
2026
+ gap: var(--space-4);
2027
+ }
2028
+
2029
+ @media (max-width: 900px) {
2030
+ .settings-grid {
2031
+ grid-template-columns: 1fr;
2032
+ }
2033
+ }
2034
+
2035
+ .theme-row {
2036
+ display: flex;
2037
+ gap: var(--space-2);
2038
+ flex-wrap: wrap;
2039
+ }
2040
+
2041
+ .theme-card {
2042
+ flex: 1;
2043
+ min-width: 100px;
2044
+ display: flex;
2045
+ flex-direction: column;
2046
+ align-items: center;
2047
+ gap: var(--space-2);
2048
+ padding: var(--space-3);
2049
+ background: var(--bg);
2050
+ border: 1px solid var(--border);
2051
+ border-radius: var(--radius);
2052
+ cursor: pointer;
2053
+ color: var(--text-dim);
2054
+ transition:
2055
+ border-color var(--motion-base) var(--ease),
2056
+ background var(--motion-base) var(--ease),
2057
+ color var(--motion-base) var(--ease);
2058
+ }
2059
+
2060
+ .theme-card:hover {
2061
+ border-color: var(--border-strong);
2062
+ color: var(--text);
2063
+ }
2064
+
2065
+ .theme-card-active {
2066
+ border-color: var(--accent);
2067
+ background: var(--accent-bg);
2068
+ color: var(--accent-2);
2069
+ }
2070
+
2071
+ .theme-card-label {
2072
+ font-size: 12px;
2073
+ font-weight: 500;
2074
+ }
2075
+
2076
+ .theme-card-swatch {
2077
+ width: 100%;
2078
+ height: 24px;
2079
+ border-radius: var(--radius-sm);
2080
+ border: 1px solid var(--border);
2081
+ }
2082
+
2083
+ .theme-card-swatch-dark {
2084
+ background: linear-gradient(135deg, #0b0e14, #1a1f2b);
2085
+ }
2086
+ .theme-card-swatch-light {
2087
+ background: linear-gradient(135deg, #f7f8fa, #e6ebf2);
2088
+ }
2089
+ .theme-card-swatch-system {
2090
+ background: linear-gradient(
2091
+ 135deg,
2092
+ #0b0e14 0%,
2093
+ #0b0e14 50%,
2094
+ #f7f8fa 50%,
2095
+ #f7f8fa 100%
2096
+ );
2097
+ }
2098
+
2099
+ /* ─── Toasts ───────────────────────────────────────────────────────── */
2100
+
2101
+ .toast-stack {
2102
+ position: fixed;
2103
+ bottom: var(--space-5);
2104
+ right: var(--space-5);
2105
+ display: flex;
2106
+ flex-direction: column;
2107
+ gap: var(--space-2);
2108
+ z-index: 1000;
2109
+ pointer-events: none;
2110
+ max-width: 420px;
2111
+ }
2112
+
2113
+ .toast {
2114
+ display: inline-flex;
2115
+ align-items: center;
2116
+ gap: var(--space-2);
2117
+ background: var(--bg-elev);
2118
+ border: 1px solid var(--border);
2119
+ border-left: 3px solid var(--accent);
2120
+ border-radius: var(--radius);
2121
+ padding: 10px 14px;
2122
+ box-shadow: var(--shadow-3);
2123
+ font-size: 13px;
2124
+ pointer-events: auto;
2125
+ animation: toast-in var(--motion-slow) var(--ease);
2126
+ min-width: 240px;
2127
+ color: var(--text);
2128
+ }
2129
+
2130
+ .toast-icon {
2131
+ flex-shrink: 0;
2132
+ }
2133
+
2134
+ .toast-message {
2135
+ flex: 1;
2136
+ word-break: break-word;
2137
+ }
2138
+
2139
+ .toast-close {
2140
+ background: transparent;
2141
+ border: none;
2142
+ color: var(--text-dim);
2143
+ cursor: pointer;
2144
+ padding: 2px;
2145
+ display: inline-flex;
2146
+ }
2147
+
2148
+ .toast-close:hover {
2149
+ color: var(--text);
2150
+ }
2151
+
2152
+ .toast-success {
2153
+ border-left-color: var(--success);
2154
+ }
2155
+ .toast-success .toast-icon {
2156
+ color: var(--success);
2157
+ }
2158
+
2159
+ .toast-error {
2160
+ border-left-color: var(--error);
2161
+ }
2162
+ .toast-error .toast-icon {
2163
+ color: var(--error);
2164
+ }
2165
+
2166
+ .toast-warning {
2167
+ border-left-color: var(--warning);
2168
+ }
2169
+ .toast-warning .toast-icon {
2170
+ color: var(--warning);
2171
+ }
2172
+
2173
+ .toast-info .toast-icon {
2174
+ color: var(--info);
2175
+ }
2176
+
2177
+ @keyframes toast-in {
2178
+ from {
2179
+ transform: translateX(110%);
2180
+ opacity: 0;
2181
+ }
2182
+ to {
2183
+ transform: translateX(0);
2184
+ opacity: 1;
2185
+ }
2186
+ }
2187
+
2188
+ /* ─── Modal ────────────────────────────────────────────────────────── */
2189
+
2190
+ .modal-stack {
2191
+ position: fixed;
2192
+ inset: 0;
2193
+ z-index: 999;
2194
+ pointer-events: none;
2195
+ }
2196
+
2197
+ .modal-backdrop {
2198
+ position: absolute;
2199
+ inset: 0;
2200
+ background: rgba(0, 0, 0, 0.6);
2201
+ backdrop-filter: blur(4px);
2202
+ display: flex;
2203
+ align-items: center;
2204
+ justify-content: center;
2205
+ padding: var(--space-4);
2206
+ pointer-events: auto;
2207
+ animation: fade-in var(--motion-base) var(--ease);
2208
+ }
2209
+
2210
+ @keyframes fade-in {
2211
+ from {
2212
+ opacity: 0;
2213
+ }
2214
+ to {
2215
+ opacity: 1;
2216
+ }
2217
+ }
2218
+
2219
+ .modal {
2220
+ background: var(--bg-elev);
2221
+ border: 1px solid var(--border);
2222
+ border-radius: var(--radius-lg);
2223
+ width: min(560px, 100%);
2224
+ max-height: 80vh;
2225
+ display: flex;
2226
+ flex-direction: column;
2227
+ box-shadow: var(--shadow-3);
2228
+ animation: modal-in var(--motion-slow) var(--ease);
2229
+ overflow: hidden;
2230
+ }
2231
+
2232
+ @keyframes modal-in {
2233
+ from {
2234
+ opacity: 0;
2235
+ transform: translateY(8px) scale(0.98);
2236
+ }
2237
+ to {
2238
+ opacity: 1;
2239
+ transform: none;
2240
+ }
2241
+ }
2242
+
2243
+ .modal-header {
2244
+ display: flex;
2245
+ align-items: center;
2246
+ justify-content: space-between;
2247
+ gap: var(--space-3);
2248
+ padding: var(--space-4) var(--space-5);
2249
+ border-bottom: 1px solid var(--border);
2250
+ }
2251
+
2252
+ .modal-title {
2253
+ font-size: 16px;
2254
+ font-weight: 600;
2255
+ margin: 0;
2256
+ color: var(--text-strong);
2257
+ }
2258
+
2259
+ .modal-body {
2260
+ flex: 1;
2261
+ overflow-y: auto;
2262
+ padding: var(--space-5);
2263
+ font-size: 13px;
2264
+ line-height: 1.55;
2265
+ }
2266
+
2267
+ .modal-footer {
2268
+ display: flex;
2269
+ align-items: center;
2270
+ justify-content: flex-end;
2271
+ gap: var(--space-2);
2272
+ padding: var(--space-3) var(--space-5);
2273
+ border-top: 1px solid var(--border);
2274
+ background: var(--bg-elev-2);
2275
+ }
2276
+
2277
+ .modal-footer-actions {
2278
+ display: flex;
2279
+ gap: var(--space-2);
2280
+ justify-content: flex-end;
2281
+ width: 100%;
2282
+ }
2283
+
2284
+ .code-block {
2285
+ background: var(--bg);
2286
+ padding: var(--space-3);
2287
+ border-radius: var(--radius);
2288
+ border: 1px solid var(--border);
2289
+ font-size: 12px;
2290
+ margin: var(--space-2) 0 0;
2291
+ overflow-x: auto;
2292
+ }
2293
+
2294
+ kbd {
2295
+ display: inline-flex;
2296
+ align-items: center;
2297
+ padding: 1px 6px;
2298
+ border-radius: var(--radius-sm);
2299
+ background: var(--bg-elev-2);
2300
+ border: 1px solid var(--border);
2301
+ border-bottom-width: 2px;
2302
+ font-family: var(--font-mono);
2303
+ font-size: 10px;
2304
+ color: var(--text-dim);
2305
+ }
2306
+
2307
+ /* ─── Responsive ───────────────────────────────────────────────────── */
2308
+
2309
+ @media (max-width: 800px) {
2310
+ .topbar {
2311
+ padding: 0 var(--space-3);
2312
+ gap: var(--space-3);
2313
+ }
2314
+ .brand-version,
2315
+ .tab-label {
2316
+ display: none;
2317
+ }
2318
+ .content {
2319
+ padding: var(--space-4);
2320
+ }
2321
+ .ws-status .ws-label {
2322
+ display: none;
2323
+ }
2324
+ }
2325
+
2326
+ /* ─── v3.0.0 additions ─────────────────────────────────────────────── */
2327
+
2328
+ /* Project selector in topbar */
2329
+ .project-selector {
2330
+ position: relative;
2331
+ }
2332
+ .project-selector-btn {
2333
+ display: inline-flex;
2334
+ align-items: center;
2335
+ gap: 6px;
2336
+ padding: 4px 10px;
2337
+ border: 1px solid var(--border);
2338
+ background: var(--bg-elev-2);
2339
+ color: var(--text);
2340
+ border-radius: 6px;
2341
+ font-size: 13px;
2342
+ cursor: pointer;
2343
+ transition: background var(--motion-fast) var(--ease);
2344
+ max-width: 200px;
2345
+ }
2346
+ .project-selector-btn:hover {
2347
+ background: var(--bg-elev-3);
2348
+ }
2349
+ .project-selector-name {
2350
+ overflow: hidden;
2351
+ text-overflow: ellipsis;
2352
+ white-space: nowrap;
2353
+ max-width: 160px;
2354
+ }
2355
+ .project-selector-menu {
2356
+ position: absolute;
2357
+ top: calc(100% + 4px);
2358
+ left: 0;
2359
+ min-width: 280px;
2360
+ background: var(--bg-elev-2);
2361
+ border: 1px solid var(--border-strong);
2362
+ border-radius: 8px;
2363
+ box-shadow: var(--shadow-2);
2364
+ z-index: 100;
2365
+ padding: 4px;
2366
+ }
2367
+ .project-selector-menu-head {
2368
+ display: flex;
2369
+ align-items: center;
2370
+ justify-content: space-between;
2371
+ padding: 4px 8px;
2372
+ font-size: 11px;
2373
+ text-transform: uppercase;
2374
+ letter-spacing: 0.05em;
2375
+ }
2376
+ .project-selector-list {
2377
+ list-style: none;
2378
+ margin: 0;
2379
+ padding: 0;
2380
+ max-height: 320px;
2381
+ overflow-y: auto;
2382
+ }
2383
+ .project-selector-item {
2384
+ display: flex;
2385
+ align-items: center;
2386
+ justify-content: space-between;
2387
+ padding: 8px 10px;
2388
+ border-radius: 6px;
2389
+ cursor: pointer;
2390
+ font-size: 13px;
2391
+ }
2392
+ .project-selector-item:hover {
2393
+ background: var(--bg-elev-3);
2394
+ }
2395
+ .project-selector-item.active {
2396
+ background: var(--accent-bg);
2397
+ color: var(--accent-2);
2398
+ }
2399
+ .project-selector-item-status {
2400
+ font-size: 10px;
2401
+ text-transform: uppercase;
2402
+ color: var(--text-dim);
2403
+ }
2404
+ .project-selector-empty {
2405
+ padding: 8px 10px;
2406
+ font-size: 12px;
2407
+ }
2408
+
2409
+ /* Topbar search */
2410
+ .topbar-search {
2411
+ display: inline-flex;
2412
+ align-items: center;
2413
+ gap: 8px;
2414
+ padding: 4px 10px;
2415
+ background: var(--bg-elev-2);
2416
+ border: 1px solid var(--border);
2417
+ border-radius: 6px;
2418
+ color: var(--text-dim);
2419
+ font-size: 13px;
2420
+ cursor: pointer;
2421
+ min-width: 180px;
2422
+ transition: background var(--motion-fast) var(--ease);
2423
+ }
2424
+ .topbar-search:hover {
2425
+ background: var(--bg-elev-3);
2426
+ }
2427
+ .topbar-search span {
2428
+ flex: 1;
2429
+ text-align: left;
2430
+ }
2431
+ .topbar-search kbd {
2432
+ font-family: var(--font-mono);
2433
+ font-size: 10px;
2434
+ padding: 1px 5px;
2435
+ background: var(--bg-elev-3);
2436
+ border: 1px solid var(--border);
2437
+ border-radius: 3px;
2438
+ }
2439
+
2440
+ /* Search modal */
2441
+ .search-modal-backdrop {
2442
+ position: fixed;
2443
+ inset: 0;
2444
+ background: rgba(0, 0, 0, 0.6);
2445
+ display: flex;
2446
+ align-items: flex-start;
2447
+ justify-content: center;
2448
+ z-index: 200;
2449
+ padding-top: 12vh;
2450
+ }
2451
+ .search-modal {
2452
+ width: 640px;
2453
+ max-width: 90vw;
2454
+ max-height: 70vh;
2455
+ background: var(--bg-elev-2);
2456
+ border: 1px solid var(--border-strong);
2457
+ border-radius: 12px;
2458
+ box-shadow: var(--shadow-3);
2459
+ display: flex;
2460
+ flex-direction: column;
2461
+ overflow: hidden;
2462
+ }
2463
+ .search-modal-head {
2464
+ display: flex;
2465
+ align-items: center;
2466
+ gap: 10px;
2467
+ padding: 12px 16px;
2468
+ border-bottom: 1px solid var(--border);
2469
+ }
2470
+ .search-modal-input {
2471
+ flex: 1;
2472
+ background: transparent;
2473
+ border: none;
2474
+ outline: none;
2475
+ color: var(--text);
2476
+ font-size: 15px;
2477
+ }
2478
+ .search-modal-scopes {
2479
+ display: flex;
2480
+ gap: 4px;
2481
+ padding: 6px 12px;
2482
+ border-bottom: 1px solid var(--border);
2483
+ }
2484
+ .search-scope {
2485
+ padding: 3px 8px;
2486
+ background: var(--bg-elev);
2487
+ border: 1px solid var(--border);
2488
+ border-radius: 4px;
2489
+ color: var(--text-dim);
2490
+ font-size: 11px;
2491
+ cursor: pointer;
2492
+ }
2493
+ .search-scope-active {
2494
+ background: var(--accent-bg);
2495
+ color: var(--accent-2);
2496
+ border-color: var(--accent-border);
2497
+ }
2498
+ .search-modal-body {
2499
+ flex: 1;
2500
+ overflow-y: auto;
2501
+ padding: 8px 0;
2502
+ }
2503
+ .search-group {
2504
+ margin-bottom: 8px;
2505
+ }
2506
+ .search-group-head {
2507
+ padding: 4px 16px;
2508
+ font-size: 10px;
2509
+ text-transform: uppercase;
2510
+ color: var(--text-dim);
2511
+ letter-spacing: 0.05em;
2512
+ }
2513
+ .search-result {
2514
+ display: flex;
2515
+ align-items: center;
2516
+ gap: 12px;
2517
+ width: 100%;
2518
+ padding: 6px 16px;
2519
+ background: transparent;
2520
+ border: none;
2521
+ text-align: left;
2522
+ color: var(--text);
2523
+ cursor: pointer;
2524
+ }
2525
+ .search-result:hover,
2526
+ .search-result-active {
2527
+ background: var(--bg-elev-3);
2528
+ }
2529
+ .search-result-type {
2530
+ font-size: 10px;
2531
+ padding: 1px 5px;
2532
+ background: var(--accent-bg);
2533
+ color: var(--accent-2);
2534
+ border-radius: 3px;
2535
+ text-transform: uppercase;
2536
+ }
2537
+ .search-result-label {
2538
+ flex: 1;
2539
+ font-size: 13px;
2540
+ overflow: hidden;
2541
+ text-overflow: ellipsis;
2542
+ white-space: nowrap;
2543
+ }
2544
+ .search-modal-foot {
2545
+ padding: 6px 16px;
2546
+ font-size: 11px;
2547
+ border-top: 1px solid var(--border);
2548
+ }
2549
+
2550
+ /* Project cards (Overview) */
2551
+ .project-grid {
2552
+ display: grid;
2553
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
2554
+ gap: var(--space-3);
2555
+ }
2556
+ .project-card {
2557
+ background: var(--bg-elev);
2558
+ border: 1px solid var(--border);
2559
+ border-radius: 8px;
2560
+ padding: 14px;
2561
+ display: flex;
2562
+ flex-direction: column;
2563
+ gap: 8px;
2564
+ transition: border-color var(--motion-fast) var(--ease);
2565
+ }
2566
+ .project-card:hover {
2567
+ border-color: var(--border-strong);
2568
+ }
2569
+ .project-card-active {
2570
+ border-color: var(--accent);
2571
+ box-shadow: var(--shadow-glow);
2572
+ }
2573
+ .project-card-head {
2574
+ display: flex;
2575
+ align-items: center;
2576
+ gap: 8px;
2577
+ }
2578
+ .project-card-name {
2579
+ font-weight: 600;
2580
+ flex: 1;
2581
+ font-size: 14px;
2582
+ overflow: hidden;
2583
+ text-overflow: ellipsis;
2584
+ }
2585
+ .project-card-status {
2586
+ font-size: 9px;
2587
+ padding: 1px 5px;
2588
+ border-radius: 3px;
2589
+ text-transform: uppercase;
2590
+ letter-spacing: 0.05em;
2591
+ }
2592
+ .status-on { background: rgba(63, 185, 80, 0.18); color: var(--success); }
2593
+ .status-neutral { background: var(--bg-elev-2); color: var(--text-dim); }
2594
+ .status-error { background: rgba(248, 113, 113, 0.18); color: var(--error); }
2595
+ .project-card-path {
2596
+ font-size: 11px;
2597
+ color: var(--text-dim);
2598
+ overflow: hidden;
2599
+ text-overflow: ellipsis;
2600
+ white-space: nowrap;
2601
+ }
2602
+ .project-card-meta {
2603
+ font-size: 11px;
2604
+ color: var(--text-dim);
2605
+ }
2606
+ .project-card-actions {
2607
+ display: flex;
2608
+ gap: 4px;
2609
+ margin-top: auto;
2610
+ }
2611
+ .project-picker {
2612
+ margin-bottom: var(--space-4);
2613
+ }
2614
+
2615
+ /* Mod cards (Overview mini + Mods page) */
2616
+ .mod-mini-list {
2617
+ list-style: none;
2618
+ margin: 0;
2619
+ padding: 0;
2620
+ display: flex;
2621
+ flex-direction: column;
2622
+ gap: 4px;
2623
+ }
2624
+ .mod-mini {
2625
+ display: grid;
2626
+ grid-template-columns: 1fr auto auto;
2627
+ align-items: center;
2628
+ gap: 8px;
2629
+ padding: 4px 0;
2630
+ font-size: 12px;
2631
+ }
2632
+ .mod-mini-name {
2633
+ font-family: var(--font-mono);
2634
+ color: var(--text);
2635
+ }
2636
+ .mod-mini-meta {
2637
+ color: var(--text-dim);
2638
+ font-size: 11px;
2639
+ }
2640
+ .mod-mini-pill {
2641
+ font-size: 9px;
2642
+ padding: 1px 5px;
2643
+ border-radius: 3px;
2644
+ text-transform: uppercase;
2645
+ }
2646
+ .mod-mini-pill-on { background: rgba(63, 185, 80, 0.18); color: var(--success); }
2647
+ .mod-mini-pill-off { background: var(--bg-elev-2); color: var(--text-dim); }
2648
+
2649
+ /* Mods view layout */
2650
+ .mods-layout {
2651
+ display: grid;
2652
+ grid-template-columns: 360px 1fr;
2653
+ gap: var(--space-4);
2654
+ }
2655
+ .mods-list {
2656
+ display: flex;
2657
+ flex-direction: column;
2658
+ gap: 8px;
2659
+ max-height: 70vh;
2660
+ overflow-y: auto;
2661
+ }
2662
+ .mod-list-item {
2663
+ padding: 12px;
2664
+ background: var(--bg-elev);
2665
+ border: 1px solid var(--border);
2666
+ border-radius: 8px;
2667
+ cursor: pointer;
2668
+ transition: border-color var(--motion-fast) var(--ease);
2669
+ }
2670
+ .mod-list-item:hover { border-color: var(--border-strong); }
2671
+ .mod-list-item-active { border-color: var(--accent); }
2672
+ .mod-list-item-head {
2673
+ display: flex;
2674
+ justify-content: space-between;
2675
+ align-items: flex-start;
2676
+ margin-bottom: 6px;
2677
+ }
2678
+ .mod-list-item-name { font-weight: 600; font-size: 14px; }
2679
+ .mod-list-item-meta { font-size: 11px; color: var(--text-dim); }
2680
+ .mod-list-item-desc { font-size: 12px; color: var(--text-dim); margin-bottom: 6px; }
2681
+ .mod-list-item-status { font-size: 11px; }
2682
+ .ellipsis-2 {
2683
+ display: -webkit-box;
2684
+ -webkit-line-clamp: 2;
2685
+ -webkit-box-orient: vertical;
2686
+ overflow: hidden;
2687
+ }
2688
+ .mod-files { margin-top: var(--space-3); }
2689
+ .mod-files ul { list-style: none; padding: 0; margin: 0; font-size: 12px; }
2690
+ .mod-files li { display: flex; gap: 8px; padding: 2px 0; }
2691
+ .mod-file-cat {
2692
+ font-size: 10px;
2693
+ text-transform: uppercase;
2694
+ color: var(--text-dim);
2695
+ min-width: 64px;
2696
+ }
2697
+
2698
+ /* Schedule cards */
2699
+ .schedule-grid {
2700
+ display: grid;
2701
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
2702
+ gap: var(--space-3);
2703
+ }
2704
+ .schedule-card-head {
2705
+ display: flex;
2706
+ justify-content: space-between;
2707
+ align-items: flex-start;
2708
+ margin-bottom: 8px;
2709
+ }
2710
+ .schedule-card-name { font-weight: 600; font-size: 14px; }
2711
+ .schedule-card-meta { font-size: 11px; color: var(--text-dim); }
2712
+ .schedule-card-action {
2713
+ font-size: 12px;
2714
+ margin: 8px 0;
2715
+ }
2716
+ .schedule-card-times {
2717
+ display: flex;
2718
+ justify-content: space-between;
2719
+ font-size: 12px;
2720
+ margin-bottom: 6px;
2721
+ }
2722
+ .schedule-card-history summary {
2723
+ cursor: pointer;
2724
+ font-size: 11px;
2725
+ color: var(--text-dim);
2726
+ display: inline-flex;
2727
+ align-items: center;
2728
+ gap: 4px;
2729
+ }
2730
+ .schedule-card-history ul {
2731
+ list-style: none;
2732
+ padding: 0;
2733
+ margin: 6px 0 0;
2734
+ font-size: 12px;
2735
+ }
2736
+ .schedule-card-history li {
2737
+ padding: 2px 0;
2738
+ border-bottom: 1px solid var(--border);
2739
+ }
2740
+ .schedule-form .task-form-row { margin-top: 12px; }
2741
+ .tag { font-size: 10px; padding: 1px 5px; border-radius: 3px; background: var(--bg-elev-2); color: var(--text-dim); display: inline-block; margin-right: 4px; }
2742
+ .tag-success { background: rgba(63, 185, 80, 0.18); color: var(--success); }
2743
+ .tag-error { background: rgba(248, 113, 113, 0.18); color: var(--error); }
2744
+ .tag-neutral { background: var(--bg-elev-2); color: var(--text-dim); }
2745
+
2746
+ /* Floating chat layout */
2747
+ .chat-layout {
2748
+ display: grid;
2749
+ grid-template-columns: 200px 1fr 280px;
2750
+ gap: var(--space-3);
2751
+ height: calc(100vh - 200px);
2752
+ min-height: 480px;
2753
+ }
2754
+ .chat-sessions {
2755
+ background: var(--bg-elev);
2756
+ border: 1px solid var(--border);
2757
+ border-radius: 8px;
2758
+ display: flex;
2759
+ flex-direction: column;
2760
+ overflow: hidden;
2761
+ }
2762
+ .chat-sessions-head {
2763
+ display: flex;
2764
+ align-items: center;
2765
+ justify-content: space-between;
2766
+ padding: 8px 12px;
2767
+ border-bottom: 1px solid var(--border);
2768
+ font-size: 11px;
2769
+ text-transform: uppercase;
2770
+ letter-spacing: 0.05em;
2771
+ }
2772
+ .chat-sessions-list {
2773
+ list-style: none;
2774
+ margin: 0;
2775
+ padding: 0;
2776
+ flex: 1;
2777
+ overflow-y: auto;
2778
+ }
2779
+ .chat-session-item {
2780
+ display: flex;
2781
+ flex-direction: column;
2782
+ padding: 8px 12px;
2783
+ border-bottom: 1px solid var(--border);
2784
+ cursor: pointer;
2785
+ font-size: 12px;
2786
+ }
2787
+ .chat-session-item:hover { background: var(--bg-elev-2); }
2788
+ .chat-session-item.active { background: var(--accent-bg); color: var(--accent-2); }
2789
+ .chat-session-id {
2790
+ font-family: var(--font-mono);
2791
+ font-size: 11px;
2792
+ overflow: hidden;
2793
+ text-overflow: ellipsis;
2794
+ white-space: nowrap;
2795
+ }
2796
+ .chat-session-meta { color: var(--text-dim); font-size: 10px; }
2797
+ .chat-main {
2798
+ display: flex;
2799
+ flex-direction: column;
2800
+ background: var(--bg-elev);
2801
+ border: 1px solid var(--border);
2802
+ border-radius: 8px;
2803
+ overflow: hidden;
2804
+ }
2805
+ .chat-list {
2806
+ flex: 1;
2807
+ overflow-y: auto;
2808
+ padding: var(--space-3);
2809
+ }
2810
+ .chat-msg {
2811
+ margin-bottom: var(--space-3);
2812
+ padding: var(--space-3);
2813
+ background: var(--bg-elev-2);
2814
+ border-radius: 8px;
2815
+ border: 1px solid var(--border);
2816
+ }
2817
+ .chat-msg-pinned {
2818
+ border-color: var(--accent);
2819
+ background: var(--accent-bg);
2820
+ }
2821
+ .chat-msg-meta {
2822
+ display: flex;
2823
+ align-items: center;
2824
+ gap: 8px;
2825
+ font-size: 11px;
2826
+ color: var(--text-dim);
2827
+ margin-bottom: 6px;
2828
+ }
2829
+ .chat-msg-role {
2830
+ text-transform: uppercase;
2831
+ font-size: 10px;
2832
+ padding: 1px 5px;
2833
+ border-radius: 3px;
2834
+ background: var(--bg-elev-3);
2835
+ color: var(--text);
2836
+ }
2837
+ .chat-msg-agent {
2838
+ font-family: var(--font-mono);
2839
+ color: var(--accent-2);
2840
+ }
2841
+ .chat-msg-pin {
2842
+ display: inline-flex;
2843
+ align-items: center;
2844
+ gap: 2px;
2845
+ color: var(--accent);
2846
+ }
2847
+ .chat-msg-actions {
2848
+ margin-left: auto;
2849
+ display: flex;
2850
+ gap: 2px;
2851
+ }
2852
+ .chat-msg-body { font-size: 13px; }
2853
+ .chat-info {
2854
+ display: flex;
2855
+ flex-direction: column;
2856
+ gap: var(--space-3);
2857
+ overflow-y: auto;
2858
+ }
2859
+ .slash-mini-list {
2860
+ list-style: none;
2861
+ margin: 0;
2862
+ padding: 0;
2863
+ font-size: 12px;
2864
+ }
2865
+ .slash-mini-list li { padding: 4px 0; border-bottom: 1px solid var(--border); }
2866
+ .chat-composer {
2867
+ border-top: 1px solid var(--border);
2868
+ padding: var(--space-3);
2869
+ background: var(--bg-elev-2);
2870
+ }
2871
+ .chat-suggestions {
2872
+ display: flex;
2873
+ flex-direction: column;
2874
+ gap: 4px;
2875
+ margin-bottom: 6px;
2876
+ max-height: 200px;
2877
+ overflow-y: auto;
2878
+ }
2879
+ .chat-suggestion {
2880
+ display: flex;
2881
+ align-items: center;
2882
+ gap: 12px;
2883
+ padding: 6px 10px;
2884
+ background: var(--bg-elev);
2885
+ border: 1px solid var(--border);
2886
+ border-radius: 6px;
2887
+ cursor: pointer;
2888
+ font-size: 12px;
2889
+ text-align: left;
2890
+ }
2891
+ .chat-suggestion:hover { background: var(--bg-elev-3); }
2892
+ .chat-suggestion-desc { color: var(--text-dim); }
2893
+ .chat-attachments { display: flex; gap: 4px; margin-bottom: 6px; flex-wrap: wrap; }
2894
+ .chat-attachment-tag {
2895
+ display: inline-flex;
2896
+ align-items: center;
2897
+ gap: 4px;
2898
+ font-size: 11px;
2899
+ padding: 2px 6px;
2900
+ background: var(--bg-elev-3);
2901
+ border-radius: 3px;
2902
+ }
2903
+ .chat-composer-row {
2904
+ display: flex;
2905
+ gap: 6px;
2906
+ align-items: flex-end;
2907
+ }
2908
+ .chat-composer-row .chat-input { flex: 1; min-height: 56px; }
2909
+ .chat-input {
2910
+ flex: 1;
2911
+ background: var(--bg-elev);
2912
+ border: 1px solid var(--border);
2913
+ border-radius: 6px;
2914
+ color: var(--text);
2915
+ padding: 8px 10px;
2916
+ font-family: inherit;
2917
+ font-size: 13px;
2918
+ resize: vertical;
2919
+ }
2920
+ .color-row { display: flex; gap: 6px; align-items: center; }
2921
+ .color-input { padding: 0; width: 36px; height: 28px; }
2922
+ .theme-colors {
2923
+ display: grid;
2924
+ grid-template-columns: 1fr 1fr;
2925
+ gap: var(--space-3);
2926
+ margin: var(--space-3) 0;
2927
+ }
2928
+ .layout-row { display: flex; gap: 6px; }
2929
+ .layout-card {
2930
+ flex: 1;
2931
+ padding: 10px;
2932
+ background: var(--bg-elev);
2933
+ border: 1px solid var(--border);
2934
+ border-radius: 6px;
2935
+ cursor: pointer;
2936
+ text-align: center;
2937
+ font-size: 12px;
2938
+ }
2939
+ .layout-card-active {
2940
+ background: var(--accent-bg);
2941
+ border-color: var(--accent);
2942
+ color: var(--accent-2);
2943
+ }
2944
+
2945
+ /* Config — advanced + diagnostics */
2946
+ .config-advanced {
2947
+ margin-top: var(--space-4);
2948
+ }
2949
+ .config-advanced-head {
2950
+ display: flex;
2951
+ align-items: center;
2952
+ gap: 8px;
2953
+ width: 100%;
2954
+ background: transparent;
2955
+ border: none;
2956
+ color: var(--text);
2957
+ font-size: 14px;
2958
+ cursor: pointer;
2959
+ padding: 4px 0;
2960
+ text-align: left;
2961
+ }
2962
+ .config-advanced-body { margin-top: var(--space-3); }
2963
+ .config-advanced-tabs {
2964
+ display: flex;
2965
+ gap: 4px;
2966
+ border-bottom: 1px solid var(--border);
2967
+ margin-bottom: var(--space-3);
2968
+ }
2969
+ .config-advanced-tabs .tab {
2970
+ display: inline-flex;
2971
+ align-items: center;
2972
+ gap: 4px;
2973
+ padding: 6px 10px;
2974
+ background: transparent;
2975
+ border: none;
2976
+ border-bottom: 2px solid transparent;
2977
+ color: var(--text-dim);
2978
+ cursor: pointer;
2979
+ font-size: 12px;
2980
+ }
2981
+ .config-advanced-tabs .tab-active {
2982
+ color: var(--accent-2);
2983
+ border-bottom-color: var(--accent);
2984
+ }
2985
+
2986
+ .diagnostics-card { margin-bottom: var(--space-3); }
2987
+ .diagnostics-grid {
2988
+ display: grid;
2989
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
2990
+ gap: 8px;
2991
+ margin-bottom: var(--space-3);
2992
+ }
2993
+ .diagnostic-tile {
2994
+ background: var(--bg-elev-2);
2995
+ border: 1px solid var(--border);
2996
+ border-radius: 6px;
2997
+ padding: 8px 10px;
2998
+ }
2999
+ .diagnostic-tile-label { font-size: 10px; color: var(--text-dim); text-transform: uppercase; }
3000
+ .diagnostic-tile-value { font-size: 14px; margin-top: 2px; }
3001
+ .diagnostic-counts {
3002
+ display: flex;
3003
+ gap: 16px;
3004
+ flex-wrap: wrap;
3005
+ font-size: 12px;
3006
+ color: var(--text-dim);
3007
+ margin-bottom: var(--space-3);
3008
+ }
3009
+ .diagnostic-errors ul {
3010
+ list-style: none;
3011
+ padding: 0;
3012
+ margin: 0;
3013
+ font-size: 11px;
3014
+ max-height: 200px;
3015
+ overflow-y: auto;
3016
+ background: var(--bg-elev-2);
3017
+ border: 1px solid var(--border);
3018
+ border-radius: 4px;
3019
+ padding: 8px;
3020
+ }
3021
+ .diagnostic-errors li { padding: 2px 0; }
3022
+ .link-btn { background: transparent; border: none; color: var(--accent-2); cursor: pointer; padding: 0; }
3023
+
3024
+ .provider-list, .mcp-list {
3025
+ display: flex;
3026
+ flex-direction: column;
3027
+ gap: var(--space-3);
3028
+ }
3029
+ .provider-row, .mcp-row {
3030
+ padding: var(--space-3);
3031
+ }
3032
+ .provider-row-head, .mcp-row-head {
3033
+ display: flex;
3034
+ align-items: center;
3035
+ justify-content: space-between;
3036
+ margin-bottom: 8px;
3037
+ }
3038
+ .provider-name, .mcp-name { font-weight: 600; }
3039
+ .provider-id { font-size: 11px; color: var(--text-dim); }
3040
+ .provider-meta { font-size: 12px; display: flex; flex-direction: column; gap: 4px; }
3041
+
3042
+ .debug-log {
3043
+ background: var(--bg-elev-2);
3044
+ border: 1px solid var(--border);
3045
+ border-radius: 4px;
3046
+ padding: 8px;
3047
+ font-size: 11px;
3048
+ max-height: 320px;
3049
+ overflow-y: auto;
3050
+ }
3051
+
3052
+ /* Tasks v3 — badges, timer, detail */
3053
+ .task-card-badges {
3054
+ display: flex;
3055
+ flex-wrap: wrap;
3056
+ gap: 4px;
3057
+ margin-top: 6px;
3058
+ }
3059
+ .task-card-badge {
3060
+ display: inline-flex;
3061
+ align-items: center;
3062
+ gap: 3px;
3063
+ font-size: 10px;
3064
+ padding: 1px 5px;
3065
+ background: var(--bg-elev-2);
3066
+ border: 1px solid var(--border);
3067
+ border-radius: 3px;
3068
+ color: var(--text-dim);
3069
+ }
3070
+ .task-card-timer { border-left: 3px solid var(--warning); }
3071
+ .task-card-timer-pill {
3072
+ display: inline-flex;
3073
+ align-items: center;
3074
+ gap: 2px;
3075
+ font-size: 10px;
3076
+ padding: 1px 5px;
3077
+ background: var(--warning);
3078
+ color: var(--bg);
3079
+ border-radius: 3px;
3080
+ }
3081
+ .task-detail { display: flex; flex-direction: column; gap: var(--space-3); }
3082
+ .task-detail-meta {
3083
+ display: flex;
3084
+ gap: 16px;
3085
+ font-size: 12px;
3086
+ color: var(--text-dim);
3087
+ flex-wrap: wrap;
3088
+ }
3089
+ .task-detail-row {
3090
+ display: flex;
3091
+ gap: 6px;
3092
+ align-items: center;
3093
+ margin: 6px 0;
3094
+ }
3095
+ .task-detail-desc { font-size: 13px; white-space: pre-wrap; }
3096
+ .task-comments, .task-activity {
3097
+ list-style: none;
3098
+ margin: 8px 0 0;
3099
+ padding: 0;
3100
+ font-size: 12px;
3101
+ max-height: 200px;
3102
+ overflow-y: auto;
3103
+ }
3104
+ .task-comments li, .task-activity li {
3105
+ padding: 4px 0;
3106
+ border-bottom: 1px solid var(--border);
3107
+ }
3108
+ .agent-form { display: flex; flex-direction: column; gap: 4px; }
3109
+ .agent-tools { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; padding: 4px 0; }
3110
+
3111
+ /* Compact mode */
3112
+ html[data-compact-mode="true"] {
3113
+ --space-1: 2px;
3114
+ --space-2: 4px;
3115
+ --space-3: 8px;
3116
+ --space-4: 12px;
3117
+ --space-5: 16px;
3118
+ --space-6: 20px;
3119
+ }
3120
+ html[data-compact-mode="true"] .kanban-col-header { padding: 4px; }
3121
+ html[data-compact-mode="true"] .task-card { padding: 6px; }
3122
+
3123
+ /* Animations */
3124
+ html[data-animations="false"] * {
3125
+ animation-duration: 0s !important;
3126
+ transition-duration: 0s !important;
3127
+ }
3128
+
3129
+ /* Layout variants */
3130
+ .app[data-layout="sidebar"] .topbar .tabs { display: none; }
3131
+ .app[data-layout="sidebar"] { display: grid; grid-template-columns: 200px 1fr; }
3132
+ .app[data-layout="sidebar"] .topbar { grid-column: 1 / -1; }
3133
+ .app[data-layout="both"] { display: grid; grid-template-columns: 200px 1fr; }
3134
+ .app[data-layout="both"] .topbar { grid-column: 1 / -1; }
3135
+ .app[data-layout="both"] .tabs { display: flex; flex-direction: column; }
3136
+ .app[data-layout="sidebar"] .tabs, .app[data-layout="both"] .tabs {
3137
+ display: flex;
3138
+ flex-direction: column;
3139
+ align-items: stretch;
3140
+ border-right: 1px solid var(--border);
3141
+ padding: var(--space-3);
3142
+ }
3143
+ .app[data-layout="sidebar"] .tab,
3144
+ .app[data-layout="both"] .tab {
3145
+ justify-content: flex-start;
3146
+ width: 100%;
3147
+ padding: 6px 10px;
3148
+ }