@polderlabs/bizar 2.6.1 → 3.0.1

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 (43) hide show
  1. package/cli/bin.mjs +158 -130
  2. package/cli/plan.test.mjs +2331 -0
  3. package/cli/service.mjs +309 -0
  4. package/package.json +19 -27
  5. package/cli/dashboard/api.mjs +0 -473
  6. package/cli/dashboard/browser.mjs +0 -40
  7. package/cli/dashboard/server.mjs +0 -366
  8. package/cli/dashboard/state.mjs +0 -438
  9. package/cli/dashboard/tasks-store.mjs +0 -203
  10. package/cli/dashboard/watcher.mjs +0 -81
  11. package/cli/dashboard.mjs +0 -97
  12. package/dist/assets/index-BVvY22Gt.css +0 -1
  13. package/dist/assets/index-CO3c8O32.js +0 -285
  14. package/dist/assets/index-CO3c8O32.js.map +0 -1
  15. package/dist/index.html +0 -18
  16. package/src/App.tsx +0 -233
  17. package/src/components/Button.tsx +0 -55
  18. package/src/components/Card.tsx +0 -40
  19. package/src/components/EmptyState.tsx +0 -30
  20. package/src/components/Modal.tsx +0 -137
  21. package/src/components/Spinner.tsx +0 -19
  22. package/src/components/StatusBadge.tsx +0 -25
  23. package/src/components/Tag.tsx +0 -28
  24. package/src/components/Toast.tsx +0 -142
  25. package/src/components/Topbar.tsx +0 -88
  26. package/src/index.html +0 -17
  27. package/src/lib/api.ts +0 -71
  28. package/src/lib/markdown.tsx +0 -59
  29. package/src/lib/types.ts +0 -200
  30. package/src/lib/utils.ts +0 -79
  31. package/src/lib/ws.ts +0 -132
  32. package/src/main.tsx +0 -12
  33. package/src/styles/main.css +0 -2324
  34. package/src/views/Agents.tsx +0 -199
  35. package/src/views/Chat.tsx +0 -255
  36. package/src/views/Config.tsx +0 -250
  37. package/src/views/Overview.tsx +0 -267
  38. package/src/views/Plans.tsx +0 -667
  39. package/src/views/Projects.tsx +0 -155
  40. package/src/views/Settings.tsx +0 -253
  41. package/src/views/Tasks.tsx +0 -567
  42. package/tsconfig.json +0 -23
  43. package/vite.config.ts +0 -24
@@ -1,2324 +0,0 @@
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
- }