agent-tasks 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +181 -188
  3. package/package.json +84 -84
  4. package/dist/context.d.ts +0 -21
  5. package/dist/context.d.ts.map +0 -1
  6. package/dist/context.js +0 -48
  7. package/dist/context.js.map +0 -1
  8. package/dist/db.d.ts +0 -10
  9. package/dist/db.d.ts.map +0 -1
  10. package/dist/db.js +0 -112
  11. package/dist/db.js.map +0 -1
  12. package/dist/domain/agent-bridge.d.ts +0 -13
  13. package/dist/domain/agent-bridge.d.ts.map +0 -1
  14. package/dist/domain/agent-bridge.js +0 -99
  15. package/dist/domain/agent-bridge.js.map +0 -1
  16. package/dist/domain/approvals.d.ts +0 -19
  17. package/dist/domain/approvals.d.ts.map +0 -1
  18. package/dist/domain/approvals.js +0 -99
  19. package/dist/domain/approvals.js.map +0 -1
  20. package/dist/domain/cleanup.d.ts +0 -28
  21. package/dist/domain/cleanup.d.ts.map +0 -1
  22. package/dist/domain/cleanup.js +0 -68
  23. package/dist/domain/cleanup.js.map +0 -1
  24. package/dist/domain/collaborators.d.ts +0 -15
  25. package/dist/domain/collaborators.d.ts.map +0 -1
  26. package/dist/domain/collaborators.js +0 -72
  27. package/dist/domain/collaborators.js.map +0 -1
  28. package/dist/domain/comments.d.ts +0 -14
  29. package/dist/domain/comments.d.ts.map +0 -1
  30. package/dist/domain/comments.js +0 -66
  31. package/dist/domain/comments.js.map +0 -1
  32. package/dist/domain/events.d.ts +0 -10
  33. package/dist/domain/events.d.ts.map +0 -1
  34. package/dist/domain/events.js +0 -61
  35. package/dist/domain/events.js.map +0 -1
  36. package/dist/domain/rules.d.ts +0 -2
  37. package/dist/domain/rules.d.ts.map +0 -1
  38. package/dist/domain/rules.js +0 -67
  39. package/dist/domain/rules.js.map +0 -1
  40. package/dist/domain/tasks.d.ts +0 -66
  41. package/dist/domain/tasks.d.ts.map +0 -1
  42. package/dist/domain/tasks.js +0 -655
  43. package/dist/domain/tasks.js.map +0 -1
  44. package/dist/domain/validate.d.ts +0 -16
  45. package/dist/domain/validate.d.ts.map +0 -1
  46. package/dist/domain/validate.js +0 -32
  47. package/dist/domain/validate.js.map +0 -1
  48. package/dist/event-bus.d.ts +0 -10
  49. package/dist/event-bus.d.ts.map +0 -1
  50. package/dist/event-bus.js +0 -38
  51. package/dist/event-bus.js.map +0 -1
  52. package/dist/index.d.ts +0 -3
  53. package/dist/index.d.ts.map +0 -1
  54. package/dist/index.js +0 -132
  55. package/dist/index.js.map +0 -1
  56. package/dist/server.d.ts +0 -10
  57. package/dist/server.d.ts.map +0 -1
  58. package/dist/server.js +0 -95
  59. package/dist/server.js.map +0 -1
  60. package/dist/session.d.ts +0 -7
  61. package/dist/session.d.ts.map +0 -1
  62. package/dist/session.js +0 -11
  63. package/dist/session.js.map +0 -1
  64. package/dist/storage/database.d.ts +0 -15
  65. package/dist/storage/database.d.ts.map +0 -1
  66. package/dist/storage/database.js +0 -224
  67. package/dist/storage/database.js.map +0 -1
  68. package/dist/tasks.d.ts +0 -32
  69. package/dist/tasks.d.ts.map +0 -1
  70. package/dist/tasks.js +0 -410
  71. package/dist/tasks.js.map +0 -1
  72. package/dist/transport/mcp.d.ts +0 -6
  73. package/dist/transport/mcp.d.ts.map +0 -1
  74. package/dist/transport/mcp.js +0 -731
  75. package/dist/transport/mcp.js.map +0 -1
  76. package/dist/transport/rest.d.ts +0 -4
  77. package/dist/transport/rest.d.ts.map +0 -1
  78. package/dist/transport/rest.js +0 -534
  79. package/dist/transport/rest.js.map +0 -1
  80. package/dist/transport/ws.d.ts +0 -10
  81. package/dist/transport/ws.d.ts.map +0 -1
  82. package/dist/transport/ws.js +0 -191
  83. package/dist/transport/ws.js.map +0 -1
  84. package/dist/types.d.ts +0 -147
  85. package/dist/types.d.ts.map +0 -1
  86. package/dist/types.js +0 -35
  87. package/dist/types.js.map +0 -1
  88. package/dist/ui/app.js +0 -1973
  89. package/dist/ui/index.html +0 -172
  90. package/dist/ui/morphdom.min.js +0 -1
  91. package/dist/ui/styles.css +0 -2435
@@ -1,2435 +0,0 @@
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: 480px;
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
- transition:
1302
- width var(--transition-slow),
1303
- min-width var(--transition-slow);
1304
- box-shadow: var(--shadow-panel);
1305
- z-index: 15;
1306
- }
1307
-
1308
- .board-wrapper.panel-open .side-panel {
1309
- width: var(--panel-width);
1310
- min-width: var(--panel-width);
1311
- }
1312
-
1313
- .board-wrapper.panel-open .side-panel.panel-wide {
1314
- --panel-width: min(600px, 50vw);
1315
- }
1316
-
1317
- .panel-header {
1318
- display: flex;
1319
- align-items: center;
1320
- justify-content: space-between;
1321
- padding: 12px 16px;
1322
- border-bottom: 1px solid var(--border-light);
1323
- flex-shrink: 0;
1324
- gap: 8px;
1325
- min-height: 49px;
1326
- }
1327
-
1328
- .panel-header-left {
1329
- display: flex;
1330
- align-items: center;
1331
- gap: 8px;
1332
- min-width: 0;
1333
- flex: 1;
1334
- }
1335
-
1336
- .panel-task-id {
1337
- font-family: var(--font-mono);
1338
- font-size: 13px;
1339
- color: var(--text-muted);
1340
- font-weight: 500;
1341
- flex-shrink: 0;
1342
- }
1343
-
1344
- .panel-stage-badge {
1345
- font-size: 10px;
1346
- font-weight: 600;
1347
- text-transform: uppercase;
1348
- letter-spacing: 0.3px;
1349
- padding: 2px 10px;
1350
- border-radius: var(--radius);
1351
- flex-shrink: 0;
1352
- }
1353
-
1354
- .panel-close-btn {
1355
- background: none;
1356
- border: none;
1357
- cursor: pointer;
1358
- color: var(--text-muted);
1359
- padding: 4px;
1360
- border-radius: var(--radius-sm);
1361
- display: flex;
1362
- align-items: center;
1363
- justify-content: center;
1364
- transition: all var(--transition-fast);
1365
- flex-shrink: 0;
1366
- }
1367
- .panel-close-btn:hover {
1368
- background: var(--bg-hover);
1369
- color: var(--text);
1370
- }
1371
- .panel-close-btn .material-symbols-outlined {
1372
- font-size: 20px;
1373
- }
1374
-
1375
- .panel-body {
1376
- flex: 1;
1377
- overflow-y: auto;
1378
- padding: 16px;
1379
- }
1380
-
1381
- .panel-title {
1382
- font-size: 16px;
1383
- font-weight: 700;
1384
- line-height: 1.35;
1385
- margin-bottom: 16px;
1386
- word-break: break-word;
1387
- }
1388
-
1389
- .panel-title[contenteditable='true'] {
1390
- outline: none;
1391
- border-bottom: 2px solid var(--accent);
1392
- cursor: text;
1393
- }
1394
-
1395
- .panel-section {
1396
- margin-bottom: 20px;
1397
- }
1398
-
1399
- .panel-section-title {
1400
- font-size: 11px;
1401
- font-weight: 600;
1402
- text-transform: uppercase;
1403
- letter-spacing: 0.5px;
1404
- color: var(--text-dim);
1405
- margin-bottom: 8px;
1406
- display: flex;
1407
- align-items: center;
1408
- gap: 6px;
1409
- }
1410
-
1411
- .panel-section-title .material-symbols-outlined {
1412
- font-size: 14px;
1413
- }
1414
-
1415
- .panel-grid {
1416
- display: grid;
1417
- grid-template-columns: 100px 1fr;
1418
- gap: 6px 12px;
1419
- font-size: 13px;
1420
- }
1421
-
1422
- .panel-label {
1423
- font-weight: 500;
1424
- color: var(--text-muted);
1425
- }
1426
-
1427
- .panel-value {
1428
- word-break: break-word;
1429
- color: var(--text);
1430
- }
1431
-
1432
- .panel-value .task-tag {
1433
- cursor: pointer;
1434
- }
1435
-
1436
- .panel-description {
1437
- font-size: 13px;
1438
- line-height: 1.6;
1439
- word-break: break-word;
1440
- color: var(--text-secondary);
1441
- padding: 10px 12px;
1442
- background: var(--bg-elevated);
1443
- border-radius: var(--radius-sm);
1444
- border: 1px solid var(--border-light);
1445
- }
1446
- .panel-description .rendered-md {
1447
- white-space: normal;
1448
- }
1449
-
1450
- /* ---- Panel artifacts ---- */
1451
-
1452
- .panel-artifact {
1453
- background: var(--bg-elevated);
1454
- border: 1px solid var(--border-light);
1455
- border-radius: var(--radius-sm);
1456
- padding: 10px 12px;
1457
- margin-bottom: 6px;
1458
- }
1459
- .panel-artifact h4 {
1460
- font-size: 12px;
1461
- color: var(--accent);
1462
- margin-bottom: 0;
1463
- display: flex;
1464
- align-items: center;
1465
- gap: 4px;
1466
- }
1467
- .panel-artifact pre {
1468
- font-family: var(--font-mono);
1469
- font-size: 12px;
1470
- white-space: pre-wrap;
1471
- word-break: break-word;
1472
- color: var(--text-muted);
1473
- line-height: 1.5;
1474
- margin: 0;
1475
- padding: 0;
1476
- }
1477
-
1478
- /* ---- Panel subtasks ---- */
1479
-
1480
- .panel-subtask {
1481
- display: flex;
1482
- align-items: center;
1483
- gap: 8px;
1484
- padding: 6px 10px;
1485
- background: var(--bg-elevated);
1486
- border: 1px solid var(--border-light);
1487
- border-radius: var(--radius-sm);
1488
- margin-bottom: 4px;
1489
- cursor: pointer;
1490
- transition: border-color var(--transition-fast);
1491
- font-size: 13px;
1492
- }
1493
- .panel-subtask:hover {
1494
- border-color: var(--accent);
1495
- }
1496
- .panel-subtask .subtask-id {
1497
- font-family: var(--font-mono);
1498
- font-size: 11px;
1499
- color: var(--text-dim);
1500
- }
1501
- .panel-subtask .subtask-stage {
1502
- font-size: 10px;
1503
- padding: 2px 8px;
1504
- border-radius: var(--radius-sm);
1505
- margin-left: auto;
1506
- flex-shrink: 0;
1507
- }
1508
-
1509
- /* ---- Panel comments ---- */
1510
-
1511
- .panel-comments {
1512
- border-top: 1px solid var(--border-light);
1513
- padding-top: 12px;
1514
- }
1515
-
1516
- .comment-item {
1517
- padding: 8px 10px;
1518
- background: var(--bg-elevated);
1519
- border-radius: var(--radius-sm);
1520
- margin-bottom: 6px;
1521
- border: 1px solid var(--border-light);
1522
- }
1523
- .comment-item.reply {
1524
- margin-left: 24px;
1525
- }
1526
- .comment-header {
1527
- display: flex;
1528
- align-items: center;
1529
- gap: 6px;
1530
- margin-bottom: 4px;
1531
- font-size: 12px;
1532
- }
1533
- .comment-agent {
1534
- font-weight: 600;
1535
- color: var(--accent);
1536
- }
1537
- .comment-time {
1538
- color: var(--text-dim);
1539
- font-size: 11px;
1540
- }
1541
- .comment-body {
1542
- font-size: 13px;
1543
- white-space: pre-wrap;
1544
- word-break: break-word;
1545
- color: var(--text-secondary);
1546
- }
1547
- .comment-form {
1548
- display: flex;
1549
- gap: 6px;
1550
- margin-top: 8px;
1551
- }
1552
- .comment-form textarea {
1553
- flex: 1;
1554
- padding: 6px 10px;
1555
- border: 1px solid var(--border);
1556
- border-radius: var(--radius-sm);
1557
- background: var(--bg-elevated);
1558
- color: var(--text);
1559
- font-family: var(--font-sans);
1560
- font-size: 12px;
1561
- resize: vertical;
1562
- min-height: 32px;
1563
- max-height: 120px;
1564
- outline: none;
1565
- transition: border-color var(--transition-fast);
1566
- }
1567
- .comment-form textarea:focus {
1568
- border-color: var(--accent);
1569
- box-shadow: 0 0 0 3px var(--focus-ring);
1570
- }
1571
- .comment-form button {
1572
- padding: 6px 14px;
1573
- border: none;
1574
- border-radius: var(--radius-sm);
1575
- background: var(--accent);
1576
- color: white;
1577
- font-size: 12px;
1578
- font-weight: 500;
1579
- cursor: pointer;
1580
- white-space: nowrap;
1581
- align-self: flex-end;
1582
- transition: background var(--transition-fast);
1583
- }
1584
- .comment-form button:hover {
1585
- background: var(--accent-hover);
1586
- }
1587
-
1588
- /* --------------------------------------------------------------------------
1589
- Legacy Modal (cleanup dialog only)
1590
- -------------------------------------------------------------------------- */
1591
-
1592
- .modal-overlay {
1593
- position: fixed;
1594
- inset: 0;
1595
- background: rgba(0, 0, 0, 0.5);
1596
- display: flex;
1597
- align-items: center;
1598
- justify-content: center;
1599
- z-index: 100;
1600
- backdrop-filter: blur(2px);
1601
- animation: overlayIn 0.15s ease;
1602
- }
1603
- .modal-overlay[hidden],
1604
- .modal-overlay.hidden {
1605
- display: none;
1606
- }
1607
-
1608
- @keyframes overlayIn {
1609
- from {
1610
- opacity: 0;
1611
- }
1612
- to {
1613
- opacity: 1;
1614
- }
1615
- }
1616
-
1617
- .modal {
1618
- background: var(--bg-surface);
1619
- border-radius: var(--radius-lg);
1620
- border: 1px solid var(--border);
1621
- width: 90%;
1622
- max-width: 600px;
1623
- max-height: 80vh;
1624
- display: flex;
1625
- flex-direction: column;
1626
- box-shadow: var(--shadow-3);
1627
- animation: modalIn 0.2s ease;
1628
- }
1629
-
1630
- @keyframes modalIn {
1631
- from {
1632
- opacity: 0;
1633
- transform: translateY(12px) scale(0.97);
1634
- }
1635
- to {
1636
- opacity: 1;
1637
- transform: translateY(0) scale(1);
1638
- }
1639
- }
1640
-
1641
- .modal-header {
1642
- display: flex;
1643
- align-items: center;
1644
- justify-content: space-between;
1645
- padding: 12px 16px;
1646
- border-bottom: 1px solid var(--border-light);
1647
- }
1648
- .modal-header h2 {
1649
- font-size: 15px;
1650
- font-weight: 600;
1651
- }
1652
- .modal-close {
1653
- font-size: 20px;
1654
- border: none;
1655
- background: none;
1656
- cursor: pointer;
1657
- color: var(--text-muted);
1658
- padding: 4px;
1659
- border-radius: var(--radius-sm);
1660
- transition: all var(--transition-fast);
1661
- }
1662
- .modal-close:hover {
1663
- background: var(--bg-hover);
1664
- color: var(--text);
1665
- }
1666
-
1667
- .modal-body {
1668
- padding: 16px;
1669
- overflow-y: auto;
1670
- font-size: 13px;
1671
- line-height: 1.6;
1672
- }
1673
-
1674
- /* --------------------------------------------------------------------------
1675
- Inline Edit Dropdown
1676
- -------------------------------------------------------------------------- */
1677
-
1678
- .inline-dropdown {
1679
- position: absolute;
1680
- background: var(--bg-surface);
1681
- border: 1px solid var(--border);
1682
- border-radius: var(--radius);
1683
- box-shadow: var(--shadow-3);
1684
- z-index: 50;
1685
- padding: 4px;
1686
- min-width: 140px;
1687
- max-height: 200px;
1688
- overflow-y: auto;
1689
- animation: dropdownIn 0.12s ease;
1690
- }
1691
-
1692
- @keyframes dropdownIn {
1693
- from {
1694
- opacity: 0;
1695
- transform: translateY(-4px);
1696
- }
1697
- to {
1698
- opacity: 1;
1699
- transform: translateY(0);
1700
- }
1701
- }
1702
-
1703
- .inline-dropdown-item {
1704
- padding: 6px 10px;
1705
- font-size: 12px;
1706
- cursor: pointer;
1707
- border-radius: var(--radius-sm);
1708
- transition: background var(--transition-fast);
1709
- display: flex;
1710
- align-items: center;
1711
- gap: 6px;
1712
- }
1713
- .inline-dropdown-item:hover {
1714
- background: var(--bg-hover);
1715
- }
1716
- .inline-dropdown-item.active {
1717
- background: var(--accent-dim);
1718
- color: var(--accent);
1719
- font-weight: 500;
1720
- }
1721
-
1722
- /* --------------------------------------------------------------------------
1723
- Toast
1724
- -------------------------------------------------------------------------- */
1725
-
1726
- .toast-container {
1727
- position: fixed;
1728
- top: 16px;
1729
- right: 16px;
1730
- z-index: 1000;
1731
- display: flex;
1732
- flex-direction: column;
1733
- gap: 8px;
1734
- pointer-events: none;
1735
- }
1736
-
1737
- .toast {
1738
- background: var(--bg-surface);
1739
- border: 1px solid var(--border);
1740
- border-radius: var(--radius);
1741
- padding: 10px 14px;
1742
- font-size: 12px;
1743
- box-shadow: var(--shadow-2);
1744
- animation: toastIn 0.3s cubic-bezier(0.2, 0.8, 0.3, 1);
1745
- max-width: 340px;
1746
- pointer-events: auto;
1747
- display: flex;
1748
- align-items: flex-start;
1749
- gap: 8px;
1750
- }
1751
-
1752
- .toast-icon {
1753
- font-size: 18px;
1754
- flex-shrink: 0;
1755
- line-height: 1;
1756
- }
1757
- .toast-icon.toast-icon-success {
1758
- color: var(--green);
1759
- }
1760
- .toast-icon.toast-icon-error {
1761
- color: var(--red);
1762
- }
1763
-
1764
- .toast-content {
1765
- flex: 1;
1766
- min-width: 0;
1767
- }
1768
-
1769
- .toast-title {
1770
- font-weight: 600;
1771
- margin-bottom: 2px;
1772
- }
1773
- .toast-body {
1774
- color: var(--text-muted);
1775
- }
1776
-
1777
- .toast.fade-out {
1778
- animation: toastOut 0.3s ease forwards;
1779
- }
1780
-
1781
- @keyframes toastIn {
1782
- from {
1783
- opacity: 0;
1784
- transform: translateY(16px) scale(0.95);
1785
- }
1786
- to {
1787
- opacity: 1;
1788
- transform: translateY(0) scale(1);
1789
- }
1790
- }
1791
-
1792
- @keyframes toastOut {
1793
- from {
1794
- opacity: 1;
1795
- transform: translateX(0);
1796
- }
1797
- to {
1798
- opacity: 0;
1799
- transform: translateX(40px);
1800
- }
1801
- }
1802
-
1803
- /* --------------------------------------------------------------------------
1804
- Scrollbar
1805
- -------------------------------------------------------------------------- */
1806
-
1807
- ::-webkit-scrollbar {
1808
- width: 6px;
1809
- height: 6px;
1810
- }
1811
- ::-webkit-scrollbar-track {
1812
- background: transparent;
1813
- }
1814
- ::-webkit-scrollbar-thumb {
1815
- background: var(--border);
1816
- border-radius: 3px;
1817
- }
1818
- ::-webkit-scrollbar-thumb:hover {
1819
- background: var(--text-dim);
1820
- }
1821
-
1822
- /* --------------------------------------------------------------------------
1823
- Cleanup Dialog
1824
- -------------------------------------------------------------------------- */
1825
-
1826
- .cleanup-options {
1827
- display: flex;
1828
- flex-direction: column;
1829
- gap: 8px;
1830
- }
1831
-
1832
- .cleanup-option {
1833
- display: flex;
1834
- align-items: flex-start;
1835
- gap: 12px;
1836
- padding: 12px;
1837
- border: 1px solid var(--border);
1838
- border-radius: var(--radius);
1839
- background: var(--bg-elevated);
1840
- color: var(--text);
1841
- cursor: pointer;
1842
- text-align: left;
1843
- font-family: var(--font-sans);
1844
- font-size: 13px;
1845
- transition:
1846
- border-color var(--transition-fast),
1847
- background var(--transition-fast);
1848
- }
1849
- .cleanup-option:hover {
1850
- background: var(--bg-hover);
1851
- border-color: var(--accent);
1852
- }
1853
- .cleanup-option .material-symbols-outlined {
1854
- font-size: 24px;
1855
- color: var(--accent);
1856
- flex-shrink: 0;
1857
- margin-top: 2px;
1858
- }
1859
- .cleanup-option div {
1860
- display: flex;
1861
- flex-direction: column;
1862
- gap: 2px;
1863
- }
1864
- .cleanup-option strong {
1865
- font-size: 14px;
1866
- }
1867
- .cleanup-option div span {
1868
- font-size: 12px;
1869
- color: var(--text-muted);
1870
- }
1871
-
1872
- .cleanup-option-danger {
1873
- border-color: rgba(220, 53, 69, 0.4);
1874
- border-width: 1.5px;
1875
- }
1876
- .cleanup-option-danger:hover {
1877
- border-color: var(--red);
1878
- background: var(--red-dim);
1879
- box-shadow: 0 0 0 1px rgba(220, 53, 69, 0.15);
1880
- }
1881
- .cleanup-option-danger .material-symbols-outlined {
1882
- color: var(--red);
1883
- }
1884
- .cleanup-option-danger strong {
1885
- color: var(--red);
1886
- }
1887
-
1888
- /* --------------------------------------------------------------------------
1889
- Reduced Motion
1890
- -------------------------------------------------------------------------- */
1891
-
1892
- @media (prefers-reduced-motion: reduce) {
1893
- *,
1894
- *::before,
1895
- *::after {
1896
- animation-duration: 0.01ms !important;
1897
- transition-duration: 0.01ms !important;
1898
- }
1899
- }
1900
-
1901
- /* --------------------------------------------------------------------------
1902
- Responsive
1903
- -------------------------------------------------------------------------- */
1904
-
1905
- @media (max-width: 1024px) {
1906
- .board-wrapper.panel-open .side-panel {
1907
- position: fixed;
1908
- right: 0;
1909
- top: 0;
1910
- bottom: 0;
1911
- width: var(--panel-width);
1912
- min-width: var(--panel-width);
1913
- z-index: 80;
1914
- box-shadow: var(--shadow-3);
1915
- }
1916
-
1917
- .board-wrapper.panel-open .kanban-board {
1918
- flex: 1;
1919
- }
1920
-
1921
- .panel-backdrop {
1922
- display: block;
1923
- position: fixed;
1924
- inset: 0;
1925
- background: rgba(0, 0, 0, 0.3);
1926
- z-index: 79;
1927
- }
1928
- }
1929
-
1930
- @media (min-width: 1025px) {
1931
- .panel-backdrop {
1932
- display: none;
1933
- }
1934
- }
1935
-
1936
- @media (max-width: 768px) {
1937
- .kanban-board {
1938
- flex-direction: column;
1939
- overflow-y: auto;
1940
- overflow-x: hidden;
1941
- }
1942
- .kanban-column {
1943
- min-width: 0;
1944
- max-width: none;
1945
- max-height: none;
1946
- }
1947
- .kanban-column.collapsed {
1948
- min-width: 0;
1949
- max-width: none;
1950
- writing-mode: horizontal-tb;
1951
- }
1952
- .kanban-column.collapsed .column-header {
1953
- writing-mode: horizontal-tb;
1954
- flex-direction: row;
1955
- padding: 10px 12px;
1956
- }
1957
- .filter-group {
1958
- flex-wrap: wrap;
1959
- }
1960
- .filter-input {
1961
- max-width: none;
1962
- }
1963
- .stats {
1964
- display: none;
1965
- }
1966
-
1967
- .board-wrapper.panel-open .side-panel {
1968
- width: 100%;
1969
- min-width: 100%;
1970
- --panel-width: 100%;
1971
- }
1972
- }
1973
-
1974
- @media (max-width: 480px) {
1975
- header {
1976
- padding: 6px 12px;
1977
- }
1978
- .filter-bar {
1979
- padding: 6px 12px;
1980
- }
1981
- .kanban-board {
1982
- padding: 8px;
1983
- }
1984
- .modal {
1985
- width: 98%;
1986
- }
1987
- }
1988
-
1989
- /* --------------------------------------------------------------------------
1990
- Stage Badge Colors (panel & dropdown)
1991
- -------------------------------------------------------------------------- */
1992
-
1993
- .stage-backlog {
1994
- background: var(--gray-dim);
1995
- color: var(--gray);
1996
- }
1997
- .stage-spec {
1998
- background: var(--blue-dim);
1999
- color: var(--blue);
2000
- }
2001
- .stage-plan {
2002
- background: var(--indigo-dim);
2003
- color: var(--indigo);
2004
- }
2005
- .stage-implement {
2006
- background: var(--purple-dim);
2007
- color: var(--purple);
2008
- }
2009
- .stage-test {
2010
- background: var(--orange-dim);
2011
- color: var(--orange);
2012
- }
2013
- .stage-review {
2014
- background: var(--amber-dim);
2015
- color: var(--amber);
2016
- }
2017
- .stage-done {
2018
- background: var(--green-dim);
2019
- color: var(--green);
2020
- }
2021
- .stage-cancelled {
2022
- background: var(--red-dim);
2023
- color: var(--red);
2024
- }
2025
-
2026
- /* --------------------------------------------------------------------------
2027
- Priority dropdown indicator
2028
- -------------------------------------------------------------------------- */
2029
-
2030
- .priority-dot {
2031
- width: 8px;
2032
- height: 8px;
2033
- border-radius: 50%;
2034
- display: inline-block;
2035
- flex-shrink: 0;
2036
- }
2037
- .priority-dot.p-high {
2038
- background: var(--red);
2039
- }
2040
- .priority-dot.p-med {
2041
- background: var(--orange);
2042
- }
2043
- .priority-dot.p-low {
2044
- background: var(--blue);
2045
- }
2046
- .priority-dot.p-none {
2047
- background: var(--gray);
2048
- }
2049
-
2050
- /* --------------------------------------------------------------------------
2051
- Comments section (used in legacy modal)
2052
- -------------------------------------------------------------------------- */
2053
-
2054
- .comments-section {
2055
- margin-top: 16px;
2056
- border-top: 1px solid var(--border-light);
2057
- padding-top: 12px;
2058
- }
2059
- .comments-section h3 {
2060
- font-size: 13px;
2061
- font-weight: 600;
2062
- margin-bottom: 8px;
2063
- display: flex;
2064
- align-items: center;
2065
- gap: 6px;
2066
- }
2067
-
2068
- /* --------------------------------------------------------------------------
2069
- Detail row (used in both panel and legacy modal)
2070
- -------------------------------------------------------------------------- */
2071
-
2072
- .detail-row {
2073
- display: flex;
2074
- gap: 8px;
2075
- margin-bottom: 8px;
2076
- font-size: 13px;
2077
- line-height: 1.6;
2078
- }
2079
- .detail-label {
2080
- font-weight: 600;
2081
- color: var(--text-muted);
2082
- min-width: 90px;
2083
- flex-shrink: 0;
2084
- }
2085
- .detail-value {
2086
- word-break: break-word;
2087
- }
2088
-
2089
- .artifact-list {
2090
- margin-top: 12px;
2091
- }
2092
- .artifact-item {
2093
- background: var(--bg-elevated);
2094
- border: 1px solid var(--border-light);
2095
- border-radius: var(--radius-sm);
2096
- padding: 8px 10px;
2097
- margin-bottom: 6px;
2098
- }
2099
- .artifact-item h4 {
2100
- font-size: 12px;
2101
- color: var(--accent);
2102
- margin-bottom: 4px;
2103
- }
2104
- .artifact-item pre {
2105
- font-family: var(--font-mono);
2106
- font-size: 12px;
2107
- white-space: pre-wrap;
2108
- word-break: break-word;
2109
- color: var(--text-muted);
2110
- max-height: 200px;
2111
- overflow-y: auto;
2112
- }
2113
-
2114
- /* --------------------------------------------------------------------------
2115
- Syntax Highlighting
2116
- -------------------------------------------------------------------------- */
2117
-
2118
- .hljs-keyword {
2119
- color: var(--purple);
2120
- font-weight: 500;
2121
- }
2122
- .hljs-string {
2123
- color: var(--green);
2124
- }
2125
- .hljs-comment {
2126
- color: var(--text-dim);
2127
- font-style: italic;
2128
- }
2129
- .hljs-number {
2130
- color: var(--orange);
2131
- }
2132
- .hljs-function {
2133
- color: var(--blue);
2134
- }
2135
- .hljs-type {
2136
- color: var(--indigo);
2137
- }
2138
- .hljs-operator {
2139
- color: var(--text-muted);
2140
- }
2141
- .hljs-property {
2142
- color: var(--accent);
2143
- }
2144
-
2145
- /* --------------------------------------------------------------------------
2146
- Markdown Rendering
2147
- -------------------------------------------------------------------------- */
2148
-
2149
- .rendered-md h3 {
2150
- font-size: 14px;
2151
- font-weight: 700;
2152
- margin: 12px 0 6px;
2153
- color: var(--text);
2154
- }
2155
- .rendered-md h4 {
2156
- font-size: 13px;
2157
- font-weight: 600;
2158
- margin: 10px 0 4px;
2159
- color: var(--text);
2160
- }
2161
- .rendered-md strong {
2162
- font-weight: 600;
2163
- color: var(--text);
2164
- }
2165
- .rendered-md em {
2166
- font-style: italic;
2167
- }
2168
- .rendered-md code {
2169
- font-family: var(--font-mono);
2170
- font-size: 0.9em;
2171
- background: var(--bg-inset);
2172
- padding: 1px 5px;
2173
- border-radius: 4px;
2174
- color: var(--accent);
2175
- }
2176
- .rendered-md pre {
2177
- background: var(--bg-inset);
2178
- border: 1px solid var(--border-light);
2179
- border-radius: var(--radius-sm);
2180
- padding: 10px 12px;
2181
- margin: 8px 0;
2182
- overflow-x: auto;
2183
- }
2184
- .rendered-md pre code {
2185
- background: none;
2186
- padding: 0;
2187
- color: var(--text-secondary);
2188
- font-size: 12px;
2189
- line-height: 1.5;
2190
- }
2191
- .rendered-md ul {
2192
- padding-left: 20px;
2193
- margin: 6px 0;
2194
- }
2195
- .rendered-md ul li {
2196
- font-size: 13px;
2197
- line-height: 1.6;
2198
- color: var(--text-secondary);
2199
- margin-bottom: 2px;
2200
- }
2201
- .rendered-md a {
2202
- color: var(--accent);
2203
- text-decoration: none;
2204
- }
2205
- .rendered-md a:hover {
2206
- text-decoration: underline;
2207
- }
2208
- .rendered-md br {
2209
- content: '';
2210
- display: block;
2211
- margin-top: 4px;
2212
- }
2213
-
2214
- /* --------------------------------------------------------------------------
2215
- Expandable Artifacts
2216
- -------------------------------------------------------------------------- */
2217
-
2218
- .artifact-wrapper {
2219
- position: relative;
2220
- width: 100%;
2221
- }
2222
-
2223
- .artifact-wrapper.artifact-collapsed .artifact-code {
2224
- max-height: calc(1.5em * 8 + 20px);
2225
- overflow: hidden;
2226
- }
2227
-
2228
- .artifact-wrapper.artifact-collapsed .artifact-fade {
2229
- display: block;
2230
- }
2231
-
2232
- .artifact-wrapper.artifact-expanded .artifact-code {
2233
- max-height: 600px;
2234
- overflow-y: auto;
2235
- }
2236
-
2237
- .artifact-code {
2238
- margin: 0;
2239
- padding: 0 12px;
2240
- font-family: var(--font-mono);
2241
- font-size: 12px;
2242
- line-height: 1.5;
2243
- white-space: pre;
2244
- color: var(--text-muted);
2245
- }
2246
-
2247
- .artifact-fade {
2248
- display: none;
2249
- position: absolute;
2250
- bottom: 28px;
2251
- left: 0;
2252
- right: 0;
2253
- height: 48px;
2254
- background: linear-gradient(transparent, var(--bg-elevated));
2255
- pointer-events: none;
2256
- border-radius: 0 0 var(--radius-sm) var(--radius-sm);
2257
- }
2258
-
2259
- .artifact-toggle {
2260
- display: flex;
2261
- align-items: center;
2262
- justify-content: center;
2263
- gap: 4px;
2264
- width: 100%;
2265
- padding: 4px 0;
2266
- margin-top: 4px;
2267
- background: none;
2268
- border: none;
2269
- border-top: 1px solid var(--border-light);
2270
- color: var(--accent);
2271
- font-family: var(--font-sans);
2272
- font-size: 11px;
2273
- font-weight: 500;
2274
- cursor: pointer;
2275
- transition: color var(--transition-fast);
2276
- }
2277
- .artifact-toggle:hover {
2278
- color: var(--accent-hover);
2279
- }
2280
- .artifact-toggle .material-symbols-outlined {
2281
- font-size: 14px;
2282
- }
2283
-
2284
- /* --------------------------------------------------------------------------
2285
- Diff Viewer
2286
- -------------------------------------------------------------------------- */
2287
-
2288
- .diff-viewer {
2289
- display: flex;
2290
- gap: 2px;
2291
- font-family: var(--font-mono);
2292
- font-size: 12px;
2293
- line-height: 1.5;
2294
- overflow-x: auto;
2295
- border: 1px solid var(--border);
2296
- border-radius: var(--radius-sm);
2297
- }
2298
-
2299
- .diff-side {
2300
- flex: 1;
2301
- min-width: 0;
2302
- overflow-x: auto;
2303
- }
2304
-
2305
- .diff-side .diff-header {
2306
- padding: 4px 8px;
2307
- background: var(--bg-hover);
2308
- font-weight: 600;
2309
- font-size: 11px;
2310
- color: var(--text-muted);
2311
- border-bottom: 1px solid var(--border);
2312
- }
2313
-
2314
- .diff-table {
2315
- width: 100%;
2316
- border-collapse: collapse;
2317
- }
2318
-
2319
- .diff-ln {
2320
- width: 36px;
2321
- text-align: right;
2322
- padding: 0 8px;
2323
- color: var(--text-dim);
2324
- user-select: none;
2325
- border-right: 1px solid var(--border);
2326
- }
2327
-
2328
- .diff-code {
2329
- padding: 0 8px;
2330
- white-space: pre;
2331
- }
2332
-
2333
- .diff-del {
2334
- background: var(--red-dim);
2335
- }
2336
-
2337
- .diff-del .diff-code {
2338
- color: var(--red);
2339
- }
2340
-
2341
- .diff-add {
2342
- background: var(--green-dim);
2343
- }
2344
-
2345
- .diff-add .diff-code {
2346
- color: var(--green);
2347
- }
2348
-
2349
- .diff-context {
2350
- background: transparent;
2351
- }
2352
-
2353
- .diff-context .diff-code {
2354
- color: var(--text-muted);
2355
- }
2356
-
2357
- .diff-section-header td {
2358
- padding: 2px 8px;
2359
- background: var(--blue-dim);
2360
- color: var(--blue);
2361
- font-weight: 500;
2362
- font-size: 11px;
2363
- }
2364
-
2365
- /* --------------------------------------------------------------------------
2366
- Artifact Header (copy button + line numbers)
2367
- -------------------------------------------------------------------------- */
2368
-
2369
- .artifact-header {
2370
- display: flex;
2371
- align-items: center;
2372
- justify-content: space-between;
2373
- gap: 6px;
2374
- margin-bottom: 4px;
2375
- }
2376
-
2377
- .artifact-header h4 {
2378
- font-size: 12px;
2379
- color: var(--accent);
2380
- display: flex;
2381
- align-items: center;
2382
- gap: 4px;
2383
- margin: 0;
2384
- flex: 1;
2385
- min-width: 0;
2386
- }
2387
-
2388
- .artifact-copy-btn {
2389
- background: none;
2390
- border: 1px solid var(--border-light);
2391
- border-radius: 4px;
2392
- color: var(--text-dim);
2393
- cursor: pointer;
2394
- padding: 2px 6px;
2395
- font-size: 11px;
2396
- font-family: var(--font-sans);
2397
- display: flex;
2398
- align-items: center;
2399
- gap: 3px;
2400
- transition: all var(--transition-fast);
2401
- flex-shrink: 0;
2402
- }
2403
- .artifact-copy-btn:hover {
2404
- background: var(--bg-hover);
2405
- border-color: var(--accent);
2406
- color: var(--text);
2407
- }
2408
- .artifact-copy-btn .material-symbols-outlined {
2409
- font-size: 13px;
2410
- }
2411
-
2412
- .artifact-lines {
2413
- display: flex;
2414
- overflow-x: auto;
2415
- }
2416
-
2417
- .artifact-line-numbers {
2418
- white-space: pre;
2419
- text-align: right;
2420
- padding-right: 12px;
2421
- border-right: 1px solid var(--border);
2422
- color: var(--text-dim);
2423
- font-size: 11px;
2424
- line-height: 1.5;
2425
- user-select: none;
2426
- min-width: 32px;
2427
- font-family: var(--font-mono);
2428
- flex-shrink: 0;
2429
- }
2430
-
2431
- .artifact-line-content {
2432
- flex: 1;
2433
- overflow-x: auto;
2434
- min-width: 0;
2435
- }