@unity-china/codely-cli 1.0.0-rc.3 → 1.0.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2860 +0,0 @@
1
- :root {
2
- color-scheme: dark;
3
-
4
- --bg: #0f111a;
5
- --panel: #151a27;
6
- --panel-2: #101521;
7
- --border: rgba(255, 255, 255, 0.08);
8
- --text: rgba(255, 255, 255, 0.92);
9
- --muted: rgba(255, 255, 255, 0.62);
10
- --subtle: rgba(255, 255, 255, 0.12);
11
-
12
- --accent: #7aa2f7;
13
- --accent-2: #bb9af7;
14
- --ok: #9ece6a;
15
- --warn: #e0af68;
16
- --err: #f7768e;
17
-
18
- --shadow: 0 16px 50px rgba(0, 0, 0, 0.45);
19
- --radius: 8px;
20
- --radius-sm: 6px;
21
-
22
- --mono:
23
- ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
24
- 'Courier New', monospace;
25
- --sans:
26
- ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial,
27
- 'Apple Color Emoji', 'Segoe UI Emoji';
28
- }
29
-
30
- * {
31
- box-sizing: border-box;
32
- }
33
-
34
- html,
35
- body {
36
- height: 100%;
37
- }
38
-
39
- #app {
40
- height: 100%;
41
- min-height: 0;
42
- }
43
-
44
- body {
45
- margin: 0;
46
- background:
47
- radial-gradient(1200px 800px at 10% 0%, #1b2140 0%, transparent 60%),
48
- radial-gradient(900px 700px at 90% 10%, #2a1b40 0%, transparent 55%),
49
- var(--bg);
50
- color: var(--text);
51
- font-family: var(--sans);
52
- overflow: hidden;
53
- }
54
-
55
- a {
56
- color: var(--accent);
57
- text-decoration: none;
58
- }
59
- a:hover {
60
- text-decoration: underline;
61
- }
62
-
63
- button,
64
- input,
65
- textarea {
66
- font-family: inherit;
67
- }
68
-
69
- .app {
70
- height: 100%;
71
- display: flex;
72
- padding: 12px;
73
- min-height: 0;
74
- min-width: 0;
75
- position: relative;
76
- overflow: hidden;
77
- }
78
-
79
- .main,
80
- .cp-main {
81
- flex: 1;
82
- background:
83
- linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent),
84
- var(--panel-2);
85
- border: 1px solid var(--border);
86
- border-radius: var(--radius);
87
- box-shadow: var(--shadow);
88
- overflow: hidden;
89
- display: flex;
90
- flex-direction: column;
91
- min-height: 0;
92
- min-width: 0;
93
- position: relative;
94
- }
95
-
96
- .btn {
97
- display: inline-flex;
98
- align-items: center;
99
- justify-content: center;
100
- gap: 8px;
101
- padding: 8px 12px;
102
- border-radius: var(--radius-sm);
103
- border: 1px solid var(--border);
104
- background: rgba(255, 255, 255, 0.03);
105
- color: var(--text);
106
- cursor: pointer;
107
- font-size: 13px;
108
- }
109
- .btn:hover {
110
- background: rgba(255, 255, 255, 0.06);
111
- }
112
- .btn:active {
113
- transform: translateY(1px);
114
- }
115
- .btn.primary {
116
- background: linear-gradient(
117
- 135deg,
118
- rgba(122, 162, 247, 0.2),
119
- rgba(187, 154, 247, 0.16)
120
- );
121
- border-color: rgba(122, 162, 247, 0.35);
122
- }
123
- .btn.danger {
124
- background: rgba(247, 118, 142, 0.12);
125
- border-color: rgba(247, 118, 142, 0.28);
126
- }
127
-
128
- .content {
129
- flex: 1;
130
- overflow-y: auto;
131
- padding: 10px 18px 80px;
132
- min-height: 0;
133
- min-width: 0;
134
- overflow-anchor: auto;
135
- scroll-padding-bottom: 80px;
136
- }
137
-
138
- .content > * {
139
- margin-bottom: 8px;
140
- }
141
-
142
- .content > * {
143
- margin-bottom: 12px;
144
- }
145
-
146
- .session-notice {
147
- position: sticky;
148
- top: 0;
149
- z-index: 4;
150
- padding: 10px 12px;
151
- border: 1px solid rgba(224, 175, 104, 0.3);
152
- border-radius: var(--radius-md);
153
- background: rgba(224, 175, 104, 0.08);
154
- color: var(--warn);
155
- white-space: pre-wrap;
156
- line-height: 1.45;
157
- backdrop-filter: blur(18px);
158
- }
159
-
160
- .user-message {
161
- padding: 4px 0;
162
- color: var(--text);
163
- font-weight: 500;
164
- }
165
-
166
- .assistant-message {
167
- padding: 4px 0;
168
- }
169
-
170
- .md {
171
- font-size: 14px;
172
- line-height: 1.55;
173
- color: var(--text);
174
- }
175
- .md p {
176
- margin: 0 0 10px;
177
- white-space: pre-wrap;
178
- }
179
- .md h1,
180
- .md h2,
181
- .md h3,
182
- .md h4 {
183
- margin: 14px 0 8px;
184
- line-height: 1.25;
185
- }
186
- .md h1 {
187
- font-size: 20px;
188
- }
189
- .md h2 {
190
- font-size: 17px;
191
- }
192
- .md h3 {
193
- font-size: 15px;
194
- }
195
- .md h4 {
196
- font-size: 14px;
197
- color: rgba(255, 255, 255, 0.86);
198
- }
199
- .md ul,
200
- .md ol {
201
- margin: 0 0 10px 18px;
202
- padding: 0;
203
- }
204
- .md li {
205
- margin: 4px 0;
206
- white-space: pre-wrap;
207
- }
208
- .md code.inline {
209
- font-family: var(--mono);
210
- font-size: 13px;
211
- padding: 2px 6px;
212
- border-radius: 8px;
213
- border: 1px solid var(--border);
214
- background: rgba(255, 255, 255, 0.04);
215
- color: rgba(187, 154, 247, 0.95);
216
- }
217
- .md pre {
218
- margin: 10px 0;
219
- padding: 12px;
220
- border-radius: 14px;
221
- border: 1px solid var(--border);
222
- background: rgba(0, 0, 0, 0.3);
223
- overflow: auto;
224
- font-family: var(--mono);
225
- font-size: 13px;
226
- line-height: 1.5;
227
- }
228
- .md pre code {
229
- font-family: var(--mono);
230
- }
231
- .md hr {
232
- border: none;
233
- border-top: 1px solid var(--border);
234
- margin: 14px 0;
235
- }
236
- .md table {
237
- width: 100%;
238
- border-collapse: collapse;
239
- margin: 10px 0;
240
- font-size: 12px;
241
- }
242
- .md th,
243
- .md td {
244
- border: 1px solid var(--border);
245
- padding: 8px 10px;
246
- vertical-align: top;
247
- }
248
- .md th {
249
- background: rgba(255, 255, 255, 0.03);
250
- color: rgba(255, 255, 255, 0.86);
251
- }
252
- .md blockquote {
253
- margin: 10px 0;
254
- padding: 8px 10px;
255
- border-left: 3px solid rgba(122, 162, 247, 0.5);
256
- background: rgba(122, 162, 247, 0.06);
257
- border-radius: 10px;
258
- color: rgba(255, 255, 255, 0.86);
259
- }
260
-
261
- .think {
262
- margin: 12px 0;
263
- }
264
- .think summary {
265
- cursor: pointer;
266
- padding: 4px 0;
267
- color: rgba(255, 255, 255, 0.7);
268
- font-size: 11px;
269
- font-weight: 600;
270
- user-select: none;
271
- opacity: 0.8;
272
- letter-spacing: 0.05em;
273
- }
274
- .think summary:hover {
275
- opacity: 1;
276
- }
277
- .think.active {
278
- margin: 12px 0;
279
- }
280
- .think-body {
281
- margin-top: 6px;
282
- padding: 10px 12px;
283
- border-left: 3px solid rgba(122, 162, 247, 0.55);
284
- background: rgba(122, 162, 247, 0.06);
285
- border-radius: 10px;
286
- }
287
- .think-content,
288
- .think pre {
289
- margin: 0;
290
- padding: 0;
291
- border: none;
292
- background: transparent;
293
- color: rgba(255, 255, 255, 0.86);
294
- font-family: var(--sans);
295
- font-size: 12px;
296
- line-height: 1.45;
297
- white-space: pre-wrap;
298
- word-break: break-all;
299
- }
300
-
301
- .tool-card {
302
- margin: 12px 0;
303
- border-radius: var(--radius);
304
- border: 1px solid var(--border);
305
- background: rgba(255, 255, 255, 0.02);
306
- overflow: hidden;
307
- }
308
-
309
- .tool-compact {
310
- margin: 6px 0;
311
- display: flex;
312
- align-items: center;
313
- gap: 8px;
314
- font-family: var(--mono);
315
- font-size: 12px;
316
- color: rgba(255, 255, 255, 0.78);
317
- opacity: 0.95;
318
- }
319
-
320
- .tool-compact-arrow {
321
- color: rgba(255, 255, 255, 0.55);
322
- }
323
-
324
- .tool-compact-kind {
325
- color: rgba(187, 154, 247, 0.95);
326
- }
327
-
328
- .tool-compact-title {
329
- color: rgba(255, 255, 255, 0.86);
330
- overflow: hidden;
331
- text-overflow: ellipsis;
332
- white-space: nowrap;
333
- flex: 1;
334
- min-width: 0;
335
- }
336
-
337
- .tool-compact-status {
338
- font-family: var(--sans);
339
- font-size: 11px;
340
- color: var(--muted);
341
- }
342
-
343
- .planning-indicator {
344
- font-size: 11px;
345
- color: var(--muted);
346
- margin: 12px 0;
347
- font-style: italic;
348
- background: linear-gradient(90deg, var(--muted), var(--text), var(--muted));
349
- background-size: 200% 100%;
350
- -webkit-background-clip: text;
351
- -webkit-text-fill-color: transparent;
352
- animation: shimmer-text 2s infinite linear;
353
- opacity: 0.6;
354
- }
355
-
356
- @keyframes shimmer-text {
357
- 0% {
358
- background-position: 200% 0;
359
- }
360
- 100% {
361
- background-position: -200% 0;
362
- }
363
- }
364
-
365
- .shimmer {
366
- display: none;
367
- }
368
-
369
- @keyframes shimmer-pulse {
370
- 0% {
371
- background-position: 200% 0;
372
- transform: scale(0.9);
373
- opacity: 0.4;
374
- }
375
- 50% {
376
- transform: scale(1.1);
377
- opacity: 0.8;
378
- }
379
- 100% {
380
- background-position: -200% 0;
381
- transform: scale(0.9);
382
- opacity: 0.4;
383
- }
384
- }
385
- .tool-card-header {
386
- display: flex;
387
- align-items: center;
388
- justify-content: space-between;
389
- gap: 10px;
390
- padding: 6px 10px;
391
- background: rgba(255, 255, 255, 0.03);
392
- border-bottom: 1px solid var(--border);
393
- }
394
- .tool-card-title {
395
- display: flex;
396
- align-items: center;
397
- gap: 10px;
398
- min-width: 0;
399
- }
400
- .tool-kind {
401
- font-family: var(--mono);
402
- font-size: 11px;
403
- padding: 3px 7px;
404
- border-radius: 999px;
405
- border: 1px solid var(--border);
406
- color: var(--muted);
407
- background: rgba(255, 255, 255, 0.03);
408
- }
409
- .tool-status {
410
- font-size: 11px;
411
- color: var(--muted);
412
- }
413
- .tool-card-body {
414
- padding: 10px 12px;
415
- }
416
- .diff {
417
- border-radius: var(--radius-sm);
418
- border: 1px solid var(--border);
419
- background: rgba(0, 0, 0, 0.26);
420
- overflow: auto;
421
- max-height: 420px;
422
- }
423
- .diff pre {
424
- margin: 0;
425
- padding: 10px 12px;
426
- font-family: var(--mono);
427
- font-size: 12px;
428
- line-height: 1.45;
429
- }
430
- .diff .add {
431
- color: rgba(158, 206, 106, 0.95);
432
- }
433
- .diff .del {
434
- color: rgba(247, 118, 142, 0.95);
435
- }
436
- .diff .meta {
437
- color: rgba(122, 162, 247, 0.92);
438
- }
439
- .diff .hunk {
440
- color: rgba(224, 175, 104, 0.95);
441
- }
442
-
443
- .composer {
444
- border-top: 1px solid var(--border);
445
- padding: 12px;
446
- background: var(--panel-2);
447
- position: relative;
448
- z-index: 10;
449
- flex-shrink: 0;
450
- }
451
- .composer-inner {
452
- display: block;
453
- }
454
- .input-wrap {
455
- position: relative;
456
- border: 1px solid var(--border);
457
- border-radius: var(--radius);
458
- background: rgba(255, 255, 255, 0.03);
459
- /* Allow the slash command autocomplete popover to render outside the input. */
460
- overflow: visible;
461
- transition: all 0.2s;
462
- }
463
- .input-wrap:focus-within {
464
- border-color: rgba(122, 162, 247, 0.5);
465
- box-shadow: 0 0 0 4px rgba(122, 162, 247, 0.12);
466
- }
467
- textarea {
468
- width: 100%;
469
- min-height: 44px;
470
- max-height: 180px;
471
- resize: none;
472
- padding: 11px 44px 11px 12px;
473
- border: none;
474
- background: transparent;
475
- color: var(--text);
476
- outline: none;
477
- font-size: 13px;
478
- line-height: 1.45;
479
- display: block;
480
- }
481
-
482
- .composer-references {
483
- display: flex;
484
- flex-wrap: wrap;
485
- gap: 6px;
486
- padding: 8px 12px 0;
487
- background: transparent;
488
- }
489
-
490
- .ref-chip {
491
- display: inline-flex;
492
- align-items: center;
493
- gap: 6px;
494
- padding: 4px 10px;
495
- background: rgba(255, 255, 255, 0.05);
496
- border: 1px solid var(--border);
497
- border-radius: 6px;
498
- font-size: 11px;
499
- font-weight: 500;
500
- color: var(--muted);
501
- max-width: 200px;
502
- }
503
-
504
- .ref-label {
505
- overflow: hidden;
506
- text-overflow: ellipsis;
507
- white-space: nowrap;
508
- }
509
-
510
- .ref-chip.file {
511
- background: rgba(255, 255, 255, 0.08);
512
- }
513
-
514
- .ref-chip.link {
515
- background: rgba(255, 255, 255, 0.08);
516
- }
517
-
518
- .ref-chip.default {
519
- background: rgba(255, 255, 255, 0.04);
520
- }
521
-
522
- .ref-remove {
523
- background: none;
524
- border: none;
525
- color: inherit;
526
- cursor: pointer;
527
- padding: 0;
528
- font-size: 14px;
529
- display: flex;
530
- align-items: center;
531
- justify-content: center;
532
- opacity: 0.5;
533
- width: 14px;
534
- height: 14px;
535
- }
536
-
537
- .ref-remove:hover {
538
- opacity: 1;
539
- }
540
-
541
- .composer-submit {
542
- position: absolute;
543
- right: 8px;
544
- bottom: 8px;
545
- width: 28px;
546
- height: 28px;
547
- border-radius: 6px;
548
- border: none;
549
- background: rgba(255, 255, 255, 0.1);
550
- color: var(--text);
551
- display: flex;
552
- align-items: center;
553
- justify-content: center;
554
- cursor: pointer;
555
- transition: all 0.2s;
556
- z-index: 20;
557
- opacity: 0.8;
558
- }
559
-
560
- .composer-submit:hover {
561
- opacity: 1;
562
- background: rgba(255, 255, 255, 0.15);
563
- }
564
-
565
- .composer-submit:active {
566
- transform: scale(0.92);
567
- }
568
-
569
- .composer-submit.busy {
570
- background: rgba(255, 255, 255, 0.15);
571
- opacity: 1;
572
- color: var(--err);
573
- }
574
-
575
- .composer-submit svg {
576
- display: block;
577
- }
578
- .composer-footer {
579
- display: flex;
580
- align-items: center;
581
- justify-content: space-between;
582
- margin-top: 8px;
583
- gap: 12px;
584
- }
585
-
586
- .composer-footer-right {
587
- display: flex;
588
- align-items: center;
589
- gap: 12px;
590
- }
591
-
592
- .workspace-info {
593
- font-size: 11px;
594
- color: rgba(255, 255, 255, 0.35);
595
- overflow: hidden;
596
- text-overflow: ellipsis;
597
- white-space: nowrap;
598
- max-width: 50%;
599
- }
600
-
601
- .hint {
602
- font-size: 11px;
603
- color: rgba(255, 255, 255, 0.35);
604
- font-weight: normal;
605
- white-space: nowrap;
606
- }
607
-
608
- .status-bar {
609
- display: flex;
610
- align-items: center;
611
- gap: 8px;
612
- cursor: pointer;
613
- padding: 4px 8px;
614
- border-radius: var(--radius-sm);
615
- transition: background 0.2s;
616
- }
617
- .status-bar:hover {
618
- background: rgba(255, 255, 255, 0.04);
619
- }
620
-
621
- .status-text {
622
- font-size: 11px;
623
- color: var(--err);
624
- opacity: 0.9;
625
- }
626
-
627
- .status-dot {
628
- width: 10px;
629
- height: 10px;
630
- border-radius: 50%;
631
- background: var(--subtle);
632
- box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.04);
633
- }
634
- .status-dot.connected {
635
- background: var(--ok);
636
- box-shadow: 0 0 8px rgba(158, 206, 106, 0.4);
637
- }
638
- .status-dot.connecting {
639
- background: var(--warn);
640
- animation: pulse 1.5s infinite ease-in-out;
641
- }
642
- .status-dot.disconnected {
643
- background: var(--err);
644
- box-shadow: 0 0 8px rgba(247, 118, 142, 0.4);
645
- }
646
-
647
- @keyframes pulse {
648
- 0% {
649
- opacity: 0.4;
650
- transform: scale(0.85);
651
- }
652
- 50% {
653
- opacity: 1;
654
- transform: scale(1.05);
655
- }
656
- 100% {
657
- opacity: 0.4;
658
- transform: scale(0.85);
659
- }
660
- }
661
-
662
- .autocomplete {
663
- position: absolute;
664
- left: 0;
665
- right: 0;
666
- bottom: calc(100% + 8px);
667
- z-index: 50;
668
- border: 1px solid var(--border);
669
- background: rgba(20, 24, 35, 0.95);
670
- backdrop-filter: blur(12px);
671
- border-radius: 12px;
672
- overflow: hidden;
673
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
674
- max-height: 320px;
675
- display: flex;
676
- flex-direction: column;
677
- }
678
-
679
- .ac-header {
680
- padding: 8px 12px;
681
- font-size: 11px;
682
- font-weight: 700;
683
- color: var(--muted);
684
- text-transform: uppercase;
685
- letter-spacing: 0.1em;
686
- border-bottom: 1px solid var(--border);
687
- background: rgba(255, 255, 255, 0.02);
688
- }
689
-
690
- .ac-item {
691
- padding: 8px 12px;
692
- display: flex;
693
- flex-direction: column;
694
- gap: 2px;
695
- cursor: pointer;
696
- border-bottom: 1px solid rgba(255, 255, 255, 0.03);
697
- }
698
-
699
- .ac-item:last-child {
700
- border-bottom: none;
701
- }
702
-
703
- .ac-item:hover,
704
- .ac-item.active {
705
- background: rgba(122, 162, 247, 0.12);
706
- }
707
-
708
- .ac-name code {
709
- font-family: var(--mono);
710
- font-size: 13px;
711
- font-weight: 600;
712
- color: var(--accent);
713
- }
714
-
715
- .ac-desc {
716
- font-size: 12px;
717
- color: var(--muted);
718
- overflow: hidden;
719
- text-overflow: ellipsis;
720
- white-space: nowrap;
721
- }
722
-
723
- .ac-item.active .ac-desc {
724
- color: var(--text);
725
- }
726
-
727
- .modal-backdrop {
728
- position: fixed;
729
- inset: 0;
730
- background: rgba(0, 0, 0, 0.55);
731
- display: flex;
732
- align-items: center;
733
- justify-content: center;
734
- padding: 18px;
735
- z-index: 9999;
736
- }
737
- .modal {
738
- width: min(1100px, 96vw);
739
- max-height: 90vh;
740
- overflow: hidden;
741
- border-radius: 18px;
742
- border: 1px solid var(--border);
743
- background: rgba(16, 21, 33, 0.96);
744
- box-shadow: var(--shadow);
745
- display: flex;
746
- flex-direction: column;
747
- }
748
- .modal-header {
749
- padding: 12px 14px;
750
- border-bottom: 1px solid var(--border);
751
- display: flex;
752
- align-items: center;
753
- justify-content: space-between;
754
- gap: 10px;
755
- }
756
- .modal-header h2 {
757
- margin: 0;
758
- font-size: 13px;
759
- font-weight: 650;
760
- }
761
- .modal-body {
762
- display: grid;
763
- grid-template-columns: 1fr 1fr;
764
- gap: 12px;
765
- padding: 12px;
766
- overflow: auto;
767
- }
768
- .modal-pane {
769
- border: 1px solid var(--border);
770
- border-radius: 14px;
771
- overflow: hidden;
772
- background: rgba(0, 0, 0, 0.18);
773
- }
774
- .modal-pane .pane-title {
775
- padding: 10px 12px;
776
- border-bottom: 1px solid var(--border);
777
- font-size: 12px;
778
- color: var(--muted);
779
- }
780
- .modal-pane textarea {
781
- border: none;
782
- border-radius: 0;
783
- background: transparent;
784
- padding: 12px;
785
- min-height: 320px;
786
- max-height: none;
787
- outline: none;
788
- font-family: var(--mono);
789
- font-size: 12px;
790
- }
791
- .modal-footer {
792
- padding: 12px 14px;
793
- border-top: 1px solid var(--border);
794
- display: flex;
795
- justify-content: flex-end;
796
- gap: 10px;
797
- }
798
-
799
- /* Subagent card styles */
800
- .subagent-card {
801
- background: linear-gradient(
802
- 135deg,
803
- rgba(122, 162, 247, 0.04),
804
- rgba(187, 154, 247, 0.03)
805
- );
806
- border-color: rgba(122, 162, 247, 0.2);
807
- }
808
-
809
- .subagent-header {
810
- display: flex;
811
- align-items: center;
812
- justify-content: space-between;
813
- padding: 10px 14px;
814
- background: rgba(122, 162, 247, 0.06);
815
- border-bottom: 1px solid rgba(122, 162, 247, 0.15);
816
- }
817
-
818
- .subagent-header.running {
819
- background: linear-gradient(
820
- 90deg,
821
- rgba(122, 162, 247, 0.08),
822
- rgba(187, 154, 247, 0.08),
823
- rgba(122, 162, 247, 0.08)
824
- );
825
- background-size: 200% 100%;
826
- animation: shimmer-bg 3s infinite linear;
827
- }
828
-
829
- @keyframes shimmer-bg {
830
- 0% {
831
- background-position: 200% 0;
832
- }
833
- 100% {
834
- background-position: -200% 0;
835
- }
836
- }
837
-
838
- .subagent-title {
839
- display: flex;
840
- align-items: center;
841
- gap: 10px;
842
- }
843
-
844
- .subagent-label {
845
- font-family: var(--mono);
846
- font-size: 10px;
847
- text-transform: uppercase;
848
- letter-spacing: 0.08em;
849
- padding: 4px 8px;
850
- border-radius: 999px;
851
- background: linear-gradient(
852
- 135deg,
853
- rgba(122, 162, 247, 0.25),
854
- rgba(187, 154, 247, 0.2)
855
- );
856
- border: 1px solid rgba(122, 162, 247, 0.4);
857
- color: var(--accent);
858
- font-weight: 700;
859
- }
860
-
861
- .subagent-name {
862
- font-size: 13px;
863
- font-weight: 600;
864
- color: var(--text);
865
- }
866
-
867
- .subagent-status-wrap {
868
- display: flex;
869
- align-items: center;
870
- gap: 8px;
871
- }
872
-
873
- .subagent-spinner {
874
- width: 14px;
875
- height: 14px;
876
- border: 2px solid rgba(122, 162, 247, 0.2);
877
- border-top-color: var(--accent);
878
- border-radius: 50%;
879
- animation: spin 1s linear infinite;
880
- }
881
-
882
- @keyframes spin {
883
- to {
884
- transform: rotate(360deg);
885
- }
886
- }
887
-
888
- .subagent-status {
889
- font-size: 11px;
890
- color: var(--muted);
891
- font-weight: 500;
892
- }
893
-
894
- .subagent-task {
895
- padding: 10px 14px;
896
- background: rgba(0, 0, 0, 0.15);
897
- border-bottom: 1px solid var(--border);
898
- }
899
-
900
- .subagent-task-label {
901
- font-size: 10px;
902
- text-transform: uppercase;
903
- letter-spacing: 0.06em;
904
- color: var(--muted);
905
- margin-bottom: 4px;
906
- font-weight: 600;
907
- }
908
-
909
- .subagent-task-text {
910
- font-size: 13px;
911
- line-height: 1.5;
912
- color: var(--text);
913
- white-space: pre-wrap;
914
- word-break: break-word;
915
- }
916
-
917
- .subagent-params {
918
- padding: 8px 14px;
919
- background: rgba(0, 0, 0, 0.1);
920
- border-bottom: 1px solid var(--border);
921
- display: flex;
922
- flex-direction: column;
923
- gap: 4px;
924
- }
925
-
926
- .subagent-param {
927
- font-family: var(--mono);
928
- font-size: 11px;
929
- color: rgba(255, 255, 255, 0.7);
930
- padding: 4px 8px;
931
- background: rgba(255, 255, 255, 0.03);
932
- border-radius: 4px;
933
- border: 1px solid rgba(255, 255, 255, 0.08);
934
- }
935
-
936
- .subagent-result {
937
- padding: 10px 14px;
938
- }
939
-
940
- @media (max-width: 980px) {
941
- .app {
942
- grid-template-columns: 1fr;
943
- }
944
- .sidebar {
945
- display: none;
946
- }
947
- .modal-body {
948
- grid-template-columns: 1fr;
949
- }
950
- }
951
-
952
- /* =============================================
953
- Control Plane — shared base styles
954
- ============================================= */
955
-
956
- .control-plane {
957
- display: flex;
958
- flex-direction: column;
959
- gap: 0;
960
- height: 100%;
961
- min-height: 0;
962
- }
963
-
964
- /* Top header bar */
965
- .cp-header {
966
- display: flex;
967
- align-items: center;
968
- justify-content: space-between;
969
- gap: 12px;
970
- padding: 12px 16px;
971
- border-bottom: 1px solid var(--border);
972
- flex-shrink: 0;
973
- }
974
-
975
- .cp-header h1 {
976
- margin: 0;
977
- font-size: 16px;
978
- }
979
-
980
- .cp-header-actions {
981
- display: flex;
982
- gap: 8px;
983
- }
984
-
985
- .cp-subtitle {
986
- font-size: 13px;
987
- color: var(--muted);
988
- margin-top: 3px;
989
- }
990
-
991
- /* Body area below header — sidebar + main */
992
- .cp-body {
993
- display: flex;
994
- flex: 1;
995
- min-height: 0;
996
- overflow: hidden;
997
- }
998
-
999
- /* =============================================
1000
- PC Sidebar
1001
- ============================================= */
1002
-
1003
- .cp-sidebar {
1004
- width: 260px;
1005
- flex-shrink: 0;
1006
- border-right: 1px solid var(--border);
1007
- display: flex;
1008
- flex-direction: column;
1009
- overflow: hidden;
1010
- background: var(--panel-2);
1011
- }
1012
-
1013
- .cp-sidebar-section-label {
1014
- padding: 10px 12px 6px;
1015
- font-size: 11px;
1016
- font-weight: 700;
1017
- color: var(--muted);
1018
- text-transform: uppercase;
1019
- letter-spacing: 0.08em;
1020
- flex-shrink: 0;
1021
- display: flex;
1022
- align-items: center;
1023
- gap: 6px;
1024
- }
1025
-
1026
- .cp-sidebar-workers-label {
1027
- border-top: 1px solid var(--border);
1028
- }
1029
-
1030
- .cp-sidebar-workers-count {
1031
- background: rgba(255, 255, 255, 0.08);
1032
- border-radius: 999px;
1033
- padding: 1px 7px;
1034
- font-size: 11px;
1035
- font-weight: 600;
1036
- color: var(--muted);
1037
- }
1038
-
1039
- /* Broadcast summary section in sidebar */
1040
- .cp-sidebar-broadcast-section {
1041
- padding: 10px 12px 12px;
1042
- border-bottom: 1px solid var(--border);
1043
- flex-shrink: 0;
1044
- display: flex;
1045
- flex-direction: column;
1046
- gap: 8px;
1047
- }
1048
-
1049
- .cp-sidebar-broadcast-target {
1050
- font-size: 12px;
1051
- color: var(--muted);
1052
- }
1053
-
1054
- .cp-sidebar-broadcast-btn {
1055
- width: 100%;
1056
- justify-content: center;
1057
- }
1058
-
1059
- /* Worker nav list inside sidebar */
1060
- .cp-sidebar-workers {
1061
- flex: 1;
1062
- overflow-y: auto;
1063
- padding: 4px 0 8px;
1064
- }
1065
-
1066
- .cp-sidebar-worker-item {
1067
- display: flex;
1068
- align-items: flex-start;
1069
- gap: 8px;
1070
- padding: 8px 12px;
1071
- cursor: pointer;
1072
- transition: background 0.12s;
1073
- border-left: 2px solid transparent;
1074
- }
1075
-
1076
- .cp-sidebar-worker-item:hover {
1077
- background: rgba(255, 255, 255, 0.04);
1078
- }
1079
-
1080
- .cp-sidebar-worker-item.active {
1081
- background: rgba(122, 162, 247, 0.08);
1082
- border-left-color: var(--accent);
1083
- }
1084
-
1085
- .cp-sidebar-worker-item input[type='checkbox'] {
1086
- width: 14px;
1087
- height: 14px;
1088
- flex-shrink: 0;
1089
- cursor: pointer;
1090
- margin-top: 3px;
1091
- }
1092
-
1093
- .cp-sidebar-worker-info {
1094
- flex: 1;
1095
- min-width: 0;
1096
- display: flex;
1097
- flex-direction: column;
1098
- gap: 2px;
1099
- }
1100
-
1101
- .cp-sidebar-worker-name {
1102
- font-size: 13px;
1103
- font-weight: 500;
1104
- line-height: 1.4;
1105
- word-break: break-word;
1106
- }
1107
-
1108
- .cp-sidebar-worker-url {
1109
- font-family: var(--mono);
1110
- font-size: 11px;
1111
- color: var(--muted);
1112
- word-break: break-all;
1113
- line-height: 1.4;
1114
- }
1115
-
1116
- .cp-sidebar-worker-tags {
1117
- font-size: 11px;
1118
- color: rgba(187, 154, 247, 0.7);
1119
- line-height: 1.4;
1120
- }
1121
-
1122
- .cp-sidebar-worker-status {
1123
- flex-shrink: 0;
1124
- margin-top: 2px;
1125
- }
1126
-
1127
- /* =============================================
1128
- PC Broadcast Modal
1129
- ============================================= */
1130
-
1131
- .cp-broadcast-modal-backdrop {
1132
- position: fixed;
1133
- inset: 0;
1134
- background: rgba(0, 0, 0, 0.6);
1135
- z-index: 300;
1136
- display: flex;
1137
- align-items: center;
1138
- justify-content: center;
1139
- padding: 20px;
1140
- backdrop-filter: blur(3px);
1141
- }
1142
-
1143
- .cp-broadcast-modal {
1144
- width: min(860px, 96vw);
1145
- max-height: 88vh;
1146
- background: rgba(16, 21, 33, 0.98);
1147
- border: 1px solid var(--border);
1148
- border-radius: 16px;
1149
- box-shadow: var(--shadow);
1150
- display: flex;
1151
- flex-direction: column;
1152
- overflow: hidden;
1153
- }
1154
-
1155
- .cp-broadcast-modal-header {
1156
- display: flex;
1157
- align-items: center;
1158
- justify-content: space-between;
1159
- padding: 14px 18px;
1160
- border-bottom: 1px solid var(--border);
1161
- flex-shrink: 0;
1162
- }
1163
-
1164
- .cp-broadcast-modal-title {
1165
- font-size: 15px;
1166
- font-weight: 650;
1167
- }
1168
-
1169
- .cp-broadcast-modal-close {
1170
- background: none;
1171
- border: none;
1172
- color: var(--muted);
1173
- font-size: 16px;
1174
- cursor: pointer;
1175
- padding: 4px 8px;
1176
- border-radius: 6px;
1177
- line-height: 1;
1178
- }
1179
-
1180
- .cp-broadcast-modal-close:hover {
1181
- background: rgba(255, 255, 255, 0.06);
1182
- color: var(--text);
1183
- }
1184
-
1185
- .cp-broadcast-modal-body {
1186
- display: grid;
1187
- grid-template-columns: 1fr 320px;
1188
- gap: 0;
1189
- flex: 1;
1190
- min-height: 0;
1191
- overflow: hidden;
1192
- }
1193
-
1194
- .cp-broadcast-modal-left {
1195
- display: flex;
1196
- flex-direction: column;
1197
- padding: 14px 18px;
1198
- gap: 10px;
1199
- border-right: 1px solid var(--border);
1200
- min-height: 0;
1201
- }
1202
-
1203
- .cp-broadcast-modal-right {
1204
- display: flex;
1205
- flex-direction: column;
1206
- min-height: 0;
1207
- overflow: hidden;
1208
- }
1209
-
1210
- .cp-broadcast-modal-label {
1211
- font-size: 11px;
1212
- font-weight: 700;
1213
- color: var(--muted);
1214
- text-transform: uppercase;
1215
- letter-spacing: 0.08em;
1216
- display: flex;
1217
- align-items: center;
1218
- justify-content: space-between;
1219
- gap: 8px;
1220
- flex-shrink: 0;
1221
- }
1222
-
1223
- .cp-broadcast-modal-node-actions {
1224
- display: flex;
1225
- gap: 6px;
1226
- }
1227
-
1228
- .cp-broadcast-modal-textarea {
1229
- flex: 1;
1230
- min-height: 160px;
1231
- resize: none;
1232
- border: 1px solid var(--border);
1233
- border-radius: var(--radius-sm);
1234
- background: rgba(255, 255, 255, 0.03);
1235
- color: var(--text);
1236
- padding: 10px 12px;
1237
- font-size: 14px;
1238
- line-height: 1.5;
1239
- }
1240
-
1241
- .cp-broadcast-modal-textarea:focus {
1242
- outline: none;
1243
- border-color: rgba(122, 162, 247, 0.5);
1244
- box-shadow: 0 0 0 3px rgba(122, 162, 247, 0.1);
1245
- }
1246
-
1247
- .cp-broadcast-modal-footer {
1248
- display: flex;
1249
- align-items: center;
1250
- justify-content: space-between;
1251
- gap: 10px;
1252
- flex-shrink: 0;
1253
- }
1254
-
1255
- .cp-broadcast-modal-target {
1256
- font-size: 12px;
1257
- color: var(--muted);
1258
- }
1259
-
1260
- .cp-broadcast-modal-node-list {
1261
- flex: 1;
1262
- overflow-y: auto;
1263
- padding: 8px 0;
1264
- }
1265
-
1266
- .cp-broadcast-modal-node-item {
1267
- display: flex;
1268
- align-items: flex-start;
1269
- gap: 10px;
1270
- padding: 8px 16px;
1271
- cursor: pointer;
1272
- transition: background 0.1s;
1273
- }
1274
-
1275
- .cp-broadcast-modal-node-item:hover {
1276
- background: rgba(255, 255, 255, 0.04);
1277
- }
1278
-
1279
- .cp-broadcast-modal-node-item input[type='checkbox'] {
1280
- width: 15px;
1281
- height: 15px;
1282
- flex-shrink: 0;
1283
- cursor: pointer;
1284
- margin-top: 2px;
1285
- }
1286
-
1287
- .cp-broadcast-modal-node-info {
1288
- display: flex;
1289
- flex-direction: column;
1290
- gap: 2px;
1291
- min-width: 0;
1292
- }
1293
-
1294
- .cp-broadcast-modal-node-name {
1295
- font-size: 13px;
1296
- font-weight: 500;
1297
- line-height: 1.4;
1298
- word-break: break-word;
1299
- }
1300
-
1301
- .cp-broadcast-modal-node-url {
1302
- font-family: var(--mono);
1303
- font-size: 11px;
1304
- color: var(--muted);
1305
- word-break: break-all;
1306
- }
1307
-
1308
- .cp-broadcast-modal-node-tags {
1309
- font-size: 11px;
1310
- color: rgba(187, 154, 247, 0.7);
1311
- }
1312
-
1313
- /* =============================================
1314
- PC Main area — worker grid
1315
- ============================================= */
1316
-
1317
- .cp-main {
1318
- flex: 1;
1319
- min-width: 0;
1320
- display: flex;
1321
- flex-direction: column;
1322
- overflow: hidden;
1323
- }
1324
-
1325
- .cp-workers {
1326
- flex: 1;
1327
- overflow: auto;
1328
- display: flex;
1329
- flex-direction: column;
1330
- }
1331
-
1332
- .cp-workers-header {
1333
- padding: 12px 16px 0;
1334
- font-size: 11px;
1335
- color: var(--muted);
1336
- text-transform: uppercase;
1337
- letter-spacing: 0.08em;
1338
- flex-shrink: 0;
1339
- display: flex;
1340
- align-items: center;
1341
- justify-content: space-between;
1342
- }
1343
-
1344
- .cp-workers-header .btn {
1345
- text-transform: none;
1346
- letter-spacing: normal;
1347
- font-size: 11px;
1348
- padding: 2px 8px;
1349
- }
1350
-
1351
- .cp-worker-grid {
1352
- display: grid;
1353
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1354
- gap: 12px;
1355
- padding: 12px 16px 16px;
1356
- align-content: start;
1357
- }
1358
-
1359
- /* =============================================
1360
- Worker task cards
1361
- ============================================= */
1362
-
1363
- .cp-task-card {
1364
- border: 2px solid var(--border);
1365
- border-radius: var(--radius);
1366
- background: rgba(255, 255, 255, 0.02);
1367
- overflow: hidden;
1368
- display: flex;
1369
- flex-direction: column;
1370
- cursor: pointer;
1371
- transition: border-color 0.15s ease;
1372
- max-height: 30vh;
1373
- min-height: 180px;
1374
- }
1375
-
1376
- .cp-task-card:hover {
1377
- border-color: rgba(255, 255, 255, 0.2);
1378
- }
1379
-
1380
- .cp-task-card.selected {
1381
- border-color: var(--ok);
1382
- }
1383
-
1384
- .cp-task-card.error {
1385
- border-color: var(--err);
1386
- }
1387
-
1388
- .cp-task-card.selected.error {
1389
- border-color: var(--err);
1390
- }
1391
-
1392
- .cp-task-header {
1393
- display: flex;
1394
- flex-direction: column;
1395
- gap: 6px;
1396
- padding: 8px 10px;
1397
- border-bottom: 1px solid var(--border);
1398
- flex-shrink: 0;
1399
- }
1400
-
1401
- .cp-task-header-top {
1402
- display: flex;
1403
- align-items: flex-start;
1404
- justify-content: space-between;
1405
- gap: 8px;
1406
- }
1407
-
1408
- .cp-task-header-left {
1409
- display: flex;
1410
- align-items: flex-start;
1411
- gap: 8px;
1412
- min-width: 0;
1413
- flex: 1;
1414
- }
1415
-
1416
- .cp-task-header-info {
1417
- min-width: 0;
1418
- flex: 1;
1419
- display: flex;
1420
- flex-direction: column;
1421
- gap: 2px;
1422
- /* Keep title + URL as two explicit lines; do not clip the link row away */
1423
- overflow: visible;
1424
- }
1425
-
1426
- .cp-task-name {
1427
- font-weight: 600;
1428
- font-size: 13px;
1429
- line-height: 1.35;
1430
- /* Line 1: title only; URL is always the next sibling on line 2 */
1431
- overflow: hidden;
1432
- text-overflow: ellipsis;
1433
- white-space: nowrap;
1434
- }
1435
-
1436
- .cp-task-url {
1437
- font-size: 11px;
1438
- color: var(--muted);
1439
- display: block;
1440
- line-height: 1.35;
1441
- word-break: break-all;
1442
- /* Second line dedicated to link; wrap instead of single-line ellipsis */
1443
- overflow-wrap: anywhere;
1444
- }
1445
-
1446
- .cp-task-meta {
1447
- display: flex;
1448
- flex-direction: row;
1449
- align-items: center;
1450
- gap: 6px;
1451
- font-size: 11px;
1452
- color: var(--muted);
1453
- flex-shrink: 0;
1454
- margin-left: auto;
1455
- }
1456
-
1457
- .cp-conn {
1458
- padding: 2px 6px;
1459
- border-radius: 6px;
1460
- border: 1px solid var(--border);
1461
- font-size: 10px;
1462
- color: var(--muted);
1463
- text-transform: uppercase;
1464
- }
1465
-
1466
- .cp-conn.connected {
1467
- color: var(--ok);
1468
- border-color: rgba(158, 206, 106, 0.4);
1469
- }
1470
-
1471
- .cp-conn.disconnected {
1472
- color: var(--err);
1473
- border-color: rgba(247, 118, 142, 0.4);
1474
- }
1475
-
1476
- .cp-queue,
1477
- .cp-activity {
1478
- font-size: 11px;
1479
- }
1480
-
1481
- /* One row: Cancel / Refresh / Retry + idle activity timestamp */
1482
- .cp-task-actions-row {
1483
- display: flex;
1484
- flex-direction: row;
1485
- flex-wrap: wrap;
1486
- align-items: center;
1487
- gap: 8px;
1488
- }
1489
-
1490
- .cp-task-actions {
1491
- display: flex;
1492
- flex-direction: row;
1493
- gap: 6px;
1494
- flex-shrink: 0;
1495
- flex-wrap: wrap;
1496
- }
1497
-
1498
- .cp-task-actions-time {
1499
- flex-shrink: 0;
1500
- }
1501
-
1502
- .cp-task-actions .btn {
1503
- padding: 2px 8px;
1504
- font-size: 11px;
1505
- }
1506
-
1507
- .cp-task-error {
1508
- padding: 6px 12px;
1509
- font-size: 12px;
1510
- color: var(--err);
1511
- border-bottom: 1px solid var(--border);
1512
- flex-shrink: 0;
1513
- }
1514
-
1515
- .cp-task-notice {
1516
- padding: 6px 12px;
1517
- font-size: 12px;
1518
- color: var(--warn);
1519
- border-bottom: 1px solid var(--border);
1520
- background: rgba(224, 175, 104, 0.06);
1521
- white-space: pre-wrap;
1522
- flex-shrink: 0;
1523
- }
1524
-
1525
- .cp-task-body {
1526
- padding: 10px 12px;
1527
- overflow: auto;
1528
- flex: 1;
1529
- min-height: 60px;
1530
- }
1531
-
1532
- .cp-task-message,
1533
- .cp-task-tool {
1534
- margin-bottom: 10px;
1535
- }
1536
-
1537
- .cp-task-input {
1538
- display: flex;
1539
- gap: 8px;
1540
- padding: 10px 12px;
1541
- border-top: 1px solid var(--border);
1542
- background: rgba(0, 0, 0, 0.1);
1543
- flex-shrink: 0;
1544
- }
1545
-
1546
- .cp-task-textarea {
1547
- flex: 1;
1548
- min-height: 40px;
1549
- max-height: 80px;
1550
- resize: vertical;
1551
- border: 1px solid var(--border);
1552
- border-radius: var(--radius-sm);
1553
- background: rgba(255, 255, 255, 0.03);
1554
- color: var(--text);
1555
- padding: 8px 10px;
1556
- font-size: 13px;
1557
- line-height: 1.4;
1558
- }
1559
-
1560
- .cp-task-input .btn {
1561
- align-self: flex-end;
1562
- }
1563
-
1564
- /* =============================================
1565
- Endpoint registry Drawer (right side)
1566
- ============================================= */
1567
-
1568
- .cp-drawer {
1569
- position: fixed;
1570
- top: 0;
1571
- right: 0;
1572
- bottom: 0;
1573
- width: 600px;
1574
- max-width: 100%;
1575
- z-index: 100;
1576
- background: var(--panel-2);
1577
- border-left: 1px solid var(--border);
1578
- box-shadow: -4px 0 20px rgba(0, 0, 0, 0.5);
1579
- transform: translateX(100%);
1580
- transition: transform 0.2s ease;
1581
- display: flex;
1582
- flex-direction: column;
1583
- }
1584
-
1585
- .cp-drawer.open {
1586
- transform: translateX(0);
1587
- }
1588
-
1589
- .cp-drawer-backdrop {
1590
- position: fixed;
1591
- inset: 0;
1592
- background: rgba(0, 0, 0, 0.5);
1593
- z-index: 90;
1594
- backdrop-filter: blur(2px);
1595
- }
1596
-
1597
- .cp-drawer-header {
1598
- display: flex;
1599
- align-items: center;
1600
- justify-content: space-between;
1601
- gap: 12px;
1602
- padding: 14px 16px;
1603
- border-bottom: 1px solid var(--border);
1604
- position: sticky;
1605
- top: 0;
1606
- background: var(--panel-2);
1607
- z-index: 10;
1608
- }
1609
-
1610
- .cp-drawer-header h2 {
1611
- margin: 0;
1612
- font-size: 14px;
1613
- }
1614
-
1615
- .cp-drawer-toolbar {
1616
- display: flex;
1617
- flex-direction: column;
1618
- gap: 8px;
1619
- padding: 12px 16px;
1620
- border-bottom: 1px solid var(--border);
1621
- }
1622
-
1623
- .cp-drawer-content {
1624
- flex: 1;
1625
- overflow: auto;
1626
- padding: 12px 16px;
1627
- }
1628
-
1629
- /* =============================================
1630
- Shared form elements
1631
- ============================================= */
1632
-
1633
- .cp-input,
1634
- .cp-select {
1635
- background: rgba(255, 255, 255, 0.03);
1636
- border: 1px solid var(--border);
1637
- color: var(--text);
1638
- border-radius: var(--radius-sm);
1639
- padding: 8px 10px;
1640
- font-size: 13px;
1641
- width: 100%;
1642
- }
1643
-
1644
- .cp-select {
1645
- min-width: 100px;
1646
- }
1647
-
1648
- .cp-content {
1649
- padding: 12px 16px;
1650
- overflow: auto;
1651
- flex: 1;
1652
- }
1653
-
1654
- .cp-list {
1655
- display: flex;
1656
- flex-direction: column;
1657
- gap: 10px;
1658
- }
1659
-
1660
- .cp-row {
1661
- display: flex;
1662
- justify-content: space-between;
1663
- gap: 12px;
1664
- padding: 10px 12px;
1665
- border: 1px solid var(--border);
1666
- border-radius: var(--radius);
1667
- background: rgba(255, 255, 255, 0.03);
1668
- }
1669
-
1670
- .cp-select-box {
1671
- display: flex;
1672
- align-items: flex-start;
1673
- padding-top: 3px;
1674
- }
1675
-
1676
- .cp-select-box input {
1677
- width: 15px;
1678
- height: 15px;
1679
- }
1680
-
1681
- .cp-row-main {
1682
- flex: 1;
1683
- min-width: 0;
1684
- }
1685
-
1686
- .cp-row-title {
1687
- display: flex;
1688
- flex-direction: column;
1689
- gap: 3px;
1690
- }
1691
-
1692
- .cp-name {
1693
- font-weight: 600;
1694
- font-size: 13px;
1695
- }
1696
-
1697
- .cp-url {
1698
- font-family: var(--mono);
1699
- font-size: 11px;
1700
- color: var(--muted);
1701
- word-break: break-all;
1702
- }
1703
-
1704
- .cp-row-meta {
1705
- display: flex;
1706
- align-items: center;
1707
- gap: 10px;
1708
- flex-wrap: wrap;
1709
- margin-top: 6px;
1710
- }
1711
-
1712
- .cp-tags {
1713
- display: flex;
1714
- gap: 6px;
1715
- flex-wrap: wrap;
1716
- }
1717
-
1718
- .cp-tag {
1719
- padding: 2px 6px;
1720
- border: 1px solid var(--border);
1721
- border-radius: 6px;
1722
- font-size: 11px;
1723
- color: var(--muted);
1724
- }
1725
-
1726
- .cp-tag.muted {
1727
- opacity: 0.6;
1728
- }
1729
-
1730
- .cp-actions {
1731
- display: flex;
1732
- gap: 6px;
1733
- align-items: center;
1734
- }
1735
-
1736
- .cp-health {
1737
- font-size: 11px;
1738
- padding: 2px 6px;
1739
- border-radius: 6px;
1740
- border: 1px solid var(--border);
1741
- color: var(--muted);
1742
- }
1743
-
1744
- .cp-health.ok {
1745
- color: var(--ok);
1746
- border-color: rgba(158, 206, 106, 0.4);
1747
- }
1748
-
1749
- .cp-health.err {
1750
- color: var(--err);
1751
- border-color: rgba(247, 118, 142, 0.4);
1752
- }
1753
-
1754
- .cp-health.pending {
1755
- color: var(--muted);
1756
- }
1757
-
1758
- .cp-health-ms {
1759
- margin-left: 6px;
1760
- color: var(--muted);
1761
- font-size: 11px;
1762
- }
1763
-
1764
- .cp-pagination {
1765
- display: flex;
1766
- align-items: center;
1767
- justify-content: space-between;
1768
- gap: 10px;
1769
- padding: 10px 16px;
1770
- border-top: 1px solid var(--border);
1771
- }
1772
-
1773
- .cp-page-info,
1774
- .cp-page-number {
1775
- font-size: 12px;
1776
- color: var(--muted);
1777
- }
1778
-
1779
- .cp-page-controls {
1780
- display: flex;
1781
- align-items: center;
1782
- gap: 8px;
1783
- }
1784
-
1785
- .cp-modal-body {
1786
- display: flex;
1787
- flex-direction: column;
1788
- gap: 10px;
1789
- padding: 12px;
1790
- }
1791
-
1792
- .cp-label {
1793
- display: flex;
1794
- flex-direction: column;
1795
- gap: 6px;
1796
- font-size: 13px;
1797
- color: var(--muted);
1798
- }
1799
-
1800
- .cp-modal-actions {
1801
- display: flex;
1802
- gap: 8px;
1803
- }
1804
-
1805
- .cp-error {
1806
- color: var(--err);
1807
- font-size: 13px;
1808
- margin-top: 6px;
1809
- }
1810
-
1811
- .cp-loading,
1812
- .cp-empty {
1813
- color: var(--muted);
1814
- font-size: 13px;
1815
- padding: 10px 0;
1816
- }
1817
-
1818
- /* =============================================
1819
- Mobile — Worker compact list card
1820
- ============================================= */
1821
-
1822
- .cp-task-card-compact {
1823
- display: flex;
1824
- align-items: center;
1825
- gap: 10px;
1826
- padding: 12px 14px;
1827
- border: 1px solid var(--border);
1828
- border-radius: var(--radius);
1829
- background: rgba(255, 255, 255, 0.02);
1830
- cursor: pointer;
1831
- transition: background 0.12s;
1832
- -webkit-tap-highlight-color: transparent;
1833
- }
1834
-
1835
- .cp-task-card-compact:active {
1836
- background: rgba(255, 255, 255, 0.05);
1837
- }
1838
-
1839
- .cp-task-card-compact.error {
1840
- border-color: rgba(247, 118, 142, 0.35);
1841
- }
1842
-
1843
- .cp-task-card-compact input[type='checkbox'] {
1844
- width: 18px;
1845
- height: 18px;
1846
- flex-shrink: 0;
1847
- cursor: pointer;
1848
- }
1849
-
1850
- .cp-task-card-compact-body {
1851
- flex: 1;
1852
- min-width: 0;
1853
- }
1854
-
1855
- .cp-task-card-compact-top {
1856
- display: flex;
1857
- align-items: center;
1858
- gap: 8px;
1859
- margin-bottom: 4px;
1860
- }
1861
-
1862
- .cp-task-card-compact-name {
1863
- font-size: 14px;
1864
- font-weight: 600;
1865
- flex: 1;
1866
- min-width: 0;
1867
- overflow: hidden;
1868
- text-overflow: ellipsis;
1869
- white-space: nowrap;
1870
- }
1871
-
1872
- .cp-task-card-compact-meta {
1873
- font-size: 11px;
1874
- color: var(--muted);
1875
- display: flex;
1876
- gap: 8px;
1877
- }
1878
-
1879
- .cp-task-card-compact-preview {
1880
- font-size: 12px;
1881
- color: var(--muted);
1882
- overflow: hidden;
1883
- text-overflow: ellipsis;
1884
- white-space: nowrap;
1885
- }
1886
-
1887
- .cp-task-card-compact-chevron {
1888
- color: var(--muted);
1889
- flex-shrink: 0;
1890
- font-size: 16px;
1891
- opacity: 0.5;
1892
- }
1893
-
1894
- /* =============================================
1895
- Mobile — Detail view
1896
- ============================================= */
1897
-
1898
- .cp-mobile-detail {
1899
- display: flex;
1900
- flex-direction: column;
1901
- flex: 1;
1902
- min-height: 0;
1903
- overflow: hidden;
1904
- }
1905
-
1906
- .cp-mobile-header-title {
1907
- font-size: 16px;
1908
- font-weight: 700;
1909
- margin: 0;
1910
- }
1911
-
1912
- .cp-mobile-back-btn {
1913
- display: flex;
1914
- align-items: center;
1915
- gap: 4px;
1916
- background: none;
1917
- border: none;
1918
- color: var(--accent);
1919
- font-size: 15px;
1920
- cursor: pointer;
1921
- padding: 4px 0;
1922
- flex-shrink: 0;
1923
- }
1924
-
1925
- .cp-mobile-detail-title {
1926
- font-size: 15px;
1927
- font-weight: 600;
1928
- overflow: hidden;
1929
- text-overflow: ellipsis;
1930
- white-space: nowrap;
1931
- }
1932
-
1933
- .cp-mobile-detail-feed {
1934
- flex: 1;
1935
- overflow: auto;
1936
- padding: 10px 14px;
1937
- min-height: 0;
1938
- }
1939
-
1940
- .cp-mobile-detail-input {
1941
- display: flex;
1942
- gap: 8px;
1943
- padding: 10px 14px;
1944
- border-top: 1px solid var(--border);
1945
- background: rgba(0, 0, 0, 0.1);
1946
- flex-shrink: 0;
1947
- }
1948
-
1949
- .cp-mobile-detail-textarea {
1950
- flex: 1;
1951
- min-height: 44px;
1952
- max-height: 120px;
1953
- resize: none;
1954
- border: 1px solid var(--border);
1955
- border-radius: var(--radius-sm);
1956
- background: rgba(255, 255, 255, 0.03);
1957
- color: var(--text);
1958
- padding: 10px 12px;
1959
- font-size: 14px;
1960
- line-height: 1.4;
1961
- }
1962
-
1963
- .cp-mobile-detail-send {
1964
- align-self: flex-end;
1965
- min-height: 44px;
1966
- padding: 0 18px;
1967
- }
1968
-
1969
- /* =============================================
1970
- Mobile — Bottom Tab Bar
1971
- ============================================= */
1972
-
1973
- .cp-mobile-tab-bar {
1974
- display: none;
1975
- flex-shrink: 0;
1976
- border-top: 1px solid var(--border);
1977
- background: var(--panel-2);
1978
- padding-bottom: env(safe-area-inset-bottom, 0px);
1979
- }
1980
-
1981
- .cp-mobile-tab {
1982
- flex: 1;
1983
- display: flex;
1984
- flex-direction: column;
1985
- align-items: center;
1986
- justify-content: center;
1987
- gap: 4px;
1988
- padding: 10px 4px;
1989
- background: none;
1990
- border: none;
1991
- color: var(--muted);
1992
- font-size: 11px;
1993
- cursor: pointer;
1994
- position: relative;
1995
- -webkit-tap-highlight-color: transparent;
1996
- transition: color 0.12s;
1997
- }
1998
-
1999
- .cp-mobile-tab.active {
2000
- color: var(--accent);
2001
- }
2002
-
2003
- .cp-mobile-tab svg {
2004
- flex-shrink: 0;
2005
- }
2006
-
2007
- .cp-mobile-tab-broadcast {
2008
- color: var(--muted);
2009
- }
2010
-
2011
- .cp-mobile-tab-badge {
2012
- position: absolute;
2013
- top: 6px;
2014
- right: calc(50% - 18px);
2015
- background: var(--accent);
2016
- color: #0f111a;
2017
- font-size: 10px;
2018
- font-weight: 700;
2019
- border-radius: 999px;
2020
- padding: 1px 5px;
2021
- min-width: 16px;
2022
- text-align: center;
2023
- line-height: 1.4;
2024
- }
2025
-
2026
- /* =============================================
2027
- Mobile — Broadcast tab (inline, full height)
2028
- ============================================= */
2029
-
2030
- .cp-mobile-broadcast-tab {
2031
- flex: 1;
2032
- display: flex;
2033
- flex-direction: column;
2034
- overflow: hidden;
2035
- min-height: 0;
2036
- }
2037
-
2038
- .cp-broadcast-sheet-nodes {
2039
- border-bottom: 1px solid var(--border);
2040
- overflow: hidden;
2041
- flex: 1;
2042
- display: flex;
2043
- flex-direction: column;
2044
- min-height: 0;
2045
- }
2046
-
2047
- .cp-broadcast-sheet-nodes-header {
2048
- display: flex;
2049
- align-items: center;
2050
- justify-content: space-between;
2051
- gap: 8px;
2052
- padding: 10px 16px;
2053
- border-bottom: 1px solid var(--border);
2054
- background: rgba(255, 255, 255, 0.02);
2055
- flex-shrink: 0;
2056
- }
2057
-
2058
- .cp-broadcast-sheet-subtitle {
2059
- font-size: 13px;
2060
- color: var(--muted);
2061
- }
2062
-
2063
- .cp-broadcast-sheet-node-list {
2064
- overflow-y: auto;
2065
- flex: 1;
2066
- }
2067
-
2068
- .cp-broadcast-sheet-node-item {
2069
- display: flex;
2070
- align-items: flex-start;
2071
- gap: 12px;
2072
- padding: 12px 16px;
2073
- cursor: pointer;
2074
- border-bottom: 1px solid rgba(255, 255, 255, 0.04);
2075
- -webkit-tap-highlight-color: transparent;
2076
- }
2077
-
2078
- .cp-broadcast-sheet-node-item:active {
2079
- background: rgba(255, 255, 255, 0.04);
2080
- }
2081
-
2082
- .cp-broadcast-sheet-node-item:last-child {
2083
- border-bottom: none;
2084
- }
2085
-
2086
- .cp-broadcast-sheet-node-item input[type='checkbox'] {
2087
- width: 18px;
2088
- height: 18px;
2089
- flex-shrink: 0;
2090
- margin-top: 2px;
2091
- cursor: pointer;
2092
- }
2093
-
2094
- .cp-broadcast-sheet-node-info {
2095
- display: flex;
2096
- flex-direction: column;
2097
- gap: 3px;
2098
- min-width: 0;
2099
- }
2100
-
2101
- .cp-broadcast-sheet-node-name {
2102
- font-size: 14px;
2103
- font-weight: 500;
2104
- word-break: break-word;
2105
- line-height: 1.4;
2106
- }
2107
-
2108
- .cp-broadcast-sheet-node-url {
2109
- font-family: var(--mono);
2110
- font-size: 12px;
2111
- color: var(--muted);
2112
- word-break: break-all;
2113
- }
2114
-
2115
- .cp-broadcast-sheet-compose {
2116
- padding: 12px 16px;
2117
- border-top: 1px solid var(--border);
2118
- display: flex;
2119
- flex-direction: column;
2120
- gap: 10px;
2121
- flex-shrink: 0;
2122
- padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
2123
- }
2124
-
2125
- .cp-broadcast-sheet-textarea {
2126
- width: 100%;
2127
- min-height: 80px;
2128
- max-height: 160px;
2129
- resize: none;
2130
- border: 1px solid var(--border);
2131
- border-radius: var(--radius-sm);
2132
- background: rgba(255, 255, 255, 0.03);
2133
- color: var(--text);
2134
- padding: 10px 12px;
2135
- font-size: 14px;
2136
- line-height: 1.4;
2137
- }
2138
-
2139
- .cp-broadcast-sheet-footer {
2140
- display: flex;
2141
- gap: 10px;
2142
- }
2143
-
2144
- .cp-broadcast-sheet-footer .btn {
2145
- flex: 1;
2146
- min-height: 44px;
2147
- font-size: 14px;
2148
- }
2149
-
2150
- /* =============================================
2151
- Mobile — Worker list view
2152
- ============================================= */
2153
-
2154
- .cp-mobile-list {
2155
- flex: 1;
2156
- overflow-y: auto;
2157
- padding: 10px 12px;
2158
- display: flex;
2159
- flex-direction: column;
2160
- gap: 8px;
2161
- }
2162
-
2163
- /* =============================================
2164
- Mobile — Endpoints tab
2165
- ============================================= */
2166
-
2167
- .cp-mobile-endpoints-tab {
2168
- flex: 1;
2169
- display: flex;
2170
- flex-direction: column;
2171
- overflow: hidden;
2172
- min-height: 0;
2173
- }
2174
-
2175
- .cp-mobile-endpoints-toolbar {
2176
- padding: 10px 14px;
2177
- border-bottom: 1px solid var(--border);
2178
- flex-shrink: 0;
2179
- }
2180
-
2181
- /* =============================================
2182
- Responsive breakpoints
2183
- ============================================= */
2184
-
2185
- /* Desktop: sidebar + broadcast modal, no mobile elements */
2186
- @media (min-width: 769px) {
2187
- .cp-sidebar {
2188
- display: flex;
2189
- }
2190
- .cp-header-mobile,
2191
- .cp-mobile-list,
2192
- .cp-mobile-detail,
2193
- .cp-mobile-tab-bar,
2194
- .cp-mobile-endpoints-tab,
2195
- .cp-mobile-broadcast-tab {
2196
- display: none !important;
2197
- }
2198
- .cp-header-pc {
2199
- display: flex;
2200
- }
2201
- }
2202
-
2203
- /* Mobile: bottom tabs, no sidebar */
2204
- @media (max-width: 768px) {
2205
- .app {
2206
- padding: 0;
2207
- }
2208
-
2209
- .cp-header-pc {
2210
- display: none !important;
2211
- }
2212
-
2213
- .cp-header-mobile {
2214
- display: flex;
2215
- }
2216
-
2217
- .cp-sidebar {
2218
- display: none;
2219
- }
2220
-
2221
- .cp-main {
2222
- display: none;
2223
- }
2224
-
2225
- .cp-mobile-tab-bar {
2226
- display: flex;
2227
- }
2228
-
2229
- /* Body fills between header and tab bar */
2230
- .cp-body {
2231
- flex: 1;
2232
- min-height: 0;
2233
- overflow: hidden;
2234
- position: relative;
2235
- }
2236
-
2237
- /* Drawer goes full screen on mobile */
2238
- .cp-drawer {
2239
- inset: 0;
2240
- width: 100%;
2241
- max-width: none;
2242
- border-radius: 0;
2243
- border: none;
2244
- }
2245
- .cp-drawer.open {
2246
- width: 100%;
2247
- }
2248
-
2249
- /* Endpoint list rows stack vertically */
2250
- .cp-row {
2251
- flex-direction: column;
2252
- gap: 8px;
2253
- }
2254
- .cp-actions {
2255
- margin-top: 0;
2256
- justify-content: flex-start;
2257
- flex-wrap: wrap;
2258
- gap: 8px;
2259
- }
2260
- .cp-actions .btn {
2261
- min-height: 40px;
2262
- flex: 1;
2263
- }
2264
-
2265
- .cp-input,
2266
- .cp-select {
2267
- min-height: 40px;
2268
- font-size: 14px;
2269
- }
2270
-
2271
- .btn {
2272
- min-height: 38px;
2273
- }
2274
-
2275
- /* Broadcast modal hidden on mobile (use sheet instead) */
2276
- .cp-broadcast-modal-backdrop {
2277
- display: none !important;
2278
- }
2279
- }
2280
-
2281
- /* ─── Rollout Page ──────────────────────────────────────────────────────────── */
2282
-
2283
- .rollout-app {
2284
- display: flex;
2285
- flex-direction: column;
2286
- height: 100%;
2287
- background: var(--bg);
2288
- }
2289
-
2290
- .rollout-stats {
2291
- display: flex;
2292
- gap: 20px;
2293
- padding: 14px 24px;
2294
- border-bottom: 1px solid var(--border);
2295
- background: var(--panel);
2296
- }
2297
- .rollout-stat {
2298
- text-align: center;
2299
- min-width: 72px;
2300
- }
2301
- .rollout-stat-value {
2302
- font-size: 22px;
2303
- font-weight: 700;
2304
- font-variant-numeric: tabular-nums;
2305
- color: var(--text);
2306
- }
2307
- .rollout-stat-label {
2308
- font-size: 11px;
2309
- color: var(--muted);
2310
- text-transform: uppercase;
2311
- letter-spacing: 0.5px;
2312
- margin-top: 2px;
2313
- }
2314
- .rollout-running {
2315
- color: var(--accent);
2316
- }
2317
- .rollout-queued {
2318
- color: var(--warn);
2319
- }
2320
- .rollout-completed {
2321
- color: var(--ok);
2322
- }
2323
- .rollout-failed {
2324
- color: var(--err);
2325
- }
2326
-
2327
- .rollout-body {
2328
- display: flex;
2329
- flex: 1;
2330
- min-height: 0;
2331
- overflow: hidden;
2332
- }
2333
-
2334
- .rollout-sidebar {
2335
- width: 320px;
2336
- border-right: 1px solid var(--border);
2337
- background: var(--panel);
2338
- display: flex;
2339
- flex-direction: column;
2340
- overflow-y: auto;
2341
- }
2342
- .rollout-sidebar-section {
2343
- padding: 14px 16px;
2344
- border-bottom: 1px solid var(--border);
2345
- }
2346
- .rollout-sidebar-queue {
2347
- flex: 1;
2348
- min-height: 0;
2349
- display: flex;
2350
- flex-direction: column;
2351
- padding: 10px 16px;
2352
- }
2353
- .rollout-label {
2354
- display: block;
2355
- font-size: 12px;
2356
- color: var(--muted);
2357
- margin-bottom: 8px;
2358
- text-transform: uppercase;
2359
- letter-spacing: 0.5px;
2360
- }
2361
- .rollout-row {
2362
- display: flex;
2363
- gap: 8px;
2364
- align-items: center;
2365
- }
2366
- .rollout-input,
2367
- .rollout-textarea,
2368
- .rollout-select {
2369
- background: var(--panel-2);
2370
- border: 1px solid var(--border);
2371
- color: var(--text);
2372
- padding: 7px 10px;
2373
- border-radius: var(--radius-sm);
2374
- font-size: 13px;
2375
- font-family: var(--sans);
2376
- outline: none;
2377
- width: 100%;
2378
- }
2379
- .rollout-input:focus,
2380
- .rollout-textarea:focus {
2381
- border-color: var(--accent);
2382
- }
2383
- .rollout-input-sm {
2384
- width: 70px;
2385
- flex: 0 0 auto;
2386
- }
2387
- .rollout-textarea {
2388
- resize: vertical;
2389
- min-height: 80px;
2390
- }
2391
- .rollout-select {
2392
- cursor: pointer;
2393
- }
2394
- .rollout-add-form {
2395
- display: flex;
2396
- flex-direction: column;
2397
- gap: 8px;
2398
- }
2399
- .rollout-badge {
2400
- background: var(--subtle);
2401
- padding: 1px 7px;
2402
- border-radius: 10px;
2403
- font-size: 11px;
2404
- font-weight: 600;
2405
- }
2406
- .rollout-queue-list {
2407
- flex: 1;
2408
- overflow-y: auto;
2409
- display: flex;
2410
- flex-direction: column;
2411
- gap: 6px;
2412
- }
2413
- .rollout-queue-empty {
2414
- color: var(--muted);
2415
- font-size: 12px;
2416
- padding: 8px 0;
2417
- }
2418
- .rollout-queue-item {
2419
- background: var(--panel-2);
2420
- border: 1px solid var(--border);
2421
- border-radius: var(--radius-sm);
2422
- padding: 8px 10px;
2423
- }
2424
- .rollout-queue-item-header {
2425
- display: flex;
2426
- justify-content: space-between;
2427
- align-items: center;
2428
- }
2429
- .rollout-queue-item-prompt {
2430
- font-size: 12px;
2431
- color: var(--muted);
2432
- margin-top: 4px;
2433
- overflow: hidden;
2434
- text-overflow: ellipsis;
2435
- white-space: nowrap;
2436
- }
2437
-
2438
- .rollout-main {
2439
- flex: 1;
2440
- display: flex;
2441
- flex-direction: column;
2442
- min-width: 0;
2443
- overflow: hidden;
2444
- }
2445
- .rollout-main-header {
2446
- display: flex;
2447
- align-items: center;
2448
- justify-content: space-between;
2449
- padding: 12px 20px;
2450
- border-bottom: 1px solid var(--border);
2451
- }
2452
- .rollout-main-title {
2453
- font-size: 15px;
2454
- font-weight: 600;
2455
- }
2456
- .rollout-main-controls {
2457
- display: flex;
2458
- gap: 8px;
2459
- align-items: center;
2460
- }
2461
- .rollout-main-controls .rollout-select {
2462
- width: auto;
2463
- min-width: 100px;
2464
- }
2465
- .rollout-task-list {
2466
- flex: 1;
2467
- overflow-y: auto;
2468
- padding: 16px 20px;
2469
- display: flex;
2470
- flex-direction: column;
2471
- gap: 12px;
2472
- }
2473
- .rollout-empty {
2474
- text-align: center;
2475
- padding: 40px;
2476
- color: var(--muted);
2477
- }
2478
- .rollout-task-card {
2479
- background: var(--panel);
2480
- border: 1px solid var(--border);
2481
- border-radius: var(--radius);
2482
- padding: 14px 16px;
2483
- transition: border-color 0.15s;
2484
- }
2485
- .rollout-task-card:hover {
2486
- border-color: var(--muted);
2487
- }
2488
- .rollout-task-card-header {
2489
- display: flex;
2490
- align-items: center;
2491
- justify-content: space-between;
2492
- margin-bottom: 8px;
2493
- }
2494
- .rollout-task-card-left {
2495
- display: flex;
2496
- gap: 8px;
2497
- align-items: center;
2498
- flex-wrap: wrap;
2499
- }
2500
- .rollout-task-id {
2501
- font-family: var(--mono);
2502
- font-size: 12px;
2503
- color: var(--muted);
2504
- }
2505
- .rollout-task-model {
2506
- font-size: 11px;
2507
- padding: 2px 8px;
2508
- border-radius: 10px;
2509
- background: var(--subtle);
2510
- color: var(--muted);
2511
- }
2512
- .rollout-task-tags {
2513
- font-size: 11px;
2514
- color: var(--accent-2);
2515
- }
2516
- .rollout-task-status {
2517
- font-size: 12px;
2518
- font-weight: 600;
2519
- padding: 2px 10px;
2520
- border-radius: 10px;
2521
- }
2522
- .rollout-task-status.queued {
2523
- background: rgba(224, 175, 104, 0.15);
2524
- color: var(--warn);
2525
- }
2526
- .rollout-task-status.running {
2527
- background: rgba(122, 162, 247, 0.15);
2528
- color: var(--accent);
2529
- }
2530
- .rollout-task-status.completed {
2531
- background: rgba(158, 206, 106, 0.15);
2532
- color: var(--ok);
2533
- }
2534
- .rollout-task-status.failed,
2535
- .rollout-task-status.stopped {
2536
- background: rgba(247, 118, 142, 0.15);
2537
- color: var(--err);
2538
- }
2539
- .rollout-task-status.cancelled {
2540
- background: var(--subtle);
2541
- color: var(--muted);
2542
- }
2543
-
2544
- .rollout-task-prompt {
2545
- font-size: 13px;
2546
- line-height: 1.5;
2547
- color: var(--text);
2548
- margin-bottom: 4px;
2549
- word-break: break-word;
2550
- }
2551
- .rollout-task-command {
2552
- font-family: var(--mono);
2553
- font-size: 11px;
2554
- line-height: 1.4;
2555
- color: var(--muted);
2556
- background: var(--subtle);
2557
- padding: 3px 8px;
2558
- border-radius: 4px;
2559
- margin-bottom: 8px;
2560
- word-break: break-all;
2561
- white-space: nowrap;
2562
- overflow: hidden;
2563
- text-overflow: ellipsis;
2564
- }
2565
- .rollout-task-meta {
2566
- display: flex;
2567
- gap: 12px;
2568
- align-items: center;
2569
- font-size: 11px;
2570
- color: var(--muted);
2571
- }
2572
- .rollout-task-actions {
2573
- display: flex;
2574
- gap: 6px;
2575
- margin-top: 10px;
2576
- }
2577
- .rollout-btn-sm {
2578
- font-size: 12px !important;
2579
- padding: 4px 10px !important;
2580
- }
2581
- .rollout-btn-xs {
2582
- font-size: 11px !important;
2583
- padding: 2px 8px !important;
2584
- }
2585
-
2586
- /* Tabs */
2587
- .rollout-tabs {
2588
- display: flex;
2589
- gap: 0;
2590
- align-items: center;
2591
- padding: 0 20px;
2592
- border-bottom: 1px solid var(--border);
2593
- background: var(--panel);
2594
- }
2595
- .rollout-tab {
2596
- background: none;
2597
- border: none;
2598
- border-bottom: 2px solid transparent;
2599
- padding: 10px 18px;
2600
- font-size: 13px;
2601
- font-weight: 500;
2602
- color: var(--muted);
2603
- cursor: pointer;
2604
- transition: all 0.15s;
2605
- }
2606
- .rollout-tab:hover {
2607
- color: var(--text);
2608
- }
2609
- .rollout-tab.active {
2610
- color: var(--accent);
2611
- border-bottom-color: var(--accent);
2612
- }
2613
- .rollout-hint {
2614
- font-size: 12px;
2615
- color: var(--muted);
2616
- font-weight: 400;
2617
- }
2618
- .rollout-task-card.is-running {
2619
- border-left: 3px solid var(--accent);
2620
- }
2621
-
2622
- /* Detail / Log panel */
2623
- .rollout-log-backdrop {
2624
- position: fixed;
2625
- inset: 0;
2626
- background: rgba(0, 0, 0, 0.5);
2627
- z-index: 99;
2628
- }
2629
- .rollout-log-panel {
2630
- position: fixed;
2631
- right: 0;
2632
- top: 0;
2633
- width: 55vw;
2634
- min-width: 500px;
2635
- height: 100vh;
2636
- background: var(--panel);
2637
- border-left: 1px solid var(--border);
2638
- display: flex;
2639
- flex-direction: column;
2640
- z-index: 100;
2641
- animation: rollout-slide-in 0.2s ease;
2642
- }
2643
- @keyframes rollout-slide-in {
2644
- from {
2645
- transform: translateX(100%);
2646
- }
2647
- to {
2648
- transform: translateX(0);
2649
- }
2650
- }
2651
- .rollout-log-header {
2652
- display: flex;
2653
- align-items: center;
2654
- justify-content: space-between;
2655
- padding: 14px 16px;
2656
- border-bottom: 1px solid var(--border);
2657
- }
2658
- .rollout-log-header h3 {
2659
- font-size: 14px;
2660
- margin: 0;
2661
- white-space: nowrap;
2662
- overflow: hidden;
2663
- text-overflow: ellipsis;
2664
- max-width: 60%;
2665
- }
2666
- .rollout-detail-tabs {
2667
- display: flex;
2668
- border-bottom: 1px solid var(--border);
2669
- padding: 0 16px;
2670
- }
2671
- .rollout-detail-tab {
2672
- background: none;
2673
- border: none;
2674
- border-bottom: 2px solid transparent;
2675
- padding: 8px 14px;
2676
- font-size: 12px;
2677
- font-weight: 500;
2678
- color: var(--muted);
2679
- cursor: pointer;
2680
- }
2681
- .rollout-detail-tab:hover {
2682
- color: var(--text);
2683
- }
2684
- .rollout-detail-tab.active {
2685
- color: var(--accent);
2686
- border-bottom-color: var(--accent);
2687
- }
2688
- .rollout-log-content {
2689
- flex: 1;
2690
- overflow-y: auto;
2691
- padding: 16px;
2692
- margin: 0;
2693
- font-family: var(--mono);
2694
- font-size: 12px;
2695
- line-height: 1.6;
2696
- white-space: pre-wrap;
2697
- color: var(--muted);
2698
- }
2699
- .rollout-log-content.loading {
2700
- opacity: 0.5;
2701
- }
2702
- .rollout-live-dot {
2703
- color: var(--ok);
2704
- font-size: 11px;
2705
- font-weight: 600;
2706
- animation: rollout-blink 1s infinite;
2707
- }
2708
- @keyframes rollout-blink {
2709
- 0%,
2710
- 100% {
2711
- opacity: 1;
2712
- }
2713
- 50% {
2714
- opacity: 0.3;
2715
- }
2716
- }
2717
-
2718
- /* Artifacts list */
2719
- .rollout-artifact-list {
2720
- flex: 1;
2721
- overflow-y: auto;
2722
- padding: 12px 16px;
2723
- display: flex;
2724
- flex-direction: column;
2725
- gap: 4px;
2726
- }
2727
- .rollout-artifact-item {
2728
- display: flex;
2729
- align-items: center;
2730
- gap: 8px;
2731
- padding: 8px 12px;
2732
- background: var(--subtle);
2733
- border-radius: var(--radius);
2734
- color: var(--text);
2735
- text-decoration: none;
2736
- font-family: var(--mono);
2737
- font-size: 12px;
2738
- transition: background 0.15s;
2739
- }
2740
- .rollout-artifact-item:hover {
2741
- background: var(--border);
2742
- }
2743
- .rollout-artifact-icon {
2744
- font-size: 14px;
2745
- }
2746
-
2747
- /* Resolution badge */
2748
- .rollout-task-resolution {
2749
- font-size: 10px;
2750
- padding: 1px 6px;
2751
- border-radius: 8px;
2752
- background: rgba(187, 154, 247, 0.15);
2753
- color: #bb9af7;
2754
- font-weight: 600;
2755
- }
2756
-
2757
- /* Config info */
2758
- .rollout-config-info {
2759
- font-size: 12px;
2760
- line-height: 1.8;
2761
- color: var(--muted);
2762
- }
2763
- .rollout-config-info code {
2764
- font-family: var(--mono);
2765
- font-size: 11px;
2766
- background: var(--subtle);
2767
- padding: 1px 5px;
2768
- border-radius: 3px;
2769
- }
2770
-
2771
- /* New Task Dialog */
2772
- .rollout-dialog {
2773
- position: fixed;
2774
- top: 50%;
2775
- left: 50%;
2776
- transform: translate(-50%, -50%);
2777
- width: 680px;
2778
- max-width: 90vw;
2779
- max-height: 85vh;
2780
- background: var(--panel);
2781
- border: 1px solid var(--border);
2782
- border-radius: 12px;
2783
- display: flex;
2784
- flex-direction: column;
2785
- z-index: 100;
2786
- animation: rollout-dialog-in 0.2s ease;
2787
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
2788
- }
2789
- @keyframes rollout-dialog-in {
2790
- from {
2791
- opacity: 0;
2792
- transform: translate(-50%, -48%);
2793
- }
2794
- to {
2795
- opacity: 1;
2796
- transform: translate(-50%, -50%);
2797
- }
2798
- }
2799
- .rollout-dialog-header {
2800
- display: flex;
2801
- align-items: center;
2802
- justify-content: space-between;
2803
- padding: 16px 20px 12px;
2804
- border-bottom: 1px solid var(--border);
2805
- }
2806
- .rollout-dialog-header h3 {
2807
- font-size: 16px;
2808
- margin: 0;
2809
- }
2810
- .rollout-dialog-body {
2811
- flex: 1;
2812
- overflow-y: auto;
2813
- padding: 16px 20px;
2814
- display: flex;
2815
- flex-direction: column;
2816
- gap: 12px;
2817
- }
2818
- .rollout-dialog-footer {
2819
- display: flex;
2820
- align-items: center;
2821
- justify-content: space-between;
2822
- padding-top: 12px;
2823
- border-top: 1px solid var(--border);
2824
- margin-top: 4px;
2825
- }
2826
-
2827
- /* Form groups */
2828
- .rollout-form-group {
2829
- display: flex;
2830
- flex-direction: column;
2831
- gap: 4px;
2832
- }
2833
- .rollout-form-row {
2834
- display: flex;
2835
- gap: 12px;
2836
- align-items: flex-end;
2837
- }
2838
- .rollout-form-details {
2839
- border: 1px solid var(--border);
2840
- border-radius: var(--radius);
2841
- padding: 8px 12px;
2842
- }
2843
- .rollout-form-details[open] {
2844
- padding-bottom: 4px;
2845
- }
2846
-
2847
- /* JSON editor */
2848
- .rollout-json-editor {
2849
- font-family: var(--mono) !important;
2850
- font-size: 13px !important;
2851
- line-height: 1.5 !important;
2852
- min-height: 300px;
2853
- resize: vertical;
2854
- tab-size: 2;
2855
- }
2856
- .rollout-json-error {
2857
- color: var(--err);
2858
- font-size: 12px;
2859
- padding: 4px 0;
2860
- }