@jvittechs/j 1.0.11

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,2129 @@
1
+ /**
2
+ * Jai1 Web Chat - Terminal Pro Design System
3
+ * A professional developer-focused chat interface
4
+ * Optimized for code readability and extended sessions
5
+ */
6
+
7
+ /* ============================================
8
+ Design Tokens - Terminal Pro Palette
9
+ ============================================ */
10
+ :root {
11
+ /* Primary Scale (Teal/Cyan) */
12
+ --primary-50: #ECFDF5;
13
+ --primary-100: #D1FAE5;
14
+ --primary-200: #A7F3D0;
15
+ --primary-300: #6EE7B7;
16
+ --primary-400: #34D399;
17
+ --primary-500: #00D4AA;
18
+ --primary-600: #00A080;
19
+ --primary-700: #047857;
20
+ --primary-800: #065F46;
21
+ --primary-900: #064E3B;
22
+
23
+ /* Secondary (Amber/Gold) */
24
+ --secondary-400: #FBBF24;
25
+ --secondary-500: #FFB800;
26
+ --secondary-600: #D97706;
27
+
28
+ /* Accent (Coral/Red) */
29
+ --accent: #FF6B6B;
30
+ --accent-dim: rgba(255, 107, 107, 0.15);
31
+
32
+ /* Semantic Colors */
33
+ --success: #22C55E;
34
+ --warning: #F59E0B;
35
+ --error: #EF4444;
36
+ --info: #3B82F6;
37
+
38
+ /* Typography */
39
+ --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace;
40
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
41
+
42
+ /* Spacing (4px base) */
43
+ --space-1: 4px;
44
+ --space-2: 8px;
45
+ --space-3: 12px;
46
+ --space-4: 16px;
47
+ --space-5: 20px;
48
+ --space-6: 24px;
49
+ --space-8: 32px;
50
+ --space-10: 40px;
51
+ --space-12: 48px;
52
+ --space-16: 64px;
53
+
54
+ /* Border Radius */
55
+ --radius-sm: 4px;
56
+ --radius-md: 6px;
57
+ --radius-lg: 8px;
58
+ --radius-xl: 12px;
59
+
60
+ /* Transitions */
61
+ --transition-fast: 150ms ease;
62
+ --transition-normal: 200ms ease;
63
+ --transition-slow: 300ms ease;
64
+
65
+ /* Layout */
66
+ --header-height: 56px;
67
+ --sidebar-width: 280px;
68
+ --sidebar-right-width: 280px;
69
+ --input-min-height: 48px;
70
+ }
71
+
72
+ /* ============================================
73
+ Dark Theme (Default)
74
+ ============================================ */
75
+ :root, [data-theme="dark"] {
76
+ /* Background Layers (GitHub-inspired) */
77
+ --bg-primary: #0D1117;
78
+ --bg-secondary: #161B22;
79
+ --bg-tertiary: #21262D;
80
+ --bg-elevated: #2D333B;
81
+
82
+ /* Text Colors */
83
+ --text-primary: #E6EDF3;
84
+ --text-secondary: #8B949E;
85
+ --text-muted: #6E7681;
86
+ --text-link: #58A6FF;
87
+
88
+ /* Borders */
89
+ --border-default: #30363D;
90
+ --border-muted: #21262D;
91
+ --border-focus: var(--primary-500);
92
+
93
+ /* Shadows */
94
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
95
+ --shadow-md: 0 4px 8px rgba(0, 0, 0, 0.4);
96
+ --shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.5);
97
+
98
+ /* User message */
99
+ --user-msg-bg: rgba(255, 184, 0, 0.08);
100
+ --user-msg-border: rgba(255, 184, 0, 0.2);
101
+
102
+ /* Selection */
103
+ --selection-bg: rgba(0, 212, 170, 0.3);
104
+
105
+ /* Ambient orb opacity */
106
+ --ambient-opacity: 0.15;
107
+ }
108
+
109
+ /* ============================================
110
+ Light Theme
111
+ ============================================ */
112
+ [data-theme="light"] {
113
+ /* Background Layers */
114
+ --bg-primary: #FFFFFF;
115
+ --bg-secondary: #F6F8FA;
116
+ --bg-tertiary: #EAEEF2;
117
+ --bg-elevated: #D0D7DE;
118
+
119
+ /* Text Colors */
120
+ --text-primary: #1F2328;
121
+ --text-secondary: #656D76;
122
+ --text-muted: #8C959F;
123
+ --text-link: #0969DA;
124
+
125
+ /* Borders */
126
+ --border-default: #D0D7DE;
127
+ --border-muted: #EAEEF2;
128
+ --border-focus: var(--primary-600);
129
+
130
+ /* Shadows */
131
+ --shadow-sm: 0 1px 2px rgba(31, 35, 40, 0.1);
132
+ --shadow-md: 0 4px 8px rgba(31, 35, 40, 0.15);
133
+ --shadow-lg: 0 8px 16px rgba(31, 35, 40, 0.2);
134
+
135
+ /* User message */
136
+ --user-msg-bg: rgba(255, 184, 0, 0.12);
137
+ --user-msg-border: rgba(255, 184, 0, 0.35);
138
+
139
+ /* Selection */
140
+ --selection-bg: rgba(0, 160, 128, 0.25);
141
+
142
+ /* Ambient orb opacity */
143
+ --ambient-opacity: 0.08;
144
+ }
145
+
146
+ /* ============================================
147
+ Reset & Base
148
+ ============================================ */
149
+ *, *::before, *::after {
150
+ box-sizing: border-box;
151
+ margin: 0;
152
+ padding: 0;
153
+ }
154
+
155
+ html, body {
156
+ height: 100%;
157
+ overflow: hidden;
158
+ }
159
+
160
+ body {
161
+ font-family: var(--font-sans);
162
+ font-size: 14px;
163
+ line-height: 1.6;
164
+ color: var(--text-primary);
165
+ background: var(--bg-primary);
166
+ -webkit-font-smoothing: antialiased;
167
+ -moz-osx-font-smoothing: grayscale;
168
+ }
169
+
170
+ ::selection {
171
+ background: var(--selection-bg);
172
+ color: var(--text-primary);
173
+ }
174
+
175
+ /* ============================================
176
+ Ambient Background (Subtle)
177
+ ============================================ */
178
+ .grain-overlay {
179
+ display: none; /* Disabled for cleaner look */
180
+ }
181
+
182
+ .ambient-bg {
183
+ position: fixed;
184
+ top: 0;
185
+ left: 0;
186
+ right: 0;
187
+ bottom: 0;
188
+ pointer-events: none;
189
+ z-index: -1;
190
+ overflow: hidden;
191
+ }
192
+
193
+ .ambient-orb {
194
+ position: absolute;
195
+ border-radius: 50%;
196
+ filter: blur(150px);
197
+ opacity: var(--ambient-opacity);
198
+ }
199
+
200
+ .ambient-orb-1 {
201
+ width: 500px;
202
+ height: 500px;
203
+ background: var(--primary-500);
204
+ top: -200px;
205
+ right: -100px;
206
+ }
207
+
208
+ .ambient-orb-2 {
209
+ width: 400px;
210
+ height: 400px;
211
+ background: var(--secondary-500);
212
+ bottom: -200px;
213
+ left: -100px;
214
+ }
215
+
216
+ /* ============================================
217
+ App Container
218
+ ============================================ */
219
+ #app {
220
+ height: 100%;
221
+ display: flex;
222
+ flex-direction: column;
223
+ background: var(--bg-primary);
224
+ }
225
+
226
+ /* ============================================
227
+ Header
228
+ ============================================ */
229
+ .header {
230
+ height: var(--header-height);
231
+ background: var(--bg-secondary);
232
+ border-bottom: 1px solid var(--border-default);
233
+ padding: 0 var(--space-6);
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: space-between;
237
+ flex-shrink: 0;
238
+ z-index: 100;
239
+ }
240
+
241
+ .header-left {
242
+ display: flex;
243
+ align-items: center;
244
+ gap: var(--space-6);
245
+ }
246
+
247
+ /* Logo */
248
+ .logo-container {
249
+ display: flex;
250
+ align-items: center;
251
+ gap: var(--space-3);
252
+ }
253
+
254
+ .logo-icon {
255
+ font-size: 18px;
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: center;
259
+ width: 32px;
260
+ height: 32px;
261
+ background: rgba(0, 212, 170, 0.15);
262
+ border: 1px solid var(--primary-500);
263
+ border-radius: var(--radius-md);
264
+ }
265
+
266
+ .logo-text {
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 6px;
270
+ font-family: var(--font-mono);
271
+ font-size: 14px;
272
+ font-weight: 600;
273
+ }
274
+
275
+ .logo-brand {
276
+ color: var(--text-primary);
277
+ }
278
+
279
+ .logo-divider {
280
+ color: var(--text-muted);
281
+ }
282
+
283
+ .logo-product {
284
+ color: var(--primary-500);
285
+ }
286
+
287
+ /* Experimental Badge */
288
+ .badge-experimental {
289
+ padding: 2px 8px;
290
+ background: linear-gradient(135deg, var(--warning) 0%, var(--secondary-600) 100%);
291
+ border-radius: 100px;
292
+ font-family: var(--font-mono);
293
+ font-size: 9px;
294
+ font-weight: 600;
295
+ text-transform: uppercase;
296
+ letter-spacing: 0.05em;
297
+ color: var(--bg-primary);
298
+ margin-left: var(--space-2);
299
+ animation: badge-pulse 2s ease-in-out infinite;
300
+ }
301
+
302
+ @keyframes badge-pulse {
303
+ 0%, 100% { opacity: 1; }
304
+ 50% { opacity: 0.7; }
305
+ }
306
+
307
+ /* Connection Status */
308
+ .connection-status {
309
+ display: flex;
310
+ align-items: center;
311
+ gap: 6px;
312
+ padding: 4px 10px;
313
+ background: var(--bg-tertiary);
314
+ border: 1px solid var(--border-default);
315
+ border-radius: 100px;
316
+ font-family: var(--font-mono);
317
+ font-size: 11px;
318
+ text-transform: uppercase;
319
+ letter-spacing: 0.05em;
320
+ color: var(--text-muted);
321
+ }
322
+
323
+ .status-dot {
324
+ width: 6px;
325
+ height: 6px;
326
+ border-radius: 50%;
327
+ background: var(--success);
328
+ }
329
+
330
+ .connection-status.disconnected .status-dot {
331
+ background: var(--error);
332
+ }
333
+
334
+ /* Header Right */
335
+ .header-right {
336
+ display: flex;
337
+ align-items: center;
338
+ gap: var(--space-4);
339
+ }
340
+
341
+ /* Model Selector */
342
+ .model-selector {
343
+ display: flex;
344
+ align-items: center;
345
+ gap: var(--space-3);
346
+ }
347
+
348
+ .model-label {
349
+ font-family: var(--font-mono);
350
+ font-size: 10px;
351
+ font-weight: 600;
352
+ letter-spacing: 0.1em;
353
+ color: var(--text-muted);
354
+ text-transform: uppercase;
355
+ }
356
+
357
+ .select-wrapper {
358
+ position: relative;
359
+ }
360
+
361
+ .model-select {
362
+ appearance: none;
363
+ padding: var(--space-2) var(--space-8) var(--space-2) var(--space-3);
364
+ background: var(--bg-tertiary);
365
+ border: 1px solid var(--border-default);
366
+ border-radius: var(--radius-md);
367
+ font-family: var(--font-mono);
368
+ font-size: 12px;
369
+ color: var(--text-primary);
370
+ cursor: pointer;
371
+ min-width: 160px;
372
+ transition: border-color var(--transition-fast);
373
+ }
374
+
375
+ .model-select:hover {
376
+ border-color: var(--text-muted);
377
+ }
378
+
379
+ .model-select:focus {
380
+ outline: none;
381
+ border-color: var(--primary-500);
382
+ box-shadow: 0 0 0 2px rgba(0, 212, 170, 0.2);
383
+ }
384
+
385
+ .select-arrow {
386
+ position: absolute;
387
+ right: var(--space-2);
388
+ top: 50%;
389
+ transform: translateY(-50%);
390
+ color: var(--text-muted);
391
+ pointer-events: none;
392
+ font-size: 10px;
393
+ }
394
+
395
+ /* Icon Button */
396
+ .btn-icon {
397
+ display: flex;
398
+ align-items: center;
399
+ justify-content: center;
400
+ width: 36px;
401
+ height: 36px;
402
+ background: transparent;
403
+ border: 1px solid var(--border-default);
404
+ border-radius: var(--radius-md);
405
+ color: var(--text-secondary);
406
+ cursor: pointer;
407
+ transition: all var(--transition-fast);
408
+ }
409
+
410
+ .btn-icon:hover {
411
+ background: var(--bg-tertiary);
412
+ border-color: var(--text-muted);
413
+ color: var(--text-primary);
414
+ }
415
+
416
+ /* ============================================
417
+ Main Layout
418
+ ============================================ */
419
+ .main {
420
+ flex: 1;
421
+ display: flex;
422
+ overflow: hidden;
423
+ }
424
+
425
+ /* ============================================
426
+ Sidebar
427
+ ============================================ */
428
+ .sidebar {
429
+ width: var(--sidebar-width);
430
+ background: var(--bg-secondary);
431
+ border-right: 1px solid var(--border-default);
432
+ display: flex;
433
+ flex-direction: column;
434
+ flex-shrink: 0;
435
+ }
436
+
437
+ .sidebar-left {
438
+ border-right: 1px solid var(--border-default);
439
+ border-left: none;
440
+ }
441
+
442
+ .sidebar-right {
443
+ width: var(--sidebar-right-width);
444
+ border-left: 1px solid var(--border-default);
445
+ border-right: none;
446
+ display: flex;
447
+ flex-direction: column;
448
+ height: 100%;
449
+ }
450
+
451
+ .sidebar-right .sidebar-section {
452
+ flex: none;
453
+ padding: var(--space-3);
454
+ }
455
+
456
+ .sidebar-right .sidebar-section:first-child {
457
+ flex: 1;
458
+ overflow-y: auto;
459
+ min-height: 0;
460
+ display: flex;
461
+ flex-direction: column;
462
+ }
463
+
464
+ .sidebar-right .sidebar-section + .sidebar-section {
465
+ border-top: 1px solid var(--border-default);
466
+ }
467
+
468
+ .sidebar-header {
469
+ padding: var(--space-4);
470
+ border-bottom: 1px solid var(--border-default);
471
+ }
472
+
473
+ .btn-new-chat {
474
+ width: 100%;
475
+ display: flex;
476
+ align-items: center;
477
+ gap: var(--space-2);
478
+ padding: var(--space-2) var(--space-3);
479
+ background: transparent;
480
+ border: 1px solid var(--border-default);
481
+ border-radius: var(--radius-md);
482
+ color: var(--text-primary);
483
+ font-family: var(--font-sans);
484
+ font-size: 13px;
485
+ font-weight: 500;
486
+ cursor: pointer;
487
+ transition: all var(--transition-fast);
488
+ }
489
+
490
+ .btn-new-chat:hover {
491
+ background: var(--bg-tertiary);
492
+ border-color: var(--primary-500);
493
+ color: var(--primary-500);
494
+ }
495
+
496
+ .btn-new-chat .shortcut {
497
+ margin-left: auto;
498
+ padding: 2px 6px;
499
+ background: var(--bg-tertiary);
500
+ border-radius: 3px;
501
+ font-family: var(--font-mono);
502
+ font-size: 10px;
503
+ color: var(--text-muted);
504
+ }
505
+
506
+ /* Sidebar Section */
507
+ .sidebar-section {
508
+ flex: 1;
509
+ overflow-y: auto;
510
+ padding: var(--space-4);
511
+ }
512
+
513
+ .sidebar-section-title {
514
+ display: flex;
515
+ align-items: center;
516
+ gap: var(--space-2);
517
+ padding: var(--space-2) 0;
518
+ font-family: var(--font-mono);
519
+ font-size: 10px;
520
+ font-weight: 600;
521
+ letter-spacing: 0.1em;
522
+ text-transform: uppercase;
523
+ color: var(--text-muted);
524
+ }
525
+
526
+ .section-icon {
527
+ color: var(--primary-500);
528
+ font-size: 10px;
529
+ }
530
+
531
+ /* Small Icon Button */
532
+ .btn-icon-small {
533
+ display: flex;
534
+ align-items: center;
535
+ justify-content: center;
536
+ width: 20px;
537
+ height: 20px;
538
+ background: transparent;
539
+ border: none;
540
+ color: var(--text-muted);
541
+ cursor: pointer;
542
+ border-radius: var(--radius-sm);
543
+ margin-left: auto;
544
+ transition: all var(--transition-fast);
545
+ }
546
+
547
+ .btn-icon-small:hover {
548
+ background: var(--bg-tertiary);
549
+ color: var(--text-primary);
550
+ }
551
+
552
+ /* Stats Panel */
553
+ .stats-date {
554
+ font-family: var(--font-mono);
555
+ font-size: 11px;
556
+ color: var(--text-muted);
557
+ padding: 0 var(--space-2);
558
+ margin-bottom: var(--space-2);
559
+ }
560
+
561
+ .stats-list {
562
+ display: flex;
563
+ flex-direction: column;
564
+ gap: var(--space-2);
565
+ flex: 1;
566
+ overflow-y: auto;
567
+ }
568
+
569
+ .stats-loading {
570
+ display: flex;
571
+ align-items: center;
572
+ gap: var(--space-2);
573
+ padding: var(--space-3);
574
+ color: var(--text-muted);
575
+ font-size: 12px;
576
+ }
577
+
578
+ .stats-loading-icon {
579
+ animation: spin 1s linear infinite;
580
+ }
581
+
582
+ .stats-item {
583
+ padding: var(--space-2) var(--space-3);
584
+ background: var(--bg-tertiary);
585
+ border-radius: var(--radius-md);
586
+ border: 1px solid var(--border-default);
587
+ }
588
+
589
+ .stats-item-header {
590
+ display: flex;
591
+ align-items: center;
592
+ justify-content: space-between;
593
+ margin-bottom: var(--space-1);
594
+ }
595
+
596
+ .stats-item-name {
597
+ font-family: var(--font-mono);
598
+ font-size: 11px;
599
+ font-weight: 500;
600
+ color: var(--text-primary);
601
+ white-space: nowrap;
602
+ overflow: hidden;
603
+ text-overflow: ellipsis;
604
+ max-width: 140px;
605
+ }
606
+
607
+ .stats-item-count {
608
+ font-family: var(--font-mono);
609
+ font-size: 10px;
610
+ color: var(--text-muted);
611
+ }
612
+
613
+ .stats-item-bar {
614
+ height: 4px;
615
+ background: var(--bg-elevated);
616
+ border-radius: 2px;
617
+ overflow: hidden;
618
+ }
619
+
620
+ .stats-item-bar-fill {
621
+ height: 100%;
622
+ background: var(--primary-500);
623
+ border-radius: 2px;
624
+ transition: width var(--transition-normal);
625
+ }
626
+
627
+ .stats-item-bar-fill.warning {
628
+ background: var(--warning);
629
+ }
630
+
631
+ .stats-item-bar-fill.danger {
632
+ background: var(--error);
633
+ }
634
+
635
+
636
+
637
+ /* Quick Prompts */
638
+ .prompts-list {
639
+ display: flex;
640
+ flex-direction: column;
641
+ gap: var(--space-1);
642
+ }
643
+
644
+ .prompt-item {
645
+ display: flex;
646
+ align-items: center;
647
+ gap: var(--space-2);
648
+ padding: var(--space-2) var(--space-3);
649
+ background: transparent;
650
+ border: 1px solid transparent;
651
+ border-radius: var(--radius-md);
652
+ font-family: var(--font-sans);
653
+ font-size: 12px;
654
+ color: var(--text-secondary);
655
+ cursor: pointer;
656
+ text-align: left;
657
+ transition: all var(--transition-fast);
658
+ }
659
+
660
+ .prompt-item:hover {
661
+ background: var(--bg-tertiary);
662
+ border-color: var(--border-default);
663
+ color: var(--text-primary);
664
+ }
665
+
666
+ .prompt-icon {
667
+ font-family: var(--font-mono);
668
+ color: var(--primary-500);
669
+ font-size: 10px;
670
+ }
671
+
672
+ /* Stats Info Footer */
673
+ .stats-info {
674
+ display: flex;
675
+ align-items: center;
676
+ gap: var(--space-2);
677
+ }
678
+
679
+ .stats-info-text {
680
+ font-size: 10px;
681
+ color: var(--text-muted);
682
+ font-family: var(--font-mono);
683
+ }
684
+
685
+ /* Conversation Items */
686
+ .conversations-list {
687
+ margin-top: var(--space-2);
688
+ }
689
+
690
+ .conversation-item {
691
+ display: flex;
692
+ align-items: center;
693
+ gap: var(--space-2);
694
+ padding: var(--space-2) var(--space-3);
695
+ border-radius: var(--radius-md);
696
+ cursor: pointer;
697
+ transition: all var(--transition-fast);
698
+ margin-bottom: 2px;
699
+ }
700
+
701
+ .conversation-info {
702
+ flex: 1;
703
+ display: flex;
704
+ align-items: center;
705
+ gap: var(--space-2);
706
+ min-width: 0;
707
+ }
708
+
709
+ .conversation-item .token-count {
710
+ font-family: var(--font-mono);
711
+ font-size: 9px;
712
+ padding: 2px 5px;
713
+ background: var(--bg-tertiary);
714
+ border-radius: 3px;
715
+ color: var(--text-muted);
716
+ flex-shrink: 0;
717
+ }
718
+
719
+ .conversation-item .token-count.token-warning {
720
+ background: rgba(245, 158, 11, 0.2);
721
+ color: var(--warning);
722
+ }
723
+
724
+ .conversation-item .token-count.token-exceeded {
725
+ background: rgba(239, 68, 68, 0.2);
726
+ color: var(--error);
727
+ }
728
+
729
+ .conversation-item:hover {
730
+ background: var(--bg-tertiary);
731
+ }
732
+
733
+ .conversation-item.active {
734
+ background: rgba(0, 212, 170, 0.1);
735
+ border-left: 2px solid var(--primary-500);
736
+ padding-left: calc(var(--space-3) - 2px);
737
+ }
738
+
739
+ .conversation-item .title {
740
+ flex: 1;
741
+ font-size: 13px;
742
+ color: var(--text-secondary);
743
+ white-space: nowrap;
744
+ overflow: hidden;
745
+ text-overflow: ellipsis;
746
+ }
747
+
748
+ .conversation-item.active .title {
749
+ color: var(--text-primary);
750
+ }
751
+
752
+ .conversation-item .delete-btn {
753
+ opacity: 0;
754
+ padding: 4px;
755
+ background: transparent;
756
+ border: none;
757
+ color: var(--text-muted);
758
+ cursor: pointer;
759
+ border-radius: 3px;
760
+ transition: all var(--transition-fast);
761
+ font-size: 14px;
762
+ line-height: 1;
763
+ }
764
+
765
+ .conversation-item:hover .delete-btn {
766
+ opacity: 1;
767
+ }
768
+
769
+ .conversation-item .delete-btn:hover {
770
+ background: var(--accent-dim);
771
+ color: var(--accent);
772
+ }
773
+
774
+ /* Sidebar Footer */
775
+ .sidebar-footer {
776
+ padding: var(--space-4);
777
+ border-top: 1px solid var(--border-default);
778
+ }
779
+
780
+ .session-info {
781
+ display: flex;
782
+ align-items: center;
783
+ gap: var(--space-2);
784
+ font-size: 11px;
785
+ color: var(--text-muted);
786
+ }
787
+
788
+ .session-icon {
789
+ color: var(--success);
790
+ font-size: 8px;
791
+ }
792
+
793
+ /* ============================================
794
+ Chat Area
795
+ ============================================ */
796
+ .chat-area {
797
+ flex: 1;
798
+ display: flex;
799
+ flex-direction: column;
800
+ overflow: hidden;
801
+ background: var(--bg-primary);
802
+ }
803
+
804
+ .messages-container {
805
+ flex: 1;
806
+ overflow: hidden;
807
+ position: relative;
808
+ }
809
+
810
+ .messages {
811
+ height: 100%;
812
+ overflow-y: auto;
813
+ padding: var(--space-8);
814
+ scroll-behavior: smooth;
815
+ }
816
+
817
+ /* ============================================
818
+ Welcome Message
819
+ ============================================ */
820
+ .welcome-message {
821
+ display: flex;
822
+ align-items: center;
823
+ justify-content: center;
824
+ min-height: 100%;
825
+ padding: var(--space-12);
826
+ }
827
+
828
+ .welcome-content {
829
+ text-align: center;
830
+ max-width: 500px;
831
+ animation: fade-in 0.4s ease-out;
832
+ }
833
+
834
+ @keyframes fade-in {
835
+ from {
836
+ opacity: 0;
837
+ transform: translateY(10px);
838
+ }
839
+ to {
840
+ opacity: 1;
841
+ transform: translateY(0);
842
+ }
843
+ }
844
+
845
+ .welcome-glyph {
846
+ position: relative;
847
+ display: inline-flex;
848
+ align-items: center;
849
+ justify-content: center;
850
+ width: 72px;
851
+ height: 72px;
852
+ margin-bottom: var(--space-6);
853
+ }
854
+
855
+ .glyph-main {
856
+ font-size: 32px;
857
+ z-index: 2;
858
+ }
859
+
860
+ .glyph-ring {
861
+ position: absolute;
862
+ inset: 0;
863
+ border: 2px solid var(--primary-500);
864
+ border-radius: 50%;
865
+ opacity: 0.5;
866
+ }
867
+
868
+ .welcome-title {
869
+ font-family: var(--font-mono);
870
+ font-size: 24px;
871
+ font-weight: 600;
872
+ color: var(--text-primary);
873
+ margin-bottom: var(--space-2);
874
+ }
875
+
876
+ .title-prefix {
877
+ color: var(--text-muted);
878
+ }
879
+
880
+ .welcome-subtitle {
881
+ font-size: 14px;
882
+ color: var(--text-secondary);
883
+ margin-bottom: var(--space-8);
884
+ }
885
+
886
+ /* Feature Cards */
887
+ .welcome-features {
888
+ display: flex;
889
+ flex-direction: column;
890
+ gap: var(--space-2);
891
+ margin-bottom: var(--space-8);
892
+ }
893
+
894
+ .feature-card {
895
+ display: flex;
896
+ align-items: flex-start;
897
+ gap: var(--space-3);
898
+ padding: var(--space-3) var(--space-4);
899
+ background: var(--bg-secondary);
900
+ border: 1px solid var(--border-default);
901
+ border-radius: var(--radius-md);
902
+ text-align: left;
903
+ transition: all var(--transition-fast);
904
+ }
905
+
906
+ .feature-card:hover {
907
+ border-color: var(--primary-500);
908
+ background: var(--bg-tertiary);
909
+ }
910
+
911
+ .feature-icon {
912
+ font-family: var(--font-mono);
913
+ color: var(--primary-500);
914
+ font-size: 14px;
915
+ font-weight: 600;
916
+ }
917
+
918
+ .feature-title {
919
+ font-weight: 600;
920
+ font-size: 13px;
921
+ color: var(--text-primary);
922
+ margin-bottom: 2px;
923
+ }
924
+
925
+ .feature-desc {
926
+ font-size: 12px;
927
+ color: var(--text-muted);
928
+ }
929
+
930
+ /* Hints */
931
+ .welcome-hints {
932
+ display: flex;
933
+ justify-content: center;
934
+ gap: var(--space-6);
935
+ flex-wrap: wrap;
936
+ }
937
+
938
+ .hint {
939
+ display: flex;
940
+ align-items: center;
941
+ gap: var(--space-2);
942
+ font-size: 12px;
943
+ color: var(--text-muted);
944
+ }
945
+
946
+ .hint kbd {
947
+ padding: 3px 6px;
948
+ background: var(--bg-tertiary);
949
+ border: 1px solid var(--border-default);
950
+ border-radius: 4px;
951
+ font-family: var(--font-mono);
952
+ font-size: 11px;
953
+ color: var(--text-secondary);
954
+ }
955
+
956
+ /* ============================================
957
+ Messages
958
+ ============================================ */
959
+ .message {
960
+ display: flex;
961
+ gap: var(--space-4);
962
+ margin-bottom: var(--space-6);
963
+ animation: message-in 0.2s ease-out;
964
+ }
965
+
966
+ @keyframes message-in {
967
+ from {
968
+ opacity: 0;
969
+ transform: translateY(8px);
970
+ }
971
+ to {
972
+ opacity: 1;
973
+ transform: translateY(0);
974
+ }
975
+ }
976
+
977
+ .message-avatar {
978
+ width: 32px;
979
+ height: 32px;
980
+ border-radius: var(--radius-md);
981
+ display: flex;
982
+ align-items: center;
983
+ justify-content: center;
984
+ font-size: 14px;
985
+ flex-shrink: 0;
986
+ font-family: var(--font-mono);
987
+ }
988
+
989
+ .message.user .message-avatar {
990
+ background: rgba(255, 184, 0, 0.15);
991
+ border: 1px solid var(--secondary-500);
992
+ color: var(--secondary-500);
993
+ }
994
+
995
+ .message.assistant .message-avatar {
996
+ background: rgba(0, 212, 170, 0.15);
997
+ border: 1px solid var(--primary-500);
998
+ color: var(--primary-500);
999
+ }
1000
+
1001
+ .message-content {
1002
+ flex: 1;
1003
+ min-width: 0;
1004
+ }
1005
+
1006
+ .message-header {
1007
+ display: flex;
1008
+ align-items: center;
1009
+ gap: var(--space-2);
1010
+ margin-bottom: var(--space-1);
1011
+ }
1012
+
1013
+ .message-role {
1014
+ font-family: var(--font-mono);
1015
+ font-size: 12px;
1016
+ font-weight: 600;
1017
+ }
1018
+
1019
+ .message.user .message-role {
1020
+ color: var(--secondary-500);
1021
+ }
1022
+
1023
+ .message.assistant .message-role {
1024
+ color: var(--primary-500);
1025
+ }
1026
+
1027
+ .message-time {
1028
+ font-family: var(--font-mono);
1029
+ font-size: 11px;
1030
+ color: var(--text-muted);
1031
+ }
1032
+
1033
+ .message-body {
1034
+ padding: var(--space-4);
1035
+ background: var(--bg-secondary);
1036
+ border: 1px solid var(--border-default);
1037
+ border-radius: var(--radius-lg);
1038
+ font-size: 14px;
1039
+ line-height: 1.7;
1040
+ }
1041
+
1042
+ .message.user .message-body {
1043
+ background: var(--user-msg-bg);
1044
+ border-color: var(--user-msg-border);
1045
+ }
1046
+
1047
+ /* Markdown in messages */
1048
+ .message-body p {
1049
+ margin-bottom: var(--space-4);
1050
+ }
1051
+
1052
+ .message-body p:last-child {
1053
+ margin-bottom: 0;
1054
+ }
1055
+
1056
+ .message-body pre {
1057
+ margin: 0;
1058
+ padding: var(--space-4);
1059
+ background: var(--bg-primary);
1060
+ border: none;
1061
+ border-radius: 0 0 var(--radius-md) var(--radius-md);
1062
+ overflow-x: auto;
1063
+ }
1064
+
1065
+ .message-body code {
1066
+ font-family: var(--font-mono);
1067
+ font-size: 13px;
1068
+ }
1069
+
1070
+ .message-body :not(pre) > code {
1071
+ padding: 2px 6px;
1072
+ background: var(--bg-tertiary);
1073
+ border-radius: 4px;
1074
+ color: var(--primary-400);
1075
+ }
1076
+
1077
+ /* Enhanced Code Blocks */
1078
+ /* zero-md web component styling */
1079
+ zero-md {
1080
+ display: block;
1081
+ margin: var(--space-2) 0;
1082
+ }
1083
+
1084
+ /* Override zero-md default styles to match chat theme */
1085
+ zero-md::part(markdown-styles) {
1086
+ color: var(--text-primary);
1087
+ font-family: var(--font-sans);
1088
+ }
1089
+
1090
+ /* Ensure code blocks in zero-md match our theme */
1091
+ zero-md pre {
1092
+ background: var(--bg-secondary) !important;
1093
+ border: 1px solid var(--border-default);
1094
+ border-radius: var(--radius-md);
1095
+ padding: var(--space-4);
1096
+ overflow-x: auto;
1097
+ }
1098
+
1099
+ zero-md code {
1100
+ font-family: var(--font-mono) !important;
1101
+ font-size: 13px;
1102
+ }
1103
+
1104
+ zero-md a {
1105
+ color: var(--accent-primary);
1106
+ }
1107
+
1108
+ zero-md table {
1109
+ border-collapse: collapse;
1110
+ width: 100%;
1111
+ margin: var(--space-3) 0;
1112
+ }
1113
+
1114
+ zero-md th,
1115
+ zero-md td {
1116
+ border: 1px solid var(--border-default);
1117
+ padding: var(--space-2) var(--space-3);
1118
+ text-align: left;
1119
+ }
1120
+
1121
+ zero-md th {
1122
+ background: var(--bg-secondary);
1123
+ font-weight: 600;
1124
+ }
1125
+
1126
+ /* Enhanced Tables */
1127
+ .table-wrapper {
1128
+ margin: var(--space-4) 0;
1129
+ overflow-x: auto;
1130
+ border: 1px solid var(--border-default);
1131
+ border-radius: var(--radius-md);
1132
+ }
1133
+
1134
+ .enhanced-table {
1135
+ width: 100%;
1136
+ border-collapse: collapse;
1137
+ font-size: 13px;
1138
+ }
1139
+
1140
+ .enhanced-table th,
1141
+ .enhanced-table td {
1142
+ padding: var(--space-2) var(--space-3);
1143
+ text-align: left;
1144
+ border-bottom: 1px solid var(--border-default);
1145
+ }
1146
+
1147
+ .enhanced-table th {
1148
+ background: var(--bg-tertiary);
1149
+ font-weight: 600;
1150
+ color: var(--text-primary);
1151
+ }
1152
+
1153
+ .enhanced-table tr:last-child td {
1154
+ border-bottom: none;
1155
+ }
1156
+
1157
+ .enhanced-table tr:hover td {
1158
+ background: rgba(0, 212, 170, 0.05);
1159
+ }
1160
+
1161
+ .message-body ul, .message-body ol {
1162
+ margin: var(--space-4) 0;
1163
+ padding-left: var(--space-6);
1164
+ }
1165
+
1166
+ .message-body li {
1167
+ margin-bottom: var(--space-1);
1168
+ }
1169
+
1170
+ .message-body blockquote {
1171
+ margin: var(--space-4) 0;
1172
+ padding-left: var(--space-4);
1173
+ border-left: 3px solid var(--primary-500);
1174
+ color: var(--text-secondary);
1175
+ }
1176
+
1177
+ .message-body a {
1178
+ color: var(--text-link);
1179
+ text-decoration: none;
1180
+ }
1181
+
1182
+ .message-body a:hover {
1183
+ text-decoration: underline;
1184
+ }
1185
+
1186
+ .message-body h1, .message-body h2, .message-body h3, .message-body h4 {
1187
+ font-family: var(--font-sans);
1188
+ font-weight: 600;
1189
+ margin-top: var(--space-6);
1190
+ margin-bottom: var(--space-3);
1191
+ color: var(--text-primary);
1192
+ }
1193
+
1194
+ .message-body h1 { font-size: 20px; }
1195
+ .message-body h2 { font-size: 18px; }
1196
+ .message-body h3 { font-size: 16px; }
1197
+ .message-body h4 { font-size: 14px; }
1198
+
1199
+ /* Streaming Cursor */
1200
+ .streaming-cursor {
1201
+ display: inline-block;
1202
+ width: 2px;
1203
+ height: 16px;
1204
+ background: var(--primary-500);
1205
+ margin-left: 2px;
1206
+ vertical-align: text-bottom;
1207
+ animation: cursor-blink 0.8s ease-in-out infinite;
1208
+ }
1209
+
1210
+ @keyframes cursor-blink {
1211
+ 0%, 50% { opacity: 1; }
1212
+ 51%, 100% { opacity: 0; }
1213
+ }
1214
+
1215
+ /* Message Error */
1216
+ .message-error {
1217
+ margin-top: var(--space-3);
1218
+ padding: var(--space-2) var(--space-3);
1219
+ background: var(--accent-dim);
1220
+ border: 1px solid rgba(255, 107, 107, 0.3);
1221
+ border-radius: var(--radius-md);
1222
+ color: var(--accent);
1223
+ font-size: 13px;
1224
+ }
1225
+
1226
+ /* Loading Message */
1227
+ .loading-message {
1228
+ display: flex;
1229
+ align-items: center;
1230
+ gap: 4px;
1231
+ padding: var(--space-2) 0;
1232
+ }
1233
+
1234
+ .loading-dot {
1235
+ width: 8px;
1236
+ height: 8px;
1237
+ background: var(--primary-500);
1238
+ border-radius: 50%;
1239
+ animation: loading-bounce 1.4s ease-in-out infinite both;
1240
+ }
1241
+
1242
+ .loading-dot:nth-child(1) {
1243
+ animation-delay: -0.32s;
1244
+ }
1245
+
1246
+ .loading-dot:nth-child(2) {
1247
+ animation-delay: -0.16s;
1248
+ }
1249
+
1250
+ .loading-dot:nth-child(3) {
1251
+ animation-delay: 0s;
1252
+ }
1253
+
1254
+ @keyframes loading-bounce {
1255
+ 0%, 80%, 100% {
1256
+ transform: scale(0.6);
1257
+ opacity: 0.4;
1258
+ }
1259
+ 40% {
1260
+ transform: scale(1);
1261
+ opacity: 1;
1262
+ }
1263
+ }
1264
+
1265
+ /* Token Limit Warning */
1266
+ .token-limit-warning {
1267
+ display: flex;
1268
+ align-items: center;
1269
+ gap: var(--space-2);
1270
+ padding: var(--space-2) var(--space-4);
1271
+ background: rgba(239, 68, 68, 0.1);
1272
+ border: 1px solid rgba(239, 68, 68, 0.3);
1273
+ border-radius: var(--radius-md);
1274
+ margin-bottom: var(--space-3);
1275
+ font-size: 12px;
1276
+ color: var(--error);
1277
+ }
1278
+
1279
+ .token-limit-warning .warning-icon {
1280
+ flex-shrink: 0;
1281
+ }
1282
+
1283
+ /* ============================================
1284
+ Input Area
1285
+ ============================================ */
1286
+ .input-area {
1287
+ padding: var(--space-4) var(--space-8) var(--space-6);
1288
+ background: var(--bg-primary);
1289
+ border-top: 1px solid var(--border-muted);
1290
+ }
1291
+
1292
+ /* Input Selectors (Agent & Model) */
1293
+ .input-selectors {
1294
+ display: flex;
1295
+ align-items: center;
1296
+ gap: var(--space-4);
1297
+ margin-bottom: var(--space-2);
1298
+ flex-wrap: wrap;
1299
+ }
1300
+
1301
+ .selector-group {
1302
+ display: flex;
1303
+ align-items: center;
1304
+ gap: var(--space-2);
1305
+ }
1306
+
1307
+ .selector-label {
1308
+ display: flex;
1309
+ align-items: center;
1310
+ gap: var(--space-1);
1311
+ font-family: var(--font-mono);
1312
+ font-size: 11px;
1313
+ color: var(--text-muted);
1314
+ }
1315
+
1316
+ .selector-label svg {
1317
+ opacity: 0.7;
1318
+ }
1319
+
1320
+ .selector-select {
1321
+ appearance: none;
1322
+ padding: var(--space-1) var(--space-3) var(--space-1) var(--space-2);
1323
+ background: var(--bg-tertiary);
1324
+ border: 1px solid var(--border-default);
1325
+ border-radius: var(--radius-md);
1326
+ font-family: var(--font-mono);
1327
+ font-size: 11px;
1328
+ color: var(--text-primary);
1329
+ cursor: pointer;
1330
+ transition: all var(--transition-fast);
1331
+ min-width: 140px;
1332
+ }
1333
+
1334
+ .selector-select:hover {
1335
+ border-color: var(--text-muted);
1336
+ }
1337
+
1338
+ .selector-select:focus {
1339
+ outline: none;
1340
+ border-color: var(--primary-500);
1341
+ }
1342
+
1343
+ .selector-select:disabled {
1344
+ opacity: 0.5;
1345
+ cursor: not-allowed;
1346
+ }
1347
+
1348
+ .selector-divider {
1349
+ width: 1px;
1350
+ height: 16px;
1351
+ background: var(--border-default);
1352
+ }
1353
+
1354
+ /* Legacy styles - keep for compatibility */
1355
+ .input-model-selector {
1356
+ display: flex;
1357
+ align-items: center;
1358
+ margin-bottom: var(--space-2);
1359
+ }
1360
+
1361
+ .model-selector-inline {
1362
+ display: flex;
1363
+ align-items: center;
1364
+ gap: var(--space-2);
1365
+ }
1366
+
1367
+ .model-label-inline {
1368
+ display: flex;
1369
+ align-items: center;
1370
+ gap: var(--space-1);
1371
+ font-family: var(--font-mono);
1372
+ font-size: 11px;
1373
+ color: var(--text-muted);
1374
+ }
1375
+
1376
+ .model-label-inline svg {
1377
+ opacity: 0.7;
1378
+ }
1379
+
1380
+ .model-select-inline {
1381
+ appearance: none;
1382
+ padding: var(--space-1) var(--space-3) var(--space-1) var(--space-2);
1383
+ background: var(--bg-tertiary);
1384
+ border: 1px solid var(--border-default);
1385
+ border-radius: var(--radius-md);
1386
+ font-family: var(--font-mono);
1387
+ font-size: 11px;
1388
+ color: var(--text-primary);
1389
+ cursor: pointer;
1390
+ transition: all var(--transition-fast);
1391
+ }
1392
+
1393
+ .model-select-inline:hover {
1394
+ border-color: var(--text-muted);
1395
+ }
1396
+
1397
+ .model-select-inline:focus {
1398
+ outline: none;
1399
+ border-color: var(--primary-500);
1400
+ }
1401
+
1402
+ .model-select-inline:disabled {
1403
+ opacity: 0.5;
1404
+ cursor: not-allowed;
1405
+ }
1406
+
1407
+ .input-container {
1408
+ display: flex;
1409
+ align-items: flex-end;
1410
+ gap: 0;
1411
+ background: var(--bg-secondary);
1412
+ border: 1px solid var(--border-default);
1413
+ border-radius: var(--radius-lg);
1414
+ transition: all var(--transition-fast);
1415
+ }
1416
+
1417
+ .input-container:focus-within {
1418
+ border-color: var(--primary-500);
1419
+ box-shadow: 0 0 0 2px rgba(0, 212, 170, 0.2);
1420
+ }
1421
+
1422
+ .input-prefix {
1423
+ display: flex;
1424
+ align-items: center;
1425
+ justify-content: center;
1426
+ width: 44px;
1427
+ height: 44px;
1428
+ flex-shrink: 0;
1429
+ }
1430
+
1431
+ .prefix-symbol {
1432
+ font-family: var(--font-mono);
1433
+ font-size: 16px;
1434
+ font-weight: 700;
1435
+ color: var(--primary-500);
1436
+ }
1437
+
1438
+ #message-input {
1439
+ flex: 1;
1440
+ min-height: var(--input-min-height);
1441
+ max-height: 200px;
1442
+ padding: var(--space-3) 0;
1443
+ background: transparent;
1444
+ border: none;
1445
+ font-family: var(--font-sans);
1446
+ font-size: 14px;
1447
+ color: var(--text-primary);
1448
+ resize: none;
1449
+ line-height: 1.6;
1450
+ }
1451
+
1452
+ #message-input::placeholder {
1453
+ color: var(--text-muted);
1454
+ }
1455
+
1456
+ #message-input:focus {
1457
+ outline: none;
1458
+ }
1459
+
1460
+ .input-actions {
1461
+ display: flex;
1462
+ align-items: center;
1463
+ gap: var(--space-2);
1464
+ padding: var(--space-1) var(--space-2);
1465
+ }
1466
+
1467
+ .char-count {
1468
+ font-family: var(--font-mono);
1469
+ font-size: 10px;
1470
+ color: var(--text-muted);
1471
+ min-width: 40px;
1472
+ text-align: right;
1473
+ }
1474
+
1475
+ .btn-send {
1476
+ display: flex;
1477
+ align-items: center;
1478
+ justify-content: center;
1479
+ width: 36px;
1480
+ height: 36px;
1481
+ background: var(--primary-500);
1482
+ border: none;
1483
+ border-radius: var(--radius-md);
1484
+ color: var(--bg-primary);
1485
+ cursor: pointer;
1486
+ transition: all var(--transition-fast);
1487
+ }
1488
+
1489
+ .btn-send:hover:not(:disabled) {
1490
+ background: var(--primary-600);
1491
+ transform: translateX(2px);
1492
+ }
1493
+
1494
+ .btn-send:disabled {
1495
+ background: var(--bg-tertiary);
1496
+ color: var(--text-muted);
1497
+ cursor: not-allowed;
1498
+ }
1499
+
1500
+ .input-footer {
1501
+ display: flex;
1502
+ justify-content: center;
1503
+ margin-top: var(--space-2);
1504
+ }
1505
+
1506
+ .footer-hint {
1507
+ font-size: 11px;
1508
+ color: var(--text-muted);
1509
+ }
1510
+
1511
+ /* ============================================
1512
+ Modal
1513
+ ============================================ */
1514
+ .modal {
1515
+ position: fixed;
1516
+ inset: 0;
1517
+ z-index: 1000;
1518
+ display: flex;
1519
+ align-items: center;
1520
+ justify-content: center;
1521
+ animation: modal-in 0.2s ease-out;
1522
+ }
1523
+
1524
+ .modal.hidden {
1525
+ display: none;
1526
+ }
1527
+
1528
+ @keyframes modal-in {
1529
+ from { opacity: 0; }
1530
+ to { opacity: 1; }
1531
+ }
1532
+
1533
+ .modal-backdrop {
1534
+ position: absolute;
1535
+ inset: 0;
1536
+ background: rgba(0, 0, 0, 0.7);
1537
+ backdrop-filter: blur(4px);
1538
+ -webkit-backdrop-filter: blur(4px);
1539
+ }
1540
+
1541
+ .modal-content {
1542
+ position: relative;
1543
+ max-width: 400px;
1544
+ padding: var(--space-8);
1545
+ background: var(--bg-secondary);
1546
+ border: 1px solid var(--border-default);
1547
+ border-radius: var(--radius-xl);
1548
+ text-align: center;
1549
+ box-shadow: var(--shadow-lg);
1550
+ animation: modal-content-in 0.25s ease-out;
1551
+ }
1552
+
1553
+ @keyframes modal-content-in {
1554
+ from {
1555
+ opacity: 0;
1556
+ transform: scale(0.95) translateY(10px);
1557
+ }
1558
+ to {
1559
+ opacity: 1;
1560
+ transform: scale(1) translateY(0);
1561
+ }
1562
+ }
1563
+
1564
+ .modal-icon {
1565
+ display: flex;
1566
+ align-items: center;
1567
+ justify-content: center;
1568
+ width: 56px;
1569
+ height: 56px;
1570
+ margin: 0 auto var(--space-5);
1571
+ background: var(--accent-dim);
1572
+ border: 1px solid rgba(255, 107, 107, 0.3);
1573
+ border-radius: 50%;
1574
+ color: var(--accent);
1575
+ }
1576
+
1577
+ .modal-title {
1578
+ font-family: var(--font-sans);
1579
+ font-size: 18px;
1580
+ font-weight: 600;
1581
+ color: var(--text-primary);
1582
+ margin-bottom: var(--space-2);
1583
+ }
1584
+
1585
+ .modal-message {
1586
+ font-size: 14px;
1587
+ color: var(--text-secondary);
1588
+ margin-bottom: var(--space-6);
1589
+ line-height: 1.6;
1590
+ }
1591
+
1592
+ .modal-actions {
1593
+ display: flex;
1594
+ justify-content: center;
1595
+ }
1596
+
1597
+ .btn {
1598
+ padding: var(--space-2) var(--space-6);
1599
+ font-family: var(--font-sans);
1600
+ font-size: 14px;
1601
+ font-weight: 500;
1602
+ border: none;
1603
+ border-radius: var(--radius-md);
1604
+ cursor: pointer;
1605
+ transition: all var(--transition-fast);
1606
+ }
1607
+
1608
+ .btn-primary {
1609
+ background: var(--primary-500);
1610
+ color: var(--bg-primary);
1611
+ }
1612
+
1613
+ .btn-primary:hover {
1614
+ background: var(--primary-600);
1615
+ }
1616
+
1617
+ /* ============================================
1618
+ Loading Overlay
1619
+ ============================================ */
1620
+ .loading-overlay {
1621
+ position: fixed;
1622
+ inset: 0;
1623
+ z-index: 2000;
1624
+ display: flex;
1625
+ align-items: center;
1626
+ justify-content: center;
1627
+ background: var(--bg-primary);
1628
+ transition: opacity 0.3s ease;
1629
+ }
1630
+
1631
+ .loading-overlay.hidden {
1632
+ opacity: 0;
1633
+ pointer-events: none;
1634
+ }
1635
+
1636
+ .loading-content {
1637
+ text-align: center;
1638
+ }
1639
+
1640
+ .loading-spinner {
1641
+ position: relative;
1642
+ width: 64px;
1643
+ height: 64px;
1644
+ margin: 0 auto var(--space-5);
1645
+ }
1646
+
1647
+ .spinner-ring {
1648
+ position: absolute;
1649
+ inset: 0;
1650
+ border: 2px solid var(--border-default);
1651
+ border-top-color: var(--primary-500);
1652
+ border-radius: 50%;
1653
+ animation: spin 1s linear infinite;
1654
+ }
1655
+
1656
+ @keyframes spin {
1657
+ to { transform: rotate(360deg); }
1658
+ }
1659
+
1660
+ .spinner-core {
1661
+ position: absolute;
1662
+ inset: 0;
1663
+ display: flex;
1664
+ align-items: center;
1665
+ justify-content: center;
1666
+ font-size: 20px;
1667
+ }
1668
+
1669
+ .loading-text {
1670
+ font-family: var(--font-mono);
1671
+ font-size: 13px;
1672
+ color: var(--text-secondary);
1673
+ }
1674
+
1675
+ .loading-dots::after {
1676
+ content: '';
1677
+ animation: dots 1.5s steps(4, end) infinite;
1678
+ }
1679
+
1680
+ @keyframes dots {
1681
+ 0%, 20% { content: ''; }
1682
+ 40% { content: '.'; }
1683
+ 60% { content: '..'; }
1684
+ 80%, 100% { content: '...'; }
1685
+ }
1686
+
1687
+ /* ============================================
1688
+ Scrollbar
1689
+ ============================================ */
1690
+ ::-webkit-scrollbar {
1691
+ width: 8px;
1692
+ height: 8px;
1693
+ }
1694
+
1695
+ ::-webkit-scrollbar-track {
1696
+ background: transparent;
1697
+ }
1698
+
1699
+ ::-webkit-scrollbar-thumb {
1700
+ background: var(--bg-tertiary);
1701
+ border-radius: 4px;
1702
+ }
1703
+
1704
+ ::-webkit-scrollbar-thumb:hover {
1705
+ background: var(--text-muted);
1706
+ }
1707
+
1708
+ /* ============================================
1709
+ Utility Classes
1710
+ ============================================ */
1711
+ .hidden {
1712
+ display: none !important;
1713
+ }
1714
+
1715
+ /* ============================================
1716
+ Responsive
1717
+ ============================================ */
1718
+ @media (max-width: 900px) {
1719
+ .sidebar-left {
1720
+ display: none;
1721
+ }
1722
+
1723
+ .sidebar-right {
1724
+ display: none;
1725
+ }
1726
+
1727
+ .header {
1728
+ padding: 0 var(--space-4);
1729
+ }
1730
+
1731
+ .messages {
1732
+ padding: var(--space-6);
1733
+ }
1734
+
1735
+ .input-area {
1736
+ padding: var(--space-4);
1737
+ }
1738
+
1739
+ .welcome-features {
1740
+ display: none;
1741
+ }
1742
+
1743
+ .welcome-hints {
1744
+ flex-direction: column;
1745
+ gap: var(--space-2);
1746
+ }
1747
+ }
1748
+
1749
+ @media (max-width: 600px) {
1750
+ .header-left {
1751
+ gap: var(--space-2);
1752
+ }
1753
+
1754
+ .logo-text {
1755
+ display: none;
1756
+ }
1757
+
1758
+ .connection-status {
1759
+ display: none;
1760
+ }
1761
+
1762
+ .model-label-inline {
1763
+ display: none;
1764
+ }
1765
+
1766
+ .model-select-inline {
1767
+ font-size: 10px;
1768
+ }
1769
+
1770
+ .input-model-selector {
1771
+ justify-content: center;
1772
+ }
1773
+
1774
+ .welcome-title {
1775
+ font-size: 20px;
1776
+ }
1777
+
1778
+ .welcome-glyph {
1779
+ width: 56px;
1780
+ height: 56px;
1781
+ }
1782
+
1783
+ .glyph-main {
1784
+ font-size: 24px;
1785
+ }
1786
+
1787
+ .input-prefix {
1788
+ width: 36px;
1789
+ }
1790
+
1791
+ .message {
1792
+ gap: var(--space-3);
1793
+ }
1794
+
1795
+ .message-avatar {
1796
+ width: 28px;
1797
+ height: 28px;
1798
+ font-size: 12px;
1799
+ }
1800
+
1801
+ .message-body {
1802
+ padding: var(--space-3);
1803
+ }
1804
+ }
1805
+
1806
+ /* Message Copy Button */
1807
+ .message-meta {
1808
+ display: flex;
1809
+ align-items: center;
1810
+ gap: 8px;
1811
+ }
1812
+
1813
+ .message-copy-btn {
1814
+ display: flex;
1815
+ align-items: center;
1816
+ justify-content: center;
1817
+ width: 24px;
1818
+ height: 24px;
1819
+ padding: 4px;
1820
+ border: none;
1821
+ background: transparent;
1822
+ color: var(--text-secondary);
1823
+ cursor: pointer;
1824
+ border-radius: 4px;
1825
+ transition: all 0.2s ease;
1826
+ opacity: 0;
1827
+ }
1828
+
1829
+ .message:hover .message-copy-btn {
1830
+ opacity: 1;
1831
+ }
1832
+
1833
+ .message-copy-btn:hover {
1834
+ background: var(--bg-elevated);
1835
+ color: var(--text-primary);
1836
+ }
1837
+
1838
+ .message-copy-btn.copied {
1839
+ color: var(--success);
1840
+ }
1841
+
1842
+ /* ============================================
1843
+ Theme Toggle Button
1844
+ ============================================ */
1845
+ .btn-theme-toggle {
1846
+ display: flex;
1847
+ align-items: center;
1848
+ justify-content: center;
1849
+ width: 36px;
1850
+ height: 36px;
1851
+ background: transparent;
1852
+ border: 1px solid var(--border-default);
1853
+ border-radius: var(--radius-md);
1854
+ color: var(--text-secondary);
1855
+ cursor: pointer;
1856
+ transition: all var(--transition-fast);
1857
+ }
1858
+
1859
+ .btn-theme-toggle:hover {
1860
+ background: var(--bg-tertiary);
1861
+ border-color: var(--text-muted);
1862
+ color: var(--text-primary);
1863
+ }
1864
+
1865
+ .btn-theme-toggle .icon-sun,
1866
+ .btn-theme-toggle .icon-moon {
1867
+ width: 18px;
1868
+ height: 18px;
1869
+ }
1870
+
1871
+ /* Show moon in dark mode, sun in light mode */
1872
+ [data-theme="dark"] .btn-theme-toggle .icon-sun,
1873
+ :root:not([data-theme]) .btn-theme-toggle .icon-sun {
1874
+ display: none;
1875
+ }
1876
+
1877
+ [data-theme="dark"] .btn-theme-toggle .icon-moon,
1878
+ :root:not([data-theme]) .btn-theme-toggle .icon-moon {
1879
+ display: block;
1880
+ }
1881
+
1882
+ [data-theme="light"] .btn-theme-toggle .icon-sun {
1883
+ display: block;
1884
+ }
1885
+
1886
+ [data-theme="light"] .btn-theme-toggle .icon-moon {
1887
+ display: none;
1888
+ }
1889
+
1890
+ /* Theme transition for smooth color changes */
1891
+ body,
1892
+ .header,
1893
+ .sidebar,
1894
+ .chat-area,
1895
+ .input-area,
1896
+ .message-body,
1897
+ .modal-content,
1898
+ .loading-overlay {
1899
+ transition: background-color var(--transition-normal),
1900
+ border-color var(--transition-normal),
1901
+ color var(--transition-normal);
1902
+ }
1903
+
1904
+ /* ============================================
1905
+ File Mention System
1906
+ ============================================ */
1907
+
1908
+ /* File Autocomplete Dropdown */
1909
+ .file-autocomplete {
1910
+ background: var(--bg-secondary);
1911
+ border: 1px solid var(--border-color);
1912
+ border-radius: var(--radius-lg);
1913
+ margin-bottom: var(--space-2);
1914
+ overflow: hidden;
1915
+ box-shadow: var(--shadow-lg);
1916
+ max-height: 300px;
1917
+ display: flex;
1918
+ flex-direction: column;
1919
+ }
1920
+
1921
+ .file-autocomplete.hidden {
1922
+ display: none;
1923
+ }
1924
+
1925
+ .file-autocomplete-header {
1926
+ display: flex;
1927
+ align-items: center;
1928
+ gap: var(--space-2);
1929
+ padding: var(--space-2) var(--space-3);
1930
+ border-bottom: 1px solid var(--border-color);
1931
+ background: var(--bg-tertiary);
1932
+ font-size: 12px;
1933
+ }
1934
+
1935
+ .autocomplete-icon {
1936
+ font-size: 14px;
1937
+ }
1938
+
1939
+ .autocomplete-title {
1940
+ font-weight: 600;
1941
+ color: var(--text-primary);
1942
+ }
1943
+
1944
+ .autocomplete-hint {
1945
+ margin-left: auto;
1946
+ color: var(--text-tertiary);
1947
+ font-family: var(--font-mono);
1948
+ font-size: 10px;
1949
+ }
1950
+
1951
+ .file-autocomplete-list {
1952
+ overflow-y: auto;
1953
+ max-height: 250px;
1954
+ }
1955
+
1956
+ .file-autocomplete-item {
1957
+ display: flex;
1958
+ align-items: center;
1959
+ gap: var(--space-2);
1960
+ padding: var(--space-2) var(--space-3);
1961
+ cursor: pointer;
1962
+ transition: background-color var(--transition-fast);
1963
+ }
1964
+
1965
+ .file-autocomplete-item:hover {
1966
+ background: var(--bg-hover);
1967
+ }
1968
+
1969
+ .file-autocomplete-item.selected {
1970
+ background: var(--primary-900);
1971
+ border-left: 3px solid var(--primary-500);
1972
+ padding-left: calc(var(--space-3) - 3px);
1973
+ }
1974
+
1975
+ .file-autocomplete-item.selected .file-path {
1976
+ color: var(--primary-400);
1977
+ font-weight: 500;
1978
+ }
1979
+
1980
+ .file-autocomplete-item.selected .file-size {
1981
+ color: var(--text-secondary);
1982
+ }
1983
+
1984
+ .file-autocomplete-item .file-icon {
1985
+ font-size: 14px;
1986
+ flex-shrink: 0;
1987
+ }
1988
+
1989
+ .file-autocomplete-item .file-path {
1990
+ flex: 1;
1991
+ font-family: var(--font-mono);
1992
+ font-size: 12px;
1993
+ color: var(--text-secondary);
1994
+ overflow: hidden;
1995
+ text-overflow: ellipsis;
1996
+ white-space: nowrap;
1997
+ }
1998
+
1999
+ .file-autocomplete-item .file-size {
2000
+ font-family: var(--font-mono);
2001
+ font-size: 10px;
2002
+ color: var(--text-tertiary);
2003
+ flex-shrink: 0;
2004
+ }
2005
+
2006
+ .file-autocomplete-loading,
2007
+ .file-autocomplete-error,
2008
+ .file-autocomplete-empty {
2009
+ display: flex;
2010
+ align-items: center;
2011
+ justify-content: center;
2012
+ gap: var(--space-2);
2013
+ padding: var(--space-4);
2014
+ color: var(--text-tertiary);
2015
+ font-size: 12px;
2016
+ }
2017
+
2018
+ .file-autocomplete-loading .loading-spinner {
2019
+ animation: spin 1s linear infinite;
2020
+ }
2021
+
2022
+ .file-autocomplete-error {
2023
+ color: var(--error);
2024
+ }
2025
+
2026
+ /* Mentioned Files Container */
2027
+ .mentioned-files {
2028
+ background: var(--bg-tertiary);
2029
+ border: 1px solid var(--border-color);
2030
+ border-radius: var(--radius-lg);
2031
+ padding: var(--space-2) var(--space-3);
2032
+ margin-bottom: var(--space-2);
2033
+ }
2034
+
2035
+ .mentioned-files.hidden {
2036
+ display: none;
2037
+ }
2038
+
2039
+ .mentioned-files-header {
2040
+ display: flex;
2041
+ align-items: center;
2042
+ gap: var(--space-2);
2043
+ margin-bottom: var(--space-2);
2044
+ font-size: 12px;
2045
+ }
2046
+
2047
+ .mentioned-icon {
2048
+ font-size: 14px;
2049
+ }
2050
+
2051
+ .mentioned-title {
2052
+ font-weight: 500;
2053
+ color: var(--text-secondary);
2054
+ }
2055
+
2056
+ .mentioned-files-list {
2057
+ display: flex;
2058
+ flex-wrap: wrap;
2059
+ gap: var(--space-2);
2060
+ }
2061
+
2062
+ .mentioned-file-badge {
2063
+ display: inline-flex;
2064
+ align-items: center;
2065
+ gap: var(--space-1);
2066
+ background: var(--bg-secondary);
2067
+ border: 1px solid var(--border-color);
2068
+ border-radius: var(--radius-md);
2069
+ padding: var(--space-1) var(--space-2);
2070
+ font-size: 11px;
2071
+ max-width: 200px;
2072
+ }
2073
+
2074
+ .mentioned-file-badge .badge-icon {
2075
+ font-size: 12px;
2076
+ flex-shrink: 0;
2077
+ }
2078
+
2079
+ .mentioned-file-badge .badge-path {
2080
+ font-family: var(--font-mono);
2081
+ color: var(--text-secondary);
2082
+ overflow: hidden;
2083
+ text-overflow: ellipsis;
2084
+ white-space: nowrap;
2085
+ }
2086
+
2087
+ .mentioned-file-badge .badge-remove {
2088
+ background: none;
2089
+ border: none;
2090
+ color: var(--text-tertiary);
2091
+ cursor: pointer;
2092
+ padding: 0 2px;
2093
+ font-size: 14px;
2094
+ line-height: 1;
2095
+ transition: color var(--transition-fast);
2096
+ flex-shrink: 0;
2097
+ }
2098
+
2099
+ .mentioned-file-badge .badge-remove:hover {
2100
+ color: var(--error);
2101
+ }
2102
+
2103
+ /* Light theme adjustments */
2104
+ [data-theme="light"] .file-autocomplete {
2105
+ background: var(--bg-secondary);
2106
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
2107
+ }
2108
+
2109
+ [data-theme="light"] .file-autocomplete-item:hover {
2110
+ background: var(--bg-hover);
2111
+ }
2112
+
2113
+ [data-theme="light"] .file-autocomplete-item.selected {
2114
+ background: var(--primary-100);
2115
+ border-left: 3px solid var(--primary-600);
2116
+ }
2117
+
2118
+ [data-theme="light"] .file-autocomplete-item.selected .file-path {
2119
+ color: var(--primary-700);
2120
+ }
2121
+
2122
+ [data-theme="light"] .mentioned-files {
2123
+ background: var(--bg-tertiary);
2124
+ }
2125
+
2126
+ [data-theme="light"] .mentioned-file-badge {
2127
+ background: white;
2128
+ border-color: var(--border-color);
2129
+ }