@jvittechs/jai1-cli 0.1.96 → 0.1.98

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,1882 @@
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
+ /* Connection Status */
288
+ .connection-status {
289
+ display: flex;
290
+ align-items: center;
291
+ gap: 6px;
292
+ padding: 4px 10px;
293
+ background: var(--bg-tertiary);
294
+ border: 1px solid var(--border-default);
295
+ border-radius: 100px;
296
+ font-family: var(--font-mono);
297
+ font-size: 11px;
298
+ text-transform: uppercase;
299
+ letter-spacing: 0.05em;
300
+ color: var(--text-muted);
301
+ }
302
+
303
+ .status-dot {
304
+ width: 6px;
305
+ height: 6px;
306
+ border-radius: 50%;
307
+ background: var(--success);
308
+ }
309
+
310
+ .connection-status.disconnected .status-dot {
311
+ background: var(--error);
312
+ }
313
+
314
+ /* Header Right */
315
+ .header-right {
316
+ display: flex;
317
+ align-items: center;
318
+ gap: var(--space-4);
319
+ }
320
+
321
+ /* Model Selector */
322
+ .model-selector {
323
+ display: flex;
324
+ align-items: center;
325
+ gap: var(--space-3);
326
+ }
327
+
328
+ .model-label {
329
+ font-family: var(--font-mono);
330
+ font-size: 10px;
331
+ font-weight: 600;
332
+ letter-spacing: 0.1em;
333
+ color: var(--text-muted);
334
+ text-transform: uppercase;
335
+ }
336
+
337
+ .select-wrapper {
338
+ position: relative;
339
+ }
340
+
341
+ .model-select {
342
+ appearance: none;
343
+ padding: var(--space-2) var(--space-8) var(--space-2) var(--space-3);
344
+ background: var(--bg-tertiary);
345
+ border: 1px solid var(--border-default);
346
+ border-radius: var(--radius-md);
347
+ font-family: var(--font-mono);
348
+ font-size: 12px;
349
+ color: var(--text-primary);
350
+ cursor: pointer;
351
+ min-width: 160px;
352
+ transition: border-color var(--transition-fast);
353
+ }
354
+
355
+ .model-select:hover {
356
+ border-color: var(--text-muted);
357
+ }
358
+
359
+ .model-select:focus {
360
+ outline: none;
361
+ border-color: var(--primary-500);
362
+ box-shadow: 0 0 0 2px rgba(0, 212, 170, 0.2);
363
+ }
364
+
365
+ .select-arrow {
366
+ position: absolute;
367
+ right: var(--space-2);
368
+ top: 50%;
369
+ transform: translateY(-50%);
370
+ color: var(--text-muted);
371
+ pointer-events: none;
372
+ font-size: 10px;
373
+ }
374
+
375
+ /* Icon Button */
376
+ .btn-icon {
377
+ display: flex;
378
+ align-items: center;
379
+ justify-content: center;
380
+ width: 36px;
381
+ height: 36px;
382
+ background: transparent;
383
+ border: 1px solid var(--border-default);
384
+ border-radius: var(--radius-md);
385
+ color: var(--text-secondary);
386
+ cursor: pointer;
387
+ transition: all var(--transition-fast);
388
+ }
389
+
390
+ .btn-icon:hover {
391
+ background: var(--bg-tertiary);
392
+ border-color: var(--text-muted);
393
+ color: var(--text-primary);
394
+ }
395
+
396
+ /* ============================================
397
+ Main Layout
398
+ ============================================ */
399
+ .main {
400
+ flex: 1;
401
+ display: flex;
402
+ overflow: hidden;
403
+ }
404
+
405
+ /* ============================================
406
+ Sidebar
407
+ ============================================ */
408
+ .sidebar {
409
+ width: var(--sidebar-width);
410
+ background: var(--bg-secondary);
411
+ border-right: 1px solid var(--border-default);
412
+ display: flex;
413
+ flex-direction: column;
414
+ flex-shrink: 0;
415
+ }
416
+
417
+ .sidebar-left {
418
+ border-right: 1px solid var(--border-default);
419
+ border-left: none;
420
+ }
421
+
422
+ .sidebar-right {
423
+ width: var(--sidebar-right-width);
424
+ border-left: 1px solid var(--border-default);
425
+ border-right: none;
426
+ display: flex;
427
+ flex-direction: column;
428
+ height: 100%;
429
+ }
430
+
431
+ .sidebar-right .sidebar-section {
432
+ flex: none;
433
+ padding: var(--space-3);
434
+ }
435
+
436
+ .sidebar-right .sidebar-section:first-child {
437
+ flex: 1;
438
+ overflow-y: auto;
439
+ min-height: 0;
440
+ display: flex;
441
+ flex-direction: column;
442
+ }
443
+
444
+ .sidebar-right .sidebar-section + .sidebar-section {
445
+ border-top: 1px solid var(--border-default);
446
+ }
447
+
448
+ .sidebar-header {
449
+ padding: var(--space-4);
450
+ border-bottom: 1px solid var(--border-default);
451
+ }
452
+
453
+ .btn-new-chat {
454
+ width: 100%;
455
+ display: flex;
456
+ align-items: center;
457
+ gap: var(--space-2);
458
+ padding: var(--space-2) var(--space-3);
459
+ background: transparent;
460
+ border: 1px solid var(--border-default);
461
+ border-radius: var(--radius-md);
462
+ color: var(--text-primary);
463
+ font-family: var(--font-sans);
464
+ font-size: 13px;
465
+ font-weight: 500;
466
+ cursor: pointer;
467
+ transition: all var(--transition-fast);
468
+ }
469
+
470
+ .btn-new-chat:hover {
471
+ background: var(--bg-tertiary);
472
+ border-color: var(--primary-500);
473
+ color: var(--primary-500);
474
+ }
475
+
476
+ .btn-new-chat .shortcut {
477
+ margin-left: auto;
478
+ padding: 2px 6px;
479
+ background: var(--bg-tertiary);
480
+ border-radius: 3px;
481
+ font-family: var(--font-mono);
482
+ font-size: 10px;
483
+ color: var(--text-muted);
484
+ }
485
+
486
+ /* Sidebar Section */
487
+ .sidebar-section {
488
+ flex: 1;
489
+ overflow-y: auto;
490
+ padding: var(--space-4);
491
+ }
492
+
493
+ .sidebar-section-title {
494
+ display: flex;
495
+ align-items: center;
496
+ gap: var(--space-2);
497
+ padding: var(--space-2) 0;
498
+ font-family: var(--font-mono);
499
+ font-size: 10px;
500
+ font-weight: 600;
501
+ letter-spacing: 0.1em;
502
+ text-transform: uppercase;
503
+ color: var(--text-muted);
504
+ }
505
+
506
+ .section-icon {
507
+ color: var(--primary-500);
508
+ font-size: 10px;
509
+ }
510
+
511
+ /* Small Icon Button */
512
+ .btn-icon-small {
513
+ display: flex;
514
+ align-items: center;
515
+ justify-content: center;
516
+ width: 20px;
517
+ height: 20px;
518
+ background: transparent;
519
+ border: none;
520
+ color: var(--text-muted);
521
+ cursor: pointer;
522
+ border-radius: var(--radius-sm);
523
+ margin-left: auto;
524
+ transition: all var(--transition-fast);
525
+ }
526
+
527
+ .btn-icon-small:hover {
528
+ background: var(--bg-tertiary);
529
+ color: var(--text-primary);
530
+ }
531
+
532
+ /* Stats Panel */
533
+ .stats-date {
534
+ font-family: var(--font-mono);
535
+ font-size: 11px;
536
+ color: var(--text-muted);
537
+ padding: 0 var(--space-2);
538
+ margin-bottom: var(--space-2);
539
+ }
540
+
541
+ .stats-list {
542
+ display: flex;
543
+ flex-direction: column;
544
+ gap: var(--space-2);
545
+ flex: 1;
546
+ overflow-y: auto;
547
+ }
548
+
549
+ .stats-loading {
550
+ display: flex;
551
+ align-items: center;
552
+ gap: var(--space-2);
553
+ padding: var(--space-3);
554
+ color: var(--text-muted);
555
+ font-size: 12px;
556
+ }
557
+
558
+ .stats-loading-icon {
559
+ animation: spin 1s linear infinite;
560
+ }
561
+
562
+ .stats-item {
563
+ padding: var(--space-2) var(--space-3);
564
+ background: var(--bg-tertiary);
565
+ border-radius: var(--radius-md);
566
+ border: 1px solid var(--border-default);
567
+ }
568
+
569
+ .stats-item-header {
570
+ display: flex;
571
+ align-items: center;
572
+ justify-content: space-between;
573
+ margin-bottom: var(--space-1);
574
+ }
575
+
576
+ .stats-item-name {
577
+ font-family: var(--font-mono);
578
+ font-size: 11px;
579
+ font-weight: 500;
580
+ color: var(--text-primary);
581
+ white-space: nowrap;
582
+ overflow: hidden;
583
+ text-overflow: ellipsis;
584
+ max-width: 140px;
585
+ }
586
+
587
+ .stats-item-count {
588
+ font-family: var(--font-mono);
589
+ font-size: 10px;
590
+ color: var(--text-muted);
591
+ }
592
+
593
+ .stats-item-bar {
594
+ height: 4px;
595
+ background: var(--bg-elevated);
596
+ border-radius: 2px;
597
+ overflow: hidden;
598
+ }
599
+
600
+ .stats-item-bar-fill {
601
+ height: 100%;
602
+ background: var(--primary-500);
603
+ border-radius: 2px;
604
+ transition: width var(--transition-normal);
605
+ }
606
+
607
+ .stats-item-bar-fill.warning {
608
+ background: var(--warning);
609
+ }
610
+
611
+ .stats-item-bar-fill.danger {
612
+ background: var(--error);
613
+ }
614
+
615
+
616
+
617
+ /* Quick Prompts */
618
+ .prompts-list {
619
+ display: flex;
620
+ flex-direction: column;
621
+ gap: var(--space-1);
622
+ }
623
+
624
+ .prompt-item {
625
+ display: flex;
626
+ align-items: center;
627
+ gap: var(--space-2);
628
+ padding: var(--space-2) var(--space-3);
629
+ background: transparent;
630
+ border: 1px solid transparent;
631
+ border-radius: var(--radius-md);
632
+ font-family: var(--font-sans);
633
+ font-size: 12px;
634
+ color: var(--text-secondary);
635
+ cursor: pointer;
636
+ text-align: left;
637
+ transition: all var(--transition-fast);
638
+ }
639
+
640
+ .prompt-item:hover {
641
+ background: var(--bg-tertiary);
642
+ border-color: var(--border-default);
643
+ color: var(--text-primary);
644
+ }
645
+
646
+ .prompt-icon {
647
+ font-family: var(--font-mono);
648
+ color: var(--primary-500);
649
+ font-size: 10px;
650
+ }
651
+
652
+ /* Stats Info Footer */
653
+ .stats-info {
654
+ display: flex;
655
+ align-items: center;
656
+ gap: var(--space-2);
657
+ }
658
+
659
+ .stats-info-text {
660
+ font-size: 10px;
661
+ color: var(--text-muted);
662
+ font-family: var(--font-mono);
663
+ }
664
+
665
+ /* Conversation Items */
666
+ .conversations-list {
667
+ margin-top: var(--space-2);
668
+ }
669
+
670
+ .conversation-item {
671
+ display: flex;
672
+ align-items: center;
673
+ gap: var(--space-2);
674
+ padding: var(--space-2) var(--space-3);
675
+ border-radius: var(--radius-md);
676
+ cursor: pointer;
677
+ transition: all var(--transition-fast);
678
+ margin-bottom: 2px;
679
+ }
680
+
681
+ .conversation-info {
682
+ flex: 1;
683
+ display: flex;
684
+ align-items: center;
685
+ gap: var(--space-2);
686
+ min-width: 0;
687
+ }
688
+
689
+ .conversation-item .token-count {
690
+ font-family: var(--font-mono);
691
+ font-size: 9px;
692
+ padding: 2px 5px;
693
+ background: var(--bg-tertiary);
694
+ border-radius: 3px;
695
+ color: var(--text-muted);
696
+ flex-shrink: 0;
697
+ }
698
+
699
+ .conversation-item .token-count.token-warning {
700
+ background: rgba(245, 158, 11, 0.2);
701
+ color: var(--warning);
702
+ }
703
+
704
+ .conversation-item .token-count.token-exceeded {
705
+ background: rgba(239, 68, 68, 0.2);
706
+ color: var(--error);
707
+ }
708
+
709
+ .conversation-item:hover {
710
+ background: var(--bg-tertiary);
711
+ }
712
+
713
+ .conversation-item.active {
714
+ background: rgba(0, 212, 170, 0.1);
715
+ border-left: 2px solid var(--primary-500);
716
+ padding-left: calc(var(--space-3) - 2px);
717
+ }
718
+
719
+ .conversation-item .title {
720
+ flex: 1;
721
+ font-size: 13px;
722
+ color: var(--text-secondary);
723
+ white-space: nowrap;
724
+ overflow: hidden;
725
+ text-overflow: ellipsis;
726
+ }
727
+
728
+ .conversation-item.active .title {
729
+ color: var(--text-primary);
730
+ }
731
+
732
+ .conversation-item .delete-btn {
733
+ opacity: 0;
734
+ padding: 4px;
735
+ background: transparent;
736
+ border: none;
737
+ color: var(--text-muted);
738
+ cursor: pointer;
739
+ border-radius: 3px;
740
+ transition: all var(--transition-fast);
741
+ font-size: 14px;
742
+ line-height: 1;
743
+ }
744
+
745
+ .conversation-item:hover .delete-btn {
746
+ opacity: 1;
747
+ }
748
+
749
+ .conversation-item .delete-btn:hover {
750
+ background: var(--accent-dim);
751
+ color: var(--accent);
752
+ }
753
+
754
+ /* Sidebar Footer */
755
+ .sidebar-footer {
756
+ padding: var(--space-4);
757
+ border-top: 1px solid var(--border-default);
758
+ }
759
+
760
+ .session-info {
761
+ display: flex;
762
+ align-items: center;
763
+ gap: var(--space-2);
764
+ font-size: 11px;
765
+ color: var(--text-muted);
766
+ }
767
+
768
+ .session-icon {
769
+ color: var(--success);
770
+ font-size: 8px;
771
+ }
772
+
773
+ /* ============================================
774
+ Chat Area
775
+ ============================================ */
776
+ .chat-area {
777
+ flex: 1;
778
+ display: flex;
779
+ flex-direction: column;
780
+ overflow: hidden;
781
+ background: var(--bg-primary);
782
+ }
783
+
784
+ .messages-container {
785
+ flex: 1;
786
+ overflow: hidden;
787
+ position: relative;
788
+ }
789
+
790
+ .messages {
791
+ height: 100%;
792
+ overflow-y: auto;
793
+ padding: var(--space-8);
794
+ scroll-behavior: smooth;
795
+ }
796
+
797
+ /* ============================================
798
+ Welcome Message
799
+ ============================================ */
800
+ .welcome-message {
801
+ display: flex;
802
+ align-items: center;
803
+ justify-content: center;
804
+ min-height: 100%;
805
+ padding: var(--space-12);
806
+ }
807
+
808
+ .welcome-content {
809
+ text-align: center;
810
+ max-width: 500px;
811
+ animation: fade-in 0.4s ease-out;
812
+ }
813
+
814
+ @keyframes fade-in {
815
+ from {
816
+ opacity: 0;
817
+ transform: translateY(10px);
818
+ }
819
+ to {
820
+ opacity: 1;
821
+ transform: translateY(0);
822
+ }
823
+ }
824
+
825
+ .welcome-glyph {
826
+ position: relative;
827
+ display: inline-flex;
828
+ align-items: center;
829
+ justify-content: center;
830
+ width: 72px;
831
+ height: 72px;
832
+ margin-bottom: var(--space-6);
833
+ }
834
+
835
+ .glyph-main {
836
+ font-size: 32px;
837
+ z-index: 2;
838
+ }
839
+
840
+ .glyph-ring {
841
+ position: absolute;
842
+ inset: 0;
843
+ border: 2px solid var(--primary-500);
844
+ border-radius: 50%;
845
+ opacity: 0.5;
846
+ }
847
+
848
+ .welcome-title {
849
+ font-family: var(--font-mono);
850
+ font-size: 24px;
851
+ font-weight: 600;
852
+ color: var(--text-primary);
853
+ margin-bottom: var(--space-2);
854
+ }
855
+
856
+ .title-prefix {
857
+ color: var(--text-muted);
858
+ }
859
+
860
+ .welcome-subtitle {
861
+ font-size: 14px;
862
+ color: var(--text-secondary);
863
+ margin-bottom: var(--space-8);
864
+ }
865
+
866
+ /* Feature Cards */
867
+ .welcome-features {
868
+ display: flex;
869
+ flex-direction: column;
870
+ gap: var(--space-2);
871
+ margin-bottom: var(--space-8);
872
+ }
873
+
874
+ .feature-card {
875
+ display: flex;
876
+ align-items: flex-start;
877
+ gap: var(--space-3);
878
+ padding: var(--space-3) var(--space-4);
879
+ background: var(--bg-secondary);
880
+ border: 1px solid var(--border-default);
881
+ border-radius: var(--radius-md);
882
+ text-align: left;
883
+ transition: all var(--transition-fast);
884
+ }
885
+
886
+ .feature-card:hover {
887
+ border-color: var(--primary-500);
888
+ background: var(--bg-tertiary);
889
+ }
890
+
891
+ .feature-icon {
892
+ font-family: var(--font-mono);
893
+ color: var(--primary-500);
894
+ font-size: 14px;
895
+ font-weight: 600;
896
+ }
897
+
898
+ .feature-title {
899
+ font-weight: 600;
900
+ font-size: 13px;
901
+ color: var(--text-primary);
902
+ margin-bottom: 2px;
903
+ }
904
+
905
+ .feature-desc {
906
+ font-size: 12px;
907
+ color: var(--text-muted);
908
+ }
909
+
910
+ /* Hints */
911
+ .welcome-hints {
912
+ display: flex;
913
+ justify-content: center;
914
+ gap: var(--space-6);
915
+ flex-wrap: wrap;
916
+ }
917
+
918
+ .hint {
919
+ display: flex;
920
+ align-items: center;
921
+ gap: var(--space-2);
922
+ font-size: 12px;
923
+ color: var(--text-muted);
924
+ }
925
+
926
+ .hint kbd {
927
+ padding: 3px 6px;
928
+ background: var(--bg-tertiary);
929
+ border: 1px solid var(--border-default);
930
+ border-radius: 4px;
931
+ font-family: var(--font-mono);
932
+ font-size: 11px;
933
+ color: var(--text-secondary);
934
+ }
935
+
936
+ /* ============================================
937
+ Messages
938
+ ============================================ */
939
+ .message {
940
+ display: flex;
941
+ gap: var(--space-4);
942
+ margin-bottom: var(--space-6);
943
+ animation: message-in 0.2s ease-out;
944
+ }
945
+
946
+ @keyframes message-in {
947
+ from {
948
+ opacity: 0;
949
+ transform: translateY(8px);
950
+ }
951
+ to {
952
+ opacity: 1;
953
+ transform: translateY(0);
954
+ }
955
+ }
956
+
957
+ .message-avatar {
958
+ width: 32px;
959
+ height: 32px;
960
+ border-radius: var(--radius-md);
961
+ display: flex;
962
+ align-items: center;
963
+ justify-content: center;
964
+ font-size: 14px;
965
+ flex-shrink: 0;
966
+ font-family: var(--font-mono);
967
+ }
968
+
969
+ .message.user .message-avatar {
970
+ background: rgba(255, 184, 0, 0.15);
971
+ border: 1px solid var(--secondary-500);
972
+ color: var(--secondary-500);
973
+ }
974
+
975
+ .message.assistant .message-avatar {
976
+ background: rgba(0, 212, 170, 0.15);
977
+ border: 1px solid var(--primary-500);
978
+ color: var(--primary-500);
979
+ }
980
+
981
+ .message-content {
982
+ flex: 1;
983
+ min-width: 0;
984
+ }
985
+
986
+ .message-header {
987
+ display: flex;
988
+ align-items: center;
989
+ gap: var(--space-2);
990
+ margin-bottom: var(--space-1);
991
+ }
992
+
993
+ .message-role {
994
+ font-family: var(--font-mono);
995
+ font-size: 12px;
996
+ font-weight: 600;
997
+ }
998
+
999
+ .message.user .message-role {
1000
+ color: var(--secondary-500);
1001
+ }
1002
+
1003
+ .message.assistant .message-role {
1004
+ color: var(--primary-500);
1005
+ }
1006
+
1007
+ .message-time {
1008
+ font-family: var(--font-mono);
1009
+ font-size: 11px;
1010
+ color: var(--text-muted);
1011
+ }
1012
+
1013
+ .message-body {
1014
+ padding: var(--space-4);
1015
+ background: var(--bg-secondary);
1016
+ border: 1px solid var(--border-default);
1017
+ border-radius: var(--radius-lg);
1018
+ font-size: 14px;
1019
+ line-height: 1.7;
1020
+ }
1021
+
1022
+ .message.user .message-body {
1023
+ background: var(--user-msg-bg);
1024
+ border-color: var(--user-msg-border);
1025
+ }
1026
+
1027
+ /* Markdown in messages */
1028
+ .message-body p {
1029
+ margin-bottom: var(--space-4);
1030
+ }
1031
+
1032
+ .message-body p:last-child {
1033
+ margin-bottom: 0;
1034
+ }
1035
+
1036
+ .message-body pre {
1037
+ margin: 0;
1038
+ padding: var(--space-4);
1039
+ background: var(--bg-primary);
1040
+ border: none;
1041
+ border-radius: 0 0 var(--radius-md) var(--radius-md);
1042
+ overflow-x: auto;
1043
+ }
1044
+
1045
+ .message-body code {
1046
+ font-family: var(--font-mono);
1047
+ font-size: 13px;
1048
+ }
1049
+
1050
+ .message-body :not(pre) > code {
1051
+ padding: 2px 6px;
1052
+ background: var(--bg-tertiary);
1053
+ border-radius: 4px;
1054
+ color: var(--primary-400);
1055
+ }
1056
+
1057
+ /* Enhanced Code Blocks */
1058
+ /* zero-md web component styling */
1059
+ zero-md {
1060
+ display: block;
1061
+ margin: var(--space-2) 0;
1062
+ }
1063
+
1064
+ /* Override zero-md default styles to match chat theme */
1065
+ zero-md::part(markdown-styles) {
1066
+ color: var(--text-primary);
1067
+ font-family: var(--font-sans);
1068
+ }
1069
+
1070
+ /* Ensure code blocks in zero-md match our theme */
1071
+ zero-md pre {
1072
+ background: var(--bg-secondary) !important;
1073
+ border: 1px solid var(--border-default);
1074
+ border-radius: var(--radius-md);
1075
+ padding: var(--space-4);
1076
+ overflow-x: auto;
1077
+ }
1078
+
1079
+ zero-md code {
1080
+ font-family: var(--font-mono) !important;
1081
+ font-size: 13px;
1082
+ }
1083
+
1084
+ zero-md a {
1085
+ color: var(--accent-primary);
1086
+ }
1087
+
1088
+ zero-md table {
1089
+ border-collapse: collapse;
1090
+ width: 100%;
1091
+ margin: var(--space-3) 0;
1092
+ }
1093
+
1094
+ zero-md th,
1095
+ zero-md td {
1096
+ border: 1px solid var(--border-default);
1097
+ padding: var(--space-2) var(--space-3);
1098
+ text-align: left;
1099
+ }
1100
+
1101
+ zero-md th {
1102
+ background: var(--bg-secondary);
1103
+ font-weight: 600;
1104
+ }
1105
+
1106
+ /* Enhanced Tables */
1107
+ .table-wrapper {
1108
+ margin: var(--space-4) 0;
1109
+ overflow-x: auto;
1110
+ border: 1px solid var(--border-default);
1111
+ border-radius: var(--radius-md);
1112
+ }
1113
+
1114
+ .enhanced-table {
1115
+ width: 100%;
1116
+ border-collapse: collapse;
1117
+ font-size: 13px;
1118
+ }
1119
+
1120
+ .enhanced-table th,
1121
+ .enhanced-table td {
1122
+ padding: var(--space-2) var(--space-3);
1123
+ text-align: left;
1124
+ border-bottom: 1px solid var(--border-default);
1125
+ }
1126
+
1127
+ .enhanced-table th {
1128
+ background: var(--bg-tertiary);
1129
+ font-weight: 600;
1130
+ color: var(--text-primary);
1131
+ }
1132
+
1133
+ .enhanced-table tr:last-child td {
1134
+ border-bottom: none;
1135
+ }
1136
+
1137
+ .enhanced-table tr:hover td {
1138
+ background: rgba(0, 212, 170, 0.05);
1139
+ }
1140
+
1141
+ .message-body ul, .message-body ol {
1142
+ margin: var(--space-4) 0;
1143
+ padding-left: var(--space-6);
1144
+ }
1145
+
1146
+ .message-body li {
1147
+ margin-bottom: var(--space-1);
1148
+ }
1149
+
1150
+ .message-body blockquote {
1151
+ margin: var(--space-4) 0;
1152
+ padding-left: var(--space-4);
1153
+ border-left: 3px solid var(--primary-500);
1154
+ color: var(--text-secondary);
1155
+ }
1156
+
1157
+ .message-body a {
1158
+ color: var(--text-link);
1159
+ text-decoration: none;
1160
+ }
1161
+
1162
+ .message-body a:hover {
1163
+ text-decoration: underline;
1164
+ }
1165
+
1166
+ .message-body h1, .message-body h2, .message-body h3, .message-body h4 {
1167
+ font-family: var(--font-sans);
1168
+ font-weight: 600;
1169
+ margin-top: var(--space-6);
1170
+ margin-bottom: var(--space-3);
1171
+ color: var(--text-primary);
1172
+ }
1173
+
1174
+ .message-body h1 { font-size: 20px; }
1175
+ .message-body h2 { font-size: 18px; }
1176
+ .message-body h3 { font-size: 16px; }
1177
+ .message-body h4 { font-size: 14px; }
1178
+
1179
+ /* Streaming Cursor */
1180
+ .streaming-cursor {
1181
+ display: inline-block;
1182
+ width: 2px;
1183
+ height: 16px;
1184
+ background: var(--primary-500);
1185
+ margin-left: 2px;
1186
+ vertical-align: text-bottom;
1187
+ animation: cursor-blink 0.8s ease-in-out infinite;
1188
+ }
1189
+
1190
+ @keyframes cursor-blink {
1191
+ 0%, 50% { opacity: 1; }
1192
+ 51%, 100% { opacity: 0; }
1193
+ }
1194
+
1195
+ /* Message Error */
1196
+ .message-error {
1197
+ margin-top: var(--space-3);
1198
+ padding: var(--space-2) var(--space-3);
1199
+ background: var(--accent-dim);
1200
+ border: 1px solid rgba(255, 107, 107, 0.3);
1201
+ border-radius: var(--radius-md);
1202
+ color: var(--accent);
1203
+ font-size: 13px;
1204
+ }
1205
+
1206
+ /* Loading Message */
1207
+ .loading-message {
1208
+ display: flex;
1209
+ align-items: center;
1210
+ gap: 4px;
1211
+ padding: var(--space-2) 0;
1212
+ }
1213
+
1214
+ .loading-dot {
1215
+ width: 8px;
1216
+ height: 8px;
1217
+ background: var(--primary-500);
1218
+ border-radius: 50%;
1219
+ animation: loading-bounce 1.4s ease-in-out infinite both;
1220
+ }
1221
+
1222
+ .loading-dot:nth-child(1) {
1223
+ animation-delay: -0.32s;
1224
+ }
1225
+
1226
+ .loading-dot:nth-child(2) {
1227
+ animation-delay: -0.16s;
1228
+ }
1229
+
1230
+ .loading-dot:nth-child(3) {
1231
+ animation-delay: 0s;
1232
+ }
1233
+
1234
+ @keyframes loading-bounce {
1235
+ 0%, 80%, 100% {
1236
+ transform: scale(0.6);
1237
+ opacity: 0.4;
1238
+ }
1239
+ 40% {
1240
+ transform: scale(1);
1241
+ opacity: 1;
1242
+ }
1243
+ }
1244
+
1245
+ /* Token Limit Warning */
1246
+ .token-limit-warning {
1247
+ display: flex;
1248
+ align-items: center;
1249
+ gap: var(--space-2);
1250
+ padding: var(--space-2) var(--space-4);
1251
+ background: rgba(239, 68, 68, 0.1);
1252
+ border: 1px solid rgba(239, 68, 68, 0.3);
1253
+ border-radius: var(--radius-md);
1254
+ margin-bottom: var(--space-3);
1255
+ font-size: 12px;
1256
+ color: var(--error);
1257
+ }
1258
+
1259
+ .token-limit-warning .warning-icon {
1260
+ flex-shrink: 0;
1261
+ }
1262
+
1263
+ /* ============================================
1264
+ Input Area
1265
+ ============================================ */
1266
+ .input-area {
1267
+ padding: var(--space-4) var(--space-8) var(--space-6);
1268
+ background: var(--bg-primary);
1269
+ border-top: 1px solid var(--border-muted);
1270
+ }
1271
+
1272
+ /* Input Selectors (Agent & Model) */
1273
+ .input-selectors {
1274
+ display: flex;
1275
+ align-items: center;
1276
+ gap: var(--space-4);
1277
+ margin-bottom: var(--space-2);
1278
+ flex-wrap: wrap;
1279
+ }
1280
+
1281
+ .selector-group {
1282
+ display: flex;
1283
+ align-items: center;
1284
+ gap: var(--space-2);
1285
+ }
1286
+
1287
+ .selector-label {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ gap: var(--space-1);
1291
+ font-family: var(--font-mono);
1292
+ font-size: 11px;
1293
+ color: var(--text-muted);
1294
+ }
1295
+
1296
+ .selector-label svg {
1297
+ opacity: 0.7;
1298
+ }
1299
+
1300
+ .selector-select {
1301
+ appearance: none;
1302
+ padding: var(--space-1) var(--space-3) var(--space-1) var(--space-2);
1303
+ background: var(--bg-tertiary);
1304
+ border: 1px solid var(--border-default);
1305
+ border-radius: var(--radius-md);
1306
+ font-family: var(--font-mono);
1307
+ font-size: 11px;
1308
+ color: var(--text-primary);
1309
+ cursor: pointer;
1310
+ transition: all var(--transition-fast);
1311
+ min-width: 140px;
1312
+ }
1313
+
1314
+ .selector-select:hover {
1315
+ border-color: var(--text-muted);
1316
+ }
1317
+
1318
+ .selector-select:focus {
1319
+ outline: none;
1320
+ border-color: var(--primary-500);
1321
+ }
1322
+
1323
+ .selector-select:disabled {
1324
+ opacity: 0.5;
1325
+ cursor: not-allowed;
1326
+ }
1327
+
1328
+ .selector-divider {
1329
+ width: 1px;
1330
+ height: 16px;
1331
+ background: var(--border-default);
1332
+ }
1333
+
1334
+ /* Legacy styles - keep for compatibility */
1335
+ .input-model-selector {
1336
+ display: flex;
1337
+ align-items: center;
1338
+ margin-bottom: var(--space-2);
1339
+ }
1340
+
1341
+ .model-selector-inline {
1342
+ display: flex;
1343
+ align-items: center;
1344
+ gap: var(--space-2);
1345
+ }
1346
+
1347
+ .model-label-inline {
1348
+ display: flex;
1349
+ align-items: center;
1350
+ gap: var(--space-1);
1351
+ font-family: var(--font-mono);
1352
+ font-size: 11px;
1353
+ color: var(--text-muted);
1354
+ }
1355
+
1356
+ .model-label-inline svg {
1357
+ opacity: 0.7;
1358
+ }
1359
+
1360
+ .model-select-inline {
1361
+ appearance: none;
1362
+ padding: var(--space-1) var(--space-3) var(--space-1) var(--space-2);
1363
+ background: var(--bg-tertiary);
1364
+ border: 1px solid var(--border-default);
1365
+ border-radius: var(--radius-md);
1366
+ font-family: var(--font-mono);
1367
+ font-size: 11px;
1368
+ color: var(--text-primary);
1369
+ cursor: pointer;
1370
+ transition: all var(--transition-fast);
1371
+ }
1372
+
1373
+ .model-select-inline:hover {
1374
+ border-color: var(--text-muted);
1375
+ }
1376
+
1377
+ .model-select-inline:focus {
1378
+ outline: none;
1379
+ border-color: var(--primary-500);
1380
+ }
1381
+
1382
+ .model-select-inline:disabled {
1383
+ opacity: 0.5;
1384
+ cursor: not-allowed;
1385
+ }
1386
+
1387
+ .input-container {
1388
+ display: flex;
1389
+ align-items: flex-end;
1390
+ gap: 0;
1391
+ background: var(--bg-secondary);
1392
+ border: 1px solid var(--border-default);
1393
+ border-radius: var(--radius-lg);
1394
+ transition: all var(--transition-fast);
1395
+ }
1396
+
1397
+ .input-container:focus-within {
1398
+ border-color: var(--primary-500);
1399
+ box-shadow: 0 0 0 2px rgba(0, 212, 170, 0.2);
1400
+ }
1401
+
1402
+ .input-prefix {
1403
+ display: flex;
1404
+ align-items: center;
1405
+ justify-content: center;
1406
+ width: 44px;
1407
+ height: 44px;
1408
+ flex-shrink: 0;
1409
+ }
1410
+
1411
+ .prefix-symbol {
1412
+ font-family: var(--font-mono);
1413
+ font-size: 16px;
1414
+ font-weight: 700;
1415
+ color: var(--primary-500);
1416
+ }
1417
+
1418
+ #message-input {
1419
+ flex: 1;
1420
+ min-height: var(--input-min-height);
1421
+ max-height: 200px;
1422
+ padding: var(--space-3) 0;
1423
+ background: transparent;
1424
+ border: none;
1425
+ font-family: var(--font-sans);
1426
+ font-size: 14px;
1427
+ color: var(--text-primary);
1428
+ resize: none;
1429
+ line-height: 1.6;
1430
+ }
1431
+
1432
+ #message-input::placeholder {
1433
+ color: var(--text-muted);
1434
+ }
1435
+
1436
+ #message-input:focus {
1437
+ outline: none;
1438
+ }
1439
+
1440
+ .input-actions {
1441
+ display: flex;
1442
+ align-items: center;
1443
+ gap: var(--space-2);
1444
+ padding: var(--space-1) var(--space-2);
1445
+ }
1446
+
1447
+ .char-count {
1448
+ font-family: var(--font-mono);
1449
+ font-size: 10px;
1450
+ color: var(--text-muted);
1451
+ min-width: 40px;
1452
+ text-align: right;
1453
+ }
1454
+
1455
+ .btn-send {
1456
+ display: flex;
1457
+ align-items: center;
1458
+ justify-content: center;
1459
+ width: 36px;
1460
+ height: 36px;
1461
+ background: var(--primary-500);
1462
+ border: none;
1463
+ border-radius: var(--radius-md);
1464
+ color: var(--bg-primary);
1465
+ cursor: pointer;
1466
+ transition: all var(--transition-fast);
1467
+ }
1468
+
1469
+ .btn-send:hover:not(:disabled) {
1470
+ background: var(--primary-600);
1471
+ transform: translateX(2px);
1472
+ }
1473
+
1474
+ .btn-send:disabled {
1475
+ background: var(--bg-tertiary);
1476
+ color: var(--text-muted);
1477
+ cursor: not-allowed;
1478
+ }
1479
+
1480
+ .input-footer {
1481
+ display: flex;
1482
+ justify-content: center;
1483
+ margin-top: var(--space-2);
1484
+ }
1485
+
1486
+ .footer-hint {
1487
+ font-size: 11px;
1488
+ color: var(--text-muted);
1489
+ }
1490
+
1491
+ /* ============================================
1492
+ Modal
1493
+ ============================================ */
1494
+ .modal {
1495
+ position: fixed;
1496
+ inset: 0;
1497
+ z-index: 1000;
1498
+ display: flex;
1499
+ align-items: center;
1500
+ justify-content: center;
1501
+ animation: modal-in 0.2s ease-out;
1502
+ }
1503
+
1504
+ .modal.hidden {
1505
+ display: none;
1506
+ }
1507
+
1508
+ @keyframes modal-in {
1509
+ from { opacity: 0; }
1510
+ to { opacity: 1; }
1511
+ }
1512
+
1513
+ .modal-backdrop {
1514
+ position: absolute;
1515
+ inset: 0;
1516
+ background: rgba(0, 0, 0, 0.7);
1517
+ backdrop-filter: blur(4px);
1518
+ -webkit-backdrop-filter: blur(4px);
1519
+ }
1520
+
1521
+ .modal-content {
1522
+ position: relative;
1523
+ max-width: 400px;
1524
+ padding: var(--space-8);
1525
+ background: var(--bg-secondary);
1526
+ border: 1px solid var(--border-default);
1527
+ border-radius: var(--radius-xl);
1528
+ text-align: center;
1529
+ box-shadow: var(--shadow-lg);
1530
+ animation: modal-content-in 0.25s ease-out;
1531
+ }
1532
+
1533
+ @keyframes modal-content-in {
1534
+ from {
1535
+ opacity: 0;
1536
+ transform: scale(0.95) translateY(10px);
1537
+ }
1538
+ to {
1539
+ opacity: 1;
1540
+ transform: scale(1) translateY(0);
1541
+ }
1542
+ }
1543
+
1544
+ .modal-icon {
1545
+ display: flex;
1546
+ align-items: center;
1547
+ justify-content: center;
1548
+ width: 56px;
1549
+ height: 56px;
1550
+ margin: 0 auto var(--space-5);
1551
+ background: var(--accent-dim);
1552
+ border: 1px solid rgba(255, 107, 107, 0.3);
1553
+ border-radius: 50%;
1554
+ color: var(--accent);
1555
+ }
1556
+
1557
+ .modal-title {
1558
+ font-family: var(--font-sans);
1559
+ font-size: 18px;
1560
+ font-weight: 600;
1561
+ color: var(--text-primary);
1562
+ margin-bottom: var(--space-2);
1563
+ }
1564
+
1565
+ .modal-message {
1566
+ font-size: 14px;
1567
+ color: var(--text-secondary);
1568
+ margin-bottom: var(--space-6);
1569
+ line-height: 1.6;
1570
+ }
1571
+
1572
+ .modal-actions {
1573
+ display: flex;
1574
+ justify-content: center;
1575
+ }
1576
+
1577
+ .btn {
1578
+ padding: var(--space-2) var(--space-6);
1579
+ font-family: var(--font-sans);
1580
+ font-size: 14px;
1581
+ font-weight: 500;
1582
+ border: none;
1583
+ border-radius: var(--radius-md);
1584
+ cursor: pointer;
1585
+ transition: all var(--transition-fast);
1586
+ }
1587
+
1588
+ .btn-primary {
1589
+ background: var(--primary-500);
1590
+ color: var(--bg-primary);
1591
+ }
1592
+
1593
+ .btn-primary:hover {
1594
+ background: var(--primary-600);
1595
+ }
1596
+
1597
+ /* ============================================
1598
+ Loading Overlay
1599
+ ============================================ */
1600
+ .loading-overlay {
1601
+ position: fixed;
1602
+ inset: 0;
1603
+ z-index: 2000;
1604
+ display: flex;
1605
+ align-items: center;
1606
+ justify-content: center;
1607
+ background: var(--bg-primary);
1608
+ transition: opacity 0.3s ease;
1609
+ }
1610
+
1611
+ .loading-overlay.hidden {
1612
+ opacity: 0;
1613
+ pointer-events: none;
1614
+ }
1615
+
1616
+ .loading-content {
1617
+ text-align: center;
1618
+ }
1619
+
1620
+ .loading-spinner {
1621
+ position: relative;
1622
+ width: 64px;
1623
+ height: 64px;
1624
+ margin: 0 auto var(--space-5);
1625
+ }
1626
+
1627
+ .spinner-ring {
1628
+ position: absolute;
1629
+ inset: 0;
1630
+ border: 2px solid var(--border-default);
1631
+ border-top-color: var(--primary-500);
1632
+ border-radius: 50%;
1633
+ animation: spin 1s linear infinite;
1634
+ }
1635
+
1636
+ @keyframes spin {
1637
+ to { transform: rotate(360deg); }
1638
+ }
1639
+
1640
+ .spinner-core {
1641
+ position: absolute;
1642
+ inset: 0;
1643
+ display: flex;
1644
+ align-items: center;
1645
+ justify-content: center;
1646
+ font-size: 20px;
1647
+ }
1648
+
1649
+ .loading-text {
1650
+ font-family: var(--font-mono);
1651
+ font-size: 13px;
1652
+ color: var(--text-secondary);
1653
+ }
1654
+
1655
+ .loading-dots::after {
1656
+ content: '';
1657
+ animation: dots 1.5s steps(4, end) infinite;
1658
+ }
1659
+
1660
+ @keyframes dots {
1661
+ 0%, 20% { content: ''; }
1662
+ 40% { content: '.'; }
1663
+ 60% { content: '..'; }
1664
+ 80%, 100% { content: '...'; }
1665
+ }
1666
+
1667
+ /* ============================================
1668
+ Scrollbar
1669
+ ============================================ */
1670
+ ::-webkit-scrollbar {
1671
+ width: 8px;
1672
+ height: 8px;
1673
+ }
1674
+
1675
+ ::-webkit-scrollbar-track {
1676
+ background: transparent;
1677
+ }
1678
+
1679
+ ::-webkit-scrollbar-thumb {
1680
+ background: var(--bg-tertiary);
1681
+ border-radius: 4px;
1682
+ }
1683
+
1684
+ ::-webkit-scrollbar-thumb:hover {
1685
+ background: var(--text-muted);
1686
+ }
1687
+
1688
+ /* ============================================
1689
+ Utility Classes
1690
+ ============================================ */
1691
+ .hidden {
1692
+ display: none !important;
1693
+ }
1694
+
1695
+ /* ============================================
1696
+ Responsive
1697
+ ============================================ */
1698
+ @media (max-width: 900px) {
1699
+ .sidebar-left {
1700
+ display: none;
1701
+ }
1702
+
1703
+ .sidebar-right {
1704
+ display: none;
1705
+ }
1706
+
1707
+ .header {
1708
+ padding: 0 var(--space-4);
1709
+ }
1710
+
1711
+ .messages {
1712
+ padding: var(--space-6);
1713
+ }
1714
+
1715
+ .input-area {
1716
+ padding: var(--space-4);
1717
+ }
1718
+
1719
+ .welcome-features {
1720
+ display: none;
1721
+ }
1722
+
1723
+ .welcome-hints {
1724
+ flex-direction: column;
1725
+ gap: var(--space-2);
1726
+ }
1727
+ }
1728
+
1729
+ @media (max-width: 600px) {
1730
+ .header-left {
1731
+ gap: var(--space-2);
1732
+ }
1733
+
1734
+ .logo-text {
1735
+ display: none;
1736
+ }
1737
+
1738
+ .connection-status {
1739
+ display: none;
1740
+ }
1741
+
1742
+ .model-label-inline {
1743
+ display: none;
1744
+ }
1745
+
1746
+ .model-select-inline {
1747
+ font-size: 10px;
1748
+ }
1749
+
1750
+ .input-model-selector {
1751
+ justify-content: center;
1752
+ }
1753
+
1754
+ .welcome-title {
1755
+ font-size: 20px;
1756
+ }
1757
+
1758
+ .welcome-glyph {
1759
+ width: 56px;
1760
+ height: 56px;
1761
+ }
1762
+
1763
+ .glyph-main {
1764
+ font-size: 24px;
1765
+ }
1766
+
1767
+ .input-prefix {
1768
+ width: 36px;
1769
+ }
1770
+
1771
+ .message {
1772
+ gap: var(--space-3);
1773
+ }
1774
+
1775
+ .message-avatar {
1776
+ width: 28px;
1777
+ height: 28px;
1778
+ font-size: 12px;
1779
+ }
1780
+
1781
+ .message-body {
1782
+ padding: var(--space-3);
1783
+ }
1784
+ }
1785
+
1786
+ /* Message Copy Button */
1787
+ .message-meta {
1788
+ display: flex;
1789
+ align-items: center;
1790
+ gap: 8px;
1791
+ }
1792
+
1793
+ .message-copy-btn {
1794
+ display: flex;
1795
+ align-items: center;
1796
+ justify-content: center;
1797
+ width: 24px;
1798
+ height: 24px;
1799
+ padding: 4px;
1800
+ border: none;
1801
+ background: transparent;
1802
+ color: var(--text-secondary);
1803
+ cursor: pointer;
1804
+ border-radius: 4px;
1805
+ transition: all 0.2s ease;
1806
+ opacity: 0;
1807
+ }
1808
+
1809
+ .message:hover .message-copy-btn {
1810
+ opacity: 1;
1811
+ }
1812
+
1813
+ .message-copy-btn:hover {
1814
+ background: var(--bg-elevated);
1815
+ color: var(--text-primary);
1816
+ }
1817
+
1818
+ .message-copy-btn.copied {
1819
+ color: var(--success);
1820
+ }
1821
+
1822
+ /* ============================================
1823
+ Theme Toggle Button
1824
+ ============================================ */
1825
+ .btn-theme-toggle {
1826
+ display: flex;
1827
+ align-items: center;
1828
+ justify-content: center;
1829
+ width: 36px;
1830
+ height: 36px;
1831
+ background: transparent;
1832
+ border: 1px solid var(--border-default);
1833
+ border-radius: var(--radius-md);
1834
+ color: var(--text-secondary);
1835
+ cursor: pointer;
1836
+ transition: all var(--transition-fast);
1837
+ }
1838
+
1839
+ .btn-theme-toggle:hover {
1840
+ background: var(--bg-tertiary);
1841
+ border-color: var(--text-muted);
1842
+ color: var(--text-primary);
1843
+ }
1844
+
1845
+ .btn-theme-toggle .icon-sun,
1846
+ .btn-theme-toggle .icon-moon {
1847
+ width: 18px;
1848
+ height: 18px;
1849
+ }
1850
+
1851
+ /* Show moon in dark mode, sun in light mode */
1852
+ [data-theme="dark"] .btn-theme-toggle .icon-sun,
1853
+ :root:not([data-theme]) .btn-theme-toggle .icon-sun {
1854
+ display: none;
1855
+ }
1856
+
1857
+ [data-theme="dark"] .btn-theme-toggle .icon-moon,
1858
+ :root:not([data-theme]) .btn-theme-toggle .icon-moon {
1859
+ display: block;
1860
+ }
1861
+
1862
+ [data-theme="light"] .btn-theme-toggle .icon-sun {
1863
+ display: block;
1864
+ }
1865
+
1866
+ [data-theme="light"] .btn-theme-toggle .icon-moon {
1867
+ display: none;
1868
+ }
1869
+
1870
+ /* Theme transition for smooth color changes */
1871
+ body,
1872
+ .header,
1873
+ .sidebar,
1874
+ .chat-area,
1875
+ .input-area,
1876
+ .message-body,
1877
+ .modal-content,
1878
+ .loading-overlay {
1879
+ transition: background-color var(--transition-normal),
1880
+ border-color var(--transition-normal),
1881
+ color var(--transition-normal);
1882
+ }