claudeboard 2.15.4 → 3.1.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.
@@ -0,0 +1,1872 @@
1
+ /* ============================================================
2
+ ClaudeBoard v3 — HighValue Brand Stylesheet
3
+ Background: #000 / Cards: #1a1a1a / Accent: #e3c69a (gold)
4
+ Font: Poppins
5
+ ============================================================ */
6
+
7
+ /* ── CSS Reset & Base ────────────────────────────────────── */
8
+ *, *::before, *::after {
9
+ box-sizing: border-box;
10
+ margin: 0;
11
+ padding: 0;
12
+ }
13
+
14
+ :root {
15
+ --bg: #000000;
16
+ --bg-card: #1a1a1a;
17
+ --bg-card-hover: #222222;
18
+ --bg-sidebar: #0d0d0d;
19
+ --bg-terminal: #0a0a0a;
20
+ --bg-input: #111111;
21
+ --bg-modal: #141414;
22
+
23
+ --accent: #e3c69a;
24
+ --accent-dim: #d4b896;
25
+ --accent-faint: rgba(227, 198, 154, 0.12);
26
+ --accent-border: rgba(227, 198, 154, 0.3);
27
+ --accent-border-strong: rgba(227, 198, 154, 0.55);
28
+
29
+ --text: #ffffff;
30
+ --text-muted: rgba(255, 255, 255, 0.7);
31
+ --text-subtle: rgba(255, 255, 255, 0.35);
32
+
33
+ --border: rgba(255, 255, 255, 0.07);
34
+ --border-card: rgba(255, 255, 255, 0.06);
35
+
36
+ --radius: 1rem;
37
+ --radius-sm: 0.5rem;
38
+ --radius-lg: 1.25rem;
39
+
40
+ --sidebar-w: 320px;
41
+ --panel-w: 320px;
42
+ --drawer-h: 250px;
43
+
44
+ --shadow-card: 0 2px 16px rgba(0, 0, 0, 0.55);
45
+ --shadow-modal: 0 8px 60px rgba(0, 0, 0, 0.85);
46
+
47
+ /* Column accent colors */
48
+ --col-backlog: rgba(120, 120, 180, 0.12);
49
+ --col-backlog-border: rgba(120, 120, 220, 0.22);
50
+ --col-progress: rgba(227, 198, 154, 0.08);
51
+ --col-progress-border: rgba(227, 198, 154, 0.3);
52
+ --col-verifying: rgba(100, 160, 220, 0.08);
53
+ --col-verifying-border: rgba(100, 160, 220, 0.28);
54
+ --col-done: rgba(80, 200, 120, 0.08);
55
+ --col-done-border: rgba(80, 200, 120, 0.28);
56
+ --col-error: rgba(230, 80, 80, 0.08);
57
+ --col-error-border: rgba(230, 80, 80, 0.28);
58
+
59
+ /* Status badge colors */
60
+ --badge-backlog-bg: rgba(120, 120, 220, 0.18);
61
+ --badge-backlog-text: #9898e8;
62
+ --badge-progress-bg: rgba(227, 198, 154, 0.15);
63
+ --badge-progress-text: #e3c69a;
64
+ --badge-verifying-bg: rgba(100, 160, 220, 0.18);
65
+ --badge-verifying-text:#7bb8e8;
66
+ --badge-done-bg: rgba(80, 200, 120, 0.18);
67
+ --badge-done-text: #5cd68a;
68
+ --badge-error-bg: rgba(230, 80, 80, 0.18);
69
+ --badge-error-text: #e86060;
70
+
71
+ --font: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
72
+ --mono: 'Fira Code', 'Cascadia Code', 'Consolas', monospace;
73
+ }
74
+
75
+ html, body {
76
+ height: 100%;
77
+ background: var(--bg);
78
+ color: var(--text);
79
+ font-family: var(--font);
80
+ font-size: 13.5px;
81
+ line-height: 1.6;
82
+ -webkit-font-smoothing: antialiased;
83
+ -moz-osx-font-smoothing: grayscale;
84
+ overflow: hidden;
85
+ }
86
+
87
+ /* ── Scrollbars ──────────────────────────────────────────── */
88
+ ::-webkit-scrollbar {
89
+ width: 5px;
90
+ height: 5px;
91
+ }
92
+ ::-webkit-scrollbar-track {
93
+ background: transparent;
94
+ }
95
+ ::-webkit-scrollbar-thumb {
96
+ background: rgba(227, 198, 154, 0.2);
97
+ border-radius: 99px;
98
+ }
99
+ ::-webkit-scrollbar-thumb:hover {
100
+ background: rgba(227, 198, 154, 0.4);
101
+ }
102
+
103
+ /* ── Animations ──────────────────────────────────────────── */
104
+ @keyframes shimmer {
105
+ 0% { background-position: -200% center; }
106
+ 100% { background-position: 200% center; }
107
+ }
108
+
109
+ @keyframes pulse-glow {
110
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(227, 198, 154, 0); }
111
+ 50% { box-shadow: 0 0 18px 4px rgba(227, 198, 154, 0.25); }
112
+ }
113
+
114
+ @keyframes pulse-filter {
115
+ 0%, 100% {
116
+ filter:
117
+ drop-shadow(0 0 10px rgba(227, 198, 154, 0.75))
118
+ drop-shadow(0 0 22px rgba(227, 198, 154, 0.4));
119
+ }
120
+ 50% {
121
+ filter:
122
+ drop-shadow(0 0 16px rgba(227, 198, 154, 0.88))
123
+ drop-shadow(0 0 34px rgba(227, 198, 154, 0.5));
124
+ }
125
+ }
126
+
127
+ @keyframes spin {
128
+ to { transform: rotate(360deg); }
129
+ }
130
+
131
+ @keyframes fade-in {
132
+ from { opacity: 0; transform: translateY(6px); }
133
+ to { opacity: 1; transform: translateY(0); }
134
+ }
135
+
136
+ @keyframes slide-up {
137
+ from { transform: translateY(100%); }
138
+ to { transform: translateY(0); }
139
+ }
140
+
141
+ @keyframes blink-dot {
142
+ 0%, 100% { opacity: 1; }
143
+ 50% { opacity: 0.2; }
144
+ }
145
+
146
+ @keyframes typing-bounce {
147
+ 0%, 80%, 100% { transform: scale(0.7); opacity: 0.5; }
148
+ 40% { transform: scale(1); opacity: 1; }
149
+ }
150
+
151
+ @keyframes progress-pulse {
152
+ 0%, 100% { opacity: 0.6; }
153
+ 50% { opacity: 1; }
154
+ }
155
+ @keyframes halo-radial {
156
+ 0%, 100% {
157
+ text-shadow:
158
+ 0 0 8px rgba(227, 198, 154, 0.55),
159
+ 0 0 22px rgba(227, 198, 154, 0.28),
160
+ 0 0 44px rgba(227, 198, 154, 0.12);
161
+ }
162
+ 50% {
163
+ text-shadow:
164
+ 0 0 14px rgba(227, 198, 154, 0.9),
165
+ 0 0 36px rgba(227, 198, 154, 0.5),
166
+ 0 0 70px rgba(227, 198, 154, 0.22);
167
+ }
168
+ }
169
+
170
+ /* ── App Shell Layout ────────────────────────────────────── */
171
+ #app {
172
+ display: grid;
173
+ grid-template-columns: var(--sidebar-w) 1fr 0px;
174
+ grid-template-rows: 1fr;
175
+ height: 100vh;
176
+ overflow: hidden;
177
+ position: relative;
178
+ transition: grid-template-columns 0.28s cubic-bezier(0.4, 0, 0.2, 1);
179
+ }
180
+
181
+ #app.panel-open {
182
+ grid-template-columns: var(--sidebar-w) 1fr var(--panel-w);
183
+ }
184
+
185
+ #app.sidebar-collapsed {
186
+ grid-template-columns: 0px 1fr 0px;
187
+ }
188
+
189
+ #app.sidebar-collapsed.panel-open {
190
+ grid-template-columns: 0px 1fr var(--panel-w);
191
+ }
192
+
193
+ /* ── Sidebar ─────────────────────────────────────────────── */
194
+ #sidebar {
195
+ grid-column: 1;
196
+ grid-row: 1;
197
+ display: flex;
198
+ flex-direction: column;
199
+ background: var(--bg-sidebar);
200
+ border-right: 1px solid var(--accent-border);
201
+ height: 100vh;
202
+ overflow: hidden;
203
+ position: relative;
204
+ z-index: 10;
205
+ }
206
+
207
+ .sidebar-header {
208
+ padding: 0.75rem 1rem 0.6rem;
209
+ border-bottom: 1px solid var(--accent-border);
210
+ flex-shrink: 0;
211
+ }
212
+
213
+ .sidebar-header-top {
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: space-between;
217
+ margin-bottom: 0.4rem;
218
+ }
219
+
220
+ .sidebar-collapse-btn {
221
+ width: 30px;
222
+ height: 30px;
223
+ border-radius: var(--radius-sm);
224
+ border: 1px solid var(--accent-border);
225
+ background: var(--accent-faint);
226
+ color: var(--accent);
227
+ cursor: pointer;
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: center;
231
+ font-size: 0.8rem;
232
+ flex-shrink: 0;
233
+ transition: background 0.2s ease, border-color 0.2s ease, transform 0.15s ease;
234
+ }
235
+ .sidebar-collapse-btn:hover {
236
+ background: rgba(227, 198, 154, 0.25);
237
+ border-color: var(--accent);
238
+ transform: scale(1.08);
239
+ }
240
+
241
+ /* When sidebar is collapsed it hides overflow */
242
+ #sidebar {
243
+ overflow: hidden;
244
+ transition: none;
245
+ }
246
+
247
+ .logo {
248
+ display: flex;
249
+ align-items: center;
250
+ gap: 0.25rem;
251
+ margin-bottom: 0.2rem;
252
+ }
253
+
254
+ .logo-icon {
255
+ color: var(--accent);
256
+ font-size: 1.05rem;
257
+ filter: drop-shadow(0 0 10px rgba(227, 198, 154, 0.75)) drop-shadow(0 0 22px rgba(227, 198, 154, 0.4));
258
+ animation: pulse-filter 6s ease-in-out infinite;
259
+ display: inline-block;
260
+ }
261
+
262
+ .logo-text {
263
+ font-size: 0.95rem;
264
+ font-weight: 700;
265
+ letter-spacing: 0.02em;
266
+ background: linear-gradient(135deg, var(--accent) 0%, #ffffff 100%);
267
+ -webkit-background-clip: text;
268
+ -webkit-text-fill-color: transparent;
269
+ background-clip: text;
270
+ }
271
+
272
+ .logo-version {
273
+ font-size: 0.6rem;
274
+ font-weight: 500;
275
+ color: var(--accent);
276
+ background: var(--accent-faint);
277
+ border: 1px solid var(--accent-border);
278
+ padding: 0.08rem 0.3rem;
279
+ border-radius: 99px;
280
+ letter-spacing: 0.04em;
281
+ text-shadow: 0 0 20px rgba(227, 198, 154, 0.3);
282
+ }
283
+
284
+ /* ── Connection Status ───────────────────────────────────── */
285
+ .connection-status {
286
+ display: inline-flex;
287
+ align-items: center;
288
+ gap: 0.45rem;
289
+ font-size: 0.72rem;
290
+ color: var(--text-muted);
291
+ font-weight: 400;
292
+ background: rgba(255, 255, 255, 0.05);
293
+ border: 1px solid rgba(255, 255, 255, 0.1);
294
+ border-radius: 99px;
295
+ padding: 0.2rem 0.6rem;
296
+ }
297
+
298
+ .connection-status .dot {
299
+ width: 7px;
300
+ height: 7px;
301
+ border-radius: 50%;
302
+ background: #888;
303
+ flex-shrink: 0;
304
+ transition: background 0.3s ease, box-shadow 0.3s ease;
305
+ }
306
+
307
+ .connection-status.connected .dot {
308
+ background: #4ade80;
309
+ box-shadow: 0 0 6px rgba(74, 222, 128, 0.6);
310
+ animation: blink-dot 2.5s ease-in-out infinite;
311
+ }
312
+
313
+ .connection-status.connected span:last-child {
314
+ color: #4ade80;
315
+ }
316
+
317
+ .connection-status.disconnected .dot {
318
+ background: #f87171;
319
+ box-shadow: 0 0 6px rgba(248, 113, 113, 0.5);
320
+ }
321
+
322
+ .connection-status.disconnected span:last-child {
323
+ color: #f87171;
324
+ }
325
+
326
+ /* ── Chat Container ──────────────────────────────────────── */
327
+ .chat-container {
328
+ flex: 1;
329
+ overflow-y: auto;
330
+ padding: 1rem;
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: 0.85rem;
334
+ scroll-behavior: smooth;
335
+ }
336
+
337
+ .chat-welcome {
338
+ text-align: center;
339
+ padding: 1.25rem 1rem;
340
+ animation: fade-in 0.5s ease;
341
+ }
342
+
343
+ .welcome-icon {
344
+ font-size: 3rem;
345
+ color: var(--accent);
346
+ margin-bottom: 0.65rem;
347
+ display: block;
348
+ line-height: 1;
349
+ animation: halo-radial 3s ease-in-out infinite;
350
+ }
351
+
352
+ .chat-welcome h3 {
353
+ font-size: 1.05rem;
354
+ font-weight: 700;
355
+ color: var(--text);
356
+ letter-spacing: 0.01em;
357
+ margin-bottom: 0.35rem;
358
+ }
359
+
360
+ .chat-welcome p {
361
+ font-size: 0.75rem;
362
+ font-weight: 500;
363
+ line-height: 1.5;
364
+ letter-spacing: 0.02em;
365
+ background: linear-gradient(135deg, var(--accent) 0%, #fff8e0 50%, var(--accent-dim) 100%);
366
+ -webkit-background-clip: text;
367
+ -webkit-text-fill-color: transparent;
368
+ background-clip: text;
369
+ margin-bottom: 0.75rem;
370
+ }
371
+
372
+ .welcome-chips {
373
+ display: flex;
374
+ gap: 0.35rem;
375
+ justify-content: center;
376
+ flex-wrap: wrap;
377
+ }
378
+
379
+ .welcome-chip {
380
+ font-size: 0.65rem;
381
+ font-weight: 500;
382
+ padding: 0.22rem 0.6rem;
383
+ border-radius: 99px;
384
+ border: 1px solid var(--accent-border);
385
+ background: var(--accent-faint);
386
+ color: var(--accent);
387
+ letter-spacing: 0.03em;
388
+ white-space: nowrap;
389
+ backdrop-filter: blur(4px);
390
+ transition: background 0.2s ease, border-color 0.2s ease;
391
+ }
392
+
393
+ .welcome-chip:hover {
394
+ background: rgba(227, 198, 154, 0.2);
395
+ border-color: var(--accent-border-strong);
396
+ }
397
+
398
+ /* Chat messages */
399
+ .chat-message {
400
+ display: flex;
401
+ flex-direction: column;
402
+ gap: 0.25rem;
403
+ animation: fade-in 0.3s ease;
404
+ }
405
+
406
+ .chat-message.user {
407
+ align-items: flex-end;
408
+ }
409
+
410
+ .chat-message.assistant {
411
+ align-items: flex-start;
412
+ }
413
+
414
+ .message-bubble {
415
+ max-width: 88%;
416
+ padding: 0.65rem 0.9rem;
417
+ border-radius: var(--radius);
418
+ font-size: 0.82rem;
419
+ line-height: 1.6;
420
+ word-break: break-word;
421
+ }
422
+
423
+ .chat-message.user .message-bubble {
424
+ background: var(--accent-faint);
425
+ border: 1px solid var(--accent-border);
426
+ color: var(--text);
427
+ border-bottom-right-radius: var(--radius-sm);
428
+ }
429
+
430
+ .chat-message.assistant .message-bubble {
431
+ background: var(--bg-card);
432
+ border: 1px solid var(--border-card);
433
+ color: var(--text);
434
+ border-bottom-left-radius: var(--radius-sm);
435
+ }
436
+
437
+ .chat-message.assistant.error .message-bubble {
438
+ border-color: rgba(230, 80, 80, 0.35);
439
+ background: rgba(230, 80, 80, 0.07);
440
+ }
441
+
442
+ .message-label {
443
+ font-size: 0.65rem;
444
+ color: var(--text-subtle);
445
+ font-weight: 500;
446
+ letter-spacing: 0.03em;
447
+ padding: 0 0.15rem;
448
+ }
449
+
450
+ /* Streaming cursor */
451
+ .streaming-cursor::after {
452
+ content: '▋';
453
+ color: var(--accent);
454
+ animation: blink-dot 0.8s step-end infinite;
455
+ margin-left: 1px;
456
+ }
457
+
458
+ /* ── Typing Indicator ────────────────────────────────────── */
459
+ .typing-indicator {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 4px;
463
+ padding: 0.4rem 0.6rem;
464
+ margin-bottom: 0.35rem;
465
+ }
466
+
467
+ .typing-indicator span {
468
+ display: inline-block;
469
+ width: 6px;
470
+ height: 6px;
471
+ border-radius: 50%;
472
+ background: var(--accent);
473
+ animation: typing-bounce 1.3s infinite;
474
+ }
475
+
476
+ .typing-indicator span:nth-child(2) { animation-delay: 0.2s; }
477
+ .typing-indicator span:nth-child(3) { animation-delay: 0.4s; }
478
+
479
+ /* ── Chat Input Area ─────────────────────────────────────── */
480
+ .chat-input-area {
481
+ padding: 0.75rem 1rem 1rem;
482
+ border-top: 1px solid var(--accent-border);
483
+ flex-shrink: 0;
484
+ background: var(--bg-sidebar);
485
+ }
486
+
487
+ .input-row {
488
+ display: flex;
489
+ gap: 0.5rem;
490
+ align-items: flex-end;
491
+ }
492
+
493
+ #chatInput {
494
+ flex: 1;
495
+ background: var(--bg-input);
496
+ border: 1px solid var(--accent-border);
497
+ border-radius: var(--radius-sm);
498
+ color: var(--text);
499
+ font-family: var(--font);
500
+ font-size: 0.82rem;
501
+ line-height: 1.5;
502
+ padding: 0.6rem 0.8rem;
503
+ resize: none;
504
+ outline: none;
505
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
506
+ max-height: 120px;
507
+ overflow-y: auto;
508
+ }
509
+
510
+ #chatInput::placeholder {
511
+ color: var(--text-subtle);
512
+ }
513
+
514
+ #chatInput:focus {
515
+ border-color: var(--accent);
516
+ box-shadow: 0 0 0 3px rgba(227, 198, 154, 0.1);
517
+ }
518
+
519
+ /* ── Buttons ─────────────────────────────────────────────── */
520
+ .btn-send {
521
+ width: 40px;
522
+ height: 40px;
523
+ border-radius: var(--radius-sm);
524
+ border: 1px solid var(--accent-border);
525
+ background: var(--accent-faint);
526
+ color: var(--accent);
527
+ cursor: pointer;
528
+ display: flex;
529
+ align-items: center;
530
+ justify-content: center;
531
+ flex-shrink: 0;
532
+ transition: background 0.2s ease, border-color 0.2s ease, transform 0.15s ease;
533
+ }
534
+
535
+ .btn-send:hover {
536
+ background: rgba(227, 198, 154, 0.2);
537
+ border-color: var(--accent);
538
+ transform: scale(1.05);
539
+ }
540
+
541
+ .btn-send:active {
542
+ transform: scale(0.97);
543
+ }
544
+
545
+ .btn-primary {
546
+ display: inline-flex;
547
+ align-items: center;
548
+ gap: 0.4rem;
549
+ padding: 0.55rem 1.2rem;
550
+ border-radius: var(--radius-sm);
551
+ border: 1px solid var(--accent-border-strong);
552
+ font-family: var(--font);
553
+ font-size: 0.82rem;
554
+ font-weight: 600;
555
+ letter-spacing: 0.02em;
556
+ cursor: pointer;
557
+ position: relative;
558
+ overflow: hidden;
559
+ transition: transform 0.15s ease, box-shadow 0.2s ease;
560
+
561
+ /* Shimmer gradient */
562
+ background: linear-gradient(
563
+ 105deg,
564
+ var(--accent-faint) 0%,
565
+ rgba(227, 198, 154, 0.22) 30%,
566
+ rgba(255, 240, 200, 0.35) 50%,
567
+ rgba(227, 198, 154, 0.22) 70%,
568
+ var(--accent-faint) 100%
569
+ );
570
+ background-size: 200% auto;
571
+ color: var(--accent);
572
+ animation: shimmer 3s linear infinite, pulse-glow 2.5s ease-in-out infinite;
573
+ }
574
+
575
+ .btn-primary:hover {
576
+ transform: translateY(-1px);
577
+ box-shadow: 0 4px 20px rgba(227, 198, 154, 0.3);
578
+ }
579
+
580
+ .btn-primary:active {
581
+ transform: translateY(0);
582
+ }
583
+
584
+ .btn-secondary {
585
+ display: inline-flex;
586
+ align-items: center;
587
+ gap: 0.4rem;
588
+ padding: 0.55rem 1.1rem;
589
+ border-radius: var(--radius-sm);
590
+ border: 1px solid var(--accent-border);
591
+ background: transparent;
592
+ color: var(--text-muted);
593
+ font-family: var(--font);
594
+ font-size: 0.82rem;
595
+ font-weight: 500;
596
+ cursor: pointer;
597
+ transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
598
+ }
599
+
600
+ .btn-secondary:hover {
601
+ background: var(--accent-faint);
602
+ border-color: var(--accent);
603
+ color: var(--accent);
604
+ }
605
+
606
+ .btn-danger {
607
+ display: inline-flex;
608
+ align-items: center;
609
+ gap: 0.4rem;
610
+ padding: 0.55rem 1.1rem;
611
+ border-radius: var(--radius-sm);
612
+ border: 1px solid rgba(230, 80, 80, 0.35);
613
+ background: transparent;
614
+ color: rgba(230, 80, 80, 0.75);
615
+ font-family: var(--font);
616
+ font-size: 0.82rem;
617
+ font-weight: 500;
618
+ cursor: pointer;
619
+ transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
620
+ }
621
+
622
+ .btn-danger:hover {
623
+ background: rgba(230, 80, 80, 0.1);
624
+ border-color: rgba(230, 80, 80, 0.7);
625
+ color: #e65050;
626
+ }
627
+
628
+ .btn-icon {
629
+ background: transparent;
630
+ border: 1px solid var(--border);
631
+ color: var(--text-muted);
632
+ font-family: var(--font);
633
+ font-size: 0.75rem;
634
+ padding: 0.25rem 0.6rem;
635
+ border-radius: var(--radius-sm);
636
+ cursor: pointer;
637
+ transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
638
+ }
639
+
640
+ .btn-icon:hover {
641
+ background: var(--accent-faint);
642
+ border-color: var(--accent-border);
643
+ color: var(--accent);
644
+ }
645
+
646
+ /* ── Main Panel ──────────────────────────────────────────── */
647
+ #main {
648
+ grid-column: 2;
649
+ grid-row: 1;
650
+ display: flex;
651
+ flex-direction: column;
652
+ overflow: hidden;
653
+ background: var(--bg);
654
+ padding-bottom: 0;
655
+ }
656
+
657
+
658
+ .main-header {
659
+ display: flex;
660
+ align-items: center;
661
+ justify-content: space-between;
662
+ padding: 0.55rem 1.25rem;
663
+ border-bottom: 1px solid transparent;
664
+ border-image: linear-gradient(90deg, transparent 0%, rgba(227, 198, 154, 0.35) 40%, rgba(227, 198, 154, 0.12) 100%) 1;
665
+ flex-shrink: 0;
666
+ gap: 0.75rem;
667
+ }
668
+
669
+ .main-header-left {
670
+ display: flex;
671
+ align-items: center;
672
+ gap: 0.65rem;
673
+ }
674
+
675
+ .main-header h1 {
676
+ font-size: 1.15rem;
677
+ font-weight: 600;
678
+ color: var(--text);
679
+ letter-spacing: 0.03em;
680
+ }
681
+
682
+ .sidebar-expand-btn {
683
+ font-size: 0.72rem;
684
+ opacity: 0.6;
685
+ white-space: nowrap;
686
+ }
687
+ .sidebar-expand-btn:hover { opacity: 1; }
688
+
689
+ /* System monitor */
690
+ .sys-monitor {
691
+ display: flex;
692
+ align-items: center;
693
+ gap: 0.75rem;
694
+ font-size: 0.68rem;
695
+ color: var(--text-subtle);
696
+ font-variant-numeric: tabular-nums;
697
+ flex: 1;
698
+ justify-content: center;
699
+ }
700
+ .sys-stat {
701
+ display: flex;
702
+ align-items: center;
703
+ gap: 0.3rem;
704
+ }
705
+ .sys-bar {
706
+ width: 36px;
707
+ height: 5px;
708
+ background: rgba(255,255,255,0.08);
709
+ border-radius: 99px;
710
+ overflow: hidden;
711
+ }
712
+ .sys-bar-fill {
713
+ height: 100%;
714
+ min-width: 3px;
715
+ border-radius: 99px;
716
+ transition: width 0.5s ease;
717
+ background: var(--accent);
718
+ }
719
+ .sys-bar-fill.high { background: #f87171; }
720
+
721
+ .board-actions {
722
+ display: flex;
723
+ align-items: center;
724
+ gap: 0.65rem;
725
+ }
726
+
727
+ /* ── Kanban Board ────────────────────────────────────────── */
728
+ .kanban-board {
729
+ display: flex;
730
+ gap: 1rem;
731
+ padding: 1rem 1.5rem;
732
+ flex: 1;
733
+ overflow-x: auto;
734
+ overflow-y: hidden;
735
+ align-items: flex-start;
736
+ position: relative;
737
+ }
738
+
739
+ .kanban-col {
740
+ flex: 1;
741
+ min-width: 200px;
742
+ max-width: 340px;
743
+ display: flex;
744
+ flex-direction: column;
745
+ border-radius: var(--radius);
746
+ overflow: hidden;
747
+ border: 1px solid var(--border);
748
+ background: rgba(255, 255, 255, 0.02);
749
+ height: 100%;
750
+ max-height: 100%;
751
+ }
752
+
753
+ /* Column-specific color accents */
754
+ .kanban-col[data-status="backlog"] {
755
+ border-color: var(--col-backlog-border);
756
+ background: var(--col-backlog);
757
+ }
758
+
759
+ .kanban-col[data-status="in_progress"] {
760
+ border-color: var(--col-progress-border);
761
+ background: var(--col-progress);
762
+ }
763
+
764
+ .kanban-col[data-status="verifying"] {
765
+ border-color: var(--col-verifying-border);
766
+ background: var(--col-verifying);
767
+ }
768
+
769
+ .kanban-col[data-status="done"] {
770
+ border-color: var(--col-done-border);
771
+ background: var(--col-done);
772
+ }
773
+
774
+ .kanban-col[data-status="error"] {
775
+ border-color: var(--col-error-border);
776
+ background: var(--col-error);
777
+ }
778
+
779
+ .col-header {
780
+ display: flex;
781
+ align-items: center;
782
+ gap: 0.5rem;
783
+ padding: 0.75rem 0.85rem;
784
+ border-bottom: 1px solid var(--border);
785
+ flex-shrink: 0;
786
+ }
787
+
788
+ .col-icon {
789
+ font-size: 0.95rem;
790
+ line-height: 1;
791
+ }
792
+
793
+ .col-title {
794
+ font-size: 0.8rem;
795
+ font-weight: 600;
796
+ color: var(--text);
797
+ letter-spacing: 0.07em;
798
+ text-transform: uppercase;
799
+ flex: 1;
800
+ }
801
+
802
+ .col-count {
803
+ font-size: 0.72rem;
804
+ font-weight: 700;
805
+ min-width: 20px;
806
+ height: 20px;
807
+ display: inline-flex;
808
+ align-items: center;
809
+ justify-content: center;
810
+ border-radius: 99px;
811
+ padding: 0 0.3rem;
812
+ background: rgba(255, 255, 255, 0.07);
813
+ color: var(--text-muted);
814
+ }
815
+
816
+ .kanban-col[data-status="backlog"] .col-count { background: rgba(120,120,220,0.18); color: #9898e8; }
817
+ .kanban-col[data-status="in_progress"] .col-count { background: rgba(227,198,154,0.15); color: #e3c69a; }
818
+ .kanban-col[data-status="verifying"] .col-count { background: rgba(100,160,220,0.18); color: #7bb8e8; }
819
+ .kanban-col[data-status="done"] .col-count { background: rgba(80,200,120,0.18); color: #5cd68a; }
820
+ .kanban-col[data-status="error"] .col-count { background: rgba(230,80,80,0.18); color: #e86060; }
821
+
822
+ .col-cards {
823
+ flex: 1;
824
+ overflow-y: auto;
825
+ padding: 0.75rem;
826
+ display: flex;
827
+ flex-direction: column;
828
+ gap: 0.65rem;
829
+ min-height: 80px;
830
+ }
831
+
832
+ /* ── Task Cards ──────────────────────────────────────────── */
833
+ .task-card {
834
+ background: var(--bg-card);
835
+ border: 1px solid var(--border-card);
836
+ border-radius: var(--radius);
837
+ padding: 0.85rem 0.9rem;
838
+ cursor: pointer;
839
+ transition:
840
+ background 0.2s ease,
841
+ border-color 0.2s ease,
842
+ transform 0.15s ease,
843
+ box-shadow 0.2s ease;
844
+ animation: fade-in 0.3s ease;
845
+ position: relative;
846
+ overflow: hidden;
847
+ }
848
+
849
+ .task-card::before {
850
+ content: '';
851
+ position: absolute;
852
+ top: 0;
853
+ left: 0;
854
+ right: 0;
855
+ height: 2px;
856
+ opacity: 0;
857
+ transition: opacity 0.2s ease;
858
+ }
859
+
860
+ .task-card:hover {
861
+ background: var(--bg-card-hover);
862
+ border-color: var(--accent-border);
863
+ transform: translateY(-2px);
864
+ box-shadow: var(--shadow-card);
865
+ }
866
+
867
+ .task-card:hover::before {
868
+ opacity: 1;
869
+ }
870
+
871
+ .task-card.selected {
872
+ border-color: var(--accent);
873
+ background: rgba(227, 198, 154, 0.06);
874
+ box-shadow: 0 0 0 1px var(--accent-border), 0 4px 20px rgba(227, 198, 154, 0.1);
875
+ }
876
+
877
+ .task-card.selected::before {
878
+ opacity: 1;
879
+ }
880
+
881
+ /* Status-specific card top-border colors */
882
+ .task-card[data-status="backlog"]::before { background: #7878dc; }
883
+ .task-card[data-status="in_progress"]::before { background: var(--accent); }
884
+ .task-card[data-status="verifying"]::before { background: #5aa0d8; }
885
+ .task-card[data-status="done"]::before { background: #4ade80; }
886
+ .task-card[data-status="error"]::before { background: #f87171; }
887
+
888
+ /* In-progress card gets a subtle shimmer on the left border */
889
+ .task-card[data-status="in_progress"] {
890
+ border-left: 2px solid var(--accent);
891
+ }
892
+
893
+ .task-card[data-status="done"] {
894
+ border-left: 2px solid #4ade80;
895
+ opacity: 0.85;
896
+ }
897
+
898
+ .task-card[data-status="error"] {
899
+ border-left: 2px solid #f87171;
900
+ }
901
+
902
+ .task-card[data-status="verifying"] {
903
+ border-left: 2px solid #5aa0d8;
904
+ }
905
+
906
+ .card-header {
907
+ margin-bottom: 0.4rem;
908
+ }
909
+
910
+ .card-title {
911
+ font-size: 0.84rem;
912
+ font-weight: 600;
913
+ color: var(--text);
914
+ line-height: 1.4;
915
+ display: block;
916
+ word-break: break-word;
917
+ }
918
+
919
+ .card-badge {
920
+ font-size: 0.62rem;
921
+ font-weight: 600;
922
+ padding: 0.15rem 0.45rem;
923
+ border-radius: 99px;
924
+ letter-spacing: 0.04em;
925
+ text-transform: uppercase;
926
+ white-space: nowrap;
927
+ flex-shrink: 0;
928
+ }
929
+
930
+ .card-badge.badge-backlog {
931
+ background: var(--badge-backlog-bg);
932
+ color: var(--badge-backlog-text);
933
+ }
934
+
935
+ .card-badge.badge-in_progress {
936
+ background: var(--badge-progress-bg);
937
+ color: var(--badge-progress-text);
938
+ animation: progress-pulse 2s ease-in-out infinite;
939
+ }
940
+
941
+ .card-badge.badge-verifying {
942
+ background: var(--badge-verifying-bg);
943
+ color: var(--badge-verifying-text);
944
+ }
945
+
946
+ .card-badge.badge-done {
947
+ background: var(--badge-done-bg);
948
+ color: var(--badge-done-text);
949
+ }
950
+
951
+ .card-badge.badge-error {
952
+ background: var(--badge-error-bg);
953
+ color: var(--badge-error-text);
954
+ }
955
+
956
+ .card-desc {
957
+ font-size: 0.75rem;
958
+ color: var(--text-muted);
959
+ line-height: 1.5;
960
+ margin-bottom: 0.65rem;
961
+ display: -webkit-box;
962
+ -webkit-line-clamp: 2;
963
+ -webkit-box-orient: vertical;
964
+ overflow: hidden;
965
+ }
966
+
967
+ .card-footer {
968
+ display: flex;
969
+ align-items: center;
970
+ justify-content: space-between;
971
+ gap: 0.5rem;
972
+ }
973
+
974
+ .card-footer-right {
975
+ display: flex;
976
+ align-items: center;
977
+ gap: 0.4rem;
978
+ }
979
+
980
+ .card-agent {
981
+ display: flex;
982
+ align-items: center;
983
+ gap: 0.35rem;
984
+ font-size: 0.7rem;
985
+ color: var(--text-subtle);
986
+ }
987
+
988
+ .agent-avatar {
989
+ width: 20px;
990
+ height: 20px;
991
+ border-radius: 50%;
992
+ background: var(--accent-faint);
993
+ border: 1px solid var(--accent-border);
994
+ display: flex;
995
+ align-items: center;
996
+ justify-content: center;
997
+ font-size: 0.6rem;
998
+ font-weight: 700;
999
+ color: var(--accent);
1000
+ flex-shrink: 0;
1001
+ }
1002
+
1003
+ .agent-avatar.spinning {
1004
+ animation: spin 1.8s linear infinite;
1005
+ border-top-color: var(--accent);
1006
+ border-left-color: transparent;
1007
+ }
1008
+
1009
+ .agent-avatar--role {
1010
+ font-size: 0.55rem;
1011
+ text-transform: uppercase;
1012
+ letter-spacing: 0.04em;
1013
+ }
1014
+
1015
+ .btn-stop-task {
1016
+ background: transparent;
1017
+ border: 1px solid rgba(230, 80, 80, 0.3);
1018
+ color: rgba(230, 80, 80, 0.6);
1019
+ border-radius: 4px;
1020
+ font-size: 0.6rem;
1021
+ padding: 0.1rem 0.35rem;
1022
+ cursor: pointer;
1023
+ line-height: 1;
1024
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
1025
+ }
1026
+
1027
+ .btn-stop-task:hover {
1028
+ background: rgba(230, 80, 80, 0.12);
1029
+ border-color: rgba(230, 80, 80, 0.6);
1030
+ color: #e65050;
1031
+ }
1032
+
1033
+ .btn-delete-task {
1034
+ background: transparent;
1035
+ border: none;
1036
+ color: var(--text-subtle);
1037
+ border-radius: 4px;
1038
+ font-size: 0.65rem;
1039
+ padding: 0.1rem 0.3rem;
1040
+ cursor: pointer;
1041
+ line-height: 1;
1042
+ opacity: 0;
1043
+ transition: opacity 0.15s, background 0.15s, color 0.15s;
1044
+ }
1045
+ .task-card:hover .btn-delete-task {
1046
+ opacity: 0.5;
1047
+ }
1048
+ .btn-delete-task:hover {
1049
+ opacity: 1 !important;
1050
+ background: rgba(230, 80, 80, 0.12);
1051
+ color: #e65050;
1052
+ }
1053
+
1054
+ .card-elapsed {
1055
+ font-size: 0.68rem;
1056
+ color: var(--text-subtle);
1057
+ font-variant-numeric: tabular-nums;
1058
+ font-weight: 500;
1059
+ letter-spacing: 0.03em;
1060
+ }
1061
+
1062
+ /* Loading spinner on in-progress cards */
1063
+ .card-spinner {
1064
+ width: 12px;
1065
+ height: 12px;
1066
+ border: 1.5px solid rgba(227, 198, 154, 0.2);
1067
+ border-top-color: var(--accent);
1068
+ border-radius: 50%;
1069
+ animation: spin 0.9s linear infinite;
1070
+ flex-shrink: 0;
1071
+ }
1072
+
1073
+ /* ── Detail Panel (right side) ───────────────────────────── */
1074
+ .detail-panel {
1075
+ grid-column: 3;
1076
+ grid-row: 1;
1077
+ display: flex;
1078
+ flex-direction: column;
1079
+ background: var(--bg-sidebar);
1080
+ border-left: 1px solid var(--accent-border);
1081
+ height: 100vh;
1082
+ overflow: hidden;
1083
+ opacity: 0;
1084
+ pointer-events: none;
1085
+ transition: opacity 0.2s ease 0s;
1086
+ }
1087
+
1088
+ #app.panel-open .detail-panel {
1089
+ opacity: 1;
1090
+ pointer-events: auto;
1091
+ transition: opacity 0.2s ease 0.1s;
1092
+ }
1093
+
1094
+ .panel-header {
1095
+ display: flex;
1096
+ align-items: center;
1097
+ justify-content: space-between;
1098
+ padding: 0.75rem 1rem;
1099
+ border-bottom: 1px solid var(--border);
1100
+ flex-shrink: 0;
1101
+ gap: 0.5rem;
1102
+ }
1103
+
1104
+ .panel-header-left {
1105
+ display: flex;
1106
+ align-items: center;
1107
+ gap: 0.5rem;
1108
+ min-width: 0;
1109
+ }
1110
+
1111
+ .panel-header-right {
1112
+ display: flex;
1113
+ align-items: center;
1114
+ gap: 0.5rem;
1115
+ flex-shrink: 0;
1116
+ }
1117
+
1118
+ .panel-agent-label {
1119
+ font-size: 0.7rem;
1120
+ color: var(--text-subtle);
1121
+ white-space: nowrap;
1122
+ overflow: hidden;
1123
+ text-overflow: ellipsis;
1124
+ max-width: 140px;
1125
+ }
1126
+
1127
+ .panel-elapsed {
1128
+ font-size: 0.7rem;
1129
+ color: var(--text-subtle);
1130
+ font-variant-numeric: tabular-nums;
1131
+ white-space: nowrap;
1132
+ }
1133
+
1134
+ .panel-body {
1135
+ padding: 1rem 1.1rem;
1136
+ border-bottom: 1px solid var(--border);
1137
+ flex-shrink: 0;
1138
+ overflow-y: auto;
1139
+ max-height: 42%;
1140
+ }
1141
+
1142
+ .panel-task-name {
1143
+ font-size: 0.95rem;
1144
+ font-weight: 600;
1145
+ color: var(--text);
1146
+ line-height: 1.4;
1147
+ margin-bottom: 0.75rem;
1148
+ word-break: break-word;
1149
+ }
1150
+
1151
+ .panel-section {
1152
+ margin-bottom: 0.75rem;
1153
+ }
1154
+
1155
+ .panel-section-label {
1156
+ display: block;
1157
+ font-size: 0.65rem;
1158
+ font-weight: 600;
1159
+ text-transform: uppercase;
1160
+ letter-spacing: 0.06em;
1161
+ color: var(--accent);
1162
+ margin-bottom: 0.3rem;
1163
+ opacity: 0.75;
1164
+ text-shadow: 0 0 20px rgba(227, 198, 154, 0.3);
1165
+ }
1166
+
1167
+ .panel-task-desc {
1168
+ font-size: 0.78rem;
1169
+ color: var(--text-muted);
1170
+ line-height: 1.6;
1171
+ }
1172
+
1173
+ /* Terminal inside panel */
1174
+ .panel-terminal-wrap {
1175
+ flex: 1;
1176
+ display: flex;
1177
+ flex-direction: column;
1178
+ min-height: 0;
1179
+ }
1180
+
1181
+ .panel-terminal-header {
1182
+ display: flex;
1183
+ align-items: center;
1184
+ justify-content: space-between;
1185
+ padding: 0.5rem 1rem;
1186
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
1187
+ flex-shrink: 0;
1188
+ background: rgba(255, 255, 255, 0.02);
1189
+ }
1190
+
1191
+ .panel-terminal-label {
1192
+ font-size: 0.72rem;
1193
+ font-weight: 500;
1194
+ color: var(--accent);
1195
+ opacity: 0.8;
1196
+ text-shadow: 0 0 20px rgba(227, 198, 154, 0.3);
1197
+ }
1198
+
1199
+ .panel-terminal-body {
1200
+ flex: 1;
1201
+ overflow-y: auto;
1202
+ padding: 0.75rem 1rem;
1203
+ font-family: var(--mono);
1204
+ font-size: 0.73rem;
1205
+ line-height: 1.65;
1206
+ color: rgba(255, 255, 255, 0.75);
1207
+ white-space: pre-wrap;
1208
+ word-break: break-word;
1209
+ }
1210
+
1211
+ .terminal-placeholder {
1212
+ color: var(--text-subtle);
1213
+ font-family: var(--font);
1214
+ font-size: 0.78rem;
1215
+ text-align: center;
1216
+ padding: 2rem 0;
1217
+ }
1218
+
1219
+ /* Terminal output line types */
1220
+ .terminal-line {
1221
+ display: block;
1222
+ padding: 0.05rem 0;
1223
+ }
1224
+
1225
+ .terminal-line.stdout {
1226
+ color: rgba(255, 255, 255, 0.8);
1227
+ }
1228
+
1229
+ .terminal-line.stderr {
1230
+ color: #fca5a5;
1231
+ }
1232
+
1233
+ .terminal-line.system {
1234
+ color: var(--accent);
1235
+ font-style: italic;
1236
+ opacity: 0.75;
1237
+ }
1238
+
1239
+ .terminal-line.success {
1240
+ color: #4ade80;
1241
+ }
1242
+
1243
+ /* ── PRD Modal ───────────────────────────────────────────── */
1244
+ .modal {
1245
+ position: fixed;
1246
+ inset: 0;
1247
+ z-index: 1000;
1248
+ display: flex;
1249
+ align-items: center;
1250
+ justify-content: center;
1251
+ }
1252
+
1253
+ .modal-backdrop {
1254
+ position: absolute;
1255
+ inset: 0;
1256
+ background: rgba(0, 0, 0, 0.75);
1257
+ backdrop-filter: blur(4px);
1258
+ }
1259
+
1260
+ .modal-content {
1261
+ position: relative;
1262
+ background: var(--bg-modal);
1263
+ border: 1px solid var(--accent-border);
1264
+ border-radius: var(--radius-lg);
1265
+ width: min(780px, 90vw);
1266
+ max-height: 80vh;
1267
+ display: flex;
1268
+ flex-direction: column;
1269
+ box-shadow: var(--shadow-modal);
1270
+ animation: fade-in 0.25s ease;
1271
+ }
1272
+
1273
+ .modal-header {
1274
+ display: flex;
1275
+ align-items: center;
1276
+ justify-content: space-between;
1277
+ padding: 1.25rem 1.5rem 1rem;
1278
+ border-bottom: 1px solid var(--accent-border);
1279
+ flex-shrink: 0;
1280
+ }
1281
+
1282
+ .modal-header h2 {
1283
+ font-size: 1rem;
1284
+ font-weight: 600;
1285
+ color: var(--accent);
1286
+ letter-spacing: 0.02em;
1287
+ text-shadow: 0 0 20px rgba(227, 198, 154, 0.3);
1288
+ }
1289
+
1290
+ .modal-body {
1291
+ flex: 1;
1292
+ overflow-y: auto;
1293
+ padding: 1.5rem;
1294
+ font-size: 0.85rem;
1295
+ line-height: 1.75;
1296
+ color: var(--text-muted);
1297
+ }
1298
+
1299
+ /* Markdown-ish styling for PRD content */
1300
+ .modal-body h1,
1301
+ .modal-body h2,
1302
+ .modal-body h3 {
1303
+ color: var(--text);
1304
+ margin: 1.2rem 0 0.5rem;
1305
+ font-weight: 600;
1306
+ }
1307
+
1308
+ .modal-body h1 { font-size: 1.1rem; color: var(--accent); }
1309
+ .modal-body h2 { font-size: 0.95rem; }
1310
+ .modal-body h3 { font-size: 0.88rem; }
1311
+
1312
+ .modal-body p {
1313
+ margin-bottom: 0.75rem;
1314
+ }
1315
+
1316
+ .modal-body ul, .modal-body ol {
1317
+ margin-left: 1.5rem;
1318
+ margin-bottom: 0.75rem;
1319
+ }
1320
+
1321
+ .modal-body li {
1322
+ margin-bottom: 0.3rem;
1323
+ }
1324
+
1325
+ .modal-body code {
1326
+ background: rgba(255, 255, 255, 0.07);
1327
+ border: 1px solid var(--border);
1328
+ border-radius: 4px;
1329
+ padding: 0.1rem 0.35rem;
1330
+ font-family: var(--mono);
1331
+ font-size: 0.8em;
1332
+ color: var(--accent-dim);
1333
+ }
1334
+
1335
+ .modal-body pre {
1336
+ background: var(--bg-terminal);
1337
+ border: 1px solid var(--border);
1338
+ border-radius: var(--radius-sm);
1339
+ padding: 0.85rem 1rem;
1340
+ overflow-x: auto;
1341
+ margin-bottom: 0.75rem;
1342
+ }
1343
+
1344
+ .modal-body pre code {
1345
+ background: none;
1346
+ border: none;
1347
+ padding: 0;
1348
+ font-size: 0.8rem;
1349
+ color: rgba(255, 255, 255, 0.8);
1350
+ }
1351
+
1352
+ .modal-body blockquote {
1353
+ border-left: 3px solid var(--accent-border);
1354
+ padding-left: 1rem;
1355
+ margin-left: 0;
1356
+ color: var(--text-subtle);
1357
+ font-style: italic;
1358
+ }
1359
+
1360
+ .modal-body hr {
1361
+ border: none;
1362
+ border-top: 1px solid var(--border);
1363
+ margin: 1.25rem 0;
1364
+ }
1365
+
1366
+ /* ── needs_human (blocked) cards ────────────────────────── */
1367
+ .task-card[data-needs-human="true"] {
1368
+ border-left: 2px solid #f59e0b;
1369
+ }
1370
+ .task-card[data-needs-human="true"]::before {
1371
+ background: #f59e0b !important;
1372
+ }
1373
+ .badge-needs_human,
1374
+ .card-badge.badge-error[data-human="true"] {
1375
+ background: rgba(245, 158, 11, 0.18);
1376
+ color: #f59e0b;
1377
+ }
1378
+ .btn-resolve {
1379
+ font-size: 0.62rem;
1380
+ padding: 0.15rem 0.5rem;
1381
+ border-radius: 4px;
1382
+ border: 1px solid rgba(245, 158, 11, 0.4);
1383
+ background: transparent;
1384
+ color: #f59e0b;
1385
+ cursor: pointer;
1386
+ white-space: nowrap;
1387
+ transition: background 0.15s;
1388
+ }
1389
+ .btn-resolve:hover {
1390
+ background: rgba(245, 158, 11, 0.12);
1391
+ }
1392
+ .human-reason {
1393
+ font-size: 0.7rem;
1394
+ color: #f59e0b;
1395
+ opacity: 0.85;
1396
+ margin-bottom: 0.45rem;
1397
+ line-height: 1.4;
1398
+ font-style: italic;
1399
+ }
1400
+
1401
+ /* ── Drag and Drop ───────────────────────────────────────── */
1402
+ .task-card[draggable="true"] {
1403
+ cursor: grab;
1404
+ }
1405
+ .task-card[draggable="true"]:active {
1406
+ cursor: grabbing;
1407
+ }
1408
+ .task-card.dragging {
1409
+ opacity: 0.45;
1410
+ transform: scale(0.97);
1411
+ }
1412
+ .drop-zone.drag-over {
1413
+ background: rgba(227, 198, 154, 0.12);
1414
+ border-color: var(--accent-border-strong);
1415
+ box-shadow: inset 0 0 0 2px var(--accent-border);
1416
+ }
1417
+ .drop-zone.drag-over .col-empty {
1418
+ border-color: var(--accent-border);
1419
+ color: var(--accent);
1420
+ }
1421
+
1422
+ /* ── Subir PRD button (label styled as btn-secondary) ───── */
1423
+ .btn-upload-prd {
1424
+ cursor: pointer;
1425
+ display: inline-flex;
1426
+ align-items: center;
1427
+ gap: 6px;
1428
+ }
1429
+
1430
+ /* ── Supabase Credentials Modal ──────────────────────────── */
1431
+ .sb-modal-content {
1432
+ width: min(560px, 92vw);
1433
+ }
1434
+
1435
+ .sb-modal-title {
1436
+ display: flex;
1437
+ align-items: center;
1438
+ gap: 10px;
1439
+ }
1440
+
1441
+ .sb-modal-icon {
1442
+ font-size: 1.4rem;
1443
+ color: var(--accent);
1444
+ }
1445
+
1446
+ .sb-modal-body {
1447
+ display: flex;
1448
+ flex-direction: column;
1449
+ gap: 1rem;
1450
+ padding: 1.25rem 1.5rem;
1451
+ overflow-y: auto;
1452
+ max-height: 65vh;
1453
+ }
1454
+
1455
+ .sb-intro {
1456
+ font-size: 0.875rem;
1457
+ color: var(--text-muted);
1458
+ line-height: 1.5;
1459
+ }
1460
+
1461
+ .sb-task-list {
1462
+ list-style: none;
1463
+ display: flex;
1464
+ flex-direction: column;
1465
+ gap: 4px;
1466
+ padding: 0.75rem 1rem;
1467
+ background: rgba(227, 198, 154, 0.06);
1468
+ border: 1px solid var(--accent-border);
1469
+ border-radius: var(--radius-sm);
1470
+ }
1471
+
1472
+ .sb-task-list li {
1473
+ font-size: 0.8rem;
1474
+ color: var(--accent);
1475
+ padding-left: 1rem;
1476
+ position: relative;
1477
+ }
1478
+
1479
+ .sb-task-list li::before {
1480
+ content: '→';
1481
+ position: absolute;
1482
+ left: 0;
1483
+ opacity: 0.6;
1484
+ }
1485
+
1486
+ .sb-tip {
1487
+ font-size: 0.8rem;
1488
+ color: var(--text-muted);
1489
+ background: rgba(255, 255, 255, 0.04);
1490
+ border-left: 3px solid var(--accent-dim);
1491
+ padding: 0.75rem 1rem;
1492
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
1493
+ line-height: 1.6;
1494
+ }
1495
+
1496
+ .sb-fields {
1497
+ display: flex;
1498
+ flex-direction: column;
1499
+ gap: 1rem;
1500
+ }
1501
+
1502
+ .sb-field {
1503
+ display: flex;
1504
+ flex-direction: column;
1505
+ gap: 4px;
1506
+ }
1507
+
1508
+ .sb-field label {
1509
+ font-size: 0.8rem;
1510
+ font-weight: 500;
1511
+ color: var(--text-muted);
1512
+ }
1513
+
1514
+ .sb-required {
1515
+ color: var(--accent);
1516
+ }
1517
+
1518
+ .sb-optional {
1519
+ font-weight: 400;
1520
+ font-size: 0.75rem;
1521
+ opacity: 0.6;
1522
+ }
1523
+
1524
+ .sb-input {
1525
+ background: var(--bg-input);
1526
+ border: 1px solid var(--border);
1527
+ border-radius: var(--radius-sm);
1528
+ padding: 0.55rem 0.75rem;
1529
+ color: var(--text);
1530
+ font-size: 0.82rem;
1531
+ font-family: 'Courier New', monospace;
1532
+ transition: border-color 0.15s;
1533
+ width: 100%;
1534
+ }
1535
+
1536
+ .sb-input:focus {
1537
+ outline: none;
1538
+ border-color: var(--accent-border-strong);
1539
+ }
1540
+
1541
+ .sb-input::placeholder {
1542
+ color: var(--text-subtle);
1543
+ font-family: 'Courier New', monospace;
1544
+ }
1545
+
1546
+ .sb-hint {
1547
+ font-size: 0.72rem;
1548
+ color: var(--text-subtle);
1549
+ }
1550
+
1551
+ .sb-check-field {
1552
+ margin-top: 0.25rem;
1553
+ }
1554
+
1555
+ .sb-checkbox-label {
1556
+ display: flex;
1557
+ align-items: center;
1558
+ gap: 10px;
1559
+ cursor: pointer;
1560
+ font-size: 0.82rem;
1561
+ color: var(--text-muted);
1562
+ }
1563
+
1564
+ .sb-checkbox-label input[type="checkbox"] {
1565
+ accent-color: var(--accent);
1566
+ width: 15px;
1567
+ height: 15px;
1568
+ cursor: pointer;
1569
+ flex-shrink: 0;
1570
+ }
1571
+
1572
+ .sb-checkbox-label code {
1573
+ background: rgba(255,255,255,0.07);
1574
+ padding: 1px 5px;
1575
+ border-radius: 3px;
1576
+ font-size: 0.78rem;
1577
+ }
1578
+
1579
+ .sb-modal-footer {
1580
+ display: flex;
1581
+ justify-content: flex-end;
1582
+ gap: 0.75rem;
1583
+ padding: 1rem 1.5rem;
1584
+ border-top: 1px solid var(--border);
1585
+ }
1586
+
1587
+ /* ── QA Toast ────────────────────────────────────────────── */
1588
+ .qa-toast {
1589
+ position: fixed;
1590
+ bottom: 1.5rem;
1591
+ right: 1.5rem;
1592
+ background: var(--bg-card);
1593
+ border: 1px solid var(--accent-border);
1594
+ border-radius: var(--radius-sm);
1595
+ padding: 0.7rem 1.1rem;
1596
+ display: flex;
1597
+ align-items: center;
1598
+ gap: 0.5rem;
1599
+ font-size: 0.8rem;
1600
+ color: var(--text);
1601
+ box-shadow: var(--shadow-card);
1602
+ animation: fade-in 0.3s ease;
1603
+ z-index: 500;
1604
+ }
1605
+ .qa-toast-icon {
1606
+ font-size: 1rem;
1607
+ animation: spin 2s linear infinite;
1608
+ }
1609
+
1610
+ /* ── Card footer badge ───────────────────────────────────── */
1611
+ .card-footer-left {
1612
+ display: flex;
1613
+ align-items: center;
1614
+ gap: 0.4rem;
1615
+ min-width: 0;
1616
+ flex: 1;
1617
+ }
1618
+
1619
+ /* Agent name on its own row below the footer */
1620
+ .card-agent-row {
1621
+ margin-top: 0.35rem;
1622
+ display: flex;
1623
+ align-items: center;
1624
+ gap: 0.3rem;
1625
+ }
1626
+ .card-agent-row::before {
1627
+ content: '';
1628
+ display: inline-block;
1629
+ width: 6px;
1630
+ height: 6px;
1631
+ border-radius: 50%;
1632
+ background: var(--accent);
1633
+ opacity: 0.5;
1634
+ flex-shrink: 0;
1635
+ }
1636
+ .card-agent-name {
1637
+ font-size: 0.68rem;
1638
+ color: var(--text-muted);
1639
+ white-space: nowrap;
1640
+ overflow: hidden;
1641
+ text-overflow: ellipsis;
1642
+ font-weight: 500;
1643
+ }
1644
+
1645
+ /* ── Redo errors button ──────────────────────────────────── */
1646
+ .btn-redo-errors {
1647
+ background: transparent;
1648
+ border: 1px solid rgba(230, 80, 80, 0.3);
1649
+ color: rgba(230, 80, 80, 0.6);
1650
+ border-radius: 4px;
1651
+ font-size: 0.85rem;
1652
+ padding: 0.05rem 0.35rem;
1653
+ cursor: pointer;
1654
+ line-height: 1;
1655
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
1656
+ margin-left: auto;
1657
+ }
1658
+ .btn-redo-errors:hover {
1659
+ background: rgba(230, 80, 80, 0.12);
1660
+ border-color: rgba(230, 80, 80, 0.7);
1661
+ color: #e65050;
1662
+ }
1663
+
1664
+ /* ── Image attachment ────────────────────────────────────── */
1665
+ .btn-attach {
1666
+ width: 34px;
1667
+ height: 34px;
1668
+ border-radius: var(--radius-sm);
1669
+ border: 1px solid var(--accent-border);
1670
+ background: transparent;
1671
+ color: var(--text-subtle);
1672
+ cursor: pointer;
1673
+ display: flex;
1674
+ align-items: center;
1675
+ justify-content: center;
1676
+ flex-shrink: 0;
1677
+ transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
1678
+ }
1679
+ .btn-attach:hover {
1680
+ background: var(--accent-faint);
1681
+ border-color: var(--accent);
1682
+ color: var(--accent);
1683
+ }
1684
+
1685
+ .img-preview {
1686
+ display: flex;
1687
+ align-items: center;
1688
+ gap: 0.5rem;
1689
+ padding: 0.4rem 0;
1690
+ margin-bottom: 0.35rem;
1691
+ }
1692
+ .img-preview img {
1693
+ height: 48px;
1694
+ width: auto;
1695
+ max-width: 120px;
1696
+ border-radius: var(--radius-sm);
1697
+ border: 1px solid var(--accent-border);
1698
+ object-fit: cover;
1699
+ }
1700
+ .btn-remove-img {
1701
+ font-size: 0.65rem;
1702
+ padding: 0.15rem 0.4rem;
1703
+ }
1704
+
1705
+ /* ── Board empty-state (zero tasks) ─────────────────────── */
1706
+ @keyframes diamond-glow {
1707
+ 0%, 100% { text-shadow: 0 0 12px rgba(227, 198, 154, 0.5), 0 0 28px rgba(227, 198, 154, 0.25); }
1708
+ 50% { text-shadow: 0 0 22px rgba(227, 198, 154, 0.8), 0 0 48px rgba(227, 198, 154, 0.4); }
1709
+ }
1710
+
1711
+ .board-empty-state {
1712
+ position: absolute;
1713
+ inset: 0;
1714
+ display: flex;
1715
+ flex-direction: column;
1716
+ align-items: center;
1717
+ justify-content: center;
1718
+ gap: 0.75rem;
1719
+ pointer-events: none;
1720
+ z-index: 2;
1721
+ animation: fade-in 0.45s ease;
1722
+ }
1723
+
1724
+ .board-empty-icon {
1725
+ font-size: 3.5rem;
1726
+ color: var(--accent);
1727
+ line-height: 1;
1728
+ animation: diamond-glow 2.8s ease-in-out infinite;
1729
+ }
1730
+
1731
+ .board-empty-headline {
1732
+ font-size: 1.4rem;
1733
+ font-weight: 700;
1734
+ color: var(--text);
1735
+ letter-spacing: -0.01em;
1736
+ margin: 0;
1737
+ }
1738
+
1739
+ .board-empty-sub {
1740
+ font-size: 0.88rem;
1741
+ color: var(--text-muted);
1742
+ margin: 0;
1743
+ }
1744
+
1745
+ /* ── Empty column placeholder ────────────────────────────── */
1746
+ .col-empty {
1747
+ padding: 1rem 0.5rem;
1748
+ text-align: center;
1749
+ color: var(--text-subtle);
1750
+ font-size: 0.72rem;
1751
+ font-style: italic;
1752
+ border: 1px dashed var(--border);
1753
+ border-radius: var(--radius-sm);
1754
+ margin: 0.25rem 0;
1755
+ }
1756
+
1757
+ /* ── Notification Toast ──────────────────────────────────── */
1758
+ .toast-container {
1759
+ position: fixed;
1760
+ bottom: calc(var(--drawer-h) + 1rem);
1761
+ right: 1.25rem;
1762
+ display: flex;
1763
+ flex-direction: column;
1764
+ gap: 0.5rem;
1765
+ z-index: 500;
1766
+ }
1767
+
1768
+ .toast {
1769
+ background: var(--bg-card);
1770
+ border: 1px solid var(--accent-border);
1771
+ border-radius: var(--radius-sm);
1772
+ padding: 0.65rem 1rem;
1773
+ font-size: 0.78rem;
1774
+ color: var(--text);
1775
+ box-shadow: var(--shadow-card);
1776
+ animation: fade-in 0.3s ease;
1777
+ min-width: 220px;
1778
+ max-width: 300px;
1779
+ }
1780
+
1781
+ .toast.success { border-color: rgba(74, 222, 128, 0.4); }
1782
+ .toast.error { border-color: rgba(248, 113, 113, 0.4); }
1783
+
1784
+ /* ── Responsive ──────────────────────────────────────────── */
1785
+ @media (max-width: 900px) {
1786
+ :root {
1787
+ --sidebar-w: 260px;
1788
+ }
1789
+
1790
+ .kanban-board {
1791
+ padding: 1rem;
1792
+ gap: 0.75rem;
1793
+ }
1794
+
1795
+ .kanban-col {
1796
+ min-width: 180px;
1797
+ }
1798
+ }
1799
+
1800
+ @media (max-width: 700px) {
1801
+ #app {
1802
+ grid-template-columns: 1fr;
1803
+ grid-template-rows: auto 1fr;
1804
+ }
1805
+
1806
+ #sidebar {
1807
+ height: auto;
1808
+ max-height: 45vh;
1809
+ border-right: none;
1810
+ border-bottom: 1px solid var(--accent-border);
1811
+ }
1812
+
1813
+ .terminal-drawer {
1814
+ left: 0;
1815
+ }
1816
+
1817
+ .kanban-board {
1818
+ padding: 0.75rem;
1819
+ gap: 0.6rem;
1820
+ }
1821
+
1822
+ .kanban-col {
1823
+ min-width: 155px;
1824
+ }
1825
+
1826
+ .modal-content {
1827
+ width: 95vw;
1828
+ max-height: 88vh;
1829
+ }
1830
+ }
1831
+
1832
+ /* ── Checklist & Deploy button accents ──────────────────── */
1833
+ .btn-checklist {
1834
+ border-color: rgba(80, 200, 120, 0.35) !important;
1835
+ color: rgba(80, 200, 120, 0.85) !important;
1836
+ }
1837
+ .btn-checklist:hover {
1838
+ background: rgba(80, 200, 120, 0.1) !important;
1839
+ border-color: rgba(80, 200, 120, 0.65) !important;
1840
+ color: #5cd68a !important;
1841
+ }
1842
+ .btn-deploy {
1843
+ border-color: rgba(100, 160, 255, 0.35) !important;
1844
+ color: rgba(100, 160, 255, 0.85) !important;
1845
+ }
1846
+ .btn-deploy:hover {
1847
+ background: rgba(100, 160, 255, 0.1) !important;
1848
+ border-color: rgba(100, 160, 255, 0.65) !important;
1849
+ color: #7ab0ff !important;
1850
+ }
1851
+
1852
+ /* ── Utility classes ─────────────────────────────────────── */
1853
+ .visually-hidden {
1854
+ position: absolute;
1855
+ width: 1px;
1856
+ height: 1px;
1857
+ overflow: hidden;
1858
+ clip: rect(0 0 0 0);
1859
+ white-space: nowrap;
1860
+ }
1861
+
1862
+ .truncate {
1863
+ overflow: hidden;
1864
+ text-overflow: ellipsis;
1865
+ white-space: nowrap;
1866
+ }
1867
+
1868
+ .flex-center {
1869
+ display: flex;
1870
+ align-items: center;
1871
+ justify-content: center;
1872
+ }