@agent-link/server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/web/style.css ADDED
@@ -0,0 +1,1707 @@
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ :root {
10
+ --bg-primary: #0f172a;
11
+ --bg-secondary: #1e293b;
12
+ --bg-tertiary: #334155;
13
+ --text-primary: #f1f5f9;
14
+ --text-secondary: #94a3b8;
15
+ --accent: #2563eb;
16
+ --accent-hover: #1d4ed8;
17
+ --success: #22c55e;
18
+ --warning: #f59e0b;
19
+ --error: #ef4444;
20
+ --border: #475569;
21
+ --code-bg: #1a1a2e;
22
+ --code-header-bg: #16162a;
23
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
24
+ }
25
+
26
+ /* ── Light theme ── */
27
+ [data-theme="light"] {
28
+ --bg-primary: #ffffff;
29
+ --bg-secondary: #f8f9fa;
30
+ --bg-tertiary: #e9ecef;
31
+ --text-primary: #1a1a1a;
32
+ --text-secondary: #6b7280;
33
+ --accent: #2563eb;
34
+ --accent-hover: #1d4ed8;
35
+ --success: #16a34a;
36
+ --warning: #d97706;
37
+ --error: #dc2626;
38
+ --border: #d1d5db;
39
+ --code-bg: #f1f3f5;
40
+ --code-header-bg: #e9ecef;
41
+ }
42
+
43
+ body {
44
+ background-color: var(--bg-primary);
45
+ color: var(--text-primary);
46
+ min-height: 100vh;
47
+ }
48
+
49
+ #app {
50
+ height: 100vh;
51
+ }
52
+
53
+ /* ── Layout ── */
54
+ .layout {
55
+ display: flex;
56
+ flex-direction: column;
57
+ height: 100vh;
58
+ }
59
+
60
+ .top-bar {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: space-between;
64
+ padding: 0.5rem 1rem;
65
+ background: var(--bg-secondary);
66
+ border-bottom: 1px solid var(--border);
67
+ flex-shrink: 0;
68
+ }
69
+
70
+ .top-bar-left {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 0.5rem;
74
+ }
75
+
76
+ .sidebar-toggle {
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ width: 30px;
81
+ height: 30px;
82
+ background: none;
83
+ border: none;
84
+ border-radius: 4px;
85
+ color: var(--text-secondary);
86
+ cursor: pointer;
87
+ transition: color 0.15s, background 0.15s;
88
+ }
89
+
90
+ .sidebar-toggle:hover {
91
+ color: var(--text-primary);
92
+ background: var(--bg-tertiary);
93
+ }
94
+
95
+ .top-bar h1 {
96
+ font-size: 1.1rem;
97
+ font-weight: 700;
98
+ }
99
+
100
+ .top-bar-info {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 0.75rem;
104
+ }
105
+
106
+ .agent-label {
107
+ color: var(--text-secondary);
108
+ font-size: 0.85rem;
109
+ }
110
+
111
+ .theme-toggle {
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ width: 32px;
116
+ height: 32px;
117
+ background: none;
118
+ border: 1px solid var(--border);
119
+ border-radius: 8px;
120
+ color: var(--text-secondary);
121
+ cursor: pointer;
122
+ transition: color 0.15s, background 0.15s, border-color 0.15s;
123
+ }
124
+
125
+ .theme-toggle:hover {
126
+ color: var(--text-primary);
127
+ background: var(--bg-tertiary);
128
+ border-color: var(--text-secondary);
129
+ }
130
+
131
+ /* ── Center card (no session / waiting) ── */
132
+ .center-card {
133
+ flex: 1;
134
+ display: flex;
135
+ align-items: center;
136
+ justify-content: center;
137
+ padding: 2rem;
138
+ }
139
+
140
+ .status-card {
141
+ background: var(--bg-secondary);
142
+ border: 1px solid var(--border);
143
+ border-radius: 12px;
144
+ padding: 1.5rem 2rem;
145
+ min-width: 320px;
146
+ text-align: center;
147
+ }
148
+
149
+ .status-card .status {
150
+ font-size: 1.1rem;
151
+ margin-bottom: 0.75rem;
152
+ }
153
+
154
+ .status-card .info {
155
+ margin-bottom: 0.5rem;
156
+ font-size: 0.95rem;
157
+ }
158
+
159
+ .status-card .label {
160
+ color: var(--text-secondary);
161
+ }
162
+
163
+ /* ── Badges ── */
164
+ .muted {
165
+ color: var(--text-secondary);
166
+ font-size: 0.85rem;
167
+ }
168
+
169
+ .badge {
170
+ padding: 2px 8px;
171
+ border-radius: 4px;
172
+ font-weight: 600;
173
+ font-size: 0.9rem;
174
+ }
175
+
176
+ .badge.connected {
177
+ color: var(--success);
178
+ background: rgba(34, 197, 94, 0.1);
179
+ }
180
+
181
+ .badge.disconnected {
182
+ color: var(--error);
183
+ background: rgba(239, 68, 68, 0.1);
184
+ }
185
+
186
+ .badge.connecting\.\.\. {
187
+ color: var(--warning);
188
+ background: rgba(245, 158, 11, 0.1);
189
+ }
190
+
191
+ .badge.waiting {
192
+ color: var(--warning);
193
+ background: rgba(245, 158, 11, 0.1);
194
+ }
195
+
196
+ .badge.error,
197
+ .badge.no\ session {
198
+ color: var(--error);
199
+ background: rgba(239, 68, 68, 0.1);
200
+ }
201
+
202
+ .error-msg {
203
+ color: var(--error);
204
+ font-size: 0.85rem;
205
+ margin-top: 0.75rem;
206
+ }
207
+
208
+ /* ── Main body (sidebar + chat) ── */
209
+ .main-body {
210
+ flex: 1;
211
+ display: flex;
212
+ min-height: 0;
213
+ }
214
+
215
+ /* ── Sidebar ── */
216
+ .sidebar {
217
+ width: 260px;
218
+ flex-shrink: 0;
219
+ background: var(--bg-secondary);
220
+ border-right: 1px solid var(--border);
221
+ display: flex;
222
+ flex-direction: column;
223
+ overflow: hidden;
224
+ }
225
+
226
+ .sidebar-section {
227
+ padding: 0.75rem;
228
+ border-bottom: 1px solid var(--border);
229
+ }
230
+
231
+ .sidebar-workdir {
232
+ overflow: hidden;
233
+ }
234
+
235
+ .sidebar-hostname {
236
+ display: flex;
237
+ align-items: center;
238
+ gap: 6px;
239
+ font-size: 0.85rem;
240
+ font-weight: 500;
241
+ color: var(--text-primary);
242
+ margin-bottom: 10px;
243
+ padding-bottom: 10px;
244
+ border-bottom: 1px solid var(--border);
245
+ }
246
+
247
+ .sidebar-hostname-icon {
248
+ flex-shrink: 0;
249
+ opacity: 0.6;
250
+ }
251
+
252
+ .sidebar-workdir-label {
253
+ font-size: 0.7rem;
254
+ text-transform: uppercase;
255
+ letter-spacing: 0.05em;
256
+ color: var(--text-secondary);
257
+ margin-bottom: 4px;
258
+ }
259
+
260
+ .sidebar-workdir-path {
261
+ font-size: 0.8rem;
262
+ color: var(--text-primary);
263
+ font-family: 'SF Mono', 'Fira Code', Consolas, monospace;
264
+ word-break: break-all;
265
+ line-height: 1.3;
266
+ }
267
+
268
+ .sidebar-sessions {
269
+ flex: 1;
270
+ display: flex;
271
+ flex-direction: column;
272
+ overflow: hidden;
273
+ }
274
+
275
+ .sidebar-section-header {
276
+ display: flex;
277
+ align-items: center;
278
+ justify-content: space-between;
279
+ font-size: 0.75rem;
280
+ text-transform: uppercase;
281
+ letter-spacing: 0.05em;
282
+ color: var(--text-secondary);
283
+ margin-bottom: 8px;
284
+ }
285
+
286
+ .sidebar-refresh-btn {
287
+ display: flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ width: 24px;
291
+ height: 24px;
292
+ background: none;
293
+ border: none;
294
+ border-radius: 4px;
295
+ color: var(--text-secondary);
296
+ cursor: pointer;
297
+ transition: color 0.15s;
298
+ }
299
+
300
+ .sidebar-refresh-btn:hover {
301
+ color: var(--text-primary);
302
+ }
303
+
304
+ .sidebar-refresh-btn:disabled {
305
+ opacity: 0.4;
306
+ cursor: not-allowed;
307
+ }
308
+
309
+ @keyframes spin {
310
+ from { transform: rotate(0deg); }
311
+ to { transform: rotate(360deg); }
312
+ }
313
+
314
+ .spinning {
315
+ animation: spin 0.8s linear infinite;
316
+ }
317
+
318
+ .new-conversation-btn {
319
+ display: flex;
320
+ align-items: center;
321
+ gap: 6px;
322
+ width: 100%;
323
+ padding: 6px 8px;
324
+ background: none;
325
+ border: 1px dashed var(--border);
326
+ border-radius: 6px;
327
+ color: var(--text-secondary);
328
+ font-size: 0.82rem;
329
+ cursor: pointer;
330
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
331
+ margin-bottom: 8px;
332
+ }
333
+
334
+ .new-conversation-btn:hover {
335
+ color: var(--text-primary);
336
+ border-color: var(--text-secondary);
337
+ background: var(--bg-tertiary);
338
+ }
339
+
340
+ .new-conversation-btn:disabled {
341
+ opacity: 0.4;
342
+ cursor: not-allowed;
343
+ }
344
+
345
+ .sidebar-loading,
346
+ .sidebar-empty {
347
+ font-size: 0.8rem;
348
+ color: var(--text-secondary);
349
+ text-align: center;
350
+ padding: 1rem 0;
351
+ }
352
+
353
+ .session-list {
354
+ flex: 1;
355
+ overflow-y: auto;
356
+ display: flex;
357
+ flex-direction: column;
358
+ gap: 2px;
359
+ }
360
+
361
+ .session-group {
362
+ margin-bottom: 0.5rem;
363
+ }
364
+
365
+ .session-group-label {
366
+ font-size: 0.68rem;
367
+ font-weight: 600;
368
+ text-transform: uppercase;
369
+ letter-spacing: 0.04em;
370
+ color: var(--text-secondary);
371
+ padding: 0.4rem 8px 0.2rem;
372
+ opacity: 0.7;
373
+ }
374
+
375
+ .session-item {
376
+ padding: 8px 10px;
377
+ border-radius: 8px;
378
+ cursor: pointer;
379
+ transition: background 0.15s, transform 0.1s;
380
+ border-left: 3px solid transparent;
381
+ }
382
+
383
+ .session-item:hover {
384
+ background: var(--bg-tertiary);
385
+ }
386
+
387
+ .session-item:active {
388
+ transform: scale(0.98);
389
+ }
390
+
391
+ .session-item.active {
392
+ background: var(--bg-tertiary);
393
+ border-left-color: var(--accent);
394
+ }
395
+
396
+ .session-title {
397
+ font-size: 0.82rem;
398
+ color: var(--text-primary);
399
+ overflow: hidden;
400
+ text-overflow: ellipsis;
401
+ white-space: nowrap;
402
+ line-height: 1.3;
403
+ }
404
+
405
+ .session-meta {
406
+ font-size: 0.7rem;
407
+ color: var(--text-secondary);
408
+ margin-top: 2px;
409
+ }
410
+
411
+ /* ── Chat area (message list + input) ── */
412
+ .chat-area {
413
+ flex: 1;
414
+ display: flex;
415
+ flex-direction: column;
416
+ min-height: 0;
417
+ }
418
+
419
+ /* ── Message list ── */
420
+ .message-list {
421
+ flex: 1;
422
+ overflow-y: auto;
423
+ padding: 1.5rem 1.5rem 0.5rem;
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: 0.25rem;
427
+ }
428
+
429
+ .message-list-inner {
430
+ max-width: 768px;
431
+ width: 100%;
432
+ margin: 0 auto;
433
+ display: flex;
434
+ flex-direction: column;
435
+ gap: 0.25rem;
436
+ }
437
+
438
+ .empty-state {
439
+ flex: 1;
440
+ display: flex;
441
+ flex-direction: column;
442
+ align-items: center;
443
+ justify-content: center;
444
+ gap: 0.5rem;
445
+ color: var(--text-secondary);
446
+ }
447
+
448
+ .empty-state-icon {
449
+ font-size: 2.5rem;
450
+ opacity: 0.5;
451
+ margin-bottom: 0.5rem;
452
+ }
453
+
454
+ .empty-state strong {
455
+ color: var(--text-primary);
456
+ }
457
+
458
+ /* ── Messages ── */
459
+ .message {
460
+ display: flex;
461
+ flex-direction: column;
462
+ }
463
+
464
+ .message-user {
465
+ margin-top: 1.25rem;
466
+ }
467
+
468
+ .message-role-label {
469
+ font-size: 0.75rem;
470
+ font-weight: 600;
471
+ text-transform: uppercase;
472
+ letter-spacing: 0.03em;
473
+ margin-bottom: 0.3rem;
474
+ padding-left: 0.1rem;
475
+ }
476
+
477
+ .message-role-label.user-label {
478
+ color: var(--text-secondary);
479
+ }
480
+
481
+ .message-role-label.assistant-label {
482
+ color: var(--accent);
483
+ }
484
+
485
+ .message-bubble {
486
+ padding: 0.6rem 0.9rem;
487
+ border-radius: 10px;
488
+ font-size: 0.94rem;
489
+ line-height: 1.6;
490
+ word-wrap: break-word;
491
+ position: relative;
492
+ }
493
+
494
+ .user-bubble {
495
+ background: var(--bg-tertiary);
496
+ color: var(--text-primary);
497
+ }
498
+
499
+ .assistant-bubble {
500
+ background: transparent;
501
+ padding: 0.2rem 0;
502
+ }
503
+
504
+ /* ── Message actions (copy button, shown on hover) ── */
505
+ .message-actions {
506
+ position: absolute;
507
+ top: 0;
508
+ right: 0;
509
+ display: flex;
510
+ gap: 2px;
511
+ opacity: 0;
512
+ transition: opacity 0.15s;
513
+ }
514
+
515
+ .message-bubble:hover .message-actions {
516
+ opacity: 1;
517
+ }
518
+
519
+ .icon-btn {
520
+ display: flex;
521
+ align-items: center;
522
+ justify-content: center;
523
+ width: 26px;
524
+ height: 26px;
525
+ background: var(--bg-tertiary);
526
+ border: 1px solid var(--border);
527
+ border-radius: 4px;
528
+ color: var(--text-secondary);
529
+ cursor: pointer;
530
+ transition: color 0.15s;
531
+ }
532
+
533
+ .icon-btn:hover {
534
+ color: var(--text-primary);
535
+ }
536
+
537
+ /* ── Markdown body in assistant messages ── */
538
+ .markdown-body {
539
+ line-height: 1.6;
540
+ }
541
+
542
+ .markdown-body p {
543
+ margin-bottom: 0.5em;
544
+ }
545
+
546
+ .markdown-body p:last-child {
547
+ margin-bottom: 0;
548
+ }
549
+
550
+ .markdown-body ul, .markdown-body ol {
551
+ padding-left: 1.5em;
552
+ margin-bottom: 0.5em;
553
+ }
554
+
555
+ .markdown-body li {
556
+ margin-bottom: 0.2em;
557
+ }
558
+
559
+ .markdown-body strong {
560
+ font-weight: 600;
561
+ }
562
+
563
+ .markdown-body code {
564
+ background: var(--bg-tertiary);
565
+ padding: 0.15em 0.35em;
566
+ border-radius: 3px;
567
+ font-size: 0.85em;
568
+ font-family: 'SF Mono', 'Fira Code', Consolas, monospace;
569
+ }
570
+
571
+ .markdown-body pre {
572
+ margin: 0.5em 0;
573
+ overflow-x: auto;
574
+ }
575
+
576
+ .markdown-body pre code {
577
+ background: none;
578
+ padding: 0;
579
+ border-radius: 0;
580
+ font-size: 0.85em;
581
+ display: block;
582
+ padding: 0.8em;
583
+ }
584
+
585
+ .markdown-body blockquote {
586
+ border-left: 3px solid var(--border);
587
+ padding-left: 0.8em;
588
+ color: var(--text-secondary);
589
+ margin: 0.5em 0;
590
+ }
591
+
592
+ .markdown-body hr {
593
+ border: none;
594
+ border-top: 1px solid var(--border);
595
+ margin: 0.75em 0;
596
+ }
597
+
598
+ .markdown-body table {
599
+ border-collapse: collapse;
600
+ margin: 0.5em 0;
601
+ font-size: 0.88em;
602
+ }
603
+
604
+ .markdown-body th, .markdown-body td {
605
+ border: 1px solid var(--border);
606
+ padding: 0.4em 0.6em;
607
+ }
608
+
609
+ .markdown-body th {
610
+ background: var(--bg-tertiary);
611
+ }
612
+
613
+ /* ── Code block wrapper (with copy button) ── */
614
+ .code-block-wrapper {
615
+ position: relative;
616
+ margin: 0.5em 0;
617
+ border-radius: 8px;
618
+ overflow: hidden;
619
+ background: var(--code-bg);
620
+ }
621
+
622
+ .code-block-header {
623
+ display: flex;
624
+ justify-content: space-between;
625
+ align-items: center;
626
+ padding: 6px 12px;
627
+ background: var(--code-header-bg);
628
+ }
629
+
630
+ .code-lang {
631
+ font-size: 11px;
632
+ color: var(--text-secondary);
633
+ font-family: 'SF Mono', 'Fira Code', Consolas, monospace;
634
+ }
635
+
636
+ .code-copy-btn {
637
+ display: flex;
638
+ align-items: center;
639
+ padding: 2px 6px;
640
+ border: none;
641
+ border-radius: 3px;
642
+ background: transparent;
643
+ color: var(--text-secondary);
644
+ cursor: pointer;
645
+ transition: color 0.15s;
646
+ }
647
+
648
+ .code-copy-btn:hover {
649
+ color: var(--text-primary);
650
+ }
651
+
652
+ .code-block-wrapper pre {
653
+ margin: 0;
654
+ }
655
+
656
+ .code-block-wrapper pre code {
657
+ padding: 0.8em 1em;
658
+ }
659
+
660
+ /* ── Tool use lines (collapsible, compact, subdued) ── */
661
+ .tool-line-wrapper {
662
+ max-width: 100%;
663
+ padding-left: 0.25rem;
664
+ }
665
+
666
+ .tool-line {
667
+ display: flex;
668
+ align-items: center;
669
+ gap: 6px;
670
+ padding: 3px 6px;
671
+ border-radius: 4px;
672
+ font-size: 0.8rem;
673
+ cursor: pointer;
674
+ user-select: none;
675
+ transition: background 0.15s;
676
+ color: var(--text-secondary);
677
+ }
678
+
679
+ .tool-line:hover {
680
+ background: var(--bg-tertiary);
681
+ }
682
+
683
+ .tool-icon {
684
+ flex-shrink: 0;
685
+ display: flex;
686
+ align-items: center;
687
+ color: var(--text-secondary);
688
+ opacity: 0.6;
689
+ }
690
+
691
+ .tool-name {
692
+ font-weight: 500;
693
+ color: var(--text-secondary);
694
+ flex-shrink: 0;
695
+ }
696
+
697
+ .tool-summary {
698
+ color: var(--text-secondary);
699
+ overflow: hidden;
700
+ text-overflow: ellipsis;
701
+ white-space: nowrap;
702
+ flex: 1;
703
+ min-width: 0;
704
+ }
705
+
706
+ .tool-status-icon {
707
+ color: var(--text-secondary);
708
+ font-weight: normal;
709
+ flex-shrink: 0;
710
+ font-size: 0.75rem;
711
+ opacity: 0.7;
712
+ }
713
+
714
+ .tool-line.completed .tool-status-icon {
715
+ color: var(--success);
716
+ opacity: 0.6;
717
+ }
718
+
719
+ .running-dots {
720
+ display: inline-flex;
721
+ gap: 2px;
722
+ }
723
+
724
+ .running-dots span {
725
+ width: 3px;
726
+ height: 3px;
727
+ border-radius: 50%;
728
+ background: var(--text-secondary);
729
+ animation: typing 1.2s infinite ease-in-out;
730
+ }
731
+
732
+ .running-dots span:nth-child(2) { animation-delay: 0.2s; }
733
+ .running-dots span:nth-child(3) { animation-delay: 0.4s; }
734
+
735
+ .tool-toggle {
736
+ color: var(--text-secondary);
737
+ font-size: 0.6rem;
738
+ flex-shrink: 0;
739
+ margin-left: auto;
740
+ opacity: 0.5;
741
+ }
742
+
743
+ .tool-expand {
744
+ margin-top: 2px;
745
+ margin-left: 20px;
746
+ border-left: 1px solid var(--border);
747
+ padding-left: 8px;
748
+ }
749
+
750
+ .tool-block {
751
+ background: var(--bg-secondary);
752
+ border-radius: 4px;
753
+ padding: 0.4rem 0.6rem;
754
+ margin-top: 0.25rem;
755
+ overflow-x: auto;
756
+ font-size: 0.75rem;
757
+ line-height: 1.4;
758
+ max-height: 200px;
759
+ overflow-y: auto;
760
+ white-space: pre-wrap;
761
+ word-break: break-all;
762
+ color: var(--text-secondary);
763
+ }
764
+
765
+ .tool-output {
766
+ border-left: 2px solid var(--success);
767
+ color: var(--text-primary);
768
+ }
769
+
770
+ /* ── Formatted tool input (Read, Write, Bash, Glob, Grep) ── */
771
+ .tool-input-formatted {
772
+ padding: 0.3rem 0.5rem;
773
+ margin-top: 0.25rem;
774
+ font-size: 0.75rem;
775
+ line-height: 1.5;
776
+ color: var(--text-secondary);
777
+ word-break: break-all;
778
+ }
779
+
780
+ .tool-input-meta {
781
+ color: var(--text-secondary);
782
+ opacity: 0.6;
783
+ }
784
+
785
+ .tool-input-cmd {
786
+ background: var(--bg-secondary);
787
+ padding: 0.1rem 0.4rem;
788
+ border-radius: 3px;
789
+ font-size: 0.73rem;
790
+ word-break: break-all;
791
+ white-space: pre-wrap;
792
+ }
793
+
794
+ /* ── TodoWrite checklist ── */
795
+ .todo-list {
796
+ display: flex;
797
+ flex-direction: column;
798
+ gap: 2px;
799
+ }
800
+
801
+ .todo-item {
802
+ display: flex;
803
+ align-items: baseline;
804
+ gap: 6px;
805
+ font-size: 0.75rem;
806
+ line-height: 1.4;
807
+ color: var(--text-secondary);
808
+ }
809
+
810
+ .todo-item.todo-done {
811
+ opacity: 0.55;
812
+ }
813
+
814
+ .todo-item.todo-active {
815
+ color: var(--text-primary);
816
+ }
817
+
818
+ .todo-icon {
819
+ flex-shrink: 0;
820
+ width: 1em;
821
+ text-align: center;
822
+ font-size: 0.7rem;
823
+ opacity: 0.5;
824
+ }
825
+
826
+ .todo-icon.done {
827
+ color: var(--success);
828
+ opacity: 0.8;
829
+ }
830
+
831
+ .todo-icon.active {
832
+ color: #58a6ff;
833
+ opacity: 1;
834
+ font-size: 0.55rem;
835
+ }
836
+
837
+ .todo-text {
838
+ word-break: break-word;
839
+ }
840
+
841
+ /* ── Task / WebFetch formatted fields ── */
842
+ .task-field {
843
+ font-size: 0.75rem;
844
+ line-height: 1.5;
845
+ color: var(--text-secondary);
846
+ }
847
+
848
+ .task-field + .task-field {
849
+ margin-top: 2px;
850
+ }
851
+
852
+ .task-prompt {
853
+ background: var(--bg-secondary);
854
+ border-radius: 3px;
855
+ padding: 0.3rem 0.5rem;
856
+ margin-top: 3px;
857
+ font-size: 0.73rem;
858
+ line-height: 1.4;
859
+ color: var(--text-secondary);
860
+ white-space: pre-wrap;
861
+ word-break: break-word;
862
+ max-height: 150px;
863
+ overflow-y: auto;
864
+ }
865
+
866
+ .tool-link {
867
+ color: #58a6ff;
868
+ font-size: 0.75rem;
869
+ word-break: break-all;
870
+ text-decoration: none;
871
+ }
872
+
873
+ .tool-link:hover {
874
+ text-decoration: underline;
875
+ }
876
+
877
+ [data-theme="light"] .todo-icon.active {
878
+ color: #0969da;
879
+ }
880
+
881
+ [data-theme="light"] .tool-link {
882
+ color: #0969da;
883
+ }
884
+
885
+ /* ── Edit tool diff view ── */
886
+ .tool-diff {
887
+ background: var(--bg-secondary);
888
+ border-radius: 4px;
889
+ padding: 0.4rem 0.6rem;
890
+ margin-top: 0.25rem;
891
+ overflow-x: auto;
892
+ font-size: 0.75rem;
893
+ line-height: 1.5;
894
+ max-height: 300px;
895
+ overflow-y: auto;
896
+ font-family: 'Cascadia Code', 'Fira Code', 'JetBrains Mono', 'Consolas', monospace;
897
+ }
898
+
899
+ .diff-file {
900
+ color: var(--text-secondary);
901
+ margin-bottom: 0.35rem;
902
+ font-weight: 500;
903
+ }
904
+
905
+ .diff-replace-all {
906
+ opacity: 0.6;
907
+ font-weight: 400;
908
+ }
909
+
910
+ .diff-lines {
911
+ border-radius: 3px;
912
+ overflow: hidden;
913
+ }
914
+
915
+ .diff-removed, .diff-added {
916
+ white-space: pre-wrap;
917
+ word-break: break-all;
918
+ padding: 0 0.4rem;
919
+ }
920
+
921
+ .diff-removed {
922
+ background: rgba(248, 81, 73, 0.15);
923
+ color: #f85149;
924
+ }
925
+
926
+ .diff-added {
927
+ background: rgba(63, 185, 80, 0.15);
928
+ color: #3fb950;
929
+ }
930
+
931
+ .diff-sign {
932
+ display: inline-block;
933
+ width: 1.2em;
934
+ user-select: none;
935
+ opacity: 0.7;
936
+ }
937
+
938
+ [data-theme="light"] .diff-removed {
939
+ background: rgba(208, 46, 38, 0.12);
940
+ color: #b31d28;
941
+ }
942
+
943
+ [data-theme="light"] .diff-added {
944
+ background: rgba(34, 134, 58, 0.12);
945
+ color: #22863a;
946
+ }
947
+
948
+ /* ── Context summary (collapsible continuation notice) ── */
949
+ .context-summary-wrapper {
950
+ margin: 0.75rem 0;
951
+ }
952
+
953
+ /* ── AskUserQuestion interactive card ── */
954
+ .ask-question-wrapper {
955
+ max-width: 100%;
956
+ padding-left: 0.25rem;
957
+ margin: 0.5rem 0;
958
+ }
959
+
960
+ .ask-question-card {
961
+ background: var(--bg-secondary);
962
+ border: 1px solid var(--accent);
963
+ border-radius: 10px;
964
+ padding: 0.8rem 1rem;
965
+ display: flex;
966
+ flex-direction: column;
967
+ gap: 0.75rem;
968
+ }
969
+
970
+ .ask-question-block {
971
+ display: flex;
972
+ flex-direction: column;
973
+ gap: 0.5rem;
974
+ }
975
+
976
+ .ask-question-header {
977
+ font-size: 0.7rem;
978
+ font-weight: 600;
979
+ text-transform: uppercase;
980
+ letter-spacing: 0.04em;
981
+ color: var(--accent);
982
+ }
983
+
984
+ .ask-question-text {
985
+ font-size: 0.9rem;
986
+ color: var(--text-primary);
987
+ line-height: 1.5;
988
+ }
989
+
990
+ .ask-question-options {
991
+ display: flex;
992
+ flex-direction: column;
993
+ gap: 6px;
994
+ }
995
+
996
+ .ask-question-option {
997
+ padding: 8px 12px;
998
+ border: 1px solid var(--border);
999
+ border-radius: 8px;
1000
+ cursor: pointer;
1001
+ transition: border-color 0.15s, background 0.15s;
1002
+ }
1003
+
1004
+ .ask-question-option:hover {
1005
+ border-color: var(--text-secondary);
1006
+ background: var(--bg-tertiary);
1007
+ }
1008
+
1009
+ .ask-question-option.selected {
1010
+ border-color: var(--accent);
1011
+ background: rgba(37, 99, 235, 0.1);
1012
+ }
1013
+
1014
+ .ask-option-label {
1015
+ font-size: 0.88rem;
1016
+ font-weight: 500;
1017
+ color: var(--text-primary);
1018
+ }
1019
+
1020
+ .ask-option-desc {
1021
+ font-size: 0.78rem;
1022
+ color: var(--text-secondary);
1023
+ margin-top: 2px;
1024
+ line-height: 1.4;
1025
+ }
1026
+
1027
+ .ask-question-custom {
1028
+ margin-top: 2px;
1029
+ }
1030
+
1031
+ .ask-question-custom input {
1032
+ width: 100%;
1033
+ padding: 6px 10px;
1034
+ background: var(--bg-primary);
1035
+ border: 1px solid var(--border);
1036
+ border-radius: 6px;
1037
+ color: var(--text-primary);
1038
+ font-size: 0.85rem;
1039
+ font-family: inherit;
1040
+ outline: none;
1041
+ transition: border-color 0.15s;
1042
+ }
1043
+
1044
+ .ask-question-custom input::placeholder {
1045
+ color: var(--text-secondary);
1046
+ }
1047
+
1048
+ .ask-question-custom input:focus {
1049
+ border-color: var(--accent);
1050
+ }
1051
+
1052
+ .ask-question-actions {
1053
+ display: flex;
1054
+ justify-content: flex-end;
1055
+ }
1056
+
1057
+ .ask-question-submit {
1058
+ padding: 6px 20px;
1059
+ background: var(--accent);
1060
+ color: #fff;
1061
+ border: none;
1062
+ border-radius: 8px;
1063
+ font-size: 0.85rem;
1064
+ font-weight: 600;
1065
+ cursor: pointer;
1066
+ transition: background 0.15s, opacity 0.15s;
1067
+ }
1068
+
1069
+ .ask-question-submit:hover:not(:disabled) {
1070
+ background: var(--accent-hover);
1071
+ }
1072
+
1073
+ .ask-question-submit:disabled {
1074
+ opacity: 0.3;
1075
+ cursor: not-allowed;
1076
+ }
1077
+
1078
+ .ask-question-answered {
1079
+ display: flex;
1080
+ align-items: center;
1081
+ gap: 6px;
1082
+ padding: 4px 8px;
1083
+ font-size: 0.82rem;
1084
+ color: var(--text-secondary);
1085
+ }
1086
+
1087
+ .ask-answered-icon {
1088
+ color: var(--success);
1089
+ font-size: 0.8rem;
1090
+ }
1091
+
1092
+ .ask-answered-text {
1093
+ font-style: italic;
1094
+ }
1095
+
1096
+ .context-summary-bar {
1097
+ display: flex;
1098
+ align-items: center;
1099
+ gap: 6px;
1100
+ padding: 6px 10px;
1101
+ border-radius: 6px;
1102
+ border: 1px dashed var(--border);
1103
+ font-size: 0.78rem;
1104
+ color: var(--text-secondary);
1105
+ cursor: pointer;
1106
+ transition: background 0.15s;
1107
+ }
1108
+
1109
+ .context-summary-bar:hover {
1110
+ background: var(--bg-tertiary);
1111
+ }
1112
+
1113
+ .context-summary-icon {
1114
+ flex-shrink: 0;
1115
+ opacity: 0.5;
1116
+ }
1117
+
1118
+ .context-summary-label {
1119
+ flex: 1;
1120
+ }
1121
+
1122
+ .context-summary-toggle {
1123
+ font-size: 0.72rem;
1124
+ opacity: 0.6;
1125
+ flex-shrink: 0;
1126
+ }
1127
+
1128
+ .context-summary-body {
1129
+ margin-top: 6px;
1130
+ padding: 0.6rem 0.8rem;
1131
+ background: var(--bg-secondary);
1132
+ border-radius: 6px;
1133
+ border: 1px solid var(--border);
1134
+ font-size: 0.82rem;
1135
+ color: var(--text-secondary);
1136
+ max-height: 400px;
1137
+ overflow-y: auto;
1138
+ }
1139
+
1140
+ .context-summary-body .markdown-body {
1141
+ font-size: 0.82rem;
1142
+ color: var(--text-secondary);
1143
+ }
1144
+
1145
+ /* ── System message ── */
1146
+ .system-msg {
1147
+ text-align: center;
1148
+ color: var(--text-secondary);
1149
+ font-size: 0.8rem;
1150
+ font-style: italic;
1151
+ padding: 0.25rem 0;
1152
+ }
1153
+
1154
+ /* ── History loading indicator ── */
1155
+ .history-loading {
1156
+ display: flex;
1157
+ align-items: center;
1158
+ justify-content: center;
1159
+ gap: 0.5rem;
1160
+ padding: 2rem 0;
1161
+ color: var(--text-secondary);
1162
+ font-size: 0.85rem;
1163
+ }
1164
+
1165
+ .history-loading-spinner {
1166
+ width: 16px;
1167
+ height: 16px;
1168
+ border: 2px solid var(--border);
1169
+ border-top-color: var(--accent);
1170
+ border-radius: 50%;
1171
+ animation: spin 0.8s linear infinite;
1172
+ }
1173
+
1174
+ /* ── Typing indicator ── */
1175
+ .typing-indicator {
1176
+ display: flex;
1177
+ align-items: center;
1178
+ gap: 4px;
1179
+ padding: 0.5rem 0.9rem;
1180
+ }
1181
+
1182
+ .typing-indicator span {
1183
+ width: 6px;
1184
+ height: 6px;
1185
+ border-radius: 50%;
1186
+ background: var(--text-secondary);
1187
+ animation: typing 1.2s infinite ease-in-out;
1188
+ }
1189
+
1190
+ .typing-indicator span:nth-child(2) {
1191
+ animation-delay: 0.2s;
1192
+ }
1193
+
1194
+ .typing-indicator span:nth-child(3) {
1195
+ animation-delay: 0.4s;
1196
+ }
1197
+
1198
+ @keyframes typing {
1199
+ 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
1200
+ 30% { opacity: 1; transform: scale(1); }
1201
+ }
1202
+
1203
+ /* ── Context compaction banner ── */
1204
+ .compacting-banner {
1205
+ display: flex;
1206
+ align-items: center;
1207
+ gap: 10px;
1208
+ padding: 10px 16px;
1209
+ margin: 0.75rem 0;
1210
+ border-radius: 8px;
1211
+ background: rgba(245, 158, 11, 0.08);
1212
+ border: 1px solid rgba(245, 158, 11, 0.25);
1213
+ color: var(--warning);
1214
+ font-size: 0.85rem;
1215
+ font-weight: 500;
1216
+ animation: compacting-pulse 2s ease-in-out infinite;
1217
+ }
1218
+
1219
+ .compacting-spinner {
1220
+ width: 16px;
1221
+ height: 16px;
1222
+ border: 2px solid rgba(245, 158, 11, 0.3);
1223
+ border-top-color: var(--warning);
1224
+ border-radius: 50%;
1225
+ animation: spin 0.8s linear infinite;
1226
+ flex-shrink: 0;
1227
+ }
1228
+
1229
+ .compacting-text {
1230
+ flex: 1;
1231
+ }
1232
+
1233
+ @keyframes compacting-pulse {
1234
+ 0%, 100% { opacity: 1; }
1235
+ 50% { opacity: 0.7; }
1236
+ }
1237
+
1238
+ /* ── Input area ── */
1239
+ .input-area {
1240
+ flex-shrink: 0;
1241
+ padding: 0 1.5rem 1rem;
1242
+ background: transparent;
1243
+ position: relative;
1244
+ }
1245
+
1246
+ .input-area::before {
1247
+ content: '';
1248
+ position: absolute;
1249
+ top: -2rem;
1250
+ left: 0;
1251
+ right: 0;
1252
+ height: 2rem;
1253
+ background: linear-gradient(to top, var(--bg-primary), transparent);
1254
+ pointer-events: none;
1255
+ }
1256
+
1257
+ .input-card {
1258
+ max-width: 768px;
1259
+ margin: 0 auto;
1260
+ background: var(--bg-secondary);
1261
+ border: 1px solid var(--border);
1262
+ border-radius: 16px;
1263
+ padding: 0.5rem;
1264
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
1265
+ transition: border-color 0.2s, box-shadow 0.2s;
1266
+ }
1267
+
1268
+ .input-card:focus-within {
1269
+ border-color: var(--accent);
1270
+ box-shadow: 0 2px 16px rgba(37, 99, 235, 0.12);
1271
+ }
1272
+
1273
+ .input-card textarea {
1274
+ width: 100%;
1275
+ background: transparent;
1276
+ border: none;
1277
+ color: var(--text-primary);
1278
+ padding: 0.4rem 0.6rem;
1279
+ font-family: inherit;
1280
+ font-size: 0.92rem;
1281
+ resize: none;
1282
+ outline: none;
1283
+ line-height: 1.5;
1284
+ max-height: 160px;
1285
+ overflow-y: auto;
1286
+ }
1287
+
1288
+ .input-card textarea::placeholder {
1289
+ color: var(--text-secondary);
1290
+ }
1291
+
1292
+ .input-bottom-row {
1293
+ display: flex;
1294
+ justify-content: space-between;
1295
+ align-items: center;
1296
+ padding: 0.1rem 0.25rem 0;
1297
+ }
1298
+
1299
+ .send-btn {
1300
+ background: var(--accent);
1301
+ color: #fff;
1302
+ border: none;
1303
+ border-radius: 10px;
1304
+ width: 32px;
1305
+ height: 32px;
1306
+ font-size: 0.9rem;
1307
+ font-weight: 600;
1308
+ cursor: pointer;
1309
+ display: flex;
1310
+ align-items: center;
1311
+ justify-content: center;
1312
+ transition: background 0.15s, opacity 0.15s;
1313
+ }
1314
+
1315
+ .send-btn:hover:not(:disabled) {
1316
+ background: var(--accent-hover);
1317
+ }
1318
+
1319
+ .send-btn:disabled {
1320
+ opacity: 0.3;
1321
+ cursor: not-allowed;
1322
+ }
1323
+
1324
+ /* ── Stop button ── */
1325
+ .stop-btn {
1326
+ background: var(--error);
1327
+ }
1328
+
1329
+ .stop-btn:hover {
1330
+ background: #dc2626;
1331
+ }
1332
+
1333
+ /* ── Streaming cursor ── */
1334
+ .assistant-bubble.streaming .markdown-body > *:last-child::after,
1335
+ .assistant-bubble.streaming .message-content:not(.markdown-body)::after {
1336
+ content: '';
1337
+ display: inline-block;
1338
+ width: 2px;
1339
+ height: 1em;
1340
+ background: var(--accent);
1341
+ margin-left: 2px;
1342
+ vertical-align: text-bottom;
1343
+ animation: blink-cursor 0.8s steps(2) infinite;
1344
+ }
1345
+
1346
+ @keyframes blink-cursor {
1347
+ 0% { opacity: 1; }
1348
+ 50% { opacity: 0; }
1349
+ }
1350
+
1351
+ /* ── Sidebar change-dir button ── */
1352
+ .sidebar-workdir-header {
1353
+ display: flex;
1354
+ align-items: center;
1355
+ justify-content: space-between;
1356
+ }
1357
+
1358
+ .sidebar-change-dir-btn {
1359
+ display: flex;
1360
+ align-items: center;
1361
+ justify-content: center;
1362
+ width: 22px;
1363
+ height: 22px;
1364
+ background: none;
1365
+ border: 1px solid var(--border);
1366
+ border-radius: 4px;
1367
+ color: var(--text-secondary);
1368
+ cursor: pointer;
1369
+ transition: color 0.15s, background 0.15s;
1370
+ }
1371
+
1372
+ .sidebar-change-dir-btn:hover {
1373
+ color: var(--text-primary);
1374
+ background: var(--bg-tertiary);
1375
+ }
1376
+
1377
+ .sidebar-change-dir-btn:disabled {
1378
+ opacity: 0.4;
1379
+ cursor: not-allowed;
1380
+ }
1381
+
1382
+ /* ── Folder Picker Modal ── */
1383
+ .folder-picker-overlay {
1384
+ position: fixed;
1385
+ top: 0; left: 0; right: 0; bottom: 0;
1386
+ background: rgba(0, 0, 0, 0.5);
1387
+ z-index: 1000;
1388
+ display: flex;
1389
+ align-items: center;
1390
+ justify-content: center;
1391
+ }
1392
+
1393
+ .folder-picker-dialog {
1394
+ width: 440px;
1395
+ max-height: 520px;
1396
+ background: var(--bg-secondary);
1397
+ border: 1px solid var(--border);
1398
+ border-radius: 12px;
1399
+ display: flex;
1400
+ flex-direction: column;
1401
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
1402
+ }
1403
+
1404
+ .folder-picker-header {
1405
+ display: flex;
1406
+ justify-content: space-between;
1407
+ align-items: center;
1408
+ padding: 12px 16px;
1409
+ font-size: 0.95rem;
1410
+ font-weight: 600;
1411
+ border-bottom: 1px solid var(--border);
1412
+ }
1413
+
1414
+ .folder-picker-close {
1415
+ background: none;
1416
+ border: none;
1417
+ color: var(--text-secondary);
1418
+ font-size: 1.2rem;
1419
+ cursor: pointer;
1420
+ padding: 0 4px;
1421
+ line-height: 1;
1422
+ }
1423
+
1424
+ .folder-picker-close:hover {
1425
+ color: var(--text-primary);
1426
+ }
1427
+
1428
+ .folder-picker-nav {
1429
+ display: flex;
1430
+ align-items: center;
1431
+ gap: 8px;
1432
+ padding: 8px 16px;
1433
+ font-size: 0.78rem;
1434
+ font-family: 'SF Mono', 'Fira Code', Consolas, monospace;
1435
+ color: var(--text-secondary);
1436
+ border-bottom: 1px solid var(--border);
1437
+ }
1438
+
1439
+ .folder-picker-up {
1440
+ display: flex;
1441
+ align-items: center;
1442
+ justify-content: center;
1443
+ width: 24px;
1444
+ height: 24px;
1445
+ background: none;
1446
+ border: 1px solid var(--border);
1447
+ border-radius: 4px;
1448
+ color: var(--text-secondary);
1449
+ cursor: pointer;
1450
+ flex-shrink: 0;
1451
+ transition: color 0.15s, background 0.15s;
1452
+ }
1453
+
1454
+ .folder-picker-up:hover {
1455
+ color: var(--text-primary);
1456
+ background: var(--bg-tertiary);
1457
+ }
1458
+
1459
+ .folder-picker-up:disabled {
1460
+ opacity: 0.3;
1461
+ cursor: not-allowed;
1462
+ }
1463
+
1464
+ .folder-picker-current {
1465
+ overflow: hidden;
1466
+ text-overflow: ellipsis;
1467
+ white-space: nowrap;
1468
+ flex: 1;
1469
+ }
1470
+
1471
+ .folder-picker-list {
1472
+ flex: 1;
1473
+ overflow-y: auto;
1474
+ min-height: 200px;
1475
+ max-height: 350px;
1476
+ padding: 4px 0;
1477
+ }
1478
+
1479
+ .folder-picker-loading {
1480
+ display: flex;
1481
+ align-items: center;
1482
+ gap: 8px;
1483
+ padding: 16px;
1484
+ color: var(--text-secondary);
1485
+ font-size: 0.82rem;
1486
+ }
1487
+
1488
+ .folder-picker-item {
1489
+ display: flex;
1490
+ align-items: center;
1491
+ gap: 8px;
1492
+ padding: 6px 16px;
1493
+ font-size: 0.85rem;
1494
+ cursor: pointer;
1495
+ color: var(--text-primary);
1496
+ transition: background 0.1s;
1497
+ user-select: none;
1498
+ }
1499
+
1500
+ .folder-picker-item:hover {
1501
+ background: var(--bg-tertiary);
1502
+ }
1503
+
1504
+ .folder-picker-item svg {
1505
+ flex-shrink: 0;
1506
+ color: var(--text-secondary);
1507
+ }
1508
+
1509
+ .folder-picker-selected {
1510
+ background: var(--accent) !important;
1511
+ color: #fff !important;
1512
+ }
1513
+
1514
+ .folder-picker-selected svg {
1515
+ color: #fff !important;
1516
+ }
1517
+
1518
+ .folder-picker-empty {
1519
+ text-align: center;
1520
+ padding: 2rem;
1521
+ color: var(--text-secondary);
1522
+ font-size: 0.82rem;
1523
+ }
1524
+
1525
+ .folder-picker-footer {
1526
+ padding: 10px 16px;
1527
+ display: flex;
1528
+ justify-content: flex-end;
1529
+ gap: 8px;
1530
+ border-top: 1px solid var(--border);
1531
+ }
1532
+
1533
+ .folder-picker-cancel {
1534
+ padding: 6px 16px;
1535
+ background: none;
1536
+ color: var(--text-secondary);
1537
+ border: 1px solid var(--border);
1538
+ border-radius: 8px;
1539
+ font-size: 0.85rem;
1540
+ cursor: pointer;
1541
+ transition: color 0.15s, background 0.15s;
1542
+ }
1543
+
1544
+ .folder-picker-cancel:hover {
1545
+ color: var(--text-primary);
1546
+ background: var(--bg-tertiary);
1547
+ }
1548
+
1549
+ .folder-picker-confirm {
1550
+ padding: 6px 20px;
1551
+ background: var(--accent);
1552
+ color: #fff;
1553
+ border: none;
1554
+ border-radius: 8px;
1555
+ font-size: 0.85rem;
1556
+ font-weight: 600;
1557
+ cursor: pointer;
1558
+ transition: background 0.15s;
1559
+ }
1560
+
1561
+ .folder-picker-confirm:hover {
1562
+ background: var(--accent-hover);
1563
+ }
1564
+
1565
+ .folder-picker-confirm:disabled {
1566
+ opacity: 0.4;
1567
+ cursor: not-allowed;
1568
+ }
1569
+
1570
+ /* ── File Upload: Attachment Bar ── */
1571
+ .attachment-bar {
1572
+ display: flex;
1573
+ flex-wrap: wrap;
1574
+ gap: 6px;
1575
+ padding: 6px 8px;
1576
+ border-top: 1px solid var(--border);
1577
+ }
1578
+
1579
+ .attachment-chip {
1580
+ display: flex;
1581
+ align-items: center;
1582
+ gap: 6px;
1583
+ background: var(--bg-tertiary);
1584
+ border: 1px solid var(--border);
1585
+ border-radius: 8px;
1586
+ padding: 4px 8px;
1587
+ font-size: 0.78rem;
1588
+ color: var(--text-primary);
1589
+ max-width: 220px;
1590
+ }
1591
+
1592
+ .attachment-thumb {
1593
+ width: 28px;
1594
+ height: 28px;
1595
+ object-fit: cover;
1596
+ border-radius: 4px;
1597
+ flex-shrink: 0;
1598
+ }
1599
+
1600
+ .attachment-file-icon {
1601
+ display: flex;
1602
+ align-items: center;
1603
+ justify-content: center;
1604
+ width: 28px;
1605
+ height: 28px;
1606
+ background: var(--bg-secondary);
1607
+ border-radius: 4px;
1608
+ flex-shrink: 0;
1609
+ color: var(--text-secondary);
1610
+ }
1611
+
1612
+ .attachment-info {
1613
+ overflow: hidden;
1614
+ min-width: 0;
1615
+ }
1616
+
1617
+ .attachment-name {
1618
+ overflow: hidden;
1619
+ text-overflow: ellipsis;
1620
+ white-space: nowrap;
1621
+ font-weight: 500;
1622
+ }
1623
+
1624
+ .attachment-size {
1625
+ color: var(--text-secondary);
1626
+ font-size: 0.7rem;
1627
+ }
1628
+
1629
+ .attachment-remove {
1630
+ background: none;
1631
+ border: none;
1632
+ color: var(--text-secondary);
1633
+ cursor: pointer;
1634
+ padding: 0 2px;
1635
+ font-size: 1rem;
1636
+ line-height: 1;
1637
+ flex-shrink: 0;
1638
+ transition: color 0.15s;
1639
+ }
1640
+
1641
+ .attachment-remove:hover {
1642
+ color: var(--error);
1643
+ }
1644
+
1645
+ /* ── Paperclip attach button ── */
1646
+ .attach-btn {
1647
+ background: none;
1648
+ border: none;
1649
+ color: var(--text-secondary);
1650
+ cursor: pointer;
1651
+ display: flex;
1652
+ align-items: center;
1653
+ justify-content: center;
1654
+ width: 32px;
1655
+ height: 32px;
1656
+ border-radius: 8px;
1657
+ transition: color 0.15s, background 0.15s;
1658
+ }
1659
+
1660
+ .attach-btn:hover {
1661
+ color: var(--text-primary);
1662
+ background: var(--bg-tertiary);
1663
+ }
1664
+
1665
+ .attach-btn:disabled {
1666
+ opacity: 0.3;
1667
+ cursor: not-allowed;
1668
+ }
1669
+
1670
+ /* ── Drag-over highlight on input card ── */
1671
+ .input-card.drag-over {
1672
+ border-color: var(--accent);
1673
+ box-shadow: 0 0 0 2px var(--accent), 0 2px 12px rgba(99, 102, 241, 0.15);
1674
+ }
1675
+
1676
+ /* ── Attachments displayed in sent messages ── */
1677
+ .message-attachments {
1678
+ display: flex;
1679
+ flex-wrap: wrap;
1680
+ gap: 6px;
1681
+ margin-top: 6px;
1682
+ }
1683
+
1684
+ .message-attachment-chip {
1685
+ display: flex;
1686
+ align-items: center;
1687
+ gap: 4px;
1688
+ background: var(--bg-secondary);
1689
+ border: 1px solid var(--border);
1690
+ border-radius: 6px;
1691
+ padding: 3px 8px;
1692
+ font-size: 0.75rem;
1693
+ color: var(--text-secondary);
1694
+ }
1695
+
1696
+ .message-attachment-thumb {
1697
+ width: 20px;
1698
+ height: 20px;
1699
+ object-fit: cover;
1700
+ border-radius: 3px;
1701
+ }
1702
+
1703
+ .message-attachment-file-icon {
1704
+ display: flex;
1705
+ align-items: center;
1706
+ color: var(--text-secondary);
1707
+ }