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