clodds 1.2.2 → 1.2.3

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