claude-coding-flow 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1034 @@
1
+ /* ═══════════════════════════════════════════════
2
+ Flow Dashboard — "Control Room" Aesthetic
3
+ ═══════════════════════════════════════════════ */
4
+
5
+ :root {
6
+ /* Amber (doc-gen) */
7
+ --amber-50: #fff8e1; --amber-100: #ffecb3; --amber-200: #ffe082;
8
+ --amber-400: #ffca28; --amber-500: #ff9800; --amber-600: #fb8c00;
9
+ --amber-700: #f57c00;
10
+ /* Blue (code-gen) */
11
+ --blue-50: #e3f2fd; --blue-100: #bbdefb; --blue-200: #90caf9;
12
+ --blue-400: #42a5f5; --blue-500: #03a9f4; --blue-600: #039be5;
13
+ --blue-700: #0288d1;
14
+ /* Red (bug-fix) */
15
+ --red-50: #ffebee; --red-100: #ffcdd2; --red-200: #ef9a9a;
16
+ --red-400: #ef5350; --red-500: #f44336; --red-600: #e53935;
17
+ --red-700: #c62828;
18
+ /* Green */
19
+ --green-100: #c8e6c9; --green-500: #4caf50; --green-600: #2e7d32; --green-700: #1b5e20;
20
+ /* Neutral */
21
+ --g50: #fafafa; --g100: #f5f5f5; --g200: #eee; --g300: #e0e0e0;
22
+ --g400: #bdbdbd; --g500: #9e9e9e; --g600: #757575; --g700: #616161;
23
+ --g800: #424242; --g900: #212121;
24
+ /* Surface */
25
+ --sidebar-bg: #0f1117;
26
+ --sidebar-hover: #1a1d27;
27
+ --sidebar-active: #222633;
28
+ --surface: #ffffff;
29
+ --surface-raised: #ffffff;
30
+ --surface-dim: #f8f9fa;
31
+ /* Misc */
32
+ --radius-sm: 6px; --radius-md: 10px; --radius-lg: 14px;
33
+ --shadow-sm: 0 1px 3px rgba(0,0,0,.06);
34
+ --shadow-md: 0 2px 8px rgba(0,0,0,.10);
35
+ --shadow-lg: 0 4px 16px rgba(0,0,0,.14);
36
+ }
37
+
38
+ * { box-sizing: border-box; margin: 0; padding: 0; }
39
+
40
+ body {
41
+ font-family: "DM Sans", "Noto Sans SC", -apple-system, "SF Pro Text", "PingFang SC", sans-serif;
42
+ background: var(--surface-dim);
43
+ color: var(--g800);
44
+ overflow: hidden;
45
+ height: 100vh;
46
+ }
47
+
48
+ /* ── App Layout ── */
49
+
50
+ .app-layout {
51
+ display: flex;
52
+ height: 100vh;
53
+ }
54
+
55
+ /* ── Sidebar ── */
56
+
57
+ .sidebar {
58
+ width: 224px;
59
+ min-width: 224px;
60
+ background: var(--sidebar-bg);
61
+ display: flex;
62
+ flex-direction: column;
63
+ border-right: 1px solid rgba(255,255,255,.06);
64
+ position: relative;
65
+ z-index: 50;
66
+ }
67
+
68
+ .sidebar-brand {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 12px;
72
+ padding: 22px 20px 20px;
73
+ border-bottom: 1px solid rgba(255,255,255,.06);
74
+ }
75
+
76
+ .brand-icon {
77
+ width: 36px; height: 36px;
78
+ display: flex; align-items: center; justify-content: center;
79
+ background: linear-gradient(135deg, var(--blue-500), var(--amber-500));
80
+ border-radius: var(--radius-sm);
81
+ color: #fff;
82
+ }
83
+
84
+ .brand-icon .material-icons { font-size: 20px; }
85
+
86
+ .brand-text { display: flex; flex-direction: column; }
87
+ .brand-name {
88
+ font-size: 16px; font-weight: 700; color: #fff;
89
+ letter-spacing: .5px;
90
+ font-family: "DM Mono", "SF Mono", monospace;
91
+ }
92
+ .brand-sub {
93
+ font-size: 10px; color: var(--g500);
94
+ letter-spacing: 1px; text-transform: uppercase;
95
+ margin-top: 1px;
96
+ }
97
+
98
+ .sidebar-nav {
99
+ flex: 1;
100
+ padding: 12px 8px;
101
+ display: flex;
102
+ flex-direction: column;
103
+ gap: 2px;
104
+ }
105
+
106
+ .nav-item {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 12px;
110
+ padding: 12px 14px;
111
+ border-radius: var(--radius-md);
112
+ cursor: pointer;
113
+ transition: all .2s;
114
+ position: relative;
115
+ color: var(--g400);
116
+ }
117
+
118
+ .nav-item:hover {
119
+ background: var(--sidebar-hover);
120
+ color: var(--g200);
121
+ }
122
+
123
+ .nav-item.active {
124
+ background: var(--sidebar-active);
125
+ color: #fff;
126
+ }
127
+
128
+ .nav-indicator {
129
+ position: absolute;
130
+ left: 0; top: 50%;
131
+ width: 3px; height: 0;
132
+ border-radius: 0 2px 2px 0;
133
+ transform: translateY(-50%);
134
+ transition: height .25s ease;
135
+ }
136
+
137
+ .nav-item.active .nav-indicator { height: 24px; }
138
+ .nav-item[data-color="amber"] .nav-indicator { background: var(--amber-500); }
139
+ .nav-item[data-color="blue"] .nav-indicator { background: var(--blue-500); }
140
+ .nav-item[data-color="red"] .nav-indicator { background: var(--red-500); }
141
+
142
+ .nav-icon { font-size: 20px; }
143
+ .nav-label {
144
+ flex: 1;
145
+ font-size: 13px;
146
+ font-weight: 500;
147
+ letter-spacing: .2px;
148
+ }
149
+
150
+ .nav-count {
151
+ font-size: 10px;
152
+ font-weight: 600;
153
+ background: rgba(255,255,255,.08);
154
+ color: var(--g400);
155
+ padding: 2px 7px;
156
+ border-radius: 8px;
157
+ min-width: 22px;
158
+ text-align: center;
159
+ }
160
+
161
+ .nav-item.active .nav-count {
162
+ background: rgba(255,255,255,.12);
163
+ color: var(--g200);
164
+ }
165
+
166
+ .sidebar-footer {
167
+ padding: 14px 20px;
168
+ border-top: 1px solid rgba(255,255,255,.06);
169
+ }
170
+
171
+ .sidebar-status {
172
+ display: flex; align-items: center; gap: 8px;
173
+ }
174
+
175
+ .status-dot {
176
+ width: 7px; height: 7px;
177
+ border-radius: 50%;
178
+ background: var(--green-500);
179
+ box-shadow: 0 0 6px var(--green-500);
180
+ animation: pulse-dot 2s infinite;
181
+ }
182
+
183
+ @keyframes pulse-dot {
184
+ 0%,100% { opacity: 1; }
185
+ 50% { opacity: .4; }
186
+ }
187
+
188
+ .status-text {
189
+ font-size: 11px; color: var(--g500);
190
+ letter-spacing: .3px;
191
+ }
192
+
193
+ /* ── Content Area ── */
194
+
195
+ .content-area {
196
+ flex: 1;
197
+ overflow-y: auto;
198
+ overflow-x: hidden;
199
+ scroll-behavior: smooth;
200
+ }
201
+
202
+ .tab-panel {
203
+ display: none;
204
+ min-height: 100vh;
205
+ }
206
+
207
+ .tab-panel.active {
208
+ display: block;
209
+ animation: fadePanel .3s ease;
210
+ }
211
+
212
+ @keyframes fadePanel {
213
+ from { opacity: 0; transform: translateY(6px); }
214
+ to { opacity: 1; transform: translateY(0); }
215
+ }
216
+
217
+ /* ── Panel Header ── */
218
+
219
+ .panel-header {
220
+ padding: 24px 32px 16px;
221
+ display: flex;
222
+ align-items: center;
223
+ justify-content: space-between;
224
+ border-bottom: 1px solid var(--g200);
225
+ background: var(--surface);
226
+ position: sticky;
227
+ top: 0;
228
+ z-index: 30;
229
+ }
230
+
231
+ .panel-header-left {
232
+ display: flex; align-items: center; gap: 14px;
233
+ }
234
+
235
+ .panel-icon {
236
+ width: 38px; height: 38px;
237
+ display: flex; align-items: center; justify-content: center;
238
+ border-radius: var(--radius-md);
239
+ }
240
+ .panel-icon .material-icons { font-size: 22px; }
241
+ .panel-icon.amber { background: var(--amber-50); color: var(--amber-600); }
242
+ .panel-icon.blue { background: var(--blue-50); color: var(--blue-600); }
243
+ .panel-icon.red { background: var(--red-50); color: var(--red-600); }
244
+
245
+ .panel-title {
246
+ font-size: 18px; font-weight: 700; color: var(--g900);
247
+ letter-spacing: -.3px;
248
+ }
249
+
250
+ .panel-desc {
251
+ font-size: 12px; color: var(--g500);
252
+ background: var(--g100);
253
+ padding: 4px 12px;
254
+ border-radius: 20px;
255
+ }
256
+
257
+ /* ── Panel Content ── */
258
+
259
+ .panel-content {
260
+ max-width: 900px;
261
+ margin: 0 auto;
262
+ padding: 20px 24px 40px;
263
+ }
264
+
265
+ /* ── Empty State ── */
266
+
267
+ .empty-state {
268
+ text-align: center;
269
+ padding: 80px 0;
270
+ color: var(--g400);
271
+ }
272
+
273
+ .empty-state .material-icons {
274
+ font-size: 48px;
275
+ margin-bottom: 12px;
276
+ color: var(--g300);
277
+ }
278
+
279
+ .empty-state p { font-size: 14px; }
280
+
281
+ /* ── Module Section ── */
282
+
283
+ .module-section {
284
+ margin-bottom: 20px;
285
+ animation: slideUp .3s ease both;
286
+ }
287
+
288
+ .module-section:nth-child(2) { animation-delay: .05s; }
289
+ .module-section:nth-child(3) { animation-delay: .1s; }
290
+
291
+ @keyframes slideUp {
292
+ from { opacity: 0; transform: translateY(12px); }
293
+ to { opacity: 1; transform: translateY(0); }
294
+ }
295
+
296
+ .module-header {
297
+ display: flex;
298
+ align-items: center;
299
+ justify-content: space-between;
300
+ padding: 14px 20px;
301
+ background: var(--surface);
302
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
303
+ cursor: pointer;
304
+ border-bottom: 1px solid var(--g100);
305
+ transition: box-shadow .2s;
306
+ user-select: none;
307
+ }
308
+
309
+ .module-header:hover { box-shadow: var(--shadow-sm); }
310
+
311
+ .module-left {
312
+ display: flex; align-items: center; gap: 12px;
313
+ }
314
+
315
+ .module-expand {
316
+ font-size: 20px; color: var(--g400);
317
+ transition: transform .25s;
318
+ }
319
+ .module-expand.open { transform: rotate(180deg); }
320
+
321
+ .module-name {
322
+ font-size: 14px; font-weight: 600; color: var(--g900);
323
+ }
324
+
325
+ .module-id {
326
+ font-size: 10px;
327
+ font-family: "DM Mono", "SF Mono", Menlo, monospace;
328
+ background: var(--blue-50);
329
+ color: var(--blue-600);
330
+ padding: 2px 8px;
331
+ border-radius: 4px;
332
+ font-weight: 500;
333
+ }
334
+
335
+ .module-count {
336
+ font-size: 12px; color: var(--g500);
337
+ }
338
+
339
+ /* ── Module Drawer ── */
340
+
341
+ .module-drawer {
342
+ background: var(--surface);
343
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
344
+ overflow: hidden;
345
+ max-height: 0;
346
+ transition: max-height .35s ease;
347
+ }
348
+
349
+ .module-drawer.open { max-height: 10000px; }
350
+
351
+ /* ── Task Chain (timeline) ── */
352
+
353
+ .task-chain {
354
+ position: relative;
355
+ padding: 12px 20px 4px;
356
+ }
357
+
358
+ .task-chain::before {
359
+ content: "";
360
+ position: absolute;
361
+ left: 31px;
362
+ top: 12px;
363
+ bottom: 4px;
364
+ width: 2px;
365
+ background: var(--g200);
366
+ border-radius: 1px;
367
+ }
368
+
369
+ .chain-node {
370
+ display: flex;
371
+ align-items: center;
372
+ gap: 10px;
373
+ padding: 6px 0;
374
+ position: relative;
375
+ }
376
+
377
+ .chain-dot {
378
+ width: 10px; height: 10px;
379
+ border-radius: 50%;
380
+ background: var(--g300);
381
+ border: 2px solid var(--surface);
382
+ z-index: 1;
383
+ flex-shrink: 0;
384
+ }
385
+
386
+ .chain-dot.running { background: var(--blue-500); animation: pulse-ring 1.5s infinite; }
387
+ .chain-dot.completed { background: var(--green-500); }
388
+ .chain-dot.failed { background: var(--red-500); }
389
+
390
+ @keyframes pulse-ring {
391
+ 0%,100% { box-shadow: 0 0 0 0 rgba(3,169,244,.4); }
392
+ 50% { box-shadow: 0 0 0 5px rgba(3,169,244,0); }
393
+ }
394
+
395
+ .chain-title {
396
+ font-size: 12px; font-weight: 500; color: var(--g700);
397
+ }
398
+
399
+ .chain-arrow {
400
+ color: var(--g400);
401
+ font-size: 14px;
402
+ margin-left: -3px;
403
+ }
404
+
405
+ .chain-link {
406
+ display: flex;
407
+ align-items: center;
408
+ gap: 6px;
409
+ padding: 2px 0;
410
+ position: relative;
411
+ }
412
+
413
+ .chain-link-label {
414
+ font-size: 10px;
415
+ color: var(--g500);
416
+ background: var(--g100);
417
+ padding: 1px 8px;
418
+ border-radius: 8px;
419
+ }
420
+
421
+ .cross-badge {
422
+ display: inline-flex;
423
+ align-items: center;
424
+ font-size: 10px;
425
+ padding: 1px 8px;
426
+ border-radius: 8px;
427
+ margin-left: 6px;
428
+ white-space: nowrap;
429
+ max-width: 220px;
430
+ overflow: hidden;
431
+ text-overflow: ellipsis;
432
+ }
433
+
434
+ .cross-badge.based-on {
435
+ background: var(--blue-50);
436
+ color: var(--blue-600);
437
+ border: 1px solid var(--blue-200);
438
+ }
439
+
440
+ .cross-badge.used-by {
441
+ background: var(--amber-50);
442
+ color: var(--amber-600);
443
+ border: 1px solid var(--amber-100);
444
+ }
445
+
446
+ .cross-badge.traces-to {
447
+ background: var(--red-50);
448
+ color: var(--red-600);
449
+ border: 1px solid var(--red-200);
450
+ }
451
+
452
+ /* ── Task Card (shared) ── */
453
+
454
+ .task-card {
455
+ border-top: 1px solid var(--g100);
456
+ padding: 0;
457
+ transition: background .15s;
458
+ }
459
+
460
+ .task-card:hover { background: var(--surface-dim); }
461
+
462
+ .task-header {
463
+ padding: 14px 20px;
464
+ display: flex;
465
+ align-items: center;
466
+ justify-content: space-between;
467
+ cursor: pointer;
468
+ }
469
+
470
+ .task-title {
471
+ font-size: 13px; font-weight: 600; color: var(--g900);
472
+ }
473
+
474
+ .task-meta {
475
+ font-size: 11px; color: var(--g500);
476
+ margin-top: 3px;
477
+ display: flex; align-items: center; gap: 6px;
478
+ }
479
+
480
+ .task-right {
481
+ display: flex; align-items: center; gap: 10px;
482
+ }
483
+
484
+ /* ── Phase Chips ── */
485
+
486
+ .phases-row {
487
+ padding: 8px 20px 12px;
488
+ display: flex; flex-wrap: wrap; gap: 6px;
489
+ }
490
+
491
+ .phase-chip {
492
+ display: inline-flex; align-items: center;
493
+ padding: 3px 10px;
494
+ border-radius: 14px;
495
+ font-size: 11px; font-weight: 500;
496
+ white-space: nowrap;
497
+ transition: transform .12s;
498
+ }
499
+
500
+ .phase-chip:hover { transform: scale(1.04); }
501
+ .phase-chip .material-icons { font-size: 12px; margin-right: 3px; }
502
+
503
+ .phase-chip.pending { background: var(--g200); color: var(--g600); }
504
+ .phase-chip.running { background: var(--blue-50); color: var(--blue-600); border: 1px solid var(--blue-200); }
505
+ .phase-chip.completed { background: var(--green-100); color: var(--green-700); }
506
+ .phase-chip.failed { background: var(--red-100); color: var(--red-600); }
507
+
508
+ /* ── Status Badge ── */
509
+
510
+ .status-badge {
511
+ font-size: 11px;
512
+ padding: 3px 12px;
513
+ border-radius: 12px;
514
+ font-weight: 600;
515
+ letter-spacing: .2px;
516
+ }
517
+ .status-badge.running { background: var(--blue-50); color: var(--blue-600); }
518
+ .status-badge.completed { background: var(--green-100); color: var(--green-700); }
519
+ .status-badge.failed { background: var(--red-100); color: var(--red-600); }
520
+ .status-badge.resolved { background: var(--green-100); color: var(--green-700); }
521
+ .status-badge.unresolved { background: var(--red-100); color: var(--red-600); }
522
+
523
+ /* ── Progress Bar ── */
524
+
525
+ .progress-bar-wrap {
526
+ margin: 0 20px;
527
+ height: 3px; background: var(--g200);
528
+ border-radius: 2px;
529
+ }
530
+
531
+ .progress-bar {
532
+ height: 100%;
533
+ border-radius: 2px;
534
+ transition: width .5s ease;
535
+ }
536
+
537
+ .progress-bar.blue { background: linear-gradient(90deg, var(--blue-400), var(--blue-600)); }
538
+ .progress-bar.amber { background: linear-gradient(90deg, var(--amber-400), var(--amber-600)); }
539
+ .progress-bar.red { background: linear-gradient(90deg, var(--red-400), var(--red-600)); }
540
+
541
+ .progress-bar.failed { background: linear-gradient(90deg, var(--red-400), var(--red-600)); }
542
+
543
+ /* ── Task Footer ── */
544
+
545
+ .task-footer {
546
+ padding: 6px 20px 12px;
547
+ font-size: 11px; color: var(--g500);
548
+ display: flex; gap: 14px; align-items: center;
549
+ }
550
+
551
+ .log-toggle {
552
+ color: var(--blue-500);
553
+ cursor: pointer; font-weight: 500;
554
+ text-decoration: none;
555
+ margin-left: auto;
556
+ }
557
+ .log-toggle:hover { text-decoration: underline; }
558
+
559
+ /* ── Doc-gen Artifact Tags ── */
560
+
561
+ .artifact-tags {
562
+ padding: 0 20px 10px;
563
+ display: flex; flex-wrap: wrap; gap: 6px;
564
+ }
565
+
566
+ .artifact-tag {
567
+ display: inline-flex; align-items: center; gap: 4px;
568
+ font-size: 11px;
569
+ padding: 3px 10px;
570
+ border-radius: var(--radius-sm);
571
+ background: var(--amber-50);
572
+ color: var(--amber-700);
573
+ border: 1px solid var(--amber-100);
574
+ }
575
+
576
+ .artifact-tag .material-icons { font-size: 14px; }
577
+
578
+ /* ── Bug Card ── */
579
+
580
+ .bug-card {
581
+ border-top: 1px solid var(--g100);
582
+ padding: 14px 20px;
583
+ transition: background .15s;
584
+ }
585
+
586
+ .bug-card:hover { background: var(--surface-dim); }
587
+
588
+ .bug-header {
589
+ display: flex; align-items: flex-start; gap: 12px;
590
+ }
591
+
592
+ .bug-status-icon {
593
+ font-size: 20px; margin-top: 1px;
594
+ color: var(--red-500);
595
+ }
596
+ .bug-status-icon.resolved { color: var(--green-500); }
597
+
598
+ .bug-info { flex: 1; min-width: 0; }
599
+
600
+ .bug-title {
601
+ font-size: 13px; font-weight: 600; color: var(--g900);
602
+ }
603
+
604
+ .bug-desc {
605
+ font-size: 12px; color: var(--g600);
606
+ margin-top: 4px;
607
+ line-height: 1.5;
608
+ }
609
+
610
+ .bug-source {
611
+ font-size: 11px; color: var(--g500);
612
+ margin-top: 6px;
613
+ display: flex; flex-wrap: wrap; gap: 8px;
614
+ }
615
+
616
+ .bug-source-tag {
617
+ display: inline-flex; align-items: center; gap: 3px;
618
+ background: var(--red-50);
619
+ color: var(--red-600);
620
+ padding: 2px 8px;
621
+ border-radius: 4px;
622
+ font-family: "DM Mono", "SF Mono", monospace;
623
+ font-size: 10px;
624
+ }
625
+
626
+ .bug-footer {
627
+ margin-top: 8px;
628
+ font-size: 11px; color: var(--g500);
629
+ display: flex; gap: 14px;
630
+ }
631
+
632
+ /* ── Context Menu ── */
633
+
634
+ .ctx-menu {
635
+ position: fixed;
636
+ z-index: 2000;
637
+ background: var(--surface);
638
+ border-radius: var(--radius-md);
639
+ box-shadow: 0 8px 30px rgba(0,0,0,.18);
640
+ padding: 6px 0;
641
+ min-width: 180px;
642
+ border: 1px solid var(--g200);
643
+ }
644
+
645
+ .ctx-menu.hidden { display: none; }
646
+
647
+ .ctx-sep {
648
+ height: 1px;
649
+ background: var(--g100);
650
+ margin: 4px 0;
651
+ }
652
+
653
+ .ctx-item {
654
+ display: flex; align-items: center; gap: 10px;
655
+ padding: 9px 16px;
656
+ font-size: 13px;
657
+ color: var(--g800);
658
+ cursor: pointer;
659
+ transition: background .12s;
660
+ }
661
+
662
+ .ctx-item:hover {
663
+ background: var(--blue-50);
664
+ color: var(--blue-700);
665
+ }
666
+
667
+ .ctx-item.danger { color: var(--red-600); }
668
+ .ctx-item.danger:hover { background: var(--red-50); color: var(--red-700); }
669
+
670
+ .ctx-item .material-icons {
671
+ font-size: 18px; color: var(--g500);
672
+ }
673
+
674
+ .ctx-item:hover .material-icons { color: var(--blue-500); }
675
+ .ctx-item.danger:hover .material-icons { color: var(--red-500); }
676
+
677
+ /* ── Modal ── */
678
+
679
+ .modal-overlay {
680
+ position: fixed; inset: 0;
681
+ z-index: 3000;
682
+ background: rgba(0,0,0,.35);
683
+ display: flex; align-items: center; justify-content: center;
684
+ backdrop-filter: blur(3px);
685
+ animation: modalIn .2s ease;
686
+ }
687
+
688
+ .modal-overlay.hidden { display: none; }
689
+
690
+ @keyframes modalIn {
691
+ from { opacity: 0; }
692
+ to { opacity: 1; }
693
+ }
694
+
695
+ .modal-box {
696
+ background: var(--surface);
697
+ border-radius: var(--radius-lg);
698
+ box-shadow: 0 16px 48px rgba(0,0,0,.22);
699
+ width: 90%; max-width: 520px;
700
+ max-height: 80vh;
701
+ display: flex; flex-direction: column;
702
+ animation: modalBoxIn .25s ease;
703
+ }
704
+
705
+ .modal-box.wide { max-width: 800px; }
706
+
707
+ @keyframes modalBoxIn {
708
+ from { opacity: 0; transform: translateY(12px) scale(.97); }
709
+ to { opacity: 1; transform: translateY(0) scale(1); }
710
+ }
711
+
712
+ .modal-head {
713
+ display: flex; align-items: center; justify-content: space-between;
714
+ padding: 16px 20px;
715
+ border-bottom: 1px solid var(--g100);
716
+ }
717
+
718
+ .modal-title {
719
+ font-size: 14px; font-weight: 600; color: var(--g900);
720
+ }
721
+
722
+ .modal-close {
723
+ cursor: pointer; color: var(--g400);
724
+ font-size: 20px;
725
+ border-radius: 50%;
726
+ padding: 2px;
727
+ transition: all .15s;
728
+ }
729
+
730
+ .modal-close:hover {
731
+ background: var(--g100);
732
+ color: var(--g800);
733
+ }
734
+
735
+ .modal-body {
736
+ padding: 20px;
737
+ overflow-y: auto;
738
+ flex: 1;
739
+ }
740
+
741
+ /* ── Markdown Log Content ── */
742
+
743
+ .log-md-content {
744
+ font-size: 13px;
745
+ line-height: 1.8;
746
+ color: var(--g800);
747
+ }
748
+
749
+ .log-md-content hr {
750
+ border: none;
751
+ border-top: 1px solid var(--blue-200);
752
+ margin: 20px 0;
753
+ }
754
+
755
+ .log-md-content h2 {
756
+ font-size: 16px; font-weight: 700;
757
+ color: var(--blue-600);
758
+ margin: 24px 0 12px;
759
+ padding-bottom: 6px;
760
+ border-bottom: 2px solid var(--blue-100);
761
+ }
762
+
763
+ .log-md-content h3 {
764
+ font-size: 14px; font-weight: 600;
765
+ color: var(--g900);
766
+ margin: 16px 0 8px;
767
+ }
768
+
769
+ .log-md-content h4 {
770
+ font-size: 13px; font-weight: 600;
771
+ color: var(--g700);
772
+ margin: 12px 0 6px;
773
+ }
774
+
775
+ .log-md-content p { margin: 6px 0; color: var(--g700); }
776
+
777
+ .log-md-content ul, .log-md-content ol {
778
+ margin: 6px 0; padding-left: 20px;
779
+ }
780
+
781
+ .log-md-content li { margin: 4px 0; color: var(--g700); }
782
+
783
+ .log-md-content code {
784
+ font-family: "DM Mono", "SF Mono", Menlo, monospace;
785
+ font-size: 12px;
786
+ background: var(--blue-50); color: var(--blue-600);
787
+ padding: 2px 6px; border-radius: 4px;
788
+ }
789
+
790
+ .log-md-content pre {
791
+ background: #1e1e2e; color: #cdd6f4;
792
+ padding: 14px; border-radius: var(--radius-md);
793
+ overflow-x: auto;
794
+ font-size: 12px; line-height: 1.6;
795
+ margin: 10px 0;
796
+ }
797
+
798
+ .log-md-content pre code {
799
+ background: none; color: inherit; padding: 0;
800
+ }
801
+
802
+ .log-md-content table {
803
+ width: 100%; border-collapse: collapse;
804
+ margin: 10px 0; font-size: 12px;
805
+ }
806
+
807
+ .log-md-content th {
808
+ background: var(--blue-50); color: var(--blue-600);
809
+ font-weight: 600; padding: 8px 12px;
810
+ text-align: left; border-bottom: 2px solid var(--blue-100);
811
+ }
812
+
813
+ .log-md-content td {
814
+ padding: 8px 12px;
815
+ border-bottom: 1px solid var(--g200);
816
+ color: var(--g700);
817
+ }
818
+
819
+ .log-md-content blockquote {
820
+ margin: 8px 0; padding: 8px 16px;
821
+ border-left: 3px solid var(--blue-300);
822
+ background: var(--blue-50);
823
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
824
+ color: var(--g700);
825
+ }
826
+
827
+ .log-md-content strong { color: var(--g900); }
828
+
829
+ /* ── Diff Viewer ── */
830
+
831
+ .diff-viewer {
832
+ font-family: "DM Mono", "SF Mono", monospace;
833
+ font-size: 12px; line-height: 1.6;
834
+ background: var(--g50);
835
+ border-radius: var(--radius-md);
836
+ padding: 12px;
837
+ overflow-x: auto;
838
+ white-space: pre;
839
+ }
840
+
841
+ .diff-line { padding: 0 8px; }
842
+ .diff-header { font-weight: 700; color: var(--g700); }
843
+ .diff-hunk { color: var(--blue-600); background: var(--blue-50); border-radius: 3px; }
844
+ .diff-add { background: rgba(76,175,80,.12); color: #2e7d32; }
845
+ .diff-del { background: rgba(239,83,80,.10); color: #c62828; }
846
+
847
+ /* ── File Viewer ── */
848
+
849
+ .file-header {
850
+ font-family: "DM Mono", "SF Mono", monospace;
851
+ font-size: 12px;
852
+ padding: 10px 14px;
853
+ background: var(--g800);
854
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
855
+ color: var(--g200);
856
+ font-weight: 600;
857
+ display: flex; align-items: center; gap: 10px;
858
+ }
859
+
860
+ .code-lang {
861
+ font-size: 10px;
862
+ padding: 2px 8px; border-radius: 4px;
863
+ background: var(--blue-600); color: #fff;
864
+ font-weight: 500;
865
+ }
866
+
867
+ .code-viewer {
868
+ font-family: "DM Mono", "SF Mono", monospace;
869
+ font-size: 12px; line-height: 1.7;
870
+ background: #1e1e2e;
871
+ border-radius: 0 0 var(--radius-md) var(--radius-md);
872
+ overflow-x: auto;
873
+ padding: 12px 0;
874
+ max-height: 500px;
875
+ }
876
+
877
+ .code-line {
878
+ padding: 0 14px; white-space: pre;
879
+ color: #cdd6f4;
880
+ }
881
+
882
+ .code-line:hover { background: rgba(255,255,255,.05); }
883
+
884
+ .code-line-no {
885
+ display: inline-block; width: 50px;
886
+ color: #585b70; text-align: right;
887
+ margin-right: 16px; user-select: none;
888
+ }
889
+
890
+ /* ── Snapshot ── */
891
+
892
+ .snap-file-item {
893
+ display: flex; align-items: center; gap: 10px;
894
+ padding: 10px 14px;
895
+ background: var(--g50);
896
+ border-radius: var(--radius-sm);
897
+ cursor: pointer;
898
+ font-size: 12px; color: var(--g800);
899
+ font-family: "DM Mono", "SF Mono", monospace;
900
+ transition: all .15s;
901
+ border: 1px solid transparent;
902
+ }
903
+
904
+ .snap-file-item:hover {
905
+ background: var(--blue-50);
906
+ border-color: var(--blue-200);
907
+ }
908
+
909
+ .snap-file-item .material-icons {
910
+ font-size: 16px; color: var(--blue-400);
911
+ }
912
+
913
+ /* ── Image Gallery ── */
914
+
915
+ .image-grid {
916
+ display: grid;
917
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
918
+ gap: 12px;
919
+ }
920
+
921
+ .image-thumb {
922
+ position: relative;
923
+ border-radius: var(--radius-md);
924
+ overflow: hidden;
925
+ cursor: pointer;
926
+ border: 1px solid var(--g200);
927
+ transition: all .2s;
928
+ aspect-ratio: 4/3;
929
+ background: var(--g100);
930
+ }
931
+
932
+ .image-thumb:hover {
933
+ border-color: var(--amber-400);
934
+ box-shadow: 0 4px 12px rgba(255,152,0,.15);
935
+ transform: translateY(-2px);
936
+ }
937
+
938
+ .image-thumb img {
939
+ width: 100%; height: 100%;
940
+ object-fit: cover;
941
+ }
942
+
943
+ .image-name {
944
+ position: absolute;
945
+ bottom: 0; left: 0; right: 0;
946
+ background: linear-gradient(transparent, rgba(0,0,0,.7));
947
+ color: #fff;
948
+ font-size: 10px;
949
+ padding: 16px 8px 6px;
950
+ white-space: nowrap;
951
+ overflow: hidden;
952
+ text-overflow: ellipsis;
953
+ }
954
+
955
+ /* ── Lightbox ── */
956
+
957
+ .lightbox-wrap {
958
+ position: relative;
959
+ max-width: 90vw;
960
+ max-height: 90vh;
961
+ display: flex;
962
+ flex-direction: column;
963
+ align-items: center;
964
+ }
965
+
966
+ .lightbox-close {
967
+ position: absolute;
968
+ top: -36px; right: 0;
969
+ color: #fff; cursor: pointer;
970
+ font-size: 28px;
971
+ transition: transform .15s;
972
+ }
973
+
974
+ .lightbox-close:hover { transform: scale(1.1); }
975
+
976
+ .lightbox-wrap img {
977
+ max-width: 90vw;
978
+ max-height: 80vh;
979
+ object-fit: contain;
980
+ border-radius: var(--radius-md);
981
+ box-shadow: 0 8px 30px rgba(0,0,0,.4);
982
+ }
983
+
984
+ .lightbox-name {
985
+ margin-top: 12px;
986
+ font-size: 12px; color: rgba(255,255,255,.6);
987
+ font-family: "DM Mono", "SF Mono", monospace;
988
+ }
989
+
990
+ /* ── Inline Detail ── */
991
+
992
+ .task-detail-content {
993
+ padding: 0 20px 16px;
994
+ }
995
+
996
+ .task-detail-content.hidden { display: none; }
997
+
998
+ /* ── No Data ── */
999
+
1000
+ .no-data {
1001
+ color: var(--g500);
1002
+ font-size: 14px;
1003
+ text-align: center;
1004
+ padding: 24px;
1005
+ }
1006
+
1007
+ /* ── Toast ── */
1008
+
1009
+ .toast {
1010
+ position: fixed;
1011
+ bottom: 32px; left: 50%;
1012
+ transform: translateX(-50%);
1013
+ background: var(--g800);
1014
+ color: #fff;
1015
+ padding: 10px 24px;
1016
+ border-radius: var(--radius-md);
1017
+ font-size: 13px;
1018
+ z-index: 9999;
1019
+ box-shadow: 0 6px 20px rgba(0,0,0,.25);
1020
+ transition: opacity .3s;
1021
+ }
1022
+
1023
+ .toast.hidden { opacity: 0; pointer-events: none; }
1024
+
1025
+ /* ── Responsive ── */
1026
+
1027
+ @media (max-width: 768px) {
1028
+ .sidebar { width: 60px; min-width: 60px; }
1029
+ .brand-text, .nav-label, .nav-count, .status-text { display: none; }
1030
+ .sidebar-brand { padding: 16px 12px; justify-content: center; }
1031
+ .nav-item { justify-content: center; padding: 12px; }
1032
+ .panel-header { padding: 16px 20px 12px; }
1033
+ .panel-content { padding: 12px 16px 32px; }
1034
+ }