agent-tasks 1.6.6 → 1.6.7

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.
@@ -1,2512 +1,2512 @@
1
- /* =============================================================================
2
- agent-tasks — Pipeline dashboard styles
3
- Complete UI overhaul: side panel, rich cards, animations, inline editing,
4
- responsive design, enhanced color system, drag polish.
5
- ============================================================================= */
6
-
7
- /* --------------------------------------------------------------------------
8
- Theme tokens
9
- -------------------------------------------------------------------------- */
10
-
11
- :root {
12
- --bg: #ffffff;
13
- --bg-surface: #f5f7f9;
14
- --bg-elevated: #edf0f4;
15
- --bg-hover: #e4e8ed;
16
- --bg-inset: #dde3e9;
17
- --border: #c8d1da;
18
- --border-light: #dde3e9;
19
- --text: #1c2a33;
20
- --text-secondary: #3d5263;
21
- --text-muted: #5a6b78;
22
- --text-dim: #8895a0;
23
- --accent: #5d8da8;
24
- --accent-hover: #4e7a93;
25
- --accent-dim: rgba(93, 141, 168, 0.15);
26
- --accent-solid: #243742;
27
- --accent-glow: rgba(93, 141, 168, 0.35);
28
-
29
- --green: #1a7f37;
30
- --green-dim: rgba(26, 127, 55, 0.12);
31
- --yellow: #9a6700;
32
- --yellow-dim: rgba(154, 103, 0, 0.12);
33
- --orange: #bc4c00;
34
- --orange-dim: rgba(188, 76, 0, 0.12);
35
- --red: #cf222e;
36
- --red-dim: rgba(207, 34, 46, 0.12);
37
- --purple: #6e78a8;
38
- --purple-dim: rgba(110, 120, 168, 0.12);
39
- --blue: #0969da;
40
- --blue-dim: rgba(9, 105, 218, 0.12);
41
- --indigo: #5856d6;
42
- --indigo-dim: rgba(88, 86, 214, 0.12);
43
- --amber: #9a6700;
44
- --amber-dim: rgba(154, 103, 0, 0.12);
45
- --gray: #5a6b78;
46
- --gray-dim: rgba(90, 107, 120, 0.12);
47
-
48
- --stage-backlog: #5a6b78;
49
- --stage-spec: #0969da;
50
- --stage-plan: #5856d6;
51
- --stage-implement: #6e78a8;
52
- --stage-test: #bc4c00;
53
- --stage-review: #9a6700;
54
- --stage-done: #1a7f37;
55
- --stage-cancelled: #cf222e;
56
-
57
- --radius: 12px;
58
- --radius-sm: 8px;
59
- --radius-lg: 16px;
60
- --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
61
- --font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
62
- --column-min: 240px;
63
- --column-max: 320px;
64
- --panel-width: 560px;
65
-
66
- --shadow-0: none;
67
- --shadow-1: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
68
- --shadow-2: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 2px 6px 2px rgba(0, 0, 0, 0.15);
69
- --shadow-3: 0px 1px 3px 0px rgba(0, 0, 0, 0.3), 0px 4px 8px 3px rgba(0, 0, 0, 0.15);
70
- --shadow-hover: 0px 2px 4px 0px rgba(0, 0, 0, 0.25), 0px 4px 12px 4px rgba(0, 0, 0, 0.15);
71
- --focus-ring: rgba(93, 141, 168, 0.35);
72
- --shadow-drag: 0px 4px 8px 0px rgba(0, 0, 0, 0.3), 0px 12px 32px 6px rgba(0, 0, 0, 0.25);
73
- --shadow-panel: -2px 0px 8px 0px rgba(0, 0, 0, 0.3), -4px 0px 16px 2px rgba(0, 0, 0, 0.15);
74
-
75
- --transition-fast: 0.15s ease;
76
- --transition-normal: 0.2s ease;
77
- --transition-slow: 0.3s ease;
78
- }
79
-
80
- [data-theme='dark'] {
81
- --bg: #192028;
82
- --bg-surface: #1e2830;
83
- --bg-elevated: #243742;
84
- --bg-hover: #2c414e;
85
- --bg-inset: #151c24;
86
- --border: #344956;
87
- --border-light: #2a3a46;
88
- --text: #e2e9ef;
89
- --text-secondary: #b8c0cc;
90
- --text-muted: #8fa3b0;
91
- --text-dim: #5f7885;
92
- --accent: #5d8da8;
93
- --accent-hover: #7db5d2;
94
- --accent-dim: rgba(93, 141, 168, 0.2);
95
- --accent-solid: #4a7a96;
96
- --accent-glow: rgba(93, 141, 168, 0.4);
97
-
98
- --green: #3fb950;
99
- --green-dim: rgba(63, 185, 80, 0.15);
100
- --yellow: #e3b341;
101
- --yellow-dim: rgba(227, 179, 65, 0.15);
102
- --orange: #f0883e;
103
- --orange-dim: rgba(240, 136, 62, 0.15);
104
- --red: #f85149;
105
- --red-dim: rgba(248, 81, 73, 0.15);
106
- --purple: #8e9ad0;
107
- --purple-dim: rgba(142, 154, 208, 0.15);
108
- --blue: #58a6ff;
109
- --blue-dim: rgba(88, 166, 255, 0.15);
110
- --indigo: #818cf8;
111
- --indigo-dim: rgba(129, 140, 248, 0.15);
112
- --amber: #f59e0b;
113
- --amber-dim: rgba(245, 158, 11, 0.15);
114
- --gray: #8b949e;
115
- --gray-dim: rgba(139, 148, 158, 0.15);
116
-
117
- --stage-backlog: #8b949e;
118
- --stage-spec: #58a6ff;
119
- --stage-plan: #818cf8;
120
- --stage-implement: #8b5cf6;
121
- --stage-test: #f0883e;
122
- --stage-review: #f59e0b;
123
- --stage-done: #3fb950;
124
- --stage-cancelled: #f85149;
125
-
126
- --shadow-0: none;
127
- --shadow-1: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
128
- --shadow-2: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 2px 6px 2px rgba(0, 0, 0, 0.15);
129
- --shadow-3: 0px 1px 3px 0px rgba(0, 0, 0, 0.3), 0px 4px 8px 3px rgba(0, 0, 0, 0.15);
130
- --shadow-hover: 0px 2px 4px 0px rgba(0, 0, 0, 0.35), 0px 6px 16px 4px rgba(0, 0, 0, 0.25);
131
- --focus-ring: rgba(93, 141, 168, 0.4);
132
- --shadow-drag: 0px 4px 8px 0px rgba(0, 0, 0, 0.5), 0px 12px 32px 6px rgba(0, 0, 0, 0.4);
133
- --shadow-panel: -2px 0px 8px 0px rgba(0, 0, 0, 0.5), -4px 0px 16px 2px rgba(0, 0, 0, 0.3);
134
- }
135
-
136
- /* --------------------------------------------------------------------------
137
- Reset & Base
138
- -------------------------------------------------------------------------- */
139
-
140
- *,
141
- *::before,
142
- *::after {
143
- box-sizing: border-box;
144
- margin: 0;
145
- padding: 0;
146
- }
147
-
148
- html,
149
- body {
150
- height: 100%;
151
- overflow: hidden;
152
- }
153
-
154
- .material-symbols-outlined {
155
- font-variation-settings:
156
- 'FILL' 0,
157
- 'wght' 400,
158
- 'GRAD' 0,
159
- 'opsz' 24;
160
- }
161
-
162
- body {
163
- font-family: var(--font-sans);
164
- background: var(--bg);
165
- color: var(--text);
166
- font-size: 14px;
167
- line-height: 1.5;
168
- display: flex;
169
- flex-direction: column;
170
- transition:
171
- background var(--transition-normal),
172
- color var(--transition-normal);
173
- }
174
-
175
- /* --------------------------------------------------------------------------
176
- Header
177
- -------------------------------------------------------------------------- */
178
-
179
- header {
180
- display: flex;
181
- align-items: center;
182
- justify-content: space-between;
183
- padding: 8px 16px;
184
- background: var(--bg-surface);
185
- border-bottom: 1px solid var(--border);
186
- flex-shrink: 0;
187
- gap: 16px;
188
- transition:
189
- background var(--transition-normal),
190
- border-color var(--transition-normal);
191
- z-index: 20;
192
- }
193
-
194
- .header-left {
195
- display: flex;
196
- align-items: center;
197
- gap: 10px;
198
- }
199
-
200
- .brand-icon {
201
- font-size: 24px;
202
- color: var(--accent);
203
- transition: color var(--transition-normal);
204
- }
205
-
206
- .header-left h1 {
207
- font-size: 17px;
208
- font-weight: 700;
209
- font-family: var(--font-mono);
210
- color: var(--accent-solid);
211
- letter-spacing: -0.3px;
212
- }
213
-
214
- .version {
215
- font-size: 11px;
216
- color: var(--text-dim);
217
- font-family: var(--font-mono);
218
- }
219
-
220
- .header-right {
221
- display: flex;
222
- align-items: center;
223
- gap: 8px;
224
- }
225
-
226
- .stats {
227
- display: flex;
228
- gap: 16px;
229
- font-size: 12px;
230
- color: var(--text-muted);
231
- }
232
-
233
- .stats .stat {
234
- display: flex;
235
- align-items: center;
236
- gap: 4px;
237
- }
238
- .stats .stat-value {
239
- font-weight: 600;
240
- color: var(--text);
241
- transition: transform 0.2s ease;
242
- }
243
- .stats .stat-value.pulse {
244
- animation: countPulse 0.3s ease;
245
- }
246
-
247
- @keyframes countPulse {
248
- 0% {
249
- transform: scale(1);
250
- }
251
- 50% {
252
- transform: scale(1.3);
253
- }
254
- 100% {
255
- transform: scale(1);
256
- }
257
- }
258
-
259
- .status-badge {
260
- font-size: 11px;
261
- padding: 2px 10px;
262
- border-radius: var(--radius);
263
- font-weight: 500;
264
- font-family: var(--font-mono);
265
- transition:
266
- background var(--transition-fast),
267
- color var(--transition-fast);
268
- }
269
- .status-badge.connected {
270
- background: var(--green-dim);
271
- color: var(--green);
272
- }
273
- .status-badge.disconnected {
274
- background: var(--red-dim);
275
- color: var(--red);
276
- }
277
- .status-badge.connecting {
278
- background: var(--yellow-dim);
279
- color: var(--yellow);
280
- }
281
-
282
- .icon-btn {
283
- background: none;
284
- border: 1px solid var(--border);
285
- border-radius: var(--radius-sm);
286
- cursor: pointer;
287
- padding: 5px 8px;
288
- color: var(--text-muted);
289
- font-size: 14px;
290
- line-height: 1;
291
- transition: all var(--transition-fast);
292
- display: inline-flex;
293
- align-items: center;
294
- justify-content: center;
295
- }
296
- .icon-btn .material-symbols-outlined {
297
- font-size: 18px;
298
- }
299
- .icon-btn:hover {
300
- background: var(--bg-hover);
301
- border-color: var(--accent);
302
- color: var(--text);
303
- }
304
- .icon-btn:focus-visible {
305
- outline: 2px solid var(--accent);
306
- outline-offset: 1px;
307
- }
308
-
309
- /* --------------------------------------------------------------------------
310
- Filter Bar
311
- -------------------------------------------------------------------------- */
312
-
313
- .filter-bar {
314
- display: flex;
315
- flex-direction: column;
316
- gap: 6px;
317
- padding: 6px 16px;
318
- background: var(--bg-surface);
319
- border-bottom: 1px solid var(--border);
320
- flex-shrink: 0;
321
- transition:
322
- background var(--transition-normal),
323
- border-color var(--transition-normal);
324
- }
325
-
326
- .filter-group {
327
- display: flex;
328
- align-items: center;
329
- gap: 8px;
330
- }
331
-
332
- .filter-icon {
333
- font-size: 18px;
334
- color: var(--text-dim);
335
- }
336
-
337
- .filter-input {
338
- flex: 1;
339
- max-width: 280px;
340
- padding: 5px 10px;
341
- border: 1px solid var(--border);
342
- border-radius: var(--radius-sm);
343
- background: var(--bg-elevated);
344
- color: var(--text);
345
- font-family: var(--font-sans);
346
- font-size: 12px;
347
- outline: none;
348
- transition:
349
- border-color var(--transition-fast),
350
- box-shadow var(--transition-fast);
351
- }
352
- .filter-input:focus {
353
- border-color: var(--accent);
354
- box-shadow: 0 0 0 3px var(--focus-ring);
355
- }
356
- .filter-input::placeholder {
357
- color: var(--text-dim);
358
- }
359
-
360
- .filter-select {
361
- padding: 5px 8px;
362
- border: 1px solid var(--border);
363
- border-radius: var(--radius-sm);
364
- background: var(--bg-elevated);
365
- color: var(--text);
366
- font-family: var(--font-sans);
367
- font-size: 12px;
368
- cursor: pointer;
369
- outline: none;
370
- transition: border-color var(--transition-fast);
371
- }
372
- .filter-select:focus {
373
- border-color: var(--accent);
374
- box-shadow: 0 0 0 3px var(--focus-ring);
375
- }
376
-
377
- .filter-chips {
378
- display: flex;
379
- gap: 6px;
380
- flex-wrap: wrap;
381
- min-height: 0;
382
- }
383
- .filter-chips:empty {
384
- display: none;
385
- }
386
-
387
- .filter-chip {
388
- display: inline-flex;
389
- align-items: center;
390
- gap: 4px;
391
- padding: 3px 10px;
392
- border-radius: var(--radius);
393
- background: var(--accent);
394
- color: #fff;
395
- font-size: 11px;
396
- font-weight: 500;
397
- font-family: var(--font-mono);
398
- }
399
- .filter-chip button {
400
- background: none;
401
- border: none;
402
- color: rgba(255, 255, 255, 0.7);
403
- cursor: pointer;
404
- font-size: 14px;
405
- line-height: 1;
406
- padding: 0 2px;
407
- }
408
- .filter-chip button:hover {
409
- color: #fff;
410
- }
411
-
412
- /* --------------------------------------------------------------------------
413
- Loading Overlay
414
- -------------------------------------------------------------------------- */
415
-
416
- .loading-overlay {
417
- position: fixed;
418
- inset: 0;
419
- background: var(--bg);
420
- display: flex;
421
- flex-direction: column;
422
- align-items: center;
423
- justify-content: center;
424
- gap: 16px;
425
- z-index: 300;
426
- transition: opacity 0.3s ease;
427
- }
428
-
429
- .loading-overlay.hidden {
430
- opacity: 0;
431
- pointer-events: none;
432
- }
433
-
434
- .loading-spinner {
435
- width: 32px;
436
- height: 32px;
437
- border: 3px solid var(--border);
438
- border-top-color: var(--accent);
439
- border-radius: 50%;
440
- animation: spin 0.8s linear infinite;
441
- }
442
-
443
- .loading-text {
444
- font-size: 13px;
445
- color: var(--text-muted);
446
- }
447
-
448
- @keyframes spin {
449
- to {
450
- transform: rotate(360deg);
451
- }
452
- }
453
-
454
- /* --------------------------------------------------------------------------
455
- Panel Loading / Skeleton
456
- -------------------------------------------------------------------------- */
457
-
458
- .panel-loading {
459
- padding: 12px 0;
460
- }
461
-
462
- .skeleton-line {
463
- height: 12px;
464
- background: var(--bg-hover);
465
- border-radius: 6px;
466
- margin-bottom: 8px;
467
- animation: skeleton-pulse 1.2s ease-in-out infinite;
468
- }
469
-
470
- .skeleton-line:nth-child(2) {
471
- width: 85%;
472
- }
473
-
474
- .skeleton-line:nth-child(3) {
475
- width: 70%;
476
- }
477
-
478
- .skeleton-line.skeleton-wide {
479
- height: 16px;
480
- width: 60%;
481
- margin-bottom: 12px;
482
- }
483
-
484
- .skeleton-line.skeleton-short {
485
- width: 40%;
486
- }
487
-
488
- @keyframes skeleton-pulse {
489
- 0%,
490
- 100% {
491
- opacity: 0.4;
492
- }
493
- 50% {
494
- opacity: 0.8;
495
- }
496
- }
497
-
498
- /* --------------------------------------------------------------------------
499
- Board Layout (with side panel support)
500
- -------------------------------------------------------------------------- */
501
-
502
- .board-wrapper {
503
- display: flex;
504
- flex: 1;
505
- overflow: hidden;
506
- transition: all var(--transition-slow);
507
- }
508
-
509
- .kanban-board {
510
- display: flex;
511
- gap: 8px;
512
- padding: 12px;
513
- flex: 1;
514
- overflow-x: auto;
515
- overflow-y: hidden;
516
- align-items: flex-start;
517
- transition: all var(--transition-slow);
518
- position: relative;
519
- }
520
-
521
- .board-wrapper.panel-open .kanban-board {
522
- flex: 1;
523
- min-width: 0;
524
- }
525
-
526
- /* --------------------------------------------------------------------------
527
- Kanban Columns
528
- -------------------------------------------------------------------------- */
529
-
530
- .kanban-column {
531
- min-width: var(--column-min);
532
- max-width: var(--column-max);
533
- flex: 1;
534
- background: var(--bg-surface);
535
- border-radius: var(--radius);
536
- border: none;
537
- box-shadow: var(--shadow-1);
538
- display: flex;
539
- flex-direction: column;
540
- max-height: 100%;
541
- transition:
542
- background var(--transition-normal),
543
- box-shadow var(--transition-normal),
544
- max-width var(--transition-normal);
545
- position: relative;
546
- overflow: hidden;
547
- }
548
-
549
- .kanban-column::before {
550
- content: '';
551
- position: absolute;
552
- top: 0;
553
- left: 0;
554
- right: 0;
555
- height: 3px;
556
- background: var(--column-accent, var(--gray));
557
- opacity: 0.6;
558
- transition: opacity var(--transition-fast);
559
- }
560
-
561
- .kanban-column:hover {
562
- box-shadow: var(--shadow-2);
563
- }
564
-
565
- .kanban-column:hover::before {
566
- opacity: 1;
567
- }
568
-
569
- .kanban-column[data-stage='backlog'] {
570
- --column-accent: var(--stage-backlog);
571
- }
572
- .kanban-column[data-stage='spec'] {
573
- --column-accent: var(--stage-spec);
574
- }
575
- .kanban-column[data-stage='plan'] {
576
- --column-accent: var(--stage-plan);
577
- }
578
- .kanban-column[data-stage='implement'] {
579
- --column-accent: var(--stage-implement);
580
- }
581
- .kanban-column[data-stage='test'] {
582
- --column-accent: var(--stage-test);
583
- }
584
- .kanban-column[data-stage='review'] {
585
- --column-accent: var(--stage-review);
586
- }
587
- .kanban-column[data-stage='done'] {
588
- --column-accent: var(--stage-done);
589
- }
590
- .kanban-column[data-stage='cancelled'] {
591
- --column-accent: var(--stage-cancelled);
592
- }
593
-
594
- .kanban-column.collapsed {
595
- min-width: 48px;
596
- max-width: 48px;
597
- cursor: pointer;
598
- transition:
599
- min-width var(--transition-slow),
600
- max-width var(--transition-slow),
601
- background var(--transition-normal),
602
- box-shadow var(--transition-normal);
603
- }
604
-
605
- .kanban-column.collapsed .column-body,
606
- .kanban-column.collapsed .column-add-btn {
607
- display: none;
608
- }
609
-
610
- .kanban-column.collapsed .column-header {
611
- writing-mode: vertical-lr;
612
- text-orientation: mixed;
613
- padding: 12px 8px;
614
- flex-direction: column;
615
- gap: 8px;
616
- align-items: center;
617
- }
618
-
619
- .kanban-column.collapsed .column-header h3 {
620
- white-space: nowrap;
621
- }
622
-
623
- .column-header {
624
- padding: 10px 12px;
625
- border-bottom: 1px solid var(--border-light);
626
- display: flex;
627
- align-items: center;
628
- justify-content: space-between;
629
- flex-shrink: 0;
630
- cursor: pointer;
631
- user-select: none;
632
- position: sticky;
633
- top: 0;
634
- z-index: 2;
635
- background: var(--bg-surface);
636
- border-radius: var(--radius) var(--radius) 0 0;
637
- transition: background var(--transition-fast);
638
- }
639
-
640
- .column-header:hover {
641
- background: var(--bg-hover);
642
- }
643
-
644
- .column-header-left {
645
- display: flex;
646
- align-items: center;
647
- gap: 6px;
648
- }
649
-
650
- .column-header-left .material-symbols-outlined {
651
- font-size: 16px;
652
- color: var(--column-accent, var(--text-muted));
653
- opacity: 0.8;
654
- }
655
-
656
- .column-header h3 {
657
- font-size: 11px;
658
- font-weight: 600;
659
- text-transform: uppercase;
660
- letter-spacing: 0.5px;
661
- color: var(--text-muted);
662
- }
663
-
664
- .column-count {
665
- font-size: 11px;
666
- font-weight: 600;
667
- background: var(--bg-hover);
668
- color: var(--text-muted);
669
- padding: 2px 8px;
670
- border-radius: var(--radius);
671
- min-width: 20px;
672
- text-align: center;
673
- transition:
674
- transform 0.2s ease,
675
- background var(--transition-fast),
676
- color var(--transition-fast);
677
- }
678
-
679
- .column-count.pulse {
680
- animation: countPulse 0.3s ease;
681
- }
682
-
683
- .column-count.wip-warning {
684
- background: var(--orange-dim);
685
- color: var(--orange);
686
- }
687
-
688
- .column-count.wip-danger {
689
- background: var(--red-dim);
690
- color: var(--red);
691
- }
692
-
693
- .column-body {
694
- padding: 6px 8px;
695
- overflow-y: auto;
696
- flex: 1;
697
- display: flex;
698
- flex-direction: column;
699
- gap: 6px;
700
- min-height: 40px;
701
- }
702
-
703
- /* --------------------------------------------------------------------------
704
- Empty States
705
- -------------------------------------------------------------------------- */
706
-
707
- .column-empty {
708
- display: flex;
709
- flex-direction: column;
710
- align-items: center;
711
- justify-content: center;
712
- padding: 24px 12px;
713
- color: var(--text-dim);
714
- text-align: center;
715
- gap: 6px;
716
- }
717
-
718
- .column-empty .material-symbols-outlined {
719
- font-size: 28px;
720
- opacity: 0.4;
721
- }
722
-
723
- .column-empty .empty-text {
724
- font-size: 12px;
725
- line-height: 1.4;
726
- }
727
-
728
- .column-empty .empty-cta {
729
- display: inline-flex;
730
- align-items: center;
731
- gap: 4px;
732
- font-size: 12px;
733
- color: var(--accent);
734
- cursor: pointer;
735
- margin-top: 6px;
736
- padding: 6px 12px;
737
- background: var(--accent-dim);
738
- border-radius: var(--radius-sm);
739
- font-weight: 500;
740
- opacity: 1;
741
- transition: all var(--transition-fast);
742
- }
743
- .column-empty .empty-cta .material-symbols-outlined {
744
- font-size: 16px;
745
- opacity: 1;
746
- }
747
- .column-empty .empty-cta:hover {
748
- background: var(--accent);
749
- color: #fff;
750
- text-decoration: none;
751
- }
752
-
753
- .board-empty {
754
- display: flex;
755
- flex-direction: column;
756
- align-items: center;
757
- justify-content: center;
758
- flex: 1;
759
- gap: 16px;
760
- color: var(--text-dim);
761
- padding: 60px 20px;
762
- }
763
- .board-empty .material-symbols-outlined {
764
- font-size: 56px;
765
- opacity: 0.4;
766
- color: var(--accent);
767
- }
768
- .board-empty h3 {
769
- font-size: 18px;
770
- font-weight: 600;
771
- color: var(--text-muted);
772
- }
773
- .board-empty p {
774
- font-size: 13px;
775
- max-width: 400px;
776
- text-align: center;
777
- line-height: 1.6;
778
- color: var(--text-muted);
779
- }
780
- .board-empty .empty-steps {
781
- display: flex;
782
- gap: 24px;
783
- margin-top: 8px;
784
- }
785
- .board-empty .empty-step {
786
- display: flex;
787
- flex-direction: column;
788
- align-items: center;
789
- gap: 8px;
790
- max-width: 140px;
791
- text-align: center;
792
- }
793
- .board-empty .empty-step .material-symbols-outlined {
794
- font-size: 32px;
795
- opacity: 0.6;
796
- }
797
- .board-empty .empty-step span {
798
- font-size: 12px;
799
- color: var(--text-muted);
800
- }
801
-
802
- /* --------------------------------------------------------------------------
803
- Task Cards
804
- -------------------------------------------------------------------------- */
805
-
806
- .task-card {
807
- background: var(--bg-elevated);
808
- border: 1px solid transparent;
809
- border-radius: var(--radius);
810
- padding: 10px 12px;
811
- cursor: pointer;
812
- position: relative;
813
- box-shadow: var(--shadow-1);
814
- transition:
815
- border-color var(--transition-fast),
816
- box-shadow var(--transition-fast),
817
- transform var(--transition-fast),
818
- opacity var(--transition-fast);
819
- }
820
-
821
- .task-card:hover {
822
- box-shadow:
823
- 0 0 0 1px var(--accent-dim),
824
- var(--shadow-hover);
825
- transform: translateY(-2px);
826
- }
827
-
828
- .task-card:active {
829
- transform: translateY(0);
830
- }
831
-
832
- .task-card.active-card {
833
- border-color: var(--accent);
834
- box-shadow:
835
- 0 0 0 2px var(--focus-ring),
836
- var(--shadow-2);
837
- background: var(--bg-surface);
838
- }
839
-
840
- .task-card.no-anim {
841
- animation: none !important;
842
- }
843
-
844
- .task-card-header {
845
- display: flex;
846
- align-items: flex-start;
847
- justify-content: space-between;
848
- gap: 8px;
849
- margin-bottom: 2px;
850
- }
851
-
852
- .task-card-id {
853
- font-size: 11px;
854
- color: var(--text-dim);
855
- font-family: var(--font-mono);
856
- flex-shrink: 0;
857
- }
858
-
859
- .task-card-time {
860
- font-size: 10px;
861
- color: var(--text-dim);
862
- flex-shrink: 0;
863
- white-space: nowrap;
864
- }
865
-
866
- .task-card-title {
867
- font-size: 13px;
868
- font-weight: 600;
869
- margin: 2px 0 4px;
870
- line-height: 1.35;
871
- word-break: break-word;
872
- color: var(--text);
873
- }
874
-
875
- .task-card-title[contenteditable='true'] {
876
- outline: none;
877
- border-bottom: 1px dashed var(--accent);
878
- padding-bottom: 1px;
879
- cursor: text;
880
- }
881
-
882
- .task-card-desc {
883
- font-size: 12px;
884
- color: var(--text-muted);
885
- margin-bottom: 6px;
886
- line-height: 1.4;
887
- display: -webkit-box;
888
- -webkit-line-clamp: 2;
889
- -webkit-box-orient: vertical;
890
- overflow: hidden;
891
- }
892
-
893
- .task-card-footer {
894
- display: flex;
895
- align-items: center;
896
- justify-content: space-between;
897
- gap: 6px;
898
- }
899
-
900
- .task-card-meta {
901
- display: flex;
902
- align-items: center;
903
- gap: 4px;
904
- flex-wrap: wrap;
905
- flex: 1;
906
- min-width: 0;
907
- }
908
-
909
- .task-card-assignee {
910
- flex-shrink: 0;
911
- }
912
-
913
- .task-tag {
914
- font-size: 10px;
915
- padding: 2px 8px;
916
- border-radius: var(--radius-sm);
917
- font-weight: 500;
918
- transition: opacity var(--transition-fast);
919
- cursor: default;
920
- white-space: nowrap;
921
- }
922
-
923
- .task-tag.clickable {
924
- cursor: pointer;
925
- }
926
- .task-tag.clickable:hover {
927
- opacity: 0.8;
928
- }
929
-
930
- .tag-project {
931
- background: var(--accent-dim);
932
- color: var(--accent);
933
- }
934
- .tag-assignee {
935
- background: var(--purple-dim);
936
- color: var(--purple);
937
- }
938
- .tag-priority {
939
- background: var(--orange-dim);
940
- color: var(--orange);
941
- }
942
- .tag-artifacts {
943
- background: var(--blue-dim);
944
- color: var(--blue);
945
- }
946
- .tag-blocked {
947
- background: var(--red-dim);
948
- color: var(--red);
949
- }
950
- .tag-comments {
951
- background: var(--purple-dim);
952
- color: var(--purple);
953
- }
954
- .tag-subtasks {
955
- background: var(--green-dim);
956
- color: var(--green);
957
- }
958
-
959
- /* ---- Stage-colored left border ---- */
960
-
961
- .task-card[data-stage='backlog'] {
962
- border-left: 3px solid var(--stage-backlog);
963
- }
964
- .task-card[data-stage='spec'] {
965
- border-left: 3px solid var(--stage-spec);
966
- }
967
- .task-card[data-stage='plan'] {
968
- border-left: 3px solid var(--stage-plan);
969
- }
970
- .task-card[data-stage='implement'] {
971
- border-left: 3px solid var(--stage-implement);
972
- }
973
- .task-card[data-stage='test'] {
974
- border-left: 3px solid var(--stage-test);
975
- }
976
- .task-card[data-stage='review'] {
977
- border-left: 3px solid var(--stage-review);
978
- }
979
- .task-card[data-stage='done'] {
980
- border-left: 3px solid var(--stage-done);
981
- }
982
- .task-card[data-stage='cancelled'] {
983
- border-left: 3px solid var(--stage-cancelled);
984
- }
985
-
986
- /* ---- Priority override for high-priority ---- */
987
-
988
- .task-card.priority-high {
989
- border-left: 3px solid var(--red);
990
- }
991
- .task-card.priority-medium {
992
- border-left: 3px solid var(--orange);
993
- }
994
- .task-card.status-cancelled .task-card-title {
995
- text-decoration: line-through;
996
- opacity: 0.7;
997
- }
998
-
999
- /* ---- Status indicator on cards ---- */
1000
-
1001
- .task-status-indicator {
1002
- display: inline-flex;
1003
- align-items: center;
1004
- justify-content: center;
1005
- flex-shrink: 0;
1006
- margin-left: 4px;
1007
- }
1008
- .task-status-indicator .material-symbols-outlined {
1009
- font-size: 14px;
1010
- font-variation-settings:
1011
- 'FILL' 1,
1012
- 'wght' 400,
1013
- 'GRAD' 0,
1014
- 'opsz' 14;
1015
- }
1016
- .task-status-indicator.status-in_progress {
1017
- color: var(--blue);
1018
- }
1019
- .task-status-indicator.status-completed {
1020
- color: var(--green);
1021
- }
1022
- .task-status-indicator.status-failed {
1023
- color: var(--red);
1024
- }
1025
- .task-status-indicator.status-pending {
1026
- color: var(--gray);
1027
- }
1028
- .task-status-indicator.status-cancelled {
1029
- color: var(--text-dim);
1030
- }
1031
-
1032
- /* ---- Collaborator overflow indicator ---- */
1033
-
1034
- .collab-overflow {
1035
- width: 20px;
1036
- height: 20px;
1037
- border-radius: 50%;
1038
- background: var(--bg-hover);
1039
- color: var(--text-muted);
1040
- font-size: 9px;
1041
- font-weight: 600;
1042
- display: flex;
1043
- align-items: center;
1044
- justify-content: center;
1045
- border: 1.5px solid var(--bg-surface);
1046
- margin-left: -4px;
1047
- }
1048
-
1049
- /* ---- Staggered entrance animation ---- */
1050
-
1051
- @keyframes cardEnter {
1052
- from {
1053
- opacity: 0;
1054
- transform: translateY(12px);
1055
- }
1056
- to {
1057
- opacity: 1;
1058
- transform: translateY(0);
1059
- }
1060
- }
1061
-
1062
- .task-card.animate-in {
1063
- animation: cardEnter 0.3s ease both;
1064
- }
1065
-
1066
- /* ---- Assignee avatar circle ---- */
1067
-
1068
- .avatar-circle {
1069
- width: 22px;
1070
- height: 22px;
1071
- border-radius: 50%;
1072
- display: flex;
1073
- align-items: center;
1074
- justify-content: center;
1075
- font-size: 9px;
1076
- font-weight: 700;
1077
- color: #fff;
1078
- flex-shrink: 0;
1079
- text-transform: uppercase;
1080
- letter-spacing: -0.3px;
1081
- }
1082
-
1083
- .avatar-circle.avatar-sm {
1084
- width: 18px;
1085
- height: 18px;
1086
- font-size: 8px;
1087
- }
1088
-
1089
- .avatar-circle.avatar-lg {
1090
- width: 28px;
1091
- height: 28px;
1092
- font-size: 11px;
1093
- }
1094
-
1095
- /* ---- Subtask progress bar ---- */
1096
-
1097
- .subtask-progress {
1098
- margin-top: 6px;
1099
- height: 3px;
1100
- background: var(--border-light);
1101
- border-radius: 2px;
1102
- overflow: hidden;
1103
- }
1104
- .subtask-progress-fill {
1105
- height: 100%;
1106
- background: var(--green);
1107
- border-radius: 2px;
1108
- transition: width 0.3s ease;
1109
- }
1110
-
1111
- /* ---- Collaborator avatars ---- */
1112
-
1113
- .task-card-collabs {
1114
- display: flex;
1115
- margin-top: 4px;
1116
- }
1117
- .collab-avatar {
1118
- width: 20px;
1119
- height: 20px;
1120
- border-radius: 50%;
1121
- background: var(--accent-dim);
1122
- color: var(--accent);
1123
- font-size: 10px;
1124
- font-weight: 600;
1125
- display: flex;
1126
- align-items: center;
1127
- justify-content: center;
1128
- border: 1.5px solid var(--bg-surface);
1129
- margin-left: -4px;
1130
- }
1131
- .collab-avatar:first-child {
1132
- margin-left: 0;
1133
- }
1134
-
1135
- /* --------------------------------------------------------------------------
1136
- Drag and Drop
1137
- -------------------------------------------------------------------------- */
1138
-
1139
- .task-card[draggable='true'] {
1140
- cursor: grab;
1141
- }
1142
-
1143
- .task-card.dragging {
1144
- opacity: 0.35;
1145
- transform: scale(0.98);
1146
- cursor: grabbing;
1147
- }
1148
-
1149
- .drag-ghost {
1150
- position: fixed;
1151
- pointer-events: none;
1152
- z-index: 1000;
1153
- width: 280px;
1154
- opacity: 0.92;
1155
- transform: rotate(2deg) scale(1.03);
1156
- box-shadow: var(--shadow-drag);
1157
- border-radius: var(--radius);
1158
- transition: none;
1159
- }
1160
-
1161
- .kanban-column.drag-over {
1162
- background: var(--accent-dim);
1163
- box-shadow:
1164
- 0 0 0 2px var(--accent),
1165
- var(--shadow-2);
1166
- transition:
1167
- background 0.15s ease,
1168
- box-shadow 0.15s ease;
1169
- }
1170
-
1171
- .kanban-column.drag-over .column-body {
1172
- min-height: 60px;
1173
- }
1174
-
1175
- .drop-placeholder {
1176
- height: 4px;
1177
- background: var(--accent);
1178
- border-radius: 2px;
1179
- margin: 2px 0;
1180
- opacity: 0.8;
1181
- transition: height 0.15s ease;
1182
- }
1183
-
1184
- /* ---- Auto-scroll indicators ---- */
1185
-
1186
- .kanban-board.drag-scroll-left::before,
1187
- .kanban-board.drag-scroll-right::after {
1188
- content: '';
1189
- position: absolute;
1190
- top: 0;
1191
- bottom: 0;
1192
- width: 60px;
1193
- z-index: 5;
1194
- pointer-events: none;
1195
- }
1196
- .kanban-board.drag-scroll-left::before {
1197
- left: 0;
1198
- background: linear-gradient(to right, var(--accent-dim), transparent);
1199
- }
1200
- .kanban-board.drag-scroll-right::after {
1201
- right: 0;
1202
- background: linear-gradient(to left, var(--accent-dim), transparent);
1203
- }
1204
-
1205
- /* ---- Focus (keyboard nav) ---- */
1206
-
1207
- .task-card:focus-visible {
1208
- outline: 2px solid var(--accent);
1209
- outline-offset: 2px;
1210
- }
1211
-
1212
- /* --------------------------------------------------------------------------
1213
- Inline Task Creation
1214
- -------------------------------------------------------------------------- */
1215
-
1216
- .column-add-btn {
1217
- display: flex;
1218
- align-items: center;
1219
- justify-content: center;
1220
- gap: 4px;
1221
- padding: 8px;
1222
- margin: 2px 8px 8px;
1223
- border: none;
1224
- border-radius: var(--radius-sm);
1225
- background: var(--bg-elevated);
1226
- color: var(--text-dim);
1227
- font-size: 12px;
1228
- font-weight: 500;
1229
- font-family: var(--font-sans);
1230
- cursor: pointer;
1231
- transition: all var(--transition-fast);
1232
- }
1233
-
1234
- .column-add-btn:hover {
1235
- color: var(--accent);
1236
- background: var(--accent-dim);
1237
- }
1238
-
1239
- .column-add-btn .material-symbols-outlined {
1240
- font-size: 16px;
1241
- }
1242
-
1243
- .inline-create-form {
1244
- padding: 0 8px 8px;
1245
- }
1246
-
1247
- .inline-create-card {
1248
- background: var(--bg-elevated);
1249
- border: 1px solid var(--accent);
1250
- border-radius: var(--radius);
1251
- padding: 10px 12px;
1252
- box-shadow: 0 0 0 3px var(--focus-ring);
1253
- }
1254
-
1255
- .inline-create-input {
1256
- width: 100%;
1257
- border: none;
1258
- background: transparent;
1259
- color: var(--text);
1260
- font-family: var(--font-sans);
1261
- font-size: 13px;
1262
- font-weight: 500;
1263
- outline: none;
1264
- line-height: 1.4;
1265
- resize: none;
1266
- }
1267
-
1268
- .inline-create-input::placeholder {
1269
- color: var(--text-dim);
1270
- }
1271
-
1272
- .inline-create-hint {
1273
- font-size: 10px;
1274
- color: var(--text-dim);
1275
- margin-top: 6px;
1276
- display: flex;
1277
- align-items: center;
1278
- gap: 8px;
1279
- }
1280
-
1281
- .inline-create-hint kbd {
1282
- background: var(--bg-hover);
1283
- padding: 0 4px;
1284
- border-radius: 2px;
1285
- font-family: var(--font-mono);
1286
- font-size: 10px;
1287
- }
1288
-
1289
- /* --------------------------------------------------------------------------
1290
- Side Panel (Detail View)
1291
- -------------------------------------------------------------------------- */
1292
-
1293
- .side-panel {
1294
- width: 0;
1295
- min-width: 0;
1296
- background: var(--bg-surface);
1297
- border-left: 1px solid var(--border);
1298
- display: flex;
1299
- flex-direction: column;
1300
- overflow: hidden;
1301
- position: relative;
1302
- transition:
1303
- width var(--transition-slow),
1304
- min-width var(--transition-slow);
1305
- box-shadow: var(--shadow-panel);
1306
- z-index: 15;
1307
- }
1308
-
1309
- .board-wrapper.panel-open .side-panel {
1310
- width: var(--panel-width);
1311
- min-width: var(--panel-width);
1312
- }
1313
-
1314
- .board-wrapper.panel-open .side-panel.panel-wide {
1315
- --panel-width: min(720px, 55vw);
1316
- }
1317
-
1318
- /* ---- Panel resize handle ---- */
1319
-
1320
- .panel-resize-handle {
1321
- position: absolute;
1322
- top: 0;
1323
- left: -4px;
1324
- width: 8px;
1325
- height: 100%;
1326
- cursor: col-resize;
1327
- z-index: 10;
1328
- }
1329
- .panel-resize-handle::after {
1330
- content: '';
1331
- position: absolute;
1332
- top: 50%;
1333
- left: 2px;
1334
- transform: translateY(-50%);
1335
- width: 4px;
1336
- height: 40px;
1337
- border-radius: 2px;
1338
- background: var(--border);
1339
- opacity: 0;
1340
- transition: opacity 0.2s;
1341
- }
1342
- .panel-resize-handle:hover::after,
1343
- .panel-resize-handle:active::after {
1344
- opacity: 1;
1345
- background: var(--accent);
1346
- }
1347
-
1348
- /* ---- Fullscreen artifact ---- */
1349
-
1350
- .artifact-fullscreen-btn {
1351
- background: none;
1352
- border: none;
1353
- color: var(--text-dim);
1354
- cursor: pointer;
1355
- padding: 2px 4px;
1356
- display: inline-flex;
1357
- align-items: center;
1358
- }
1359
- .artifact-fullscreen-btn:hover {
1360
- color: var(--accent);
1361
- }
1362
- .artifact-fullscreen-btn .material-symbols-outlined {
1363
- font-size: 16px;
1364
- }
1365
-
1366
- .artifact-fullscreen-overlay {
1367
- position: fixed;
1368
- inset: 0;
1369
- background: var(--bg);
1370
- z-index: 400;
1371
- display: flex;
1372
- flex-direction: column;
1373
- overflow: hidden;
1374
- }
1375
- .artifact-fullscreen-header {
1376
- display: flex;
1377
- align-items: center;
1378
- justify-content: space-between;
1379
- padding: 8px 16px;
1380
- border-bottom: 1px solid var(--border);
1381
- background: var(--bg-surface);
1382
- flex-shrink: 0;
1383
- }
1384
- .artifact-fullscreen-header h3 {
1385
- font-size: 14px;
1386
- font-weight: 600;
1387
- }
1388
- .artifact-fullscreen-body {
1389
- flex: 1;
1390
- overflow: auto;
1391
- padding: 16px;
1392
- }
1393
-
1394
- .panel-header {
1395
- display: flex;
1396
- align-items: center;
1397
- justify-content: space-between;
1398
- padding: 12px 16px;
1399
- border-bottom: 1px solid var(--border-light);
1400
- flex-shrink: 0;
1401
- gap: 8px;
1402
- min-height: 49px;
1403
- }
1404
-
1405
- .panel-header-left {
1406
- display: flex;
1407
- align-items: center;
1408
- gap: 8px;
1409
- min-width: 0;
1410
- flex: 1;
1411
- }
1412
-
1413
- .panel-task-id {
1414
- font-family: var(--font-mono);
1415
- font-size: 13px;
1416
- color: var(--text-muted);
1417
- font-weight: 500;
1418
- flex-shrink: 0;
1419
- }
1420
-
1421
- .panel-stage-badge {
1422
- font-size: 10px;
1423
- font-weight: 600;
1424
- text-transform: uppercase;
1425
- letter-spacing: 0.3px;
1426
- padding: 2px 10px;
1427
- border-radius: var(--radius);
1428
- flex-shrink: 0;
1429
- }
1430
-
1431
- .panel-close-btn {
1432
- background: none;
1433
- border: none;
1434
- cursor: pointer;
1435
- color: var(--text-muted);
1436
- padding: 4px;
1437
- border-radius: var(--radius-sm);
1438
- display: flex;
1439
- align-items: center;
1440
- justify-content: center;
1441
- transition: all var(--transition-fast);
1442
- flex-shrink: 0;
1443
- }
1444
- .panel-close-btn:hover {
1445
- background: var(--bg-hover);
1446
- color: var(--text);
1447
- }
1448
- .panel-close-btn .material-symbols-outlined {
1449
- font-size: 20px;
1450
- }
1451
-
1452
- .panel-body {
1453
- flex: 1;
1454
- overflow-y: auto;
1455
- padding: 16px;
1456
- }
1457
-
1458
- .panel-title {
1459
- font-size: 16px;
1460
- font-weight: 700;
1461
- line-height: 1.35;
1462
- margin-bottom: 16px;
1463
- word-break: break-word;
1464
- }
1465
-
1466
- .panel-title[contenteditable='true'] {
1467
- outline: none;
1468
- border-bottom: 2px solid var(--accent);
1469
- cursor: text;
1470
- }
1471
-
1472
- .panel-section {
1473
- margin-bottom: 20px;
1474
- }
1475
-
1476
- .panel-section-title {
1477
- font-size: 11px;
1478
- font-weight: 600;
1479
- text-transform: uppercase;
1480
- letter-spacing: 0.5px;
1481
- color: var(--text-dim);
1482
- margin-bottom: 8px;
1483
- display: flex;
1484
- align-items: center;
1485
- gap: 6px;
1486
- }
1487
-
1488
- .panel-section-title .material-symbols-outlined {
1489
- font-size: 14px;
1490
- }
1491
-
1492
- .panel-grid {
1493
- display: grid;
1494
- grid-template-columns: 100px 1fr;
1495
- gap: 6px 12px;
1496
- font-size: 13px;
1497
- }
1498
-
1499
- .panel-label {
1500
- font-weight: 500;
1501
- color: var(--text-muted);
1502
- }
1503
-
1504
- .panel-value {
1505
- word-break: break-word;
1506
- color: var(--text);
1507
- }
1508
-
1509
- .panel-value .task-tag {
1510
- cursor: pointer;
1511
- }
1512
-
1513
- .panel-description {
1514
- font-size: 13px;
1515
- line-height: 1.6;
1516
- word-break: break-word;
1517
- color: var(--text-secondary);
1518
- padding: 10px 12px;
1519
- background: var(--bg-elevated);
1520
- border-radius: var(--radius-sm);
1521
- border: 1px solid var(--border-light);
1522
- }
1523
- .panel-description .rendered-md {
1524
- white-space: normal;
1525
- }
1526
-
1527
- /* ---- Panel artifacts ---- */
1528
-
1529
- .panel-artifact {
1530
- background: var(--bg-elevated);
1531
- border: 1px solid var(--border-light);
1532
- border-radius: var(--radius-sm);
1533
- padding: 10px 12px;
1534
- margin-bottom: 6px;
1535
- }
1536
- .panel-artifact h4 {
1537
- font-size: 12px;
1538
- color: var(--accent);
1539
- margin-bottom: 0;
1540
- display: flex;
1541
- align-items: center;
1542
- gap: 4px;
1543
- }
1544
- .panel-artifact pre {
1545
- font-family: var(--font-mono);
1546
- font-size: 12px;
1547
- white-space: pre-wrap;
1548
- word-break: break-word;
1549
- color: var(--text-muted);
1550
- line-height: 1.5;
1551
- margin: 0;
1552
- padding: 0;
1553
- }
1554
-
1555
- /* ---- Panel subtasks ---- */
1556
-
1557
- .panel-subtask {
1558
- display: flex;
1559
- align-items: center;
1560
- gap: 8px;
1561
- padding: 6px 10px;
1562
- background: var(--bg-elevated);
1563
- border: 1px solid var(--border-light);
1564
- border-radius: var(--radius-sm);
1565
- margin-bottom: 4px;
1566
- cursor: pointer;
1567
- transition: border-color var(--transition-fast);
1568
- font-size: 13px;
1569
- }
1570
- .panel-subtask:hover {
1571
- border-color: var(--accent);
1572
- }
1573
- .panel-subtask .subtask-id {
1574
- font-family: var(--font-mono);
1575
- font-size: 11px;
1576
- color: var(--text-dim);
1577
- }
1578
- .panel-subtask .subtask-stage {
1579
- font-size: 10px;
1580
- padding: 2px 8px;
1581
- border-radius: var(--radius-sm);
1582
- margin-left: auto;
1583
- flex-shrink: 0;
1584
- }
1585
-
1586
- /* ---- Panel comments ---- */
1587
-
1588
- .panel-comments {
1589
- border-top: 1px solid var(--border-light);
1590
- padding-top: 12px;
1591
- }
1592
-
1593
- .comment-item {
1594
- padding: 8px 10px;
1595
- background: var(--bg-elevated);
1596
- border-radius: var(--radius-sm);
1597
- margin-bottom: 6px;
1598
- border: 1px solid var(--border-light);
1599
- }
1600
- .comment-item.reply {
1601
- margin-left: 24px;
1602
- }
1603
- .comment-header {
1604
- display: flex;
1605
- align-items: center;
1606
- gap: 6px;
1607
- margin-bottom: 4px;
1608
- font-size: 12px;
1609
- }
1610
- .comment-agent {
1611
- font-weight: 600;
1612
- color: var(--accent);
1613
- }
1614
- .comment-time {
1615
- color: var(--text-dim);
1616
- font-size: 11px;
1617
- }
1618
- .comment-body {
1619
- font-size: 13px;
1620
- white-space: pre-wrap;
1621
- word-break: break-word;
1622
- color: var(--text-secondary);
1623
- }
1624
- .comment-form {
1625
- display: flex;
1626
- gap: 6px;
1627
- margin-top: 8px;
1628
- }
1629
- .comment-form textarea {
1630
- flex: 1;
1631
- padding: 6px 10px;
1632
- border: 1px solid var(--border);
1633
- border-radius: var(--radius-sm);
1634
- background: var(--bg-elevated);
1635
- color: var(--text);
1636
- font-family: var(--font-sans);
1637
- font-size: 12px;
1638
- resize: vertical;
1639
- min-height: 32px;
1640
- max-height: 120px;
1641
- outline: none;
1642
- transition: border-color var(--transition-fast);
1643
- }
1644
- .comment-form textarea:focus {
1645
- border-color: var(--accent);
1646
- box-shadow: 0 0 0 3px var(--focus-ring);
1647
- }
1648
- .comment-form button {
1649
- padding: 6px 14px;
1650
- border: none;
1651
- border-radius: var(--radius-sm);
1652
- background: var(--accent);
1653
- color: white;
1654
- font-size: 12px;
1655
- font-weight: 500;
1656
- cursor: pointer;
1657
- white-space: nowrap;
1658
- align-self: flex-end;
1659
- transition: background var(--transition-fast);
1660
- }
1661
- .comment-form button:hover {
1662
- background: var(--accent-hover);
1663
- }
1664
-
1665
- /* --------------------------------------------------------------------------
1666
- Legacy Modal (cleanup dialog only)
1667
- -------------------------------------------------------------------------- */
1668
-
1669
- .modal-overlay {
1670
- position: fixed;
1671
- inset: 0;
1672
- background: rgba(0, 0, 0, 0.5);
1673
- display: flex;
1674
- align-items: center;
1675
- justify-content: center;
1676
- z-index: 100;
1677
- backdrop-filter: blur(2px);
1678
- animation: overlayIn 0.15s ease;
1679
- }
1680
- .modal-overlay[hidden],
1681
- .modal-overlay.hidden {
1682
- display: none;
1683
- }
1684
-
1685
- @keyframes overlayIn {
1686
- from {
1687
- opacity: 0;
1688
- }
1689
- to {
1690
- opacity: 1;
1691
- }
1692
- }
1693
-
1694
- .modal {
1695
- background: var(--bg-surface);
1696
- border-radius: var(--radius-lg);
1697
- border: 1px solid var(--border);
1698
- width: 90%;
1699
- max-width: 600px;
1700
- max-height: 80vh;
1701
- display: flex;
1702
- flex-direction: column;
1703
- box-shadow: var(--shadow-3);
1704
- animation: modalIn 0.2s ease;
1705
- }
1706
-
1707
- @keyframes modalIn {
1708
- from {
1709
- opacity: 0;
1710
- transform: translateY(12px) scale(0.97);
1711
- }
1712
- to {
1713
- opacity: 1;
1714
- transform: translateY(0) scale(1);
1715
- }
1716
- }
1717
-
1718
- .modal-header {
1719
- display: flex;
1720
- align-items: center;
1721
- justify-content: space-between;
1722
- padding: 12px 16px;
1723
- border-bottom: 1px solid var(--border-light);
1724
- }
1725
- .modal-header h2 {
1726
- font-size: 15px;
1727
- font-weight: 600;
1728
- }
1729
- .modal-close {
1730
- font-size: 20px;
1731
- border: none;
1732
- background: none;
1733
- cursor: pointer;
1734
- color: var(--text-muted);
1735
- padding: 4px;
1736
- border-radius: var(--radius-sm);
1737
- transition: all var(--transition-fast);
1738
- }
1739
- .modal-close:hover {
1740
- background: var(--bg-hover);
1741
- color: var(--text);
1742
- }
1743
-
1744
- .modal-body {
1745
- padding: 16px;
1746
- overflow-y: auto;
1747
- font-size: 13px;
1748
- line-height: 1.6;
1749
- }
1750
-
1751
- /* --------------------------------------------------------------------------
1752
- Inline Edit Dropdown
1753
- -------------------------------------------------------------------------- */
1754
-
1755
- .inline-dropdown {
1756
- position: absolute;
1757
- background: var(--bg-surface);
1758
- border: 1px solid var(--border);
1759
- border-radius: var(--radius);
1760
- box-shadow: var(--shadow-3);
1761
- z-index: 50;
1762
- padding: 4px;
1763
- min-width: 140px;
1764
- max-height: 200px;
1765
- overflow-y: auto;
1766
- animation: dropdownIn 0.12s ease;
1767
- }
1768
-
1769
- @keyframes dropdownIn {
1770
- from {
1771
- opacity: 0;
1772
- transform: translateY(-4px);
1773
- }
1774
- to {
1775
- opacity: 1;
1776
- transform: translateY(0);
1777
- }
1778
- }
1779
-
1780
- .inline-dropdown-item {
1781
- padding: 6px 10px;
1782
- font-size: 12px;
1783
- cursor: pointer;
1784
- border-radius: var(--radius-sm);
1785
- transition: background var(--transition-fast);
1786
- display: flex;
1787
- align-items: center;
1788
- gap: 6px;
1789
- }
1790
- .inline-dropdown-item:hover {
1791
- background: var(--bg-hover);
1792
- }
1793
- .inline-dropdown-item.active {
1794
- background: var(--accent-dim);
1795
- color: var(--accent);
1796
- font-weight: 500;
1797
- }
1798
-
1799
- /* --------------------------------------------------------------------------
1800
- Toast
1801
- -------------------------------------------------------------------------- */
1802
-
1803
- .toast-container {
1804
- position: fixed;
1805
- top: 16px;
1806
- right: 16px;
1807
- z-index: 1000;
1808
- display: flex;
1809
- flex-direction: column;
1810
- gap: 8px;
1811
- pointer-events: none;
1812
- }
1813
-
1814
- .toast {
1815
- background: var(--bg-surface);
1816
- border: 1px solid var(--border);
1817
- border-radius: var(--radius);
1818
- padding: 10px 14px;
1819
- font-size: 12px;
1820
- box-shadow: var(--shadow-2);
1821
- animation: toastIn 0.3s cubic-bezier(0.2, 0.8, 0.3, 1);
1822
- max-width: 340px;
1823
- pointer-events: auto;
1824
- display: flex;
1825
- align-items: flex-start;
1826
- gap: 8px;
1827
- }
1828
-
1829
- .toast-icon {
1830
- font-size: 18px;
1831
- flex-shrink: 0;
1832
- line-height: 1;
1833
- }
1834
- .toast-icon.toast-icon-success {
1835
- color: var(--green);
1836
- }
1837
- .toast-icon.toast-icon-error {
1838
- color: var(--red);
1839
- }
1840
-
1841
- .toast-content {
1842
- flex: 1;
1843
- min-width: 0;
1844
- }
1845
-
1846
- .toast-title {
1847
- font-weight: 600;
1848
- margin-bottom: 2px;
1849
- }
1850
- .toast-body {
1851
- color: var(--text-muted);
1852
- }
1853
-
1854
- .toast.fade-out {
1855
- animation: toastOut 0.3s ease forwards;
1856
- }
1857
-
1858
- @keyframes toastIn {
1859
- from {
1860
- opacity: 0;
1861
- transform: translateY(16px) scale(0.95);
1862
- }
1863
- to {
1864
- opacity: 1;
1865
- transform: translateY(0) scale(1);
1866
- }
1867
- }
1868
-
1869
- @keyframes toastOut {
1870
- from {
1871
- opacity: 1;
1872
- transform: translateX(0);
1873
- }
1874
- to {
1875
- opacity: 0;
1876
- transform: translateX(40px);
1877
- }
1878
- }
1879
-
1880
- /* --------------------------------------------------------------------------
1881
- Scrollbar
1882
- -------------------------------------------------------------------------- */
1883
-
1884
- ::-webkit-scrollbar {
1885
- width: 6px;
1886
- height: 6px;
1887
- }
1888
- ::-webkit-scrollbar-track {
1889
- background: transparent;
1890
- }
1891
- ::-webkit-scrollbar-thumb {
1892
- background: var(--border);
1893
- border-radius: 3px;
1894
- }
1895
- ::-webkit-scrollbar-thumb:hover {
1896
- background: var(--text-dim);
1897
- }
1898
-
1899
- /* --------------------------------------------------------------------------
1900
- Cleanup Dialog
1901
- -------------------------------------------------------------------------- */
1902
-
1903
- .cleanup-options {
1904
- display: flex;
1905
- flex-direction: column;
1906
- gap: 8px;
1907
- }
1908
-
1909
- .cleanup-option {
1910
- display: flex;
1911
- align-items: flex-start;
1912
- gap: 12px;
1913
- padding: 12px;
1914
- border: 1px solid var(--border);
1915
- border-radius: var(--radius);
1916
- background: var(--bg-elevated);
1917
- color: var(--text);
1918
- cursor: pointer;
1919
- text-align: left;
1920
- font-family: var(--font-sans);
1921
- font-size: 13px;
1922
- transition:
1923
- border-color var(--transition-fast),
1924
- background var(--transition-fast);
1925
- }
1926
- .cleanup-option:hover {
1927
- background: var(--bg-hover);
1928
- border-color: var(--accent);
1929
- }
1930
- .cleanup-option .material-symbols-outlined {
1931
- font-size: 24px;
1932
- color: var(--accent);
1933
- flex-shrink: 0;
1934
- margin-top: 2px;
1935
- }
1936
- .cleanup-option div {
1937
- display: flex;
1938
- flex-direction: column;
1939
- gap: 2px;
1940
- }
1941
- .cleanup-option strong {
1942
- font-size: 14px;
1943
- }
1944
- .cleanup-option div span {
1945
- font-size: 12px;
1946
- color: var(--text-muted);
1947
- }
1948
-
1949
- .cleanup-option-danger {
1950
- border-color: rgba(220, 53, 69, 0.4);
1951
- border-width: 1.5px;
1952
- }
1953
- .cleanup-option-danger:hover {
1954
- border-color: var(--red);
1955
- background: var(--red-dim);
1956
- box-shadow: 0 0 0 1px rgba(220, 53, 69, 0.15);
1957
- }
1958
- .cleanup-option-danger .material-symbols-outlined {
1959
- color: var(--red);
1960
- }
1961
- .cleanup-option-danger strong {
1962
- color: var(--red);
1963
- }
1964
-
1965
- /* --------------------------------------------------------------------------
1966
- Reduced Motion
1967
- -------------------------------------------------------------------------- */
1968
-
1969
- @media (prefers-reduced-motion: reduce) {
1970
- *,
1971
- *::before,
1972
- *::after {
1973
- animation-duration: 0.01ms !important;
1974
- transition-duration: 0.01ms !important;
1975
- }
1976
- }
1977
-
1978
- /* --------------------------------------------------------------------------
1979
- Responsive
1980
- -------------------------------------------------------------------------- */
1981
-
1982
- @media (max-width: 1024px) {
1983
- .board-wrapper.panel-open .side-panel {
1984
- position: fixed;
1985
- right: 0;
1986
- top: 0;
1987
- bottom: 0;
1988
- width: var(--panel-width);
1989
- min-width: var(--panel-width);
1990
- z-index: 80;
1991
- box-shadow: var(--shadow-3);
1992
- }
1993
-
1994
- .board-wrapper.panel-open .kanban-board {
1995
- flex: 1;
1996
- }
1997
-
1998
- .panel-backdrop {
1999
- display: block;
2000
- position: fixed;
2001
- inset: 0;
2002
- background: rgba(0, 0, 0, 0.3);
2003
- z-index: 79;
2004
- }
2005
- }
2006
-
2007
- @media (min-width: 1025px) {
2008
- .panel-backdrop {
2009
- display: none;
2010
- }
2011
- }
2012
-
2013
- @media (max-width: 768px) {
2014
- .kanban-board {
2015
- flex-direction: column;
2016
- overflow-y: auto;
2017
- overflow-x: hidden;
2018
- }
2019
- .kanban-column {
2020
- min-width: 0;
2021
- max-width: none;
2022
- max-height: none;
2023
- }
2024
- .kanban-column.collapsed {
2025
- min-width: 0;
2026
- max-width: none;
2027
- writing-mode: horizontal-tb;
2028
- }
2029
- .kanban-column.collapsed .column-header {
2030
- writing-mode: horizontal-tb;
2031
- flex-direction: row;
2032
- padding: 10px 12px;
2033
- }
2034
- .filter-group {
2035
- flex-wrap: wrap;
2036
- }
2037
- .filter-input {
2038
- max-width: none;
2039
- }
2040
- .stats {
2041
- display: none;
2042
- }
2043
-
2044
- .board-wrapper.panel-open .side-panel {
2045
- width: 100%;
2046
- min-width: 100%;
2047
- --panel-width: 100%;
2048
- }
2049
- }
2050
-
2051
- @media (max-width: 480px) {
2052
- header {
2053
- padding: 6px 12px;
2054
- }
2055
- .filter-bar {
2056
- padding: 6px 12px;
2057
- }
2058
- .kanban-board {
2059
- padding: 8px;
2060
- }
2061
- .modal {
2062
- width: 98%;
2063
- }
2064
- }
2065
-
2066
- /* --------------------------------------------------------------------------
2067
- Stage Badge Colors (panel & dropdown)
2068
- -------------------------------------------------------------------------- */
2069
-
2070
- .stage-backlog {
2071
- background: var(--gray-dim);
2072
- color: var(--gray);
2073
- }
2074
- .stage-spec {
2075
- background: var(--blue-dim);
2076
- color: var(--blue);
2077
- }
2078
- .stage-plan {
2079
- background: var(--indigo-dim);
2080
- color: var(--indigo);
2081
- }
2082
- .stage-implement {
2083
- background: var(--purple-dim);
2084
- color: var(--purple);
2085
- }
2086
- .stage-test {
2087
- background: var(--orange-dim);
2088
- color: var(--orange);
2089
- }
2090
- .stage-review {
2091
- background: var(--amber-dim);
2092
- color: var(--amber);
2093
- }
2094
- .stage-done {
2095
- background: var(--green-dim);
2096
- color: var(--green);
2097
- }
2098
- .stage-cancelled {
2099
- background: var(--red-dim);
2100
- color: var(--red);
2101
- }
2102
-
2103
- /* --------------------------------------------------------------------------
2104
- Priority dropdown indicator
2105
- -------------------------------------------------------------------------- */
2106
-
2107
- .priority-dot {
2108
- width: 8px;
2109
- height: 8px;
2110
- border-radius: 50%;
2111
- display: inline-block;
2112
- flex-shrink: 0;
2113
- }
2114
- .priority-dot.p-high {
2115
- background: var(--red);
2116
- }
2117
- .priority-dot.p-med {
2118
- background: var(--orange);
2119
- }
2120
- .priority-dot.p-low {
2121
- background: var(--blue);
2122
- }
2123
- .priority-dot.p-none {
2124
- background: var(--gray);
2125
- }
2126
-
2127
- /* --------------------------------------------------------------------------
2128
- Comments section (used in legacy modal)
2129
- -------------------------------------------------------------------------- */
2130
-
2131
- .comments-section {
2132
- margin-top: 16px;
2133
- border-top: 1px solid var(--border-light);
2134
- padding-top: 12px;
2135
- }
2136
- .comments-section h3 {
2137
- font-size: 13px;
2138
- font-weight: 600;
2139
- margin-bottom: 8px;
2140
- display: flex;
2141
- align-items: center;
2142
- gap: 6px;
2143
- }
2144
-
2145
- /* --------------------------------------------------------------------------
2146
- Detail row (used in both panel and legacy modal)
2147
- -------------------------------------------------------------------------- */
2148
-
2149
- .detail-row {
2150
- display: flex;
2151
- gap: 8px;
2152
- margin-bottom: 8px;
2153
- font-size: 13px;
2154
- line-height: 1.6;
2155
- }
2156
- .detail-label {
2157
- font-weight: 600;
2158
- color: var(--text-muted);
2159
- min-width: 90px;
2160
- flex-shrink: 0;
2161
- }
2162
- .detail-value {
2163
- word-break: break-word;
2164
- }
2165
-
2166
- .artifact-list {
2167
- margin-top: 12px;
2168
- }
2169
- .artifact-item {
2170
- background: var(--bg-elevated);
2171
- border: 1px solid var(--border-light);
2172
- border-radius: var(--radius-sm);
2173
- padding: 8px 10px;
2174
- margin-bottom: 6px;
2175
- }
2176
- .artifact-item h4 {
2177
- font-size: 12px;
2178
- color: var(--accent);
2179
- margin-bottom: 4px;
2180
- }
2181
- .artifact-item pre {
2182
- font-family: var(--font-mono);
2183
- font-size: 12px;
2184
- white-space: pre-wrap;
2185
- word-break: break-word;
2186
- color: var(--text-muted);
2187
- max-height: 200px;
2188
- overflow-y: auto;
2189
- }
2190
-
2191
- /* --------------------------------------------------------------------------
2192
- Syntax Highlighting
2193
- -------------------------------------------------------------------------- */
2194
-
2195
- .hljs-keyword {
2196
- color: var(--purple);
2197
- font-weight: 500;
2198
- }
2199
- .hljs-string {
2200
- color: var(--green);
2201
- }
2202
- .hljs-comment {
2203
- color: var(--text-dim);
2204
- font-style: italic;
2205
- }
2206
- .hljs-number {
2207
- color: var(--orange);
2208
- }
2209
- .hljs-function {
2210
- color: var(--blue);
2211
- }
2212
- .hljs-type {
2213
- color: var(--indigo);
2214
- }
2215
- .hljs-operator {
2216
- color: var(--text-muted);
2217
- }
2218
- .hljs-property {
2219
- color: var(--accent);
2220
- }
2221
-
2222
- /* --------------------------------------------------------------------------
2223
- Markdown Rendering
2224
- -------------------------------------------------------------------------- */
2225
-
2226
- .rendered-md h3 {
2227
- font-size: 14px;
2228
- font-weight: 700;
2229
- margin: 12px 0 6px;
2230
- color: var(--text);
2231
- }
2232
- .rendered-md h4 {
2233
- font-size: 13px;
2234
- font-weight: 600;
2235
- margin: 10px 0 4px;
2236
- color: var(--text);
2237
- }
2238
- .rendered-md strong {
2239
- font-weight: 600;
2240
- color: var(--text);
2241
- }
2242
- .rendered-md em {
2243
- font-style: italic;
2244
- }
2245
- .rendered-md code {
2246
- font-family: var(--font-mono);
2247
- font-size: 0.9em;
2248
- background: var(--bg-inset);
2249
- padding: 1px 5px;
2250
- border-radius: 4px;
2251
- color: var(--accent);
2252
- }
2253
- .rendered-md pre {
2254
- background: var(--bg-inset);
2255
- border: 1px solid var(--border-light);
2256
- border-radius: var(--radius-sm);
2257
- padding: 10px 12px;
2258
- margin: 8px 0;
2259
- overflow-x: auto;
2260
- }
2261
- .rendered-md pre code {
2262
- background: none;
2263
- padding: 0;
2264
- color: var(--text-secondary);
2265
- font-size: 12px;
2266
- line-height: 1.5;
2267
- }
2268
- .rendered-md ul {
2269
- padding-left: 20px;
2270
- margin: 6px 0;
2271
- }
2272
- .rendered-md ul li {
2273
- font-size: 13px;
2274
- line-height: 1.6;
2275
- color: var(--text-secondary);
2276
- margin-bottom: 2px;
2277
- }
2278
- .rendered-md a {
2279
- color: var(--accent);
2280
- text-decoration: none;
2281
- }
2282
- .rendered-md a:hover {
2283
- text-decoration: underline;
2284
- }
2285
- .rendered-md br {
2286
- content: '';
2287
- display: block;
2288
- margin-top: 4px;
2289
- }
2290
-
2291
- /* --------------------------------------------------------------------------
2292
- Expandable Artifacts
2293
- -------------------------------------------------------------------------- */
2294
-
2295
- .artifact-wrapper {
2296
- position: relative;
2297
- width: 100%;
2298
- }
2299
-
2300
- .artifact-wrapper.artifact-collapsed .artifact-code {
2301
- max-height: calc(1.5em * 8 + 20px);
2302
- overflow: hidden;
2303
- }
2304
-
2305
- .artifact-wrapper.artifact-collapsed .artifact-fade {
2306
- display: block;
2307
- }
2308
-
2309
- .artifact-wrapper.artifact-expanded .artifact-code {
2310
- max-height: 600px;
2311
- overflow-y: auto;
2312
- }
2313
-
2314
- .artifact-code {
2315
- margin: 0;
2316
- padding: 0 12px;
2317
- font-family: var(--font-mono);
2318
- font-size: 12px;
2319
- line-height: 1.5;
2320
- white-space: pre;
2321
- color: var(--text-muted);
2322
- }
2323
-
2324
- .artifact-fade {
2325
- display: none;
2326
- position: absolute;
2327
- bottom: 28px;
2328
- left: 0;
2329
- right: 0;
2330
- height: 48px;
2331
- background: linear-gradient(transparent, var(--bg-elevated));
2332
- pointer-events: none;
2333
- border-radius: 0 0 var(--radius-sm) var(--radius-sm);
2334
- }
2335
-
2336
- .artifact-toggle {
2337
- display: flex;
2338
- align-items: center;
2339
- justify-content: center;
2340
- gap: 4px;
2341
- width: 100%;
2342
- padding: 4px 0;
2343
- margin-top: 4px;
2344
- background: none;
2345
- border: none;
2346
- border-top: 1px solid var(--border-light);
2347
- color: var(--accent);
2348
- font-family: var(--font-sans);
2349
- font-size: 11px;
2350
- font-weight: 500;
2351
- cursor: pointer;
2352
- transition: color var(--transition-fast);
2353
- }
2354
- .artifact-toggle:hover {
2355
- color: var(--accent-hover);
2356
- }
2357
- .artifact-toggle .material-symbols-outlined {
2358
- font-size: 14px;
2359
- }
2360
-
2361
- /* --------------------------------------------------------------------------
2362
- Diff Viewer
2363
- -------------------------------------------------------------------------- */
2364
-
2365
- .diff-viewer {
2366
- display: flex;
2367
- gap: 2px;
2368
- font-family: var(--font-mono);
2369
- font-size: 12px;
2370
- line-height: 1.5;
2371
- overflow-x: auto;
2372
- border: 1px solid var(--border);
2373
- border-radius: var(--radius-sm);
2374
- }
2375
-
2376
- .diff-side {
2377
- flex: 1;
2378
- min-width: 0;
2379
- overflow-x: auto;
2380
- }
2381
-
2382
- .diff-side .diff-header {
2383
- padding: 4px 8px;
2384
- background: var(--bg-hover);
2385
- font-weight: 600;
2386
- font-size: 11px;
2387
- color: var(--text-muted);
2388
- border-bottom: 1px solid var(--border);
2389
- }
2390
-
2391
- .diff-table {
2392
- width: 100%;
2393
- border-collapse: collapse;
2394
- }
2395
-
2396
- .diff-ln {
2397
- width: 36px;
2398
- text-align: right;
2399
- padding: 0 8px;
2400
- color: var(--text-dim);
2401
- user-select: none;
2402
- border-right: 1px solid var(--border);
2403
- }
2404
-
2405
- .diff-code {
2406
- padding: 0 8px;
2407
- white-space: pre;
2408
- }
2409
-
2410
- .diff-del {
2411
- background: var(--red-dim);
2412
- }
2413
-
2414
- .diff-del .diff-code {
2415
- color: var(--red);
2416
- }
2417
-
2418
- .diff-add {
2419
- background: var(--green-dim);
2420
- }
2421
-
2422
- .diff-add .diff-code {
2423
- color: var(--green);
2424
- }
2425
-
2426
- .diff-context {
2427
- background: transparent;
2428
- }
2429
-
2430
- .diff-context .diff-code {
2431
- color: var(--text-muted);
2432
- }
2433
-
2434
- .diff-section-header td {
2435
- padding: 2px 8px;
2436
- background: var(--blue-dim);
2437
- color: var(--blue);
2438
- font-weight: 500;
2439
- font-size: 11px;
2440
- }
2441
-
2442
- /* --------------------------------------------------------------------------
2443
- Artifact Header (copy button + line numbers)
2444
- -------------------------------------------------------------------------- */
2445
-
2446
- .artifact-header {
2447
- display: flex;
2448
- align-items: center;
2449
- justify-content: space-between;
2450
- gap: 6px;
2451
- margin-bottom: 4px;
2452
- }
2453
-
2454
- .artifact-header h4 {
2455
- font-size: 12px;
2456
- color: var(--accent);
2457
- display: flex;
2458
- align-items: center;
2459
- gap: 4px;
2460
- margin: 0;
2461
- flex: 1;
2462
- min-width: 0;
2463
- }
2464
-
2465
- .artifact-copy-btn {
2466
- background: none;
2467
- border: 1px solid var(--border-light);
2468
- border-radius: 4px;
2469
- color: var(--text-dim);
2470
- cursor: pointer;
2471
- padding: 2px 6px;
2472
- font-size: 11px;
2473
- font-family: var(--font-sans);
2474
- display: flex;
2475
- align-items: center;
2476
- gap: 3px;
2477
- transition: all var(--transition-fast);
2478
- flex-shrink: 0;
2479
- }
2480
- .artifact-copy-btn:hover {
2481
- background: var(--bg-hover);
2482
- border-color: var(--accent);
2483
- color: var(--text);
2484
- }
2485
- .artifact-copy-btn .material-symbols-outlined {
2486
- font-size: 13px;
2487
- }
2488
-
2489
- .artifact-lines {
2490
- display: flex;
2491
- overflow-x: auto;
2492
- }
2493
-
2494
- .artifact-line-numbers {
2495
- white-space: pre;
2496
- text-align: right;
2497
- padding-right: 12px;
2498
- border-right: 1px solid var(--border);
2499
- color: var(--text-dim);
2500
- font-size: 11px;
2501
- line-height: 1.5;
2502
- user-select: none;
2503
- min-width: 32px;
2504
- font-family: var(--font-mono);
2505
- flex-shrink: 0;
2506
- }
2507
-
2508
- .artifact-line-content {
2509
- flex: 1;
2510
- overflow-x: auto;
2511
- min-width: 0;
2512
- }
1
+ /* =============================================================================
2
+ agent-tasks — Pipeline dashboard styles
3
+ Complete UI overhaul: side panel, rich cards, animations, inline editing,
4
+ responsive design, enhanced color system, drag polish.
5
+ ============================================================================= */
6
+
7
+ /* --------------------------------------------------------------------------
8
+ Theme tokens
9
+ -------------------------------------------------------------------------- */
10
+
11
+ :root {
12
+ --bg: #ffffff;
13
+ --bg-surface: #f5f7f9;
14
+ --bg-elevated: #edf0f4;
15
+ --bg-hover: #e4e8ed;
16
+ --bg-inset: #dde3e9;
17
+ --border: #c8d1da;
18
+ --border-light: #dde3e9;
19
+ --text: #1c2a33;
20
+ --text-secondary: #3d5263;
21
+ --text-muted: #5a6b78;
22
+ --text-dim: #8895a0;
23
+ --accent: #5d8da8;
24
+ --accent-hover: #4e7a93;
25
+ --accent-dim: rgba(93, 141, 168, 0.15);
26
+ --accent-solid: #243742;
27
+ --accent-glow: rgba(93, 141, 168, 0.35);
28
+
29
+ --green: #1a7f37;
30
+ --green-dim: rgba(26, 127, 55, 0.12);
31
+ --yellow: #9a6700;
32
+ --yellow-dim: rgba(154, 103, 0, 0.12);
33
+ --orange: #bc4c00;
34
+ --orange-dim: rgba(188, 76, 0, 0.12);
35
+ --red: #cf222e;
36
+ --red-dim: rgba(207, 34, 46, 0.12);
37
+ --purple: #6e78a8;
38
+ --purple-dim: rgba(110, 120, 168, 0.12);
39
+ --blue: #0969da;
40
+ --blue-dim: rgba(9, 105, 218, 0.12);
41
+ --indigo: #5856d6;
42
+ --indigo-dim: rgba(88, 86, 214, 0.12);
43
+ --amber: #9a6700;
44
+ --amber-dim: rgba(154, 103, 0, 0.12);
45
+ --gray: #5a6b78;
46
+ --gray-dim: rgba(90, 107, 120, 0.12);
47
+
48
+ --stage-backlog: #5a6b78;
49
+ --stage-spec: #0969da;
50
+ --stage-plan: #5856d6;
51
+ --stage-implement: #6e78a8;
52
+ --stage-test: #bc4c00;
53
+ --stage-review: #9a6700;
54
+ --stage-done: #1a7f37;
55
+ --stage-cancelled: #cf222e;
56
+
57
+ --radius: 12px;
58
+ --radius-sm: 8px;
59
+ --radius-lg: 16px;
60
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
61
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
62
+ --column-min: 240px;
63
+ --column-max: 320px;
64
+ --panel-width: 560px;
65
+
66
+ --shadow-0: none;
67
+ --shadow-1: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
68
+ --shadow-2: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 2px 6px 2px rgba(0, 0, 0, 0.15);
69
+ --shadow-3: 0px 1px 3px 0px rgba(0, 0, 0, 0.3), 0px 4px 8px 3px rgba(0, 0, 0, 0.15);
70
+ --shadow-hover: 0px 2px 4px 0px rgba(0, 0, 0, 0.25), 0px 4px 12px 4px rgba(0, 0, 0, 0.15);
71
+ --focus-ring: rgba(93, 141, 168, 0.35);
72
+ --shadow-drag: 0px 4px 8px 0px rgba(0, 0, 0, 0.3), 0px 12px 32px 6px rgba(0, 0, 0, 0.25);
73
+ --shadow-panel: -2px 0px 8px 0px rgba(0, 0, 0, 0.3), -4px 0px 16px 2px rgba(0, 0, 0, 0.15);
74
+
75
+ --transition-fast: 0.15s ease;
76
+ --transition-normal: 0.2s ease;
77
+ --transition-slow: 0.3s ease;
78
+ }
79
+
80
+ [data-theme='dark'] {
81
+ --bg: #192028;
82
+ --bg-surface: #1e2830;
83
+ --bg-elevated: #243742;
84
+ --bg-hover: #2c414e;
85
+ --bg-inset: #151c24;
86
+ --border: #344956;
87
+ --border-light: #2a3a46;
88
+ --text: #e2e9ef;
89
+ --text-secondary: #b8c0cc;
90
+ --text-muted: #8fa3b0;
91
+ --text-dim: #5f7885;
92
+ --accent: #5d8da8;
93
+ --accent-hover: #7db5d2;
94
+ --accent-dim: rgba(93, 141, 168, 0.2);
95
+ --accent-solid: #4a7a96;
96
+ --accent-glow: rgba(93, 141, 168, 0.4);
97
+
98
+ --green: #3fb950;
99
+ --green-dim: rgba(63, 185, 80, 0.15);
100
+ --yellow: #e3b341;
101
+ --yellow-dim: rgba(227, 179, 65, 0.15);
102
+ --orange: #f0883e;
103
+ --orange-dim: rgba(240, 136, 62, 0.15);
104
+ --red: #f85149;
105
+ --red-dim: rgba(248, 81, 73, 0.15);
106
+ --purple: #8e9ad0;
107
+ --purple-dim: rgba(142, 154, 208, 0.15);
108
+ --blue: #58a6ff;
109
+ --blue-dim: rgba(88, 166, 255, 0.15);
110
+ --indigo: #818cf8;
111
+ --indigo-dim: rgba(129, 140, 248, 0.15);
112
+ --amber: #f59e0b;
113
+ --amber-dim: rgba(245, 158, 11, 0.15);
114
+ --gray: #8b949e;
115
+ --gray-dim: rgba(139, 148, 158, 0.15);
116
+
117
+ --stage-backlog: #8b949e;
118
+ --stage-spec: #58a6ff;
119
+ --stage-plan: #818cf8;
120
+ --stage-implement: #8b5cf6;
121
+ --stage-test: #f0883e;
122
+ --stage-review: #f59e0b;
123
+ --stage-done: #3fb950;
124
+ --stage-cancelled: #f85149;
125
+
126
+ --shadow-0: none;
127
+ --shadow-1: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
128
+ --shadow-2: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 2px 6px 2px rgba(0, 0, 0, 0.15);
129
+ --shadow-3: 0px 1px 3px 0px rgba(0, 0, 0, 0.3), 0px 4px 8px 3px rgba(0, 0, 0, 0.15);
130
+ --shadow-hover: 0px 2px 4px 0px rgba(0, 0, 0, 0.35), 0px 6px 16px 4px rgba(0, 0, 0, 0.25);
131
+ --focus-ring: rgba(93, 141, 168, 0.4);
132
+ --shadow-drag: 0px 4px 8px 0px rgba(0, 0, 0, 0.5), 0px 12px 32px 6px rgba(0, 0, 0, 0.4);
133
+ --shadow-panel: -2px 0px 8px 0px rgba(0, 0, 0, 0.5), -4px 0px 16px 2px rgba(0, 0, 0, 0.3);
134
+ }
135
+
136
+ /* --------------------------------------------------------------------------
137
+ Reset & Base
138
+ -------------------------------------------------------------------------- */
139
+
140
+ *,
141
+ *::before,
142
+ *::after {
143
+ box-sizing: border-box;
144
+ margin: 0;
145
+ padding: 0;
146
+ }
147
+
148
+ html,
149
+ body {
150
+ height: 100%;
151
+ overflow: hidden;
152
+ }
153
+
154
+ .material-symbols-outlined {
155
+ font-variation-settings:
156
+ 'FILL' 0,
157
+ 'wght' 400,
158
+ 'GRAD' 0,
159
+ 'opsz' 24;
160
+ }
161
+
162
+ body {
163
+ font-family: var(--font-sans);
164
+ background: var(--bg);
165
+ color: var(--text);
166
+ font-size: 14px;
167
+ line-height: 1.5;
168
+ display: flex;
169
+ flex-direction: column;
170
+ transition:
171
+ background var(--transition-normal),
172
+ color var(--transition-normal);
173
+ }
174
+
175
+ /* --------------------------------------------------------------------------
176
+ Header
177
+ -------------------------------------------------------------------------- */
178
+
179
+ header {
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: space-between;
183
+ padding: 8px 16px;
184
+ background: var(--bg-surface);
185
+ border-bottom: 1px solid var(--border);
186
+ flex-shrink: 0;
187
+ gap: 16px;
188
+ transition:
189
+ background var(--transition-normal),
190
+ border-color var(--transition-normal);
191
+ z-index: 20;
192
+ }
193
+
194
+ .header-left {
195
+ display: flex;
196
+ align-items: center;
197
+ gap: 10px;
198
+ }
199
+
200
+ .brand-icon {
201
+ font-size: 24px;
202
+ color: var(--accent);
203
+ transition: color var(--transition-normal);
204
+ }
205
+
206
+ .header-left h1 {
207
+ font-size: 17px;
208
+ font-weight: 700;
209
+ font-family: var(--font-mono);
210
+ color: var(--accent-solid);
211
+ letter-spacing: -0.3px;
212
+ }
213
+
214
+ .version {
215
+ font-size: 11px;
216
+ color: var(--text-dim);
217
+ font-family: var(--font-mono);
218
+ }
219
+
220
+ .header-right {
221
+ display: flex;
222
+ align-items: center;
223
+ gap: 8px;
224
+ }
225
+
226
+ .stats {
227
+ display: flex;
228
+ gap: 16px;
229
+ font-size: 12px;
230
+ color: var(--text-muted);
231
+ }
232
+
233
+ .stats .stat {
234
+ display: flex;
235
+ align-items: center;
236
+ gap: 4px;
237
+ }
238
+ .stats .stat-value {
239
+ font-weight: 600;
240
+ color: var(--text);
241
+ transition: transform 0.2s ease;
242
+ }
243
+ .stats .stat-value.pulse {
244
+ animation: countPulse 0.3s ease;
245
+ }
246
+
247
+ @keyframes countPulse {
248
+ 0% {
249
+ transform: scale(1);
250
+ }
251
+ 50% {
252
+ transform: scale(1.3);
253
+ }
254
+ 100% {
255
+ transform: scale(1);
256
+ }
257
+ }
258
+
259
+ .status-badge {
260
+ font-size: 11px;
261
+ padding: 2px 10px;
262
+ border-radius: var(--radius);
263
+ font-weight: 500;
264
+ font-family: var(--font-mono);
265
+ transition:
266
+ background var(--transition-fast),
267
+ color var(--transition-fast);
268
+ }
269
+ .status-badge.connected {
270
+ background: var(--green-dim);
271
+ color: var(--green);
272
+ }
273
+ .status-badge.disconnected {
274
+ background: var(--red-dim);
275
+ color: var(--red);
276
+ }
277
+ .status-badge.connecting {
278
+ background: var(--yellow-dim);
279
+ color: var(--yellow);
280
+ }
281
+
282
+ .icon-btn {
283
+ background: none;
284
+ border: 1px solid var(--border);
285
+ border-radius: var(--radius-sm);
286
+ cursor: pointer;
287
+ padding: 5px 8px;
288
+ color: var(--text-muted);
289
+ font-size: 14px;
290
+ line-height: 1;
291
+ transition: all var(--transition-fast);
292
+ display: inline-flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ }
296
+ .icon-btn .material-symbols-outlined {
297
+ font-size: 18px;
298
+ }
299
+ .icon-btn:hover {
300
+ background: var(--bg-hover);
301
+ border-color: var(--accent);
302
+ color: var(--text);
303
+ }
304
+ .icon-btn:focus-visible {
305
+ outline: 2px solid var(--accent);
306
+ outline-offset: 1px;
307
+ }
308
+
309
+ /* --------------------------------------------------------------------------
310
+ Filter Bar
311
+ -------------------------------------------------------------------------- */
312
+
313
+ .filter-bar {
314
+ display: flex;
315
+ flex-direction: column;
316
+ gap: 6px;
317
+ padding: 6px 16px;
318
+ background: var(--bg-surface);
319
+ border-bottom: 1px solid var(--border);
320
+ flex-shrink: 0;
321
+ transition:
322
+ background var(--transition-normal),
323
+ border-color var(--transition-normal);
324
+ }
325
+
326
+ .filter-group {
327
+ display: flex;
328
+ align-items: center;
329
+ gap: 8px;
330
+ }
331
+
332
+ .filter-icon {
333
+ font-size: 18px;
334
+ color: var(--text-dim);
335
+ }
336
+
337
+ .filter-input {
338
+ flex: 1;
339
+ max-width: 280px;
340
+ padding: 5px 10px;
341
+ border: 1px solid var(--border);
342
+ border-radius: var(--radius-sm);
343
+ background: var(--bg-elevated);
344
+ color: var(--text);
345
+ font-family: var(--font-sans);
346
+ font-size: 12px;
347
+ outline: none;
348
+ transition:
349
+ border-color var(--transition-fast),
350
+ box-shadow var(--transition-fast);
351
+ }
352
+ .filter-input:focus {
353
+ border-color: var(--accent);
354
+ box-shadow: 0 0 0 3px var(--focus-ring);
355
+ }
356
+ .filter-input::placeholder {
357
+ color: var(--text-dim);
358
+ }
359
+
360
+ .filter-select {
361
+ padding: 5px 8px;
362
+ border: 1px solid var(--border);
363
+ border-radius: var(--radius-sm);
364
+ background: var(--bg-elevated);
365
+ color: var(--text);
366
+ font-family: var(--font-sans);
367
+ font-size: 12px;
368
+ cursor: pointer;
369
+ outline: none;
370
+ transition: border-color var(--transition-fast);
371
+ }
372
+ .filter-select:focus {
373
+ border-color: var(--accent);
374
+ box-shadow: 0 0 0 3px var(--focus-ring);
375
+ }
376
+
377
+ .filter-chips {
378
+ display: flex;
379
+ gap: 6px;
380
+ flex-wrap: wrap;
381
+ min-height: 0;
382
+ }
383
+ .filter-chips:empty {
384
+ display: none;
385
+ }
386
+
387
+ .filter-chip {
388
+ display: inline-flex;
389
+ align-items: center;
390
+ gap: 4px;
391
+ padding: 3px 10px;
392
+ border-radius: var(--radius);
393
+ background: var(--accent);
394
+ color: #fff;
395
+ font-size: 11px;
396
+ font-weight: 500;
397
+ font-family: var(--font-mono);
398
+ }
399
+ .filter-chip button {
400
+ background: none;
401
+ border: none;
402
+ color: rgba(255, 255, 255, 0.7);
403
+ cursor: pointer;
404
+ font-size: 14px;
405
+ line-height: 1;
406
+ padding: 0 2px;
407
+ }
408
+ .filter-chip button:hover {
409
+ color: #fff;
410
+ }
411
+
412
+ /* --------------------------------------------------------------------------
413
+ Loading Overlay
414
+ -------------------------------------------------------------------------- */
415
+
416
+ .loading-overlay {
417
+ position: fixed;
418
+ inset: 0;
419
+ background: var(--bg);
420
+ display: flex;
421
+ flex-direction: column;
422
+ align-items: center;
423
+ justify-content: center;
424
+ gap: 16px;
425
+ z-index: 300;
426
+ transition: opacity 0.3s ease;
427
+ }
428
+
429
+ .loading-overlay.hidden {
430
+ opacity: 0;
431
+ pointer-events: none;
432
+ }
433
+
434
+ .loading-spinner {
435
+ width: 32px;
436
+ height: 32px;
437
+ border: 3px solid var(--border);
438
+ border-top-color: var(--accent);
439
+ border-radius: 50%;
440
+ animation: spin 0.8s linear infinite;
441
+ }
442
+
443
+ .loading-text {
444
+ font-size: 13px;
445
+ color: var(--text-muted);
446
+ }
447
+
448
+ @keyframes spin {
449
+ to {
450
+ transform: rotate(360deg);
451
+ }
452
+ }
453
+
454
+ /* --------------------------------------------------------------------------
455
+ Panel Loading / Skeleton
456
+ -------------------------------------------------------------------------- */
457
+
458
+ .panel-loading {
459
+ padding: 12px 0;
460
+ }
461
+
462
+ .skeleton-line {
463
+ height: 12px;
464
+ background: var(--bg-hover);
465
+ border-radius: 6px;
466
+ margin-bottom: 8px;
467
+ animation: skeleton-pulse 1.2s ease-in-out infinite;
468
+ }
469
+
470
+ .skeleton-line:nth-child(2) {
471
+ width: 85%;
472
+ }
473
+
474
+ .skeleton-line:nth-child(3) {
475
+ width: 70%;
476
+ }
477
+
478
+ .skeleton-line.skeleton-wide {
479
+ height: 16px;
480
+ width: 60%;
481
+ margin-bottom: 12px;
482
+ }
483
+
484
+ .skeleton-line.skeleton-short {
485
+ width: 40%;
486
+ }
487
+
488
+ @keyframes skeleton-pulse {
489
+ 0%,
490
+ 100% {
491
+ opacity: 0.4;
492
+ }
493
+ 50% {
494
+ opacity: 0.8;
495
+ }
496
+ }
497
+
498
+ /* --------------------------------------------------------------------------
499
+ Board Layout (with side panel support)
500
+ -------------------------------------------------------------------------- */
501
+
502
+ .board-wrapper {
503
+ display: flex;
504
+ flex: 1;
505
+ overflow: hidden;
506
+ transition: all var(--transition-slow);
507
+ }
508
+
509
+ .kanban-board {
510
+ display: flex;
511
+ gap: 8px;
512
+ padding: 12px;
513
+ flex: 1;
514
+ overflow-x: auto;
515
+ overflow-y: hidden;
516
+ align-items: flex-start;
517
+ transition: all var(--transition-slow);
518
+ position: relative;
519
+ }
520
+
521
+ .board-wrapper.panel-open .kanban-board {
522
+ flex: 1;
523
+ min-width: 0;
524
+ }
525
+
526
+ /* --------------------------------------------------------------------------
527
+ Kanban Columns
528
+ -------------------------------------------------------------------------- */
529
+
530
+ .kanban-column {
531
+ min-width: var(--column-min);
532
+ max-width: var(--column-max);
533
+ flex: 1;
534
+ background: var(--bg-surface);
535
+ border-radius: var(--radius);
536
+ border: none;
537
+ box-shadow: var(--shadow-1);
538
+ display: flex;
539
+ flex-direction: column;
540
+ max-height: 100%;
541
+ transition:
542
+ background var(--transition-normal),
543
+ box-shadow var(--transition-normal),
544
+ max-width var(--transition-normal);
545
+ position: relative;
546
+ overflow: hidden;
547
+ }
548
+
549
+ .kanban-column::before {
550
+ content: '';
551
+ position: absolute;
552
+ top: 0;
553
+ left: 0;
554
+ right: 0;
555
+ height: 3px;
556
+ background: var(--column-accent, var(--gray));
557
+ opacity: 0.6;
558
+ transition: opacity var(--transition-fast);
559
+ }
560
+
561
+ .kanban-column:hover {
562
+ box-shadow: var(--shadow-2);
563
+ }
564
+
565
+ .kanban-column:hover::before {
566
+ opacity: 1;
567
+ }
568
+
569
+ .kanban-column[data-stage='backlog'] {
570
+ --column-accent: var(--stage-backlog);
571
+ }
572
+ .kanban-column[data-stage='spec'] {
573
+ --column-accent: var(--stage-spec);
574
+ }
575
+ .kanban-column[data-stage='plan'] {
576
+ --column-accent: var(--stage-plan);
577
+ }
578
+ .kanban-column[data-stage='implement'] {
579
+ --column-accent: var(--stage-implement);
580
+ }
581
+ .kanban-column[data-stage='test'] {
582
+ --column-accent: var(--stage-test);
583
+ }
584
+ .kanban-column[data-stage='review'] {
585
+ --column-accent: var(--stage-review);
586
+ }
587
+ .kanban-column[data-stage='done'] {
588
+ --column-accent: var(--stage-done);
589
+ }
590
+ .kanban-column[data-stage='cancelled'] {
591
+ --column-accent: var(--stage-cancelled);
592
+ }
593
+
594
+ .kanban-column.collapsed {
595
+ min-width: 48px;
596
+ max-width: 48px;
597
+ cursor: pointer;
598
+ transition:
599
+ min-width var(--transition-slow),
600
+ max-width var(--transition-slow),
601
+ background var(--transition-normal),
602
+ box-shadow var(--transition-normal);
603
+ }
604
+
605
+ .kanban-column.collapsed .column-body,
606
+ .kanban-column.collapsed .column-add-btn {
607
+ display: none;
608
+ }
609
+
610
+ .kanban-column.collapsed .column-header {
611
+ writing-mode: vertical-lr;
612
+ text-orientation: mixed;
613
+ padding: 12px 8px;
614
+ flex-direction: column;
615
+ gap: 8px;
616
+ align-items: center;
617
+ }
618
+
619
+ .kanban-column.collapsed .column-header h3 {
620
+ white-space: nowrap;
621
+ }
622
+
623
+ .column-header {
624
+ padding: 10px 12px;
625
+ border-bottom: 1px solid var(--border-light);
626
+ display: flex;
627
+ align-items: center;
628
+ justify-content: space-between;
629
+ flex-shrink: 0;
630
+ cursor: pointer;
631
+ user-select: none;
632
+ position: sticky;
633
+ top: 0;
634
+ z-index: 2;
635
+ background: var(--bg-surface);
636
+ border-radius: var(--radius) var(--radius) 0 0;
637
+ transition: background var(--transition-fast);
638
+ }
639
+
640
+ .column-header:hover {
641
+ background: var(--bg-hover);
642
+ }
643
+
644
+ .column-header-left {
645
+ display: flex;
646
+ align-items: center;
647
+ gap: 6px;
648
+ }
649
+
650
+ .column-header-left .material-symbols-outlined {
651
+ font-size: 16px;
652
+ color: var(--column-accent, var(--text-muted));
653
+ opacity: 0.8;
654
+ }
655
+
656
+ .column-header h3 {
657
+ font-size: 11px;
658
+ font-weight: 600;
659
+ text-transform: uppercase;
660
+ letter-spacing: 0.5px;
661
+ color: var(--text-muted);
662
+ }
663
+
664
+ .column-count {
665
+ font-size: 11px;
666
+ font-weight: 600;
667
+ background: var(--bg-hover);
668
+ color: var(--text-muted);
669
+ padding: 2px 8px;
670
+ border-radius: var(--radius);
671
+ min-width: 20px;
672
+ text-align: center;
673
+ transition:
674
+ transform 0.2s ease,
675
+ background var(--transition-fast),
676
+ color var(--transition-fast);
677
+ }
678
+
679
+ .column-count.pulse {
680
+ animation: countPulse 0.3s ease;
681
+ }
682
+
683
+ .column-count.wip-warning {
684
+ background: var(--orange-dim);
685
+ color: var(--orange);
686
+ }
687
+
688
+ .column-count.wip-danger {
689
+ background: var(--red-dim);
690
+ color: var(--red);
691
+ }
692
+
693
+ .column-body {
694
+ padding: 6px 8px;
695
+ overflow-y: auto;
696
+ flex: 1;
697
+ display: flex;
698
+ flex-direction: column;
699
+ gap: 6px;
700
+ min-height: 40px;
701
+ }
702
+
703
+ /* --------------------------------------------------------------------------
704
+ Empty States
705
+ -------------------------------------------------------------------------- */
706
+
707
+ .column-empty {
708
+ display: flex;
709
+ flex-direction: column;
710
+ align-items: center;
711
+ justify-content: center;
712
+ padding: 24px 12px;
713
+ color: var(--text-dim);
714
+ text-align: center;
715
+ gap: 6px;
716
+ }
717
+
718
+ .column-empty .material-symbols-outlined {
719
+ font-size: 28px;
720
+ opacity: 0.4;
721
+ }
722
+
723
+ .column-empty .empty-text {
724
+ font-size: 12px;
725
+ line-height: 1.4;
726
+ }
727
+
728
+ .column-empty .empty-cta {
729
+ display: inline-flex;
730
+ align-items: center;
731
+ gap: 4px;
732
+ font-size: 12px;
733
+ color: var(--accent);
734
+ cursor: pointer;
735
+ margin-top: 6px;
736
+ padding: 6px 12px;
737
+ background: var(--accent-dim);
738
+ border-radius: var(--radius-sm);
739
+ font-weight: 500;
740
+ opacity: 1;
741
+ transition: all var(--transition-fast);
742
+ }
743
+ .column-empty .empty-cta .material-symbols-outlined {
744
+ font-size: 16px;
745
+ opacity: 1;
746
+ }
747
+ .column-empty .empty-cta:hover {
748
+ background: var(--accent);
749
+ color: #fff;
750
+ text-decoration: none;
751
+ }
752
+
753
+ .board-empty {
754
+ display: flex;
755
+ flex-direction: column;
756
+ align-items: center;
757
+ justify-content: center;
758
+ flex: 1;
759
+ gap: 16px;
760
+ color: var(--text-dim);
761
+ padding: 60px 20px;
762
+ }
763
+ .board-empty .material-symbols-outlined {
764
+ font-size: 56px;
765
+ opacity: 0.4;
766
+ color: var(--accent);
767
+ }
768
+ .board-empty h3 {
769
+ font-size: 18px;
770
+ font-weight: 600;
771
+ color: var(--text-muted);
772
+ }
773
+ .board-empty p {
774
+ font-size: 13px;
775
+ max-width: 400px;
776
+ text-align: center;
777
+ line-height: 1.6;
778
+ color: var(--text-muted);
779
+ }
780
+ .board-empty .empty-steps {
781
+ display: flex;
782
+ gap: 24px;
783
+ margin-top: 8px;
784
+ }
785
+ .board-empty .empty-step {
786
+ display: flex;
787
+ flex-direction: column;
788
+ align-items: center;
789
+ gap: 8px;
790
+ max-width: 140px;
791
+ text-align: center;
792
+ }
793
+ .board-empty .empty-step .material-symbols-outlined {
794
+ font-size: 32px;
795
+ opacity: 0.6;
796
+ }
797
+ .board-empty .empty-step span {
798
+ font-size: 12px;
799
+ color: var(--text-muted);
800
+ }
801
+
802
+ /* --------------------------------------------------------------------------
803
+ Task Cards
804
+ -------------------------------------------------------------------------- */
805
+
806
+ .task-card {
807
+ background: var(--bg-elevated);
808
+ border: 1px solid transparent;
809
+ border-radius: var(--radius);
810
+ padding: 10px 12px;
811
+ cursor: pointer;
812
+ position: relative;
813
+ box-shadow: var(--shadow-1);
814
+ transition:
815
+ border-color var(--transition-fast),
816
+ box-shadow var(--transition-fast),
817
+ transform var(--transition-fast),
818
+ opacity var(--transition-fast);
819
+ }
820
+
821
+ .task-card:hover {
822
+ box-shadow:
823
+ 0 0 0 1px var(--accent-dim),
824
+ var(--shadow-hover);
825
+ transform: translateY(-2px);
826
+ }
827
+
828
+ .task-card:active {
829
+ transform: translateY(0);
830
+ }
831
+
832
+ .task-card.active-card {
833
+ border-color: var(--accent);
834
+ box-shadow:
835
+ 0 0 0 2px var(--focus-ring),
836
+ var(--shadow-2);
837
+ background: var(--bg-surface);
838
+ }
839
+
840
+ .task-card.no-anim {
841
+ animation: none !important;
842
+ }
843
+
844
+ .task-card-header {
845
+ display: flex;
846
+ align-items: flex-start;
847
+ justify-content: space-between;
848
+ gap: 8px;
849
+ margin-bottom: 2px;
850
+ }
851
+
852
+ .task-card-id {
853
+ font-size: 11px;
854
+ color: var(--text-dim);
855
+ font-family: var(--font-mono);
856
+ flex-shrink: 0;
857
+ }
858
+
859
+ .task-card-time {
860
+ font-size: 10px;
861
+ color: var(--text-dim);
862
+ flex-shrink: 0;
863
+ white-space: nowrap;
864
+ }
865
+
866
+ .task-card-title {
867
+ font-size: 13px;
868
+ font-weight: 600;
869
+ margin: 2px 0 4px;
870
+ line-height: 1.35;
871
+ word-break: break-word;
872
+ color: var(--text);
873
+ }
874
+
875
+ .task-card-title[contenteditable='true'] {
876
+ outline: none;
877
+ border-bottom: 1px dashed var(--accent);
878
+ padding-bottom: 1px;
879
+ cursor: text;
880
+ }
881
+
882
+ .task-card-desc {
883
+ font-size: 12px;
884
+ color: var(--text-muted);
885
+ margin-bottom: 6px;
886
+ line-height: 1.4;
887
+ display: -webkit-box;
888
+ -webkit-line-clamp: 2;
889
+ -webkit-box-orient: vertical;
890
+ overflow: hidden;
891
+ }
892
+
893
+ .task-card-footer {
894
+ display: flex;
895
+ align-items: center;
896
+ justify-content: space-between;
897
+ gap: 6px;
898
+ }
899
+
900
+ .task-card-meta {
901
+ display: flex;
902
+ align-items: center;
903
+ gap: 4px;
904
+ flex-wrap: wrap;
905
+ flex: 1;
906
+ min-width: 0;
907
+ }
908
+
909
+ .task-card-assignee {
910
+ flex-shrink: 0;
911
+ }
912
+
913
+ .task-tag {
914
+ font-size: 10px;
915
+ padding: 2px 8px;
916
+ border-radius: var(--radius-sm);
917
+ font-weight: 500;
918
+ transition: opacity var(--transition-fast);
919
+ cursor: default;
920
+ white-space: nowrap;
921
+ }
922
+
923
+ .task-tag.clickable {
924
+ cursor: pointer;
925
+ }
926
+ .task-tag.clickable:hover {
927
+ opacity: 0.8;
928
+ }
929
+
930
+ .tag-project {
931
+ background: var(--accent-dim);
932
+ color: var(--accent);
933
+ }
934
+ .tag-assignee {
935
+ background: var(--purple-dim);
936
+ color: var(--purple);
937
+ }
938
+ .tag-priority {
939
+ background: var(--orange-dim);
940
+ color: var(--orange);
941
+ }
942
+ .tag-artifacts {
943
+ background: var(--blue-dim);
944
+ color: var(--blue);
945
+ }
946
+ .tag-blocked {
947
+ background: var(--red-dim);
948
+ color: var(--red);
949
+ }
950
+ .tag-comments {
951
+ background: var(--purple-dim);
952
+ color: var(--purple);
953
+ }
954
+ .tag-subtasks {
955
+ background: var(--green-dim);
956
+ color: var(--green);
957
+ }
958
+
959
+ /* ---- Stage-colored left border ---- */
960
+
961
+ .task-card[data-stage='backlog'] {
962
+ border-left: 3px solid var(--stage-backlog);
963
+ }
964
+ .task-card[data-stage='spec'] {
965
+ border-left: 3px solid var(--stage-spec);
966
+ }
967
+ .task-card[data-stage='plan'] {
968
+ border-left: 3px solid var(--stage-plan);
969
+ }
970
+ .task-card[data-stage='implement'] {
971
+ border-left: 3px solid var(--stage-implement);
972
+ }
973
+ .task-card[data-stage='test'] {
974
+ border-left: 3px solid var(--stage-test);
975
+ }
976
+ .task-card[data-stage='review'] {
977
+ border-left: 3px solid var(--stage-review);
978
+ }
979
+ .task-card[data-stage='done'] {
980
+ border-left: 3px solid var(--stage-done);
981
+ }
982
+ .task-card[data-stage='cancelled'] {
983
+ border-left: 3px solid var(--stage-cancelled);
984
+ }
985
+
986
+ /* ---- Priority override for high-priority ---- */
987
+
988
+ .task-card.priority-high {
989
+ border-left: 3px solid var(--red);
990
+ }
991
+ .task-card.priority-medium {
992
+ border-left: 3px solid var(--orange);
993
+ }
994
+ .task-card.status-cancelled .task-card-title {
995
+ text-decoration: line-through;
996
+ opacity: 0.7;
997
+ }
998
+
999
+ /* ---- Status indicator on cards ---- */
1000
+
1001
+ .task-status-indicator {
1002
+ display: inline-flex;
1003
+ align-items: center;
1004
+ justify-content: center;
1005
+ flex-shrink: 0;
1006
+ margin-left: 4px;
1007
+ }
1008
+ .task-status-indicator .material-symbols-outlined {
1009
+ font-size: 14px;
1010
+ font-variation-settings:
1011
+ 'FILL' 1,
1012
+ 'wght' 400,
1013
+ 'GRAD' 0,
1014
+ 'opsz' 14;
1015
+ }
1016
+ .task-status-indicator.status-in_progress {
1017
+ color: var(--blue);
1018
+ }
1019
+ .task-status-indicator.status-completed {
1020
+ color: var(--green);
1021
+ }
1022
+ .task-status-indicator.status-failed {
1023
+ color: var(--red);
1024
+ }
1025
+ .task-status-indicator.status-pending {
1026
+ color: var(--gray);
1027
+ }
1028
+ .task-status-indicator.status-cancelled {
1029
+ color: var(--text-dim);
1030
+ }
1031
+
1032
+ /* ---- Collaborator overflow indicator ---- */
1033
+
1034
+ .collab-overflow {
1035
+ width: 20px;
1036
+ height: 20px;
1037
+ border-radius: 50%;
1038
+ background: var(--bg-hover);
1039
+ color: var(--text-muted);
1040
+ font-size: 9px;
1041
+ font-weight: 600;
1042
+ display: flex;
1043
+ align-items: center;
1044
+ justify-content: center;
1045
+ border: 1.5px solid var(--bg-surface);
1046
+ margin-left: -4px;
1047
+ }
1048
+
1049
+ /* ---- Staggered entrance animation ---- */
1050
+
1051
+ @keyframes cardEnter {
1052
+ from {
1053
+ opacity: 0;
1054
+ transform: translateY(12px);
1055
+ }
1056
+ to {
1057
+ opacity: 1;
1058
+ transform: translateY(0);
1059
+ }
1060
+ }
1061
+
1062
+ .task-card.animate-in {
1063
+ animation: cardEnter 0.3s ease both;
1064
+ }
1065
+
1066
+ /* ---- Assignee avatar circle ---- */
1067
+
1068
+ .avatar-circle {
1069
+ width: 22px;
1070
+ height: 22px;
1071
+ border-radius: 50%;
1072
+ display: flex;
1073
+ align-items: center;
1074
+ justify-content: center;
1075
+ font-size: 9px;
1076
+ font-weight: 700;
1077
+ color: #fff;
1078
+ flex-shrink: 0;
1079
+ text-transform: uppercase;
1080
+ letter-spacing: -0.3px;
1081
+ }
1082
+
1083
+ .avatar-circle.avatar-sm {
1084
+ width: 18px;
1085
+ height: 18px;
1086
+ font-size: 8px;
1087
+ }
1088
+
1089
+ .avatar-circle.avatar-lg {
1090
+ width: 28px;
1091
+ height: 28px;
1092
+ font-size: 11px;
1093
+ }
1094
+
1095
+ /* ---- Subtask progress bar ---- */
1096
+
1097
+ .subtask-progress {
1098
+ margin-top: 6px;
1099
+ height: 3px;
1100
+ background: var(--border-light);
1101
+ border-radius: 2px;
1102
+ overflow: hidden;
1103
+ }
1104
+ .subtask-progress-fill {
1105
+ height: 100%;
1106
+ background: var(--green);
1107
+ border-radius: 2px;
1108
+ transition: width 0.3s ease;
1109
+ }
1110
+
1111
+ /* ---- Collaborator avatars ---- */
1112
+
1113
+ .task-card-collabs {
1114
+ display: flex;
1115
+ margin-top: 4px;
1116
+ }
1117
+ .collab-avatar {
1118
+ width: 20px;
1119
+ height: 20px;
1120
+ border-radius: 50%;
1121
+ background: var(--accent-dim);
1122
+ color: var(--accent);
1123
+ font-size: 10px;
1124
+ font-weight: 600;
1125
+ display: flex;
1126
+ align-items: center;
1127
+ justify-content: center;
1128
+ border: 1.5px solid var(--bg-surface);
1129
+ margin-left: -4px;
1130
+ }
1131
+ .collab-avatar:first-child {
1132
+ margin-left: 0;
1133
+ }
1134
+
1135
+ /* --------------------------------------------------------------------------
1136
+ Drag and Drop
1137
+ -------------------------------------------------------------------------- */
1138
+
1139
+ .task-card[draggable='true'] {
1140
+ cursor: grab;
1141
+ }
1142
+
1143
+ .task-card.dragging {
1144
+ opacity: 0.35;
1145
+ transform: scale(0.98);
1146
+ cursor: grabbing;
1147
+ }
1148
+
1149
+ .drag-ghost {
1150
+ position: fixed;
1151
+ pointer-events: none;
1152
+ z-index: 1000;
1153
+ width: 280px;
1154
+ opacity: 0.92;
1155
+ transform: rotate(2deg) scale(1.03);
1156
+ box-shadow: var(--shadow-drag);
1157
+ border-radius: var(--radius);
1158
+ transition: none;
1159
+ }
1160
+
1161
+ .kanban-column.drag-over {
1162
+ background: var(--accent-dim);
1163
+ box-shadow:
1164
+ 0 0 0 2px var(--accent),
1165
+ var(--shadow-2);
1166
+ transition:
1167
+ background 0.15s ease,
1168
+ box-shadow 0.15s ease;
1169
+ }
1170
+
1171
+ .kanban-column.drag-over .column-body {
1172
+ min-height: 60px;
1173
+ }
1174
+
1175
+ .drop-placeholder {
1176
+ height: 4px;
1177
+ background: var(--accent);
1178
+ border-radius: 2px;
1179
+ margin: 2px 0;
1180
+ opacity: 0.8;
1181
+ transition: height 0.15s ease;
1182
+ }
1183
+
1184
+ /* ---- Auto-scroll indicators ---- */
1185
+
1186
+ .kanban-board.drag-scroll-left::before,
1187
+ .kanban-board.drag-scroll-right::after {
1188
+ content: '';
1189
+ position: absolute;
1190
+ top: 0;
1191
+ bottom: 0;
1192
+ width: 60px;
1193
+ z-index: 5;
1194
+ pointer-events: none;
1195
+ }
1196
+ .kanban-board.drag-scroll-left::before {
1197
+ left: 0;
1198
+ background: linear-gradient(to right, var(--accent-dim), transparent);
1199
+ }
1200
+ .kanban-board.drag-scroll-right::after {
1201
+ right: 0;
1202
+ background: linear-gradient(to left, var(--accent-dim), transparent);
1203
+ }
1204
+
1205
+ /* ---- Focus (keyboard nav) ---- */
1206
+
1207
+ .task-card:focus-visible {
1208
+ outline: 2px solid var(--accent);
1209
+ outline-offset: 2px;
1210
+ }
1211
+
1212
+ /* --------------------------------------------------------------------------
1213
+ Inline Task Creation
1214
+ -------------------------------------------------------------------------- */
1215
+
1216
+ .column-add-btn {
1217
+ display: flex;
1218
+ align-items: center;
1219
+ justify-content: center;
1220
+ gap: 4px;
1221
+ padding: 8px;
1222
+ margin: 2px 8px 8px;
1223
+ border: none;
1224
+ border-radius: var(--radius-sm);
1225
+ background: var(--bg-elevated);
1226
+ color: var(--text-dim);
1227
+ font-size: 12px;
1228
+ font-weight: 500;
1229
+ font-family: var(--font-sans);
1230
+ cursor: pointer;
1231
+ transition: all var(--transition-fast);
1232
+ }
1233
+
1234
+ .column-add-btn:hover {
1235
+ color: var(--accent);
1236
+ background: var(--accent-dim);
1237
+ }
1238
+
1239
+ .column-add-btn .material-symbols-outlined {
1240
+ font-size: 16px;
1241
+ }
1242
+
1243
+ .inline-create-form {
1244
+ padding: 0 8px 8px;
1245
+ }
1246
+
1247
+ .inline-create-card {
1248
+ background: var(--bg-elevated);
1249
+ border: 1px solid var(--accent);
1250
+ border-radius: var(--radius);
1251
+ padding: 10px 12px;
1252
+ box-shadow: 0 0 0 3px var(--focus-ring);
1253
+ }
1254
+
1255
+ .inline-create-input {
1256
+ width: 100%;
1257
+ border: none;
1258
+ background: transparent;
1259
+ color: var(--text);
1260
+ font-family: var(--font-sans);
1261
+ font-size: 13px;
1262
+ font-weight: 500;
1263
+ outline: none;
1264
+ line-height: 1.4;
1265
+ resize: none;
1266
+ }
1267
+
1268
+ .inline-create-input::placeholder {
1269
+ color: var(--text-dim);
1270
+ }
1271
+
1272
+ .inline-create-hint {
1273
+ font-size: 10px;
1274
+ color: var(--text-dim);
1275
+ margin-top: 6px;
1276
+ display: flex;
1277
+ align-items: center;
1278
+ gap: 8px;
1279
+ }
1280
+
1281
+ .inline-create-hint kbd {
1282
+ background: var(--bg-hover);
1283
+ padding: 0 4px;
1284
+ border-radius: 2px;
1285
+ font-family: var(--font-mono);
1286
+ font-size: 10px;
1287
+ }
1288
+
1289
+ /* --------------------------------------------------------------------------
1290
+ Side Panel (Detail View)
1291
+ -------------------------------------------------------------------------- */
1292
+
1293
+ .side-panel {
1294
+ width: 0;
1295
+ min-width: 0;
1296
+ background: var(--bg-surface);
1297
+ border-left: 1px solid var(--border);
1298
+ display: flex;
1299
+ flex-direction: column;
1300
+ overflow: hidden;
1301
+ position: relative;
1302
+ transition:
1303
+ width var(--transition-slow),
1304
+ min-width var(--transition-slow);
1305
+ box-shadow: var(--shadow-panel);
1306
+ z-index: 15;
1307
+ }
1308
+
1309
+ .board-wrapper.panel-open .side-panel {
1310
+ width: var(--panel-width);
1311
+ min-width: var(--panel-width);
1312
+ }
1313
+
1314
+ .board-wrapper.panel-open .side-panel.panel-wide {
1315
+ --panel-width: min(720px, 55vw);
1316
+ }
1317
+
1318
+ /* ---- Panel resize handle ---- */
1319
+
1320
+ .panel-resize-handle {
1321
+ position: absolute;
1322
+ top: 0;
1323
+ left: -4px;
1324
+ width: 8px;
1325
+ height: 100%;
1326
+ cursor: col-resize;
1327
+ z-index: 10;
1328
+ }
1329
+ .panel-resize-handle::after {
1330
+ content: '';
1331
+ position: absolute;
1332
+ top: 50%;
1333
+ left: 2px;
1334
+ transform: translateY(-50%);
1335
+ width: 4px;
1336
+ height: 40px;
1337
+ border-radius: 2px;
1338
+ background: var(--border);
1339
+ opacity: 0;
1340
+ transition: opacity 0.2s;
1341
+ }
1342
+ .panel-resize-handle:hover::after,
1343
+ .panel-resize-handle:active::after {
1344
+ opacity: 1;
1345
+ background: var(--accent);
1346
+ }
1347
+
1348
+ /* ---- Fullscreen artifact ---- */
1349
+
1350
+ .artifact-fullscreen-btn {
1351
+ background: none;
1352
+ border: none;
1353
+ color: var(--text-dim);
1354
+ cursor: pointer;
1355
+ padding: 2px 4px;
1356
+ display: inline-flex;
1357
+ align-items: center;
1358
+ }
1359
+ .artifact-fullscreen-btn:hover {
1360
+ color: var(--accent);
1361
+ }
1362
+ .artifact-fullscreen-btn .material-symbols-outlined {
1363
+ font-size: 16px;
1364
+ }
1365
+
1366
+ .artifact-fullscreen-overlay {
1367
+ position: fixed;
1368
+ inset: 0;
1369
+ background: var(--bg);
1370
+ z-index: 400;
1371
+ display: flex;
1372
+ flex-direction: column;
1373
+ overflow: hidden;
1374
+ }
1375
+ .artifact-fullscreen-header {
1376
+ display: flex;
1377
+ align-items: center;
1378
+ justify-content: space-between;
1379
+ padding: 8px 16px;
1380
+ border-bottom: 1px solid var(--border);
1381
+ background: var(--bg-surface);
1382
+ flex-shrink: 0;
1383
+ }
1384
+ .artifact-fullscreen-header h3 {
1385
+ font-size: 14px;
1386
+ font-weight: 600;
1387
+ }
1388
+ .artifact-fullscreen-body {
1389
+ flex: 1;
1390
+ overflow: auto;
1391
+ padding: 16px;
1392
+ }
1393
+
1394
+ .panel-header {
1395
+ display: flex;
1396
+ align-items: center;
1397
+ justify-content: space-between;
1398
+ padding: 12px 16px;
1399
+ border-bottom: 1px solid var(--border-light);
1400
+ flex-shrink: 0;
1401
+ gap: 8px;
1402
+ min-height: 49px;
1403
+ }
1404
+
1405
+ .panel-header-left {
1406
+ display: flex;
1407
+ align-items: center;
1408
+ gap: 8px;
1409
+ min-width: 0;
1410
+ flex: 1;
1411
+ }
1412
+
1413
+ .panel-task-id {
1414
+ font-family: var(--font-mono);
1415
+ font-size: 13px;
1416
+ color: var(--text-muted);
1417
+ font-weight: 500;
1418
+ flex-shrink: 0;
1419
+ }
1420
+
1421
+ .panel-stage-badge {
1422
+ font-size: 10px;
1423
+ font-weight: 600;
1424
+ text-transform: uppercase;
1425
+ letter-spacing: 0.3px;
1426
+ padding: 2px 10px;
1427
+ border-radius: var(--radius);
1428
+ flex-shrink: 0;
1429
+ }
1430
+
1431
+ .panel-close-btn {
1432
+ background: none;
1433
+ border: none;
1434
+ cursor: pointer;
1435
+ color: var(--text-muted);
1436
+ padding: 4px;
1437
+ border-radius: var(--radius-sm);
1438
+ display: flex;
1439
+ align-items: center;
1440
+ justify-content: center;
1441
+ transition: all var(--transition-fast);
1442
+ flex-shrink: 0;
1443
+ }
1444
+ .panel-close-btn:hover {
1445
+ background: var(--bg-hover);
1446
+ color: var(--text);
1447
+ }
1448
+ .panel-close-btn .material-symbols-outlined {
1449
+ font-size: 20px;
1450
+ }
1451
+
1452
+ .panel-body {
1453
+ flex: 1;
1454
+ overflow-y: auto;
1455
+ padding: 16px;
1456
+ }
1457
+
1458
+ .panel-title {
1459
+ font-size: 16px;
1460
+ font-weight: 700;
1461
+ line-height: 1.35;
1462
+ margin-bottom: 16px;
1463
+ word-break: break-word;
1464
+ }
1465
+
1466
+ .panel-title[contenteditable='true'] {
1467
+ outline: none;
1468
+ border-bottom: 2px solid var(--accent);
1469
+ cursor: text;
1470
+ }
1471
+
1472
+ .panel-section {
1473
+ margin-bottom: 20px;
1474
+ }
1475
+
1476
+ .panel-section-title {
1477
+ font-size: 11px;
1478
+ font-weight: 600;
1479
+ text-transform: uppercase;
1480
+ letter-spacing: 0.5px;
1481
+ color: var(--text-dim);
1482
+ margin-bottom: 8px;
1483
+ display: flex;
1484
+ align-items: center;
1485
+ gap: 6px;
1486
+ }
1487
+
1488
+ .panel-section-title .material-symbols-outlined {
1489
+ font-size: 14px;
1490
+ }
1491
+
1492
+ .panel-grid {
1493
+ display: grid;
1494
+ grid-template-columns: 100px 1fr;
1495
+ gap: 6px 12px;
1496
+ font-size: 13px;
1497
+ }
1498
+
1499
+ .panel-label {
1500
+ font-weight: 500;
1501
+ color: var(--text-muted);
1502
+ }
1503
+
1504
+ .panel-value {
1505
+ word-break: break-word;
1506
+ color: var(--text);
1507
+ }
1508
+
1509
+ .panel-value .task-tag {
1510
+ cursor: pointer;
1511
+ }
1512
+
1513
+ .panel-description {
1514
+ font-size: 13px;
1515
+ line-height: 1.6;
1516
+ word-break: break-word;
1517
+ color: var(--text-secondary);
1518
+ padding: 10px 12px;
1519
+ background: var(--bg-elevated);
1520
+ border-radius: var(--radius-sm);
1521
+ border: 1px solid var(--border-light);
1522
+ }
1523
+ .panel-description .rendered-md {
1524
+ white-space: normal;
1525
+ }
1526
+
1527
+ /* ---- Panel artifacts ---- */
1528
+
1529
+ .panel-artifact {
1530
+ background: var(--bg-elevated);
1531
+ border: 1px solid var(--border-light);
1532
+ border-radius: var(--radius-sm);
1533
+ padding: 10px 12px;
1534
+ margin-bottom: 6px;
1535
+ }
1536
+ .panel-artifact h4 {
1537
+ font-size: 12px;
1538
+ color: var(--accent);
1539
+ margin-bottom: 0;
1540
+ display: flex;
1541
+ align-items: center;
1542
+ gap: 4px;
1543
+ }
1544
+ .panel-artifact pre {
1545
+ font-family: var(--font-mono);
1546
+ font-size: 12px;
1547
+ white-space: pre-wrap;
1548
+ word-break: break-word;
1549
+ color: var(--text-muted);
1550
+ line-height: 1.5;
1551
+ margin: 0;
1552
+ padding: 0;
1553
+ }
1554
+
1555
+ /* ---- Panel subtasks ---- */
1556
+
1557
+ .panel-subtask {
1558
+ display: flex;
1559
+ align-items: center;
1560
+ gap: 8px;
1561
+ padding: 6px 10px;
1562
+ background: var(--bg-elevated);
1563
+ border: 1px solid var(--border-light);
1564
+ border-radius: var(--radius-sm);
1565
+ margin-bottom: 4px;
1566
+ cursor: pointer;
1567
+ transition: border-color var(--transition-fast);
1568
+ font-size: 13px;
1569
+ }
1570
+ .panel-subtask:hover {
1571
+ border-color: var(--accent);
1572
+ }
1573
+ .panel-subtask .subtask-id {
1574
+ font-family: var(--font-mono);
1575
+ font-size: 11px;
1576
+ color: var(--text-dim);
1577
+ }
1578
+ .panel-subtask .subtask-stage {
1579
+ font-size: 10px;
1580
+ padding: 2px 8px;
1581
+ border-radius: var(--radius-sm);
1582
+ margin-left: auto;
1583
+ flex-shrink: 0;
1584
+ }
1585
+
1586
+ /* ---- Panel comments ---- */
1587
+
1588
+ .panel-comments {
1589
+ border-top: 1px solid var(--border-light);
1590
+ padding-top: 12px;
1591
+ }
1592
+
1593
+ .comment-item {
1594
+ padding: 8px 10px;
1595
+ background: var(--bg-elevated);
1596
+ border-radius: var(--radius-sm);
1597
+ margin-bottom: 6px;
1598
+ border: 1px solid var(--border-light);
1599
+ }
1600
+ .comment-item.reply {
1601
+ margin-left: 24px;
1602
+ }
1603
+ .comment-header {
1604
+ display: flex;
1605
+ align-items: center;
1606
+ gap: 6px;
1607
+ margin-bottom: 4px;
1608
+ font-size: 12px;
1609
+ }
1610
+ .comment-agent {
1611
+ font-weight: 600;
1612
+ color: var(--accent);
1613
+ }
1614
+ .comment-time {
1615
+ color: var(--text-dim);
1616
+ font-size: 11px;
1617
+ }
1618
+ .comment-body {
1619
+ font-size: 13px;
1620
+ white-space: pre-wrap;
1621
+ word-break: break-word;
1622
+ color: var(--text-secondary);
1623
+ }
1624
+ .comment-form {
1625
+ display: flex;
1626
+ gap: 6px;
1627
+ margin-top: 8px;
1628
+ }
1629
+ .comment-form textarea {
1630
+ flex: 1;
1631
+ padding: 6px 10px;
1632
+ border: 1px solid var(--border);
1633
+ border-radius: var(--radius-sm);
1634
+ background: var(--bg-elevated);
1635
+ color: var(--text);
1636
+ font-family: var(--font-sans);
1637
+ font-size: 12px;
1638
+ resize: vertical;
1639
+ min-height: 32px;
1640
+ max-height: 120px;
1641
+ outline: none;
1642
+ transition: border-color var(--transition-fast);
1643
+ }
1644
+ .comment-form textarea:focus {
1645
+ border-color: var(--accent);
1646
+ box-shadow: 0 0 0 3px var(--focus-ring);
1647
+ }
1648
+ .comment-form button {
1649
+ padding: 6px 14px;
1650
+ border: none;
1651
+ border-radius: var(--radius-sm);
1652
+ background: var(--accent);
1653
+ color: white;
1654
+ font-size: 12px;
1655
+ font-weight: 500;
1656
+ cursor: pointer;
1657
+ white-space: nowrap;
1658
+ align-self: flex-end;
1659
+ transition: background var(--transition-fast);
1660
+ }
1661
+ .comment-form button:hover {
1662
+ background: var(--accent-hover);
1663
+ }
1664
+
1665
+ /* --------------------------------------------------------------------------
1666
+ Legacy Modal (cleanup dialog only)
1667
+ -------------------------------------------------------------------------- */
1668
+
1669
+ .modal-overlay {
1670
+ position: fixed;
1671
+ inset: 0;
1672
+ background: rgba(0, 0, 0, 0.5);
1673
+ display: flex;
1674
+ align-items: center;
1675
+ justify-content: center;
1676
+ z-index: 100;
1677
+ backdrop-filter: blur(2px);
1678
+ animation: overlayIn 0.15s ease;
1679
+ }
1680
+ .modal-overlay[hidden],
1681
+ .modal-overlay.hidden {
1682
+ display: none;
1683
+ }
1684
+
1685
+ @keyframes overlayIn {
1686
+ from {
1687
+ opacity: 0;
1688
+ }
1689
+ to {
1690
+ opacity: 1;
1691
+ }
1692
+ }
1693
+
1694
+ .modal {
1695
+ background: var(--bg-surface);
1696
+ border-radius: var(--radius-lg);
1697
+ border: 1px solid var(--border);
1698
+ width: 90%;
1699
+ max-width: 600px;
1700
+ max-height: 80vh;
1701
+ display: flex;
1702
+ flex-direction: column;
1703
+ box-shadow: var(--shadow-3);
1704
+ animation: modalIn 0.2s ease;
1705
+ }
1706
+
1707
+ @keyframes modalIn {
1708
+ from {
1709
+ opacity: 0;
1710
+ transform: translateY(12px) scale(0.97);
1711
+ }
1712
+ to {
1713
+ opacity: 1;
1714
+ transform: translateY(0) scale(1);
1715
+ }
1716
+ }
1717
+
1718
+ .modal-header {
1719
+ display: flex;
1720
+ align-items: center;
1721
+ justify-content: space-between;
1722
+ padding: 12px 16px;
1723
+ border-bottom: 1px solid var(--border-light);
1724
+ }
1725
+ .modal-header h2 {
1726
+ font-size: 15px;
1727
+ font-weight: 600;
1728
+ }
1729
+ .modal-close {
1730
+ font-size: 20px;
1731
+ border: none;
1732
+ background: none;
1733
+ cursor: pointer;
1734
+ color: var(--text-muted);
1735
+ padding: 4px;
1736
+ border-radius: var(--radius-sm);
1737
+ transition: all var(--transition-fast);
1738
+ }
1739
+ .modal-close:hover {
1740
+ background: var(--bg-hover);
1741
+ color: var(--text);
1742
+ }
1743
+
1744
+ .modal-body {
1745
+ padding: 16px;
1746
+ overflow-y: auto;
1747
+ font-size: 13px;
1748
+ line-height: 1.6;
1749
+ }
1750
+
1751
+ /* --------------------------------------------------------------------------
1752
+ Inline Edit Dropdown
1753
+ -------------------------------------------------------------------------- */
1754
+
1755
+ .inline-dropdown {
1756
+ position: absolute;
1757
+ background: var(--bg-surface);
1758
+ border: 1px solid var(--border);
1759
+ border-radius: var(--radius);
1760
+ box-shadow: var(--shadow-3);
1761
+ z-index: 50;
1762
+ padding: 4px;
1763
+ min-width: 140px;
1764
+ max-height: 200px;
1765
+ overflow-y: auto;
1766
+ animation: dropdownIn 0.12s ease;
1767
+ }
1768
+
1769
+ @keyframes dropdownIn {
1770
+ from {
1771
+ opacity: 0;
1772
+ transform: translateY(-4px);
1773
+ }
1774
+ to {
1775
+ opacity: 1;
1776
+ transform: translateY(0);
1777
+ }
1778
+ }
1779
+
1780
+ .inline-dropdown-item {
1781
+ padding: 6px 10px;
1782
+ font-size: 12px;
1783
+ cursor: pointer;
1784
+ border-radius: var(--radius-sm);
1785
+ transition: background var(--transition-fast);
1786
+ display: flex;
1787
+ align-items: center;
1788
+ gap: 6px;
1789
+ }
1790
+ .inline-dropdown-item:hover {
1791
+ background: var(--bg-hover);
1792
+ }
1793
+ .inline-dropdown-item.active {
1794
+ background: var(--accent-dim);
1795
+ color: var(--accent);
1796
+ font-weight: 500;
1797
+ }
1798
+
1799
+ /* --------------------------------------------------------------------------
1800
+ Toast
1801
+ -------------------------------------------------------------------------- */
1802
+
1803
+ .toast-container {
1804
+ position: fixed;
1805
+ top: 16px;
1806
+ right: 16px;
1807
+ z-index: 1000;
1808
+ display: flex;
1809
+ flex-direction: column;
1810
+ gap: 8px;
1811
+ pointer-events: none;
1812
+ }
1813
+
1814
+ .toast {
1815
+ background: var(--bg-surface);
1816
+ border: 1px solid var(--border);
1817
+ border-radius: var(--radius);
1818
+ padding: 10px 14px;
1819
+ font-size: 12px;
1820
+ box-shadow: var(--shadow-2);
1821
+ animation: toastIn 0.3s cubic-bezier(0.2, 0.8, 0.3, 1);
1822
+ max-width: 340px;
1823
+ pointer-events: auto;
1824
+ display: flex;
1825
+ align-items: flex-start;
1826
+ gap: 8px;
1827
+ }
1828
+
1829
+ .toast-icon {
1830
+ font-size: 18px;
1831
+ flex-shrink: 0;
1832
+ line-height: 1;
1833
+ }
1834
+ .toast-icon.toast-icon-success {
1835
+ color: var(--green);
1836
+ }
1837
+ .toast-icon.toast-icon-error {
1838
+ color: var(--red);
1839
+ }
1840
+
1841
+ .toast-content {
1842
+ flex: 1;
1843
+ min-width: 0;
1844
+ }
1845
+
1846
+ .toast-title {
1847
+ font-weight: 600;
1848
+ margin-bottom: 2px;
1849
+ }
1850
+ .toast-body {
1851
+ color: var(--text-muted);
1852
+ }
1853
+
1854
+ .toast.fade-out {
1855
+ animation: toastOut 0.3s ease forwards;
1856
+ }
1857
+
1858
+ @keyframes toastIn {
1859
+ from {
1860
+ opacity: 0;
1861
+ transform: translateY(16px) scale(0.95);
1862
+ }
1863
+ to {
1864
+ opacity: 1;
1865
+ transform: translateY(0) scale(1);
1866
+ }
1867
+ }
1868
+
1869
+ @keyframes toastOut {
1870
+ from {
1871
+ opacity: 1;
1872
+ transform: translateX(0);
1873
+ }
1874
+ to {
1875
+ opacity: 0;
1876
+ transform: translateX(40px);
1877
+ }
1878
+ }
1879
+
1880
+ /* --------------------------------------------------------------------------
1881
+ Scrollbar
1882
+ -------------------------------------------------------------------------- */
1883
+
1884
+ ::-webkit-scrollbar {
1885
+ width: 6px;
1886
+ height: 6px;
1887
+ }
1888
+ ::-webkit-scrollbar-track {
1889
+ background: transparent;
1890
+ }
1891
+ ::-webkit-scrollbar-thumb {
1892
+ background: var(--border);
1893
+ border-radius: 3px;
1894
+ }
1895
+ ::-webkit-scrollbar-thumb:hover {
1896
+ background: var(--text-dim);
1897
+ }
1898
+
1899
+ /* --------------------------------------------------------------------------
1900
+ Cleanup Dialog
1901
+ -------------------------------------------------------------------------- */
1902
+
1903
+ .cleanup-options {
1904
+ display: flex;
1905
+ flex-direction: column;
1906
+ gap: 8px;
1907
+ }
1908
+
1909
+ .cleanup-option {
1910
+ display: flex;
1911
+ align-items: flex-start;
1912
+ gap: 12px;
1913
+ padding: 12px;
1914
+ border: 1px solid var(--border);
1915
+ border-radius: var(--radius);
1916
+ background: var(--bg-elevated);
1917
+ color: var(--text);
1918
+ cursor: pointer;
1919
+ text-align: left;
1920
+ font-family: var(--font-sans);
1921
+ font-size: 13px;
1922
+ transition:
1923
+ border-color var(--transition-fast),
1924
+ background var(--transition-fast);
1925
+ }
1926
+ .cleanup-option:hover {
1927
+ background: var(--bg-hover);
1928
+ border-color: var(--accent);
1929
+ }
1930
+ .cleanup-option .material-symbols-outlined {
1931
+ font-size: 24px;
1932
+ color: var(--accent);
1933
+ flex-shrink: 0;
1934
+ margin-top: 2px;
1935
+ }
1936
+ .cleanup-option div {
1937
+ display: flex;
1938
+ flex-direction: column;
1939
+ gap: 2px;
1940
+ }
1941
+ .cleanup-option strong {
1942
+ font-size: 14px;
1943
+ }
1944
+ .cleanup-option div span {
1945
+ font-size: 12px;
1946
+ color: var(--text-muted);
1947
+ }
1948
+
1949
+ .cleanup-option-danger {
1950
+ border-color: rgba(220, 53, 69, 0.4);
1951
+ border-width: 1.5px;
1952
+ }
1953
+ .cleanup-option-danger:hover {
1954
+ border-color: var(--red);
1955
+ background: var(--red-dim);
1956
+ box-shadow: 0 0 0 1px rgba(220, 53, 69, 0.15);
1957
+ }
1958
+ .cleanup-option-danger .material-symbols-outlined {
1959
+ color: var(--red);
1960
+ }
1961
+ .cleanup-option-danger strong {
1962
+ color: var(--red);
1963
+ }
1964
+
1965
+ /* --------------------------------------------------------------------------
1966
+ Reduced Motion
1967
+ -------------------------------------------------------------------------- */
1968
+
1969
+ @media (prefers-reduced-motion: reduce) {
1970
+ *,
1971
+ *::before,
1972
+ *::after {
1973
+ animation-duration: 0.01ms !important;
1974
+ transition-duration: 0.01ms !important;
1975
+ }
1976
+ }
1977
+
1978
+ /* --------------------------------------------------------------------------
1979
+ Responsive
1980
+ -------------------------------------------------------------------------- */
1981
+
1982
+ @media (max-width: 1024px) {
1983
+ .board-wrapper.panel-open .side-panel {
1984
+ position: fixed;
1985
+ right: 0;
1986
+ top: 0;
1987
+ bottom: 0;
1988
+ width: var(--panel-width);
1989
+ min-width: var(--panel-width);
1990
+ z-index: 80;
1991
+ box-shadow: var(--shadow-3);
1992
+ }
1993
+
1994
+ .board-wrapper.panel-open .kanban-board {
1995
+ flex: 1;
1996
+ }
1997
+
1998
+ .panel-backdrop {
1999
+ display: block;
2000
+ position: fixed;
2001
+ inset: 0;
2002
+ background: rgba(0, 0, 0, 0.3);
2003
+ z-index: 79;
2004
+ }
2005
+ }
2006
+
2007
+ @media (min-width: 1025px) {
2008
+ .panel-backdrop {
2009
+ display: none;
2010
+ }
2011
+ }
2012
+
2013
+ @media (max-width: 768px) {
2014
+ .kanban-board {
2015
+ flex-direction: column;
2016
+ overflow-y: auto;
2017
+ overflow-x: hidden;
2018
+ }
2019
+ .kanban-column {
2020
+ min-width: 0;
2021
+ max-width: none;
2022
+ max-height: none;
2023
+ }
2024
+ .kanban-column.collapsed {
2025
+ min-width: 0;
2026
+ max-width: none;
2027
+ writing-mode: horizontal-tb;
2028
+ }
2029
+ .kanban-column.collapsed .column-header {
2030
+ writing-mode: horizontal-tb;
2031
+ flex-direction: row;
2032
+ padding: 10px 12px;
2033
+ }
2034
+ .filter-group {
2035
+ flex-wrap: wrap;
2036
+ }
2037
+ .filter-input {
2038
+ max-width: none;
2039
+ }
2040
+ .stats {
2041
+ display: none;
2042
+ }
2043
+
2044
+ .board-wrapper.panel-open .side-panel {
2045
+ width: 100%;
2046
+ min-width: 100%;
2047
+ --panel-width: 100%;
2048
+ }
2049
+ }
2050
+
2051
+ @media (max-width: 480px) {
2052
+ header {
2053
+ padding: 6px 12px;
2054
+ }
2055
+ .filter-bar {
2056
+ padding: 6px 12px;
2057
+ }
2058
+ .kanban-board {
2059
+ padding: 8px;
2060
+ }
2061
+ .modal {
2062
+ width: 98%;
2063
+ }
2064
+ }
2065
+
2066
+ /* --------------------------------------------------------------------------
2067
+ Stage Badge Colors (panel & dropdown)
2068
+ -------------------------------------------------------------------------- */
2069
+
2070
+ .stage-backlog {
2071
+ background: var(--gray-dim);
2072
+ color: var(--gray);
2073
+ }
2074
+ .stage-spec {
2075
+ background: var(--blue-dim);
2076
+ color: var(--blue);
2077
+ }
2078
+ .stage-plan {
2079
+ background: var(--indigo-dim);
2080
+ color: var(--indigo);
2081
+ }
2082
+ .stage-implement {
2083
+ background: var(--purple-dim);
2084
+ color: var(--purple);
2085
+ }
2086
+ .stage-test {
2087
+ background: var(--orange-dim);
2088
+ color: var(--orange);
2089
+ }
2090
+ .stage-review {
2091
+ background: var(--amber-dim);
2092
+ color: var(--amber);
2093
+ }
2094
+ .stage-done {
2095
+ background: var(--green-dim);
2096
+ color: var(--green);
2097
+ }
2098
+ .stage-cancelled {
2099
+ background: var(--red-dim);
2100
+ color: var(--red);
2101
+ }
2102
+
2103
+ /* --------------------------------------------------------------------------
2104
+ Priority dropdown indicator
2105
+ -------------------------------------------------------------------------- */
2106
+
2107
+ .priority-dot {
2108
+ width: 8px;
2109
+ height: 8px;
2110
+ border-radius: 50%;
2111
+ display: inline-block;
2112
+ flex-shrink: 0;
2113
+ }
2114
+ .priority-dot.p-high {
2115
+ background: var(--red);
2116
+ }
2117
+ .priority-dot.p-med {
2118
+ background: var(--orange);
2119
+ }
2120
+ .priority-dot.p-low {
2121
+ background: var(--blue);
2122
+ }
2123
+ .priority-dot.p-none {
2124
+ background: var(--gray);
2125
+ }
2126
+
2127
+ /* --------------------------------------------------------------------------
2128
+ Comments section (used in legacy modal)
2129
+ -------------------------------------------------------------------------- */
2130
+
2131
+ .comments-section {
2132
+ margin-top: 16px;
2133
+ border-top: 1px solid var(--border-light);
2134
+ padding-top: 12px;
2135
+ }
2136
+ .comments-section h3 {
2137
+ font-size: 13px;
2138
+ font-weight: 600;
2139
+ margin-bottom: 8px;
2140
+ display: flex;
2141
+ align-items: center;
2142
+ gap: 6px;
2143
+ }
2144
+
2145
+ /* --------------------------------------------------------------------------
2146
+ Detail row (used in both panel and legacy modal)
2147
+ -------------------------------------------------------------------------- */
2148
+
2149
+ .detail-row {
2150
+ display: flex;
2151
+ gap: 8px;
2152
+ margin-bottom: 8px;
2153
+ font-size: 13px;
2154
+ line-height: 1.6;
2155
+ }
2156
+ .detail-label {
2157
+ font-weight: 600;
2158
+ color: var(--text-muted);
2159
+ min-width: 90px;
2160
+ flex-shrink: 0;
2161
+ }
2162
+ .detail-value {
2163
+ word-break: break-word;
2164
+ }
2165
+
2166
+ .artifact-list {
2167
+ margin-top: 12px;
2168
+ }
2169
+ .artifact-item {
2170
+ background: var(--bg-elevated);
2171
+ border: 1px solid var(--border-light);
2172
+ border-radius: var(--radius-sm);
2173
+ padding: 8px 10px;
2174
+ margin-bottom: 6px;
2175
+ }
2176
+ .artifact-item h4 {
2177
+ font-size: 12px;
2178
+ color: var(--accent);
2179
+ margin-bottom: 4px;
2180
+ }
2181
+ .artifact-item pre {
2182
+ font-family: var(--font-mono);
2183
+ font-size: 12px;
2184
+ white-space: pre-wrap;
2185
+ word-break: break-word;
2186
+ color: var(--text-muted);
2187
+ max-height: 200px;
2188
+ overflow-y: auto;
2189
+ }
2190
+
2191
+ /* --------------------------------------------------------------------------
2192
+ Syntax Highlighting
2193
+ -------------------------------------------------------------------------- */
2194
+
2195
+ .hljs-keyword {
2196
+ color: var(--purple);
2197
+ font-weight: 500;
2198
+ }
2199
+ .hljs-string {
2200
+ color: var(--green);
2201
+ }
2202
+ .hljs-comment {
2203
+ color: var(--text-dim);
2204
+ font-style: italic;
2205
+ }
2206
+ .hljs-number {
2207
+ color: var(--orange);
2208
+ }
2209
+ .hljs-function {
2210
+ color: var(--blue);
2211
+ }
2212
+ .hljs-type {
2213
+ color: var(--indigo);
2214
+ }
2215
+ .hljs-operator {
2216
+ color: var(--text-muted);
2217
+ }
2218
+ .hljs-property {
2219
+ color: var(--accent);
2220
+ }
2221
+
2222
+ /* --------------------------------------------------------------------------
2223
+ Markdown Rendering
2224
+ -------------------------------------------------------------------------- */
2225
+
2226
+ .rendered-md h3 {
2227
+ font-size: 14px;
2228
+ font-weight: 700;
2229
+ margin: 12px 0 6px;
2230
+ color: var(--text);
2231
+ }
2232
+ .rendered-md h4 {
2233
+ font-size: 13px;
2234
+ font-weight: 600;
2235
+ margin: 10px 0 4px;
2236
+ color: var(--text);
2237
+ }
2238
+ .rendered-md strong {
2239
+ font-weight: 600;
2240
+ color: var(--text);
2241
+ }
2242
+ .rendered-md em {
2243
+ font-style: italic;
2244
+ }
2245
+ .rendered-md code {
2246
+ font-family: var(--font-mono);
2247
+ font-size: 0.9em;
2248
+ background: var(--bg-inset);
2249
+ padding: 1px 5px;
2250
+ border-radius: 4px;
2251
+ color: var(--accent);
2252
+ }
2253
+ .rendered-md pre {
2254
+ background: var(--bg-inset);
2255
+ border: 1px solid var(--border-light);
2256
+ border-radius: var(--radius-sm);
2257
+ padding: 10px 12px;
2258
+ margin: 8px 0;
2259
+ overflow-x: auto;
2260
+ }
2261
+ .rendered-md pre code {
2262
+ background: none;
2263
+ padding: 0;
2264
+ color: var(--text-secondary);
2265
+ font-size: 12px;
2266
+ line-height: 1.5;
2267
+ }
2268
+ .rendered-md ul {
2269
+ padding-left: 20px;
2270
+ margin: 6px 0;
2271
+ }
2272
+ .rendered-md ul li {
2273
+ font-size: 13px;
2274
+ line-height: 1.6;
2275
+ color: var(--text-secondary);
2276
+ margin-bottom: 2px;
2277
+ }
2278
+ .rendered-md a {
2279
+ color: var(--accent);
2280
+ text-decoration: none;
2281
+ }
2282
+ .rendered-md a:hover {
2283
+ text-decoration: underline;
2284
+ }
2285
+ .rendered-md br {
2286
+ content: '';
2287
+ display: block;
2288
+ margin-top: 4px;
2289
+ }
2290
+
2291
+ /* --------------------------------------------------------------------------
2292
+ Expandable Artifacts
2293
+ -------------------------------------------------------------------------- */
2294
+
2295
+ .artifact-wrapper {
2296
+ position: relative;
2297
+ width: 100%;
2298
+ }
2299
+
2300
+ .artifact-wrapper.artifact-collapsed .artifact-code {
2301
+ max-height: calc(1.5em * 8 + 20px);
2302
+ overflow: hidden;
2303
+ }
2304
+
2305
+ .artifact-wrapper.artifact-collapsed .artifact-fade {
2306
+ display: block;
2307
+ }
2308
+
2309
+ .artifact-wrapper.artifact-expanded .artifact-code {
2310
+ max-height: 600px;
2311
+ overflow-y: auto;
2312
+ }
2313
+
2314
+ .artifact-code {
2315
+ margin: 0;
2316
+ padding: 0 12px;
2317
+ font-family: var(--font-mono);
2318
+ font-size: 12px;
2319
+ line-height: 1.5;
2320
+ white-space: pre;
2321
+ color: var(--text-muted);
2322
+ }
2323
+
2324
+ .artifact-fade {
2325
+ display: none;
2326
+ position: absolute;
2327
+ bottom: 28px;
2328
+ left: 0;
2329
+ right: 0;
2330
+ height: 48px;
2331
+ background: linear-gradient(transparent, var(--bg-elevated));
2332
+ pointer-events: none;
2333
+ border-radius: 0 0 var(--radius-sm) var(--radius-sm);
2334
+ }
2335
+
2336
+ .artifact-toggle {
2337
+ display: flex;
2338
+ align-items: center;
2339
+ justify-content: center;
2340
+ gap: 4px;
2341
+ width: 100%;
2342
+ padding: 4px 0;
2343
+ margin-top: 4px;
2344
+ background: none;
2345
+ border: none;
2346
+ border-top: 1px solid var(--border-light);
2347
+ color: var(--accent);
2348
+ font-family: var(--font-sans);
2349
+ font-size: 11px;
2350
+ font-weight: 500;
2351
+ cursor: pointer;
2352
+ transition: color var(--transition-fast);
2353
+ }
2354
+ .artifact-toggle:hover {
2355
+ color: var(--accent-hover);
2356
+ }
2357
+ .artifact-toggle .material-symbols-outlined {
2358
+ font-size: 14px;
2359
+ }
2360
+
2361
+ /* --------------------------------------------------------------------------
2362
+ Diff Viewer
2363
+ -------------------------------------------------------------------------- */
2364
+
2365
+ .diff-viewer {
2366
+ display: flex;
2367
+ gap: 2px;
2368
+ font-family: var(--font-mono);
2369
+ font-size: 12px;
2370
+ line-height: 1.5;
2371
+ overflow-x: auto;
2372
+ border: 1px solid var(--border);
2373
+ border-radius: var(--radius-sm);
2374
+ }
2375
+
2376
+ .diff-side {
2377
+ flex: 1;
2378
+ min-width: 0;
2379
+ overflow-x: auto;
2380
+ }
2381
+
2382
+ .diff-side .diff-header {
2383
+ padding: 4px 8px;
2384
+ background: var(--bg-hover);
2385
+ font-weight: 600;
2386
+ font-size: 11px;
2387
+ color: var(--text-muted);
2388
+ border-bottom: 1px solid var(--border);
2389
+ }
2390
+
2391
+ .diff-table {
2392
+ width: 100%;
2393
+ border-collapse: collapse;
2394
+ }
2395
+
2396
+ .diff-ln {
2397
+ width: 36px;
2398
+ text-align: right;
2399
+ padding: 0 8px;
2400
+ color: var(--text-dim);
2401
+ user-select: none;
2402
+ border-right: 1px solid var(--border);
2403
+ }
2404
+
2405
+ .diff-code {
2406
+ padding: 0 8px;
2407
+ white-space: pre;
2408
+ }
2409
+
2410
+ .diff-del {
2411
+ background: var(--red-dim);
2412
+ }
2413
+
2414
+ .diff-del .diff-code {
2415
+ color: var(--red);
2416
+ }
2417
+
2418
+ .diff-add {
2419
+ background: var(--green-dim);
2420
+ }
2421
+
2422
+ .diff-add .diff-code {
2423
+ color: var(--green);
2424
+ }
2425
+
2426
+ .diff-context {
2427
+ background: transparent;
2428
+ }
2429
+
2430
+ .diff-context .diff-code {
2431
+ color: var(--text-muted);
2432
+ }
2433
+
2434
+ .diff-section-header td {
2435
+ padding: 2px 8px;
2436
+ background: var(--blue-dim);
2437
+ color: var(--blue);
2438
+ font-weight: 500;
2439
+ font-size: 11px;
2440
+ }
2441
+
2442
+ /* --------------------------------------------------------------------------
2443
+ Artifact Header (copy button + line numbers)
2444
+ -------------------------------------------------------------------------- */
2445
+
2446
+ .artifact-header {
2447
+ display: flex;
2448
+ align-items: center;
2449
+ justify-content: space-between;
2450
+ gap: 6px;
2451
+ margin-bottom: 4px;
2452
+ }
2453
+
2454
+ .artifact-header h4 {
2455
+ font-size: 12px;
2456
+ color: var(--accent);
2457
+ display: flex;
2458
+ align-items: center;
2459
+ gap: 4px;
2460
+ margin: 0;
2461
+ flex: 1;
2462
+ min-width: 0;
2463
+ }
2464
+
2465
+ .artifact-copy-btn {
2466
+ background: none;
2467
+ border: 1px solid var(--border-light);
2468
+ border-radius: 4px;
2469
+ color: var(--text-dim);
2470
+ cursor: pointer;
2471
+ padding: 2px 6px;
2472
+ font-size: 11px;
2473
+ font-family: var(--font-sans);
2474
+ display: flex;
2475
+ align-items: center;
2476
+ gap: 3px;
2477
+ transition: all var(--transition-fast);
2478
+ flex-shrink: 0;
2479
+ }
2480
+ .artifact-copy-btn:hover {
2481
+ background: var(--bg-hover);
2482
+ border-color: var(--accent);
2483
+ color: var(--text);
2484
+ }
2485
+ .artifact-copy-btn .material-symbols-outlined {
2486
+ font-size: 13px;
2487
+ }
2488
+
2489
+ .artifact-lines {
2490
+ display: flex;
2491
+ overflow-x: auto;
2492
+ }
2493
+
2494
+ .artifact-line-numbers {
2495
+ white-space: pre;
2496
+ text-align: right;
2497
+ padding-right: 12px;
2498
+ border-right: 1px solid var(--border);
2499
+ color: var(--text-dim);
2500
+ font-size: 11px;
2501
+ line-height: 1.5;
2502
+ user-select: none;
2503
+ min-width: 32px;
2504
+ font-family: var(--font-mono);
2505
+ flex-shrink: 0;
2506
+ }
2507
+
2508
+ .artifact-line-content {
2509
+ flex: 1;
2510
+ overflow-x: auto;
2511
+ min-width: 0;
2512
+ }