1/* CSS Reset and Base Styles */
2* {
3 box-sizing: border-box;
4}
5
6html {
7 height: 100%;
8 height: 100dvh;
9 overflow: hidden;
10}
11
12body {
13 margin: 0;
14 height: 100%;
15 overflow: hidden;
16 font-family:
17 "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace;
18 line-height: 1.6;
19 -webkit-font-smoothing: antialiased;
20 letter-spacing: -0.01em;
21 color: var(--text-primary);
22 background: var(--bg-secondary);
23}
24
25/* CSS Variables */
26:root {
27 --font-mono:
28 "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace;
29 --primary: #2563eb;
30 --primary-dark: #1d4ed8;
31 --bg-base: #ffffff;
32 --bg-secondary: #f9fafb;
33 --bg-tertiary: #f3f4f6;
34 --border: #e5e7eb;
35 --text-primary: #111827;
36 --text-secondary: #6b7280;
37 --text-tertiary: #9ca3af;
38 --success-bg: #f0fdf4;
39 --success-border: #bbf7d0;
40 --success-text: #166534;
41 --error-bg: #fef2f2;
42 --error-border: #fecaca;
43 --error-text: #991b1b;
44 --warning-bg: #fffbeb;
45 --warning-border: #fcd34d;
46 --warning-text: #92400e;
47 --blue-bg: #eff6ff;
48 --blue-border: #bfdbfe;
49 --blue-text: #1e40af;
50 --user-message-text: #2563eb;
51 --link-color: #2563eb;
52 --green-600: #16a34a;
53 --green-700: #15803d;
54 --gray-50: #f9fafb;
55 --gray-100: #f3f4f6;
56 --gray-200: #e5e7eb;
57 --gray-300: #d1d5db;
58 --gray-400: #9ca3af;
59 --gray-500: #6b7280;
60 --gray-600: #4b5563;
61 --gray-700: #374151;
62 --gray-800: #1f2937;
63 --gray-900: #111827;
64}
65
66.dark {
67 --bg-base: #1f2937;
68 --bg-secondary: #111827;
69 --bg-tertiary: #374151;
70 --border: #374151;
71 --text-primary: #f9fafb;
72 --text-secondary: #9ca3af;
73 --text-tertiary: #6b7280;
74 --success-bg: rgba(34, 197, 94, 0.1);
75 --success-border: rgba(34, 197, 94, 0.3);
76 --success-text: #86efac;
77 --error-bg: rgba(239, 68, 68, 0.1);
78 --error-border: rgba(239, 68, 68, 0.3);
79 --error-text: #fca5a5;
80 --warning-bg: rgba(251, 191, 36, 0.15);
81 --warning-border: #fbbf24;
82 --warning-text: #fcd34d;
83 --blue-bg: rgba(59, 130, 246, 0.1);
84 --blue-border: rgba(59, 130, 246, 0.3);
85 --blue-text: #93c5fd;
86 --user-message-text: #60a5fa;
87 --link-color: #60a5fa;
88}
89
90/* Layout */
91.app-container {
92 display: flex;
93 height: 100vh; /* Fallback for older browsers */
94 height: 100dvh; /* Dynamic viewport height - adjusts when mobile browser chrome appears/hides */
95 background: var(--bg-secondary);
96 position: relative;
97 overflow: hidden;
98}
99
100.main-content {
101 flex: 1;
102 display: flex;
103 flex-direction: column;
104 min-width: 0;
105}
106
107.screen-height {
108 height: 100vh; /* Fallback for older browsers */
109 height: 100dvh;
110}
111
112.full-height {
113 height: 100%;
114}
115
116/* Flexbox utilities */
117.flex {
118 display: flex;
119}
120
121.flex-col {
122 flex-direction: column;
123}
124
125.flex-1 {
126 flex: 1;
127}
128
129.items-center {
130 align-items: center;
131}
132
133.justify-center {
134 justify-content: center;
135}
136
137.justify-between {
138 justify-content: space-between;
139}
140
141.space-x-2 > * + * {
142 margin-left: 0.5rem;
143}
144
145.space-x-3 > * + * {
146 margin-left: 0.75rem;
147}
148
149.space-y-2 > * + * {
150 margin-top: 0.5rem;
151}
152
153.space-y-3 > * + * {
154 margin-top: 0.75rem;
155}
156
157.space-y-4 > * + * {
158 margin-top: 1rem;
159}
160
161/* Text */
162.text-center {
163 text-align: center;
164}
165
166.text-sm {
167 font-size: 0.875rem;
168 line-height: 1.5;
169}
170
171.text-xs {
172 font-size: 0.75rem;
173 line-height: 1.4;
174}
175
176.text-lg {
177 font-size: 1.125rem;
178 line-height: 1.6;
179}
180
181.font-medium {
182 font-weight: 500;
183}
184
185.font-semibold {
186 font-weight: 600;
187}
188
189.italic {
190 font-style: italic;
191}
192
193.truncate {
194 overflow: hidden;
195 text-overflow: ellipsis;
196 white-space: nowrap;
197}
198
199.break-words {
200 word-break: break-word;
201}
202
203.break-all {
204 word-break: break-all;
205}
206
207.whitespace-pre-wrap {
208 white-space: pre-wrap;
209}
210
211/* Colors */
212.text-primary {
213 color: var(--text-primary);
214}
215
216.text-secondary {
217 color: var(--text-secondary);
218}
219
220.text-tertiary {
221 color: var(--text-tertiary);
222}
223
224.text-white {
225 color: white;
226}
227
228.text-error {
229 color: var(--error-text);
230}
231
232.text-success {
233 color: var(--success-text);
234}
235
236.text-blue {
237 color: var(--blue-text);
238}
239
240.bg-primary {
241 background: var(--primary);
242}
243
244.bg-base {
245 background: var(--bg-base);
246}
247
248.bg-secondary {
249 background: var(--bg-secondary);
250}
251
252/* Buttons */
253button {
254 font-family: inherit;
255 cursor: pointer;
256 border: none;
257 background: none;
258 padding: 0;
259 color: inherit;
260}
261
262.btn {
263 padding: 0.5rem 0.75rem;
264 border-radius: 0.25rem;
265 transition: background-color 0.2s;
266}
267
268.btn:hover {
269 background: var(--bg-tertiary);
270}
271
272.btn:disabled {
273 opacity: 0.5;
274 cursor: not-allowed;
275}
276
277.btn-primary {
278 padding: 0.5rem 1rem;
279 background: var(--primary);
280 color: white;
281 border-radius: 0.25rem;
282 font-weight: 500;
283 transition: background-color 0.2s;
284 letter-spacing: -0.01em;
285}
286
287.btn-primary:hover:not(:disabled) {
288 background: var(--primary-dark);
289}
290
291.btn-primary:disabled {
292 background: var(--gray-300);
293 cursor: not-allowed;
294}
295
296.dark .btn-primary:disabled {
297 background: var(--gray-600);
298}
299
300.btn-secondary {
301 padding: 0.5rem 1rem;
302 background: var(--bg-secondary);
303 color: var(--text-primary);
304 border: 1px solid var(--border);
305 border-radius: 0.25rem;
306 font-weight: 500;
307 transition: background-color 0.2s;
308 letter-spacing: -0.01em;
309}
310
311.btn-secondary:hover {
312 background: var(--bg-tertiary);
313}
314
315.btn-sm {
316 padding: 0.375rem 0.75rem;
317 font-size: 0.8125rem;
318}
319
320.btn-icon {
321 padding: 0.5rem;
322 border-radius: 0.375rem;
323 display: flex;
324 align-items: center;
325 justify-content: center;
326 transition: background-color 0.2s;
327}
328
329.btn-icon:hover {
330 background: var(--bg-tertiary);
331}
332
333.btn-icon-sm {
334 padding: 0.25rem;
335 border-radius: 0.25rem;
336 display: flex;
337 align-items: center;
338 justify-content: center;
339 transition:
340 background-color 0.2s,
341 opacity 0.2s;
342 opacity: 0.4;
343 color: var(--text-secondary);
344}
345
346.btn-icon-sm:hover {
347 background: var(--gray-200);
348 opacity: 1;
349}
350
351.dark .btn-icon-sm:hover {
352 background: var(--gray-600);
353}
354
355.conversation-item:hover .btn-icon-sm {
356 opacity: 0.7;
357}
358
359.conversation-item.active .btn-icon-sm {
360 color: rgba(255, 255, 255, 0.8);
361 opacity: 0.7;
362}
363
364.conversation-item.active .btn-icon-sm:hover {
365 background: rgba(255, 255, 255, 0.2);
366 color: white;
367 opacity: 1;
368}
369
370.btn-icon-sm.btn-danger:hover {
371 background: var(--red-600);
372 color: white;
373 opacity: 1;
374}
375
376.btn-new {
377 width: 2rem;
378 height: 2rem;
379 background: var(--text-primary);
380 color: var(--bg-base);
381 border-radius: 50%;
382 display: flex;
383 align-items: center;
384 justify-content: center;
385 transition: background-color 0.2s;
386}
387
388.btn-new:hover {
389 background: var(--text-secondary);
390}
391
392/* Header */
393.header {
394 flex: 0 0 auto;
395 background: var(--bg-base);
396 border-bottom: 1px solid var(--border);
397 padding: 0.5rem 1rem;
398 padding-top: calc(0.5rem + env(safe-area-inset-top, 0px));
399 padding-left: max(1rem, env(safe-area-inset-left));
400 padding-right: max(1rem, env(safe-area-inset-right));
401 display: flex;
402 align-items: center;
403 justify-content: space-between;
404 gap: 0.5rem;
405}
406
407.header-left {
408 display: flex;
409 align-items: center;
410 gap: 0.75rem;
411 min-width: 0; /* Allow shrinking below content size */
412 flex: 1 1 auto;
413 overflow: hidden;
414}
415
416.header-title {
417 font-size: 1rem;
418 font-weight: 600;
419 overflow: hidden;
420 text-overflow: ellipsis;
421 white-space: nowrap;
422 letter-spacing: -0.02em;
423 min-width: 0; /* Allow shrinking */
424}
425
426.header-actions {
427 display: flex;
428 align-items: center;
429 gap: 0.5rem;
430 flex-shrink: 0; /* Never shrink the actions */
431}
432
433/* Drawer/Sidebar */
434.drawer {
435 position: fixed;
436 inset: 0 auto 0 0;
437 z-index: 50;
438 width: 20rem;
439 max-width: calc(100vw - 3rem); /* Ensure drawer doesn't fill entire screen on mobile */
440 background: var(--bg-base);
441 border-right: 1px solid var(--border);
442 color: var(--text-primary);
443 display: flex;
444 flex-direction: column;
445 height: 100%;
446 height: 100dvh;
447 transform: translateX(-100%);
448 transition: transform 0.3s ease;
449 padding-top: env(safe-area-inset-top);
450 padding-left: env(safe-area-inset-left);
451 padding-bottom: env(safe-area-inset-bottom);
452}
453
454.drawer.open {
455 transform: translateX(0);
456}
457
458.drawer-header {
459 display: flex;
460 align-items: center;
461 justify-content: space-between;
462 padding: 1rem;
463}
464
465.drawer-header-actions {
466 display: flex;
467 align-items: center;
468 gap: 0.25rem;
469}
470
471.drawer-title {
472 font-size: 1.125rem;
473 font-weight: 600;
474}
475
476.drawer-body {
477 flex: 1;
478 overflow-y: auto;
479 min-height: 0;
480}
481
482.drawer-section {
483 padding: 1rem;
484 border-bottom: 1px solid var(--border);
485}
486
487.drawer-footer {
488 padding: 1rem;
489}
490
491/* Backdrop */
492.backdrop {
493 position: fixed;
494 inset: 0;
495 background: rgba(0, 0, 0, 0.5);
496 z-index: 40;
497}
498
499/* Conversation List */
500.conversation-list {
501 padding: 0.5rem;
502}
503
504.conversation-item {
505 width: 100%;
506 text-align: left;
507 padding: 0.75rem;
508 border-radius: 0.5rem;
509 margin-bottom: 0.25rem;
510 transition: background-color 0.2s;
511 display: flex;
512 flex-direction: row;
513 align-items: center;
514 gap: 0.25rem;
515}
516
517.conversation-item:hover {
518 background: var(--bg-tertiary);
519}
520
521.conversation-item.active {
522 background: var(--primary);
523 color: white;
524}
525
526.conversation-item .conversation-title {
527 font-weight: 500;
528 font-size: 0.875rem;
529 word-break: break-all;
530}
531
532.conversation-item .conversation-meta {
533 display: flex;
534 align-items: center;
535 gap: 0.5rem;
536 font-size: 0.75rem;
537 color: var(--text-tertiary);
538 min-width: 0;
539}
540
541.conversation-item .conversation-date {
542 flex-shrink: 0;
543}
544
545.conversation-item.active .conversation-meta {
546 color: rgba(255, 255, 255, 0.8);
547}
548
549.conversation-item .conversation-cwd {
550 font-family: var(--font-mono);
551 font-size: 0.7rem;
552 opacity: 0.8;
553 overflow: hidden;
554 text-overflow: ellipsis;
555 white-space: nowrap;
556 text-align: left;
557 min-width: 0;
558}
559
560/* Messages */
561.messages-container {
562 flex: 1 1 auto;
563 overflow-y: auto;
564 overflow-x: hidden;
565 -webkit-overflow-scrolling: touch;
566 overscroll-behavior: contain;
567 padding: 1rem;
568 padding-left: max(1rem, env(safe-area-inset-left));
569 padding-right: max(1rem, env(safe-area-inset-right));
570}
571
572.messages-list {
573 display: flex;
574 flex-direction: column;
575 gap: 0.5rem;
576}
577
578.message {
579 display: flex;
580 flex-direction: column;
581}
582
583.message-content {
584 padding: 1rem;
585 border-radius: 0.5rem;
586 overflow-wrap: break-word;
587 word-wrap: break-word;
588 min-width: 0;
589}
590
591.message-user .message-content {
592 margin-left: auto;
593 max-width: 80%;
594 color: var(--user-message-text);
595}
596
597.message-agent .message-content,
598.message-tool .message-content {
599 margin-right: auto;
600 max-width: 100%;
601 color: var(--text-primary);
602}
603
604.thinking-indicator {
605 display: inline-flex;
606 align-items: center;
607 gap: 0.25rem;
608 color: var(--text-secondary);
609 font-size: 0.875rem;
610 margin: 0.25rem 0 0.75rem 0;
611 padding-left: 0.5rem;
612}
613
614.thinking-dots {
615 display: inline-flex;
616 gap: 0.2rem;
617 font-size: 1.25rem;
618 letter-spacing: 0.15rem;
619 color: var(--blue-text);
620}
621
622.thinking-dots span {
623 animation: thinking-dot 1.2s infinite ease-in-out;
624 opacity: 0.25;
625}
626
627.thinking-dots span:nth-child(2) {
628 animation-delay: 0.2s;
629}
630
631.thinking-dots span:nth-child(3) {
632 animation-delay: 0.4s;
633}
634
635@keyframes thinking-dot {
636 0%,
637 80%,
638 100% {
639 opacity: 0.25;
640 transform: translateY(0);
641 }
642 40% {
643 opacity: 1;
644 transform: translateY(-0.2rem);
645 }
646}
647
648.message-error .message-content {
649 margin-right: auto;
650 max-width: 100%;
651 background: var(--error-bg);
652 border: 2px solid var(--error-border);
653 color: var(--error-text);
654}
655
656/* Tool Display */
657.tool-use {
658 background: var(--blue-bg);
659 border: 1px solid var(--blue-border);
660 border-radius: 0.5rem;
661 padding: 0.75rem;
662 margin: 0.5rem 0;
663}
664
665.tool-header {
666 display: flex;
667 align-items: center;
668 gap: 0.5rem;
669 margin-bottom: 0.5rem;
670}
671
672.tool-name {
673 font-weight: 500;
674 color: var(--blue-text);
675}
676
677.tool-input {
678 font-size: 0.875rem;
679 font-family: monospace;
680 background: var(--gray-100);
681 border-radius: 0.25rem;
682 padding: 0.5rem;
683 overflow-wrap: break-word;
684 word-break: break-all;
685 white-space: pre-wrap;
686}
687
688.dark .tool-input {
689 background: var(--gray-800);
690}
691
692.tool-result-details {
693 border: 1px solid var(--border);
694 border-radius: 0.5rem;
695 margin: 0.5rem 0;
696}
697
698.tool-result-details.error {
699 border-color: var(--error-border);
700}
701
702.tool-result-summary {
703 cursor: pointer;
704 padding: 0.5rem 0.75rem;
705 border-radius: 0.5rem;
706 transition: background-color 0.2s;
707 background: var(--bg-tertiary);
708}
709
710.tool-result-summary:hover {
711 background: var(--bg-secondary);
712}
713
714.tool-result-details.error .tool-result-summary {
715 background: var(--error-bg);
716 color: var(--error-text);
717}
718
719.tool-result-content {
720 padding: 0.75rem;
721 padding-top: 0;
722}
723
724.tool-result-section {
725 background: var(--blue-bg);
726 border: 1px solid var(--blue-border);
727 border-radius: 0.25rem;
728 padding: 0.5rem;
729 margin-top: 0.75rem;
730}
731
732.tool-result-section.output {
733 background: var(--success-bg);
734 border-color: var(--success-border);
735}
736
737.tool-result-section.error.output {
738 background: var(--error-bg);
739 border-color: var(--error-border);
740}
741
742.tool-result-label {
743 font-size: 0.75rem;
744 font-weight: 500;
745 margin-bottom: 0.25rem;
746 color: var(--blue-text);
747}
748
749.tool-result-section.output .tool-result-label {
750 color: var(--success-text);
751}
752
753.tool-result-section.error.output .tool-result-label {
754 color: var(--error-text);
755}
756
757.tool-result-data {
758 font-size: 0.875rem;
759 font-family: monospace;
760 overflow-wrap: break-word;
761 word-break: break-all;
762 white-space: pre-wrap;
763}
764
765.tool-result-meta {
766 display: flex;
767 align-items: center;
768 justify-content: space-between;
769}
770
771.tool-result-status {
772 font-size: 0.75rem;
773}
774
775.tool-result-status.success {
776 color: var(--success-text);
777}
778
779.tool-result-status.error {
780 color: var(--error-text);
781}
782
783.tool-result-time {
784 font-size: 0.75rem;
785 color: var(--text-tertiary);
786}
787
788/* Tool running state */
789.tool-running {
790 background: var(--blue-bg);
791 border: 1px solid var(--blue-border);
792 border-radius: 0.5rem;
793 padding: 0.75rem;
794 margin: 0.5rem 0;
795}
796
797.tool-running-header {
798 display: flex;
799 align-items: center;
800 gap: 0.5rem;
801 margin-bottom: 0.5rem;
802}
803
804.tool-status-running {
805 font-size: 0.875rem;
806 color: var(--text-secondary);
807 font-style: italic;
808 animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
809}
810
811@keyframes pulse {
812 0%,
813 100% {
814 opacity: 1;
815 }
816 50% {
817 opacity: 0.5;
818 }
819}
820
821/* Tool Component (shared styles for all tools) */
822.tool {
823 background: var(--gray-100);
824 border-radius: 0.5rem;
825 margin: 0.5rem 0;
826 width: 100%;
827}
828
829.dark .tool {
830 background: var(--gray-800);
831}
832
833.tool-header {
834 display: flex;
835 align-items: center;
836 justify-content: space-between;
837 padding: 0.75rem 1rem;
838 cursor: pointer;
839 user-select: none;
840}
841
842.tool-header:hover {
843 background: rgba(0, 0, 0, 0.02);
844 border-radius: 0.5rem;
845}
846
847.dark .tool-header:hover {
848 background: rgba(255, 255, 255, 0.02);
849}
850
851.tool-summary {
852 display: flex;
853 align-items: center;
854 gap: 0.5rem;
855 flex: 1;
856 min-width: 0;
857}
858
859.tool-emoji {
860 font-size: 1rem;
861 flex-shrink: 0;
862}
863
864.tool-emoji.running {
865}
866
867.tool-command {
868 font-family: var(--font-mono);
869 font-size: 0.875rem;
870 color: var(--text-primary);
871 overflow: hidden;
872 text-overflow: ellipsis;
873 white-space: nowrap;
874}
875
876.tool-running {
877 font-size: 0.75rem;
878 color: var(--text-secondary);
879 font-style: italic;
880 flex-shrink: 0;
881 animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
882}
883
884.tool-success {
885 color: var(--success-text);
886 font-size: 0.875rem;
887 flex-shrink: 0;
888}
889
890.tool-error {
891 color: var(--error-text);
892 font-size: 0.875rem;
893 flex-shrink: 0;
894}
895
896.tool-toggle {
897 background: none;
898 border: none;
899 cursor: pointer;
900 padding: 0.25rem;
901 display: flex;
902 align-items: center;
903 justify-content: center;
904 color: var(--text-secondary);
905 flex-shrink: 0;
906}
907
908.tool-toggle:hover {
909 color: var(--text-primary);
910}
911
912.tool-details {
913 padding: 0 1rem 0.75rem 1rem;
914 display: flex;
915 flex-direction: column;
916 gap: 0.75rem;
917}
918
919.tool-section {
920 display: flex;
921 flex-direction: column;
922 gap: 0.5rem;
923}
924
925.tool-label {
926 font-size: 0.75rem;
927 font-weight: 500;
928 color: var(--text-secondary);
929 display: flex;
930 align-items: center;
931 gap: 0.5rem;
932}
933
934.tool-time {
935 font-size: 0.75rem;
936 color: var(--text-tertiary);
937 font-weight: normal;
938}
939
940.tool-code {
941 font-family: var(--font-mono);
942 font-size: 0.875rem;
943 background: var(--bg-base);
944 border: 1px solid var(--border);
945 border-radius: 0.25rem;
946 padding: 0.75rem;
947 margin: 0;
948 overflow-x: auto;
949 white-space: pre-wrap;
950 word-break: break-word;
951 color: var(--text-primary);
952}
953
954.tool-code.error {
955 background: var(--error-bg);
956 border-color: var(--error-border);
957 color: var(--error-text);
958}
959
960/* Bash Tool Component - uses shared tool styles */
961.bash-tool {
962 /* Alias for backwards compatibility */
963 background: var(--gray-100);
964 border-radius: 0.5rem;
965 margin: 0.5rem 0;
966 width: 100%;
967}
968
969.dark .bash-tool {
970 background: var(--gray-800);
971}
972
973.bash-tool-header {
974 display: flex;
975 align-items: center;
976 justify-content: space-between;
977 padding: 0.75rem 1rem;
978 cursor: pointer;
979 user-select: none;
980}
981
982.bash-tool-header:hover {
983 background: rgba(0, 0, 0, 0.02);
984 border-radius: 0.5rem;
985}
986
987.dark .bash-tool-header:hover {
988 background: rgba(255, 255, 255, 0.02);
989}
990
991.bash-tool-summary {
992 display: flex;
993 align-items: center;
994 gap: 0.5rem;
995 flex: 1;
996 min-width: 0;
997}
998
999.bash-tool-emoji {
1000 font-size: 1rem;
1001 flex-shrink: 0;
1002}
1003
1004.bash-tool-emoji.running {
1005}
1006
1007.bash-tool-command {
1008 font-family: var(--font-mono);
1009 font-size: 0.875rem;
1010 color: var(--text-primary);
1011 overflow: hidden;
1012 text-overflow: ellipsis;
1013 white-space: nowrap;
1014 flex-shrink: 1;
1015 min-width: 0;
1016}
1017
1018.bash-tool-cwd {
1019 font-family: var(--font-mono);
1020 font-size: 0.75rem;
1021 color: var(--text-tertiary);
1022 white-space: nowrap;
1023 overflow: hidden;
1024 text-overflow: ellipsis;
1025 flex-shrink: 0;
1026 max-width: 30%;
1027}
1028
1029.bash-tool-running {
1030 font-size: 0.75rem;
1031 color: var(--text-secondary);
1032 font-style: italic;
1033 flex-shrink: 0;
1034 animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
1035}
1036
1037.bash-tool-success {
1038 color: var(--success-text);
1039 font-size: 0.875rem;
1040 flex-shrink: 0;
1041}
1042
1043.bash-tool-error {
1044 color: var(--error-text);
1045 font-size: 0.875rem;
1046 flex-shrink: 0;
1047}
1048
1049.bash-tool-cancelled {
1050 color: var(--error-text);
1051 font-size: 0.875rem;
1052 flex-shrink: 0;
1053}
1054
1055.bash-tool-toggle {
1056 background: none;
1057 border: none;
1058 cursor: pointer;
1059 padding: 0.25rem;
1060 display: flex;
1061 align-items: center;
1062 justify-content: center;
1063 color: var(--text-secondary);
1064 flex-shrink: 0;
1065}
1066
1067.bash-tool-toggle:hover {
1068 color: var(--text-primary);
1069}
1070
1071.bash-tool-details {
1072 padding: 0 1rem 0.75rem 1rem;
1073 display: flex;
1074 flex-direction: column;
1075 gap: 0.75rem;
1076}
1077
1078.bash-tool-section {
1079 display: flex;
1080 flex-direction: column;
1081 gap: 0.5rem;
1082}
1083
1084.bash-tool-label {
1085 font-size: 0.75rem;
1086 font-weight: 500;
1087 color: var(--text-secondary);
1088 display: flex;
1089 align-items: center;
1090 gap: 0.5rem;
1091}
1092
1093.bash-tool-time {
1094 font-size: 0.75rem;
1095 color: var(--text-tertiary);
1096 font-weight: normal;
1097}
1098
1099.bash-tool-code {
1100 font-family: var(--font-mono);
1101 font-size: 0.875rem;
1102 background: var(--bg-base);
1103 border: 1px solid var(--border);
1104 border-radius: 0.25rem;
1105 padding: 0.75rem;
1106 margin: 0;
1107 overflow-x: auto;
1108 white-space: pre-wrap;
1109 word-break: break-word;
1110 color: var(--text-primary);
1111}
1112
1113.bash-tool-code.error {
1114 background: var(--error-bg);
1115 border-color: var(--error-border);
1116 color: var(--error-text);
1117}
1118
1119/* Patch Tool */
1120.patch-tool {
1121 background: var(--gray-100);
1122 border-radius: 0.5rem;
1123 margin: 0.5rem 0;
1124 width: 100%;
1125}
1126
1127.dark .patch-tool {
1128 background: var(--gray-800);
1129}
1130
1131.patch-tool-header {
1132 display: flex;
1133 align-items: center;
1134 justify-content: space-between;
1135 padding: 0.75rem 1rem;
1136 cursor: pointer;
1137 user-select: none;
1138}
1139
1140.patch-tool-header:hover {
1141 background: rgba(0, 0, 0, 0.02);
1142 border-radius: 0.5rem;
1143}
1144
1145.dark .patch-tool-header:hover {
1146 background: rgba(255, 255, 255, 0.02);
1147}
1148
1149.patch-tool-summary {
1150 display: flex;
1151 align-items: center;
1152 gap: 0.5rem;
1153 flex: 1;
1154 min-width: 0;
1155}
1156
1157.patch-tool-emoji {
1158 font-size: 1rem;
1159 flex-shrink: 0;
1160}
1161
1162.patch-tool-emoji.running {
1163}
1164
1165.patch-tool-filename {
1166 font-family: var(--font-mono);
1167 font-size: 0.875rem;
1168 color: var(--text-primary);
1169 overflow: hidden;
1170 text-overflow: ellipsis;
1171 white-space: nowrap;
1172 font-weight: 500;
1173}
1174
1175.patch-tool-running {
1176 font-size: 0.75rem;
1177 color: var(--text-secondary);
1178 font-style: italic;
1179 flex-shrink: 0;
1180 animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
1181}
1182
1183.patch-tool-success {
1184 color: var(--success-text);
1185 font-size: 0.875rem;
1186 flex-shrink: 0;
1187}
1188
1189.patch-tool-error {
1190 color: var(--text-secondary);
1191 font-size: 0.875rem;
1192 flex-shrink: 0;
1193}
1194
1195.patch-tool-header-controls {
1196 display: flex;
1197 align-items: center;
1198 gap: 0.25rem;
1199 flex-shrink: 0;
1200}
1201
1202.patch-tool-toggle {
1203 background: none;
1204 border: none;
1205 cursor: pointer;
1206 padding: 0.25rem;
1207 display: flex;
1208 align-items: center;
1209 justify-content: center;
1210 color: var(--text-secondary);
1211 flex-shrink: 0;
1212}
1213
1214.patch-tool-toggle:hover {
1215 color: var(--text-primary);
1216}
1217
1218.patch-tool-diff-mode-toggle {
1219 background: none;
1220 border: 1px solid var(--border);
1221 border-radius: 0.25rem;
1222 cursor: pointer;
1223 padding: 0.25rem;
1224 display: flex;
1225 align-items: center;
1226 justify-content: center;
1227 color: var(--text-secondary);
1228 flex-shrink: 0;
1229 transition: all 0.15s ease;
1230}
1231
1232.patch-tool-diff-mode-toggle:hover {
1233 color: var(--text-primary);
1234 background: var(--bg-secondary);
1235 border-color: var(--text-tertiary);
1236}
1237
1238.patch-tool-details {
1239 padding: 0 1rem 0.75rem 1rem;
1240 display: flex;
1241 flex-direction: column;
1242 gap: 0.75rem;
1243}
1244
1245.patch-tool-section {
1246 display: flex;
1247 flex-direction: column;
1248 gap: 0.5rem;
1249}
1250
1251.patch-tool-label {
1252 font-size: 0.75rem;
1253 font-weight: 500;
1254 color: var(--text-secondary);
1255 display: flex;
1256 align-items: center;
1257 justify-content: space-between;
1258}
1259
1260.patch-tool-time {
1261 font-size: 0.75rem;
1262 color: var(--text-tertiary);
1263 font-weight: normal;
1264}
1265
1266.patch-tool-error-message {
1267 font-family: var(--font-mono);
1268 font-size: 0.875rem;
1269 background: var(--bg-tertiary);
1270 border: 1px solid var(--border);
1271 border-radius: 0.25rem;
1272 padding: 0.75rem;
1273 margin: 0;
1274 overflow-x: auto;
1275 white-space: pre-wrap;
1276 word-break: break-word;
1277 color: var(--text-secondary);
1278}
1279
1280/* Patch Tool Simple Diff View */
1281.patch-tool-diff {
1282 font-family: var(--font-mono);
1283 font-size: 0.875rem;
1284 background: var(--bg-base);
1285 border: 1px solid var(--border);
1286 border-radius: 0.25rem;
1287 padding: 0.75rem;
1288 margin: 0;
1289 overflow-x: auto;
1290 line-height: 1.4;
1291}
1292
1293.patch-diff-line {
1294 white-space: pre;
1295 display: block;
1296}
1297
1298.patch-diff-addition {
1299 background: rgba(34, 197, 94, 0.1);
1300 color: #16a34a;
1301}
1302
1303.dark .patch-diff-addition {
1304 background: rgba(34, 197, 94, 0.15);
1305 color: #86efac;
1306}
1307
1308.patch-diff-deletion {
1309 background: rgba(239, 68, 68, 0.1);
1310 color: #dc2626;
1311}
1312
1313.dark .patch-diff-deletion {
1314 background: rgba(239, 68, 68, 0.15);
1315 color: #fca5a5;
1316}
1317
1318.patch-diff-hunk {
1319 color: var(--text-secondary);
1320 background: var(--bg-tertiary);
1321 font-weight: 500;
1322}
1323
1324.patch-diff-header {
1325 color: var(--text-tertiary);
1326 font-style: italic;
1327}
1328
1329/* Patch Tool Monaco Container */
1330.patch-tool-monaco-container {
1331 display: flex;
1332 flex-direction: column;
1333 gap: 0.25rem;
1334}
1335
1336/* Patch Tool Monaco Placeholder (for lazy loading) */
1337.patch-tool-monaco-placeholder {
1338 display: flex;
1339 align-items: center;
1340 justify-content: center;
1341 gap: 0.5rem;
1342 background: var(--bg-tertiary);
1343 border: 1px solid var(--border);
1344 border-radius: 0.25rem;
1345 color: var(--text-secondary);
1346 font-size: 0.75rem;
1347}
1348
1349.spinner-small {
1350 width: 14px;
1351 height: 14px;
1352 border: 2px solid var(--border);
1353 border-top-color: var(--primary);
1354 border-radius: 50%;
1355 animation: spin 0.8s linear infinite;
1356}
1357
1358@keyframes spin {
1359 to {
1360 transform: rotate(360deg);
1361 }
1362}
1363
1364/* Patch Tool Monaco Editor */
1365.patch-tool-monaco-editor {
1366 border: 1px solid var(--border);
1367 border-radius: 0.25rem;
1368 overflow: hidden;
1369}
1370
1371/* Monaco line hover highlighting (via decoration API) */
1372.patch-tool-monaco-editor .monaco-editor .patch-line-hover {
1373 background-color: rgba(37, 99, 235, 0.08) !important;
1374}
1375
1376.dark .patch-tool-monaco-editor .monaco-editor .patch-line-hover {
1377 background-color: rgba(96, 165, 250, 0.12) !important;
1378}
1379
1380/* Comment indicator glyph in margin */
1381.patch-tool-monaco-editor .monaco-editor .patch-comment-glyph {
1382 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'%3E%3C/path%3E%3Cline x1='9' y1='10' x2='15' y2='10'%3E%3C/line%3E%3C/svg%3E");
1383 background-size: 14px 14px;
1384 background-repeat: no-repeat;
1385 background-position: center;
1386 opacity: 0.6;
1387 cursor: pointer;
1388}
1389
1390.patch-tool-monaco-editor .monaco-editor .patch-comment-glyph:hover {
1391 opacity: 1;
1392}
1393
1394.dark .patch-tool-monaco-editor .monaco-editor .patch-comment-glyph {
1395 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'%3E%3C/path%3E%3Cline x1='9' y1='10' x2='15' y2='10'%3E%3C/line%3E%3C/svg%3E");
1396}
1397
1398/* Make Monaco lines clickable with pointer cursor */
1399.patch-tool-monaco-editor .monaco-editor .view-lines {
1400 cursor: pointer;
1401}
1402
1403/* Patch Tool Comment Dialog */
1404.patch-tool-comment-dialog {
1405 position: fixed;
1406 top: 50%;
1407 left: 50%;
1408 transform: translate(-50%, -50%);
1409 background: var(--bg-base);
1410 border: 1px solid var(--border);
1411 border-radius: 0.5rem;
1412 padding: 1rem;
1413 z-index: 1000;
1414 max-width: 500px;
1415 width: 90%;
1416 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
1417}
1418
1419.dark .patch-tool-comment-dialog {
1420 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
1421}
1422
1423.patch-tool-comment-dialog h4 {
1424 margin: 0 0 0.75rem 0;
1425 font-size: 0.875rem;
1426 font-weight: 600;
1427 color: var(--text-primary);
1428}
1429
1430.patch-tool-selected-text {
1431 font-family: var(--font-mono);
1432 font-size: 0.75rem;
1433 background: var(--bg-tertiary);
1434 border: 1px solid var(--border);
1435 border-radius: 0.25rem;
1436 padding: 0.5rem;
1437 margin: 0 0 0.75rem 0;
1438 overflow-x: auto;
1439 max-height: 100px;
1440 white-space: pre;
1441 color: var(--text-secondary);
1442}
1443
1444.patch-tool-comment-input {
1445 width: 100%;
1446 min-height: 80px;
1447 padding: 0.5rem;
1448 border: 1px solid var(--border);
1449 border-radius: 0.25rem;
1450 background: var(--bg-base);
1451 color: var(--text-primary);
1452 font-family: inherit;
1453 font-size: 0.875rem;
1454 resize: vertical;
1455 box-sizing: border-box;
1456}
1457
1458.patch-tool-comment-input:focus {
1459 outline: none;
1460 border-color: var(--primary);
1461 box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.2);
1462}
1463
1464.patch-tool-comment-actions {
1465 display: flex;
1466 gap: 0.5rem;
1467 justify-content: flex-end;
1468 margin-top: 0.75rem;
1469}
1470
1471.patch-tool-btn {
1472 padding: 0.5rem 1rem;
1473 border-radius: 0.25rem;
1474 font-size: 0.875rem;
1475 font-weight: 500;
1476 cursor: pointer;
1477 border: none;
1478 transition: background-color 0.15s;
1479}
1480
1481.patch-tool-btn-primary {
1482 background: var(--primary);
1483 color: white;
1484}
1485
1486.patch-tool-btn-primary:hover:not(:disabled) {
1487 background: var(--primary-dark);
1488}
1489
1490.patch-tool-btn-primary:disabled {
1491 opacity: 0.5;
1492 cursor: not-allowed;
1493}
1494
1495.patch-tool-btn-secondary {
1496 background: var(--bg-tertiary);
1497 color: var(--text-primary);
1498}
1499
1500.patch-tool-btn-secondary:hover {
1501 background: var(--bg-secondary);
1502}
1503
1504/* Screenshot Tool */
1505.screenshot-tool {
1506 background: var(--gray-100);
1507 border-radius: 0.5rem;
1508 margin: 0.5rem 0;
1509 width: 100%;
1510}
1511
1512.dark .screenshot-tool {
1513 background: var(--gray-800);
1514}
1515
1516.screenshot-tool-header {
1517 display: flex;
1518 align-items: center;
1519 justify-content: space-between;
1520 padding: 0.75rem 1rem;
1521 cursor: pointer;
1522 user-select: none;
1523}
1524
1525.screenshot-tool-header:hover {
1526 background: rgba(0, 0, 0, 0.02);
1527 border-radius: 0.5rem;
1528}
1529
1530.dark .screenshot-tool-header:hover {
1531 background: rgba(255, 255, 255, 0.02);
1532}
1533
1534.screenshot-tool-summary {
1535 display: flex;
1536 align-items: center;
1537 gap: 0.5rem;
1538 flex: 1;
1539 min-width: 0;
1540}
1541
1542.screenshot-tool-emoji {
1543 font-size: 1rem;
1544 flex-shrink: 0;
1545}
1546
1547.screenshot-tool-emoji.running {
1548}
1549
1550.screenshot-tool-filename {
1551 font-family: var(--font-mono);
1552 font-size: 0.875rem;
1553 color: var(--text-primary);
1554 overflow: hidden;
1555 text-overflow: ellipsis;
1556 white-space: nowrap;
1557 font-weight: 500;
1558}
1559
1560.screenshot-tool-running {
1561 font-size: 0.75rem;
1562 color: var(--text-secondary);
1563 font-style: italic;
1564 flex-shrink: 0;
1565 animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
1566}
1567
1568.screenshot-tool-success {
1569 color: var(--success-text);
1570 font-size: 0.875rem;
1571 flex-shrink: 0;
1572}
1573
1574.screenshot-tool-error {
1575 color: var(--error-text);
1576 font-size: 0.875rem;
1577 flex-shrink: 0;
1578}
1579
1580.screenshot-tool-toggle {
1581 background: none;
1582 border: none;
1583 cursor: pointer;
1584 padding: 0.25rem;
1585 display: flex;
1586 align-items: center;
1587 justify-content: center;
1588 color: var(--text-secondary);
1589 flex-shrink: 0;
1590}
1591
1592.screenshot-tool-toggle:hover {
1593 color: var(--text-primary);
1594}
1595
1596.screenshot-tool-details {
1597 padding: 0 1rem 0.75rem 1rem;
1598 display: flex;
1599 flex-direction: column;
1600 gap: 0.75rem;
1601}
1602
1603.screenshot-tool-section {
1604 display: flex;
1605 flex-direction: column;
1606 gap: 0.5rem;
1607}
1608
1609.screenshot-tool-label {
1610 font-size: 0.75rem;
1611 font-weight: 500;
1612 color: var(--text-secondary);
1613 display: flex;
1614 align-items: center;
1615 justify-content: space-between;
1616}
1617
1618.screenshot-tool-time {
1619 font-size: 0.75rem;
1620 color: var(--text-tertiary);
1621 font-weight: normal;
1622}
1623
1624.screenshot-tool-image-container {
1625 border: 1px solid var(--border);
1626 border-radius: 0.25rem;
1627 overflow: hidden;
1628 background: var(--bg-base);
1629 width: fit-content;
1630 max-width: 100%;
1631}
1632
1633.screenshot-tool-image-container a {
1634 display: block;
1635}
1636
1637.screenshot-tool-image-container img {
1638 display: block;
1639 border-radius: 0.25rem;
1640}
1641
1642.screenshot-tool-error-message {
1643 font-family: var(--font-mono);
1644 font-size: 0.875rem;
1645 background: var(--error-bg);
1646 border: 1px solid var(--error-border);
1647 border-radius: 0.25rem;
1648 padding: 0.75rem;
1649 margin: 0;
1650 overflow-x: auto;
1651 white-space: pre-wrap;
1652 word-break: break-word;
1653 color: var(--error-text);
1654}
1655
1656/* Output Iframe Tool */
1657.output-iframe-tool {
1658 background: var(--gray-100);
1659 border-radius: 0.5rem;
1660 margin: 0.5rem 0;
1661 width: 100%;
1662}
1663
1664.dark .output-iframe-tool {
1665 background: var(--gray-800);
1666}
1667
1668.output-iframe-tool-header {
1669 display: flex;
1670 align-items: center;
1671 justify-content: space-between;
1672 padding: 0.75rem 1rem;
1673 cursor: pointer;
1674 user-select: none;
1675}
1676
1677.output-iframe-tool-header:hover {
1678 background: rgba(0, 0, 0, 0.02);
1679 border-radius: 0.5rem;
1680}
1681
1682.dark .output-iframe-tool-header:hover {
1683 background: rgba(255, 255, 255, 0.02);
1684}
1685
1686.output-iframe-tool-summary {
1687 display: flex;
1688 align-items: center;
1689 gap: 0.5rem;
1690 flex: 1;
1691 min-width: 0;
1692}
1693
1694.output-iframe-tool-emoji {
1695 font-size: 1rem;
1696 flex-shrink: 0;
1697}
1698
1699.output-iframe-tool-emoji.running {
1700}
1701
1702.output-iframe-tool-title {
1703 font-family: var(--font-mono);
1704 font-size: 0.875rem;
1705 color: var(--text-primary);
1706 overflow: hidden;
1707 text-overflow: ellipsis;
1708 white-space: nowrap;
1709 font-weight: 500;
1710}
1711
1712.output-iframe-tool-success {
1713 color: var(--success-text);
1714 font-weight: 600;
1715 margin-left: 0.5rem;
1716}
1717
1718.output-iframe-tool-error {
1719 color: var(--error-text);
1720 font-weight: 600;
1721 margin-left: 0.5rem;
1722}
1723
1724.output-iframe-tool-actions {
1725 display: flex;
1726 align-items: center;
1727 gap: 0.25rem;
1728 flex-shrink: 0;
1729}
1730
1731.output-iframe-tool-open-btn,
1732.output-iframe-tool-download-btn {
1733 background: none;
1734 border: none;
1735 padding: 0.25rem;
1736 cursor: pointer;
1737 color: var(--text-secondary);
1738 display: flex;
1739 align-items: center;
1740 justify-content: center;
1741 border-radius: 4px;
1742}
1743
1744.output-iframe-tool-open-btn:hover,
1745.output-iframe-tool-download-btn:hover {
1746 color: var(--text-primary);
1747 background: var(--gray-200);
1748}
1749
1750.dark .output-iframe-tool-open-btn:hover,
1751.dark .output-iframe-tool-download-btn:hover {
1752 background: var(--gray-700);
1753}
1754
1755.output-iframe-tool-toggle {
1756 background: none;
1757 border: none;
1758 padding: 0.25rem;
1759 cursor: pointer;
1760 color: var(--text-secondary);
1761 display: flex;
1762 align-items: center;
1763 justify-content: center;
1764 flex-shrink: 0;
1765}
1766
1767.output-iframe-tool-toggle:hover {
1768 color: var(--text-primary);
1769}
1770
1771.output-iframe-tool-details {
1772 padding: 0 1rem 1rem 1rem;
1773}
1774
1775.output-iframe-tool-section {
1776 margin-top: 0.5rem;
1777}
1778
1779.output-iframe-tool-label {
1780 font-size: 0.75rem;
1781 font-weight: 500;
1782 color: var(--text-secondary);
1783 margin-bottom: 0.5rem;
1784 display: flex;
1785 justify-content: space-between;
1786 align-items: center;
1787}
1788
1789.output-iframe-tool-time {
1790 font-family: var(--font-mono);
1791 font-size: 0.75rem;
1792 color: var(--text-tertiary);
1793}
1794
1795.output-iframe-container {
1796 width: 100%;
1797 overflow: hidden;
1798 border-radius: 0.25rem;
1799}
1800
1801.output-iframe-container iframe {
1802 display: block;
1803}
1804
1805.output-iframe-tool-error-message {
1806 font-family: var(--font-mono);
1807 font-size: 0.875rem;
1808 background: var(--error-bg);
1809 border: 1px solid var(--error-border);
1810 border-radius: 0.25rem;
1811 padding: 0.75rem;
1812 margin: 0;
1813 overflow-x: auto;
1814 white-space: pre-wrap;
1815 word-break: break-word;
1816 color: var(--error-text);
1817}
1818
1819/* Message Input */
1820.message-input-container {
1821 flex: 0 0 auto;
1822 background: var(--bg-base);
1823 border-top: 1px solid var(--border);
1824 padding: 1rem;
1825 padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
1826 padding-left: max(1rem, env(safe-area-inset-left));
1827 padding-right: max(1rem, env(safe-area-inset-right));
1828}
1829
1830.message-input-form {
1831 display: flex;
1832 align-items: flex-end;
1833 gap: 0.5rem;
1834 max-width: 800px;
1835 margin: 0 auto;
1836}
1837
1838.message-textarea {
1839 flex: 1;
1840 min-height: 46px;
1841 max-height: 200px;
1842 padding: 0.625rem 1rem;
1843 border: 1.5px solid var(--border);
1844 border-radius: 4px;
1845 resize: none;
1846 background: var(--bg-base);
1847 color: var(--text-primary);
1848 font-family: inherit;
1849 font-size: 16px; /* Must be 16px+ to prevent iOS zoom on focus */
1850 line-height: 1.5;
1851 transition:
1852 border-color 0.2s,
1853 box-shadow 0.2s;
1854}
1855
1856.message-textarea:focus {
1857 outline: none;
1858 border-color: var(--primary);
1859 box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.08);
1860}
1861
1862.message-textarea:disabled {
1863 opacity: 0.5;
1864 cursor: not-allowed;
1865}
1866
1867.message-send-btn svg {
1868 transform: rotate(-90deg);
1869}
1870
1871.message-textarea::placeholder {
1872 color: var(--text-tertiary);
1873}
1874
1875.message-send-btn {
1876 flex-shrink: 0;
1877 width: 36px;
1878 height: 36px;
1879 margin-bottom: 0.25rem;
1880 padding: 0;
1881 background: var(--primary);
1882 color: white;
1883 border: none;
1884 border-radius: 50%;
1885 display: flex;
1886 align-items: center;
1887 justify-content: center;
1888 transition:
1889 background-color 0.2s,
1890 transform 0.1s;
1891 cursor: pointer;
1892}
1893
1894.message-send-btn:hover:not(:disabled) {
1895 background: var(--primary-dark);
1896 transform: scale(1.05);
1897}
1898
1899.message-send-btn:active:not(:disabled) {
1900 transform: scale(0.95);
1901}
1902
1903.message-send-btn:disabled {
1904 background: var(--gray-300);
1905 cursor: not-allowed;
1906 opacity: 0.6;
1907}
1908
1909.dark .message-send-btn:disabled {
1910 background: var(--gray-600);
1911}
1912
1913/* Attach file button */
1914.message-attach-btn {
1915 flex-shrink: 0;
1916 width: 36px;
1917 height: 36px;
1918 margin-bottom: 0.25rem;
1919 padding: 0;
1920 background: transparent;
1921 color: var(--text-secondary);
1922 border: none;
1923 border-radius: 50%;
1924 display: flex;
1925 align-items: center;
1926 justify-content: center;
1927 transition:
1928 background-color 0.2s,
1929 color 0.2s,
1930 transform 0.1s;
1931 cursor: pointer;
1932}
1933
1934.message-attach-btn:hover:not(:disabled) {
1935 background: var(--gray-100);
1936 color: var(--text-primary);
1937}
1938
1939.dark .message-attach-btn:hover:not(:disabled) {
1940 background: var(--gray-700);
1941}
1942
1943.message-attach-btn:active:not(:disabled) {
1944 transform: scale(0.95);
1945}
1946
1947.message-attach-btn:disabled {
1948 cursor: not-allowed;
1949 opacity: 0.4;
1950}
1951
1952/* Voice input button */
1953.message-voice-btn {
1954 flex-shrink: 0;
1955 width: 36px;
1956 height: 36px;
1957 margin-bottom: 0.25rem;
1958 padding: 0;
1959 background: transparent;
1960 color: var(--text-secondary);
1961 border: none;
1962 border-radius: 50%;
1963 display: flex;
1964 align-items: center;
1965 justify-content: center;
1966 transition:
1967 background-color 0.2s,
1968 color 0.2s,
1969 transform 0.1s;
1970 cursor: pointer;
1971}
1972
1973.message-voice-btn:hover:not(:disabled):not(.listening) {
1974 background: var(--gray-100);
1975 color: var(--text-primary);
1976}
1977
1978.dark .message-voice-btn:hover:not(:disabled):not(.listening) {
1979 background: var(--gray-700);
1980}
1981
1982.message-voice-btn:active:not(:disabled):not(.listening) {
1983 transform: scale(0.95);
1984}
1985
1986.message-voice-btn:disabled {
1987 cursor: not-allowed;
1988 opacity: 0.4;
1989}
1990
1991.message-voice-btn.listening,
1992.message-voice-btn.listening:hover {
1993 background: #dc2626;
1994 color: white;
1995 animation: pulse-voice 1.5s ease-in-out infinite;
1996}
1997
1998.dark .message-voice-btn.listening,
1999.dark .message-voice-btn.listening:hover {
2000 background: #ef4444;
2001 color: white;
2002}
2003
2004@keyframes pulse-voice {
2005 0%,
2006 100% {
2007 transform: scale(1);
2008 }
2009 50% {
2010 transform: scale(1.1);
2011 }
2012}
2013
2014/* Drag and drop styles */
2015.message-input-container {
2016 position: relative;
2017}
2018
2019.message-input-container.drag-over {
2020 border-color: var(--primary);
2021}
2022
2023.message-input-container.shell-mode .message-input-form {
2024 border-color: var(--warning-border);
2025 background: var(--warning-bg);
2026}
2027
2028.message-input-container.shell-mode .message-textarea {
2029 font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
2030 background: transparent;
2031 padding-left: 36px;
2032}
2033
2034.message-input-container.shell-mode .message-textarea::placeholder {
2035 font-family: inherit;
2036}
2037
2038.shell-mode-indicator {
2039 position: absolute;
2040 left: 12px;
2041 top: 50%;
2042 transform: translateY(-50%);
2043 display: flex;
2044 align-items: center;
2045 justify-content: center;
2046 color: var(--warning-text);
2047 pointer-events: none;
2048 z-index: 1;
2049}
2050
2051.drag-overlay {
2052 position: absolute;
2053 inset: 0;
2054 background: rgba(37, 99, 235, 0.1);
2055 border: 2px dashed var(--primary);
2056 border-radius: 4px;
2057 display: flex;
2058 align-items: center;
2059 justify-content: center;
2060 z-index: 10;
2061 pointer-events: none;
2062}
2063
2064.drag-overlay-content {
2065 background: var(--primary);
2066 color: white;
2067 padding: 0.5rem 1rem;
2068 border-radius: 4px;
2069 font-size: 0.875rem;
2070 font-weight: 500;
2071}
2072
2073/* Modal */
2074.modal-overlay {
2075 position: fixed;
2076 inset: 0;
2077 background: rgba(0, 0, 0, 0.5);
2078 z-index: 50;
2079 display: flex;
2080 align-items: center;
2081 justify-content: center;
2082 padding: 1rem;
2083}
2084
2085.modal {
2086 background: var(--bg-base);
2087 border-radius: 0.5rem;
2088 box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
2089 max-width: 28rem;
2090 width: 100%;
2091 max-height: 80vh;
2092 overflow: hidden;
2093}
2094
2095.modal.modal-wide {
2096 max-width: 40rem;
2097}
2098
2099.modal-header {
2100 display: flex;
2101 align-items: center;
2102 justify-content: space-between;
2103 padding: 1rem;
2104 border-bottom: 1px solid var(--border);
2105}
2106
2107.modal-title {
2108 font-size: 1.125rem;
2109 font-weight: 600;
2110}
2111
2112.modal-title-right {
2113 margin-left: auto;
2114 margin-right: 1rem;
2115}
2116
2117.modal-body {
2118 padding: 1rem;
2119 overflow-y: auto;
2120 max-height: calc(80vh - 60px);
2121}
2122
2123/* Form Elements */
2124label {
2125 display: block;
2126 font-size: 0.875rem;
2127 font-weight: 500;
2128 margin-bottom: 0.5rem;
2129}
2130
2131select {
2132 width: 100%;
2133 background: var(--bg-tertiary);
2134 border: 1px solid var(--border);
2135 border-radius: 0.375rem;
2136 padding: 0.5rem 0.75rem;
2137 font-family: inherit;
2138 font-size: 1rem;
2139 color: var(--text-primary);
2140}
2141
2142select:focus {
2143 outline: none;
2144 border-color: var(--primary);
2145 box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);
2146}
2147
2148select:disabled {
2149 opacity: 0.5;
2150 cursor: not-allowed;
2151}
2152
2153/* Loading Spinner */
2154.spinner {
2155 width: 2rem;
2156 height: 2rem;
2157 border: 2px solid transparent;
2158 border-top-color: var(--primary);
2159 border-radius: 50%;
2160 animation: spin 0.8s linear infinite;
2161}
2162
2163.spinner-small {
2164 width: 1rem;
2165 height: 1rem;
2166 border-width: 2px;
2167 border-top-color: currentColor;
2168}
2169
2170@keyframes spin {
2171 to {
2172 transform: rotate(360deg);
2173 }
2174}
2175
2176/* Loading/Error States */
2177.loading-container,
2178.error-container {
2179 height: 100vh; /* Fallback for older browsers */
2180 height: 100dvh;
2181 display: flex;
2182 align-items: center;
2183 justify-content: center;
2184}
2185
2186.loading-content,
2187.error-content {
2188 text-align: center;
2189}
2190
2191/* Unified Status Bar */
2192.status-bar {
2193 flex: 0 0 auto;
2194 background: var(--bg-base);
2195 border-top: 1px solid var(--border);
2196 padding: 0.5rem 1rem;
2197 padding-left: max(1rem, env(safe-area-inset-left));
2198 padding-right: max(1rem, env(safe-area-inset-right));
2199 min-height: 2.5rem;
2200 display: flex;
2201 align-items: center;
2202}
2203
2204.status-bar-content {
2205 display: flex;
2206 align-items: center;
2207 justify-content: space-between;
2208 width: 100%;
2209 gap: 0.75rem;
2210}
2211
2212.status-message {
2213 color: var(--text-secondary);
2214 font-size: 0.875rem;
2215 flex: 1;
2216 min-width: 0;
2217}
2218
2219.status-message.status-ready {
2220 color: var(--text-tertiary);
2221}
2222
2223.status-message.status-warning {
2224 color: var(--blue-text);
2225 font-weight: 500;
2226}
2227
2228.status-message.status-error {
2229 color: var(--error-text);
2230 font-weight: 500;
2231}
2232
2233.animated-working {
2234 display: inline;
2235}
2236
2237.animated-working .bold-letter {
2238 font-weight: 700;
2239}
2240
2241.status-button {
2242 padding: 0.375rem 0.875rem;
2243 border-radius: 0.375rem;
2244 font-size: 0.875rem;
2245 font-weight: 500;
2246 transition: all 0.2s;
2247 display: flex;
2248 align-items: center;
2249 gap: 0.375rem;
2250 white-space: nowrap;
2251 border: none;
2252 cursor: pointer;
2253}
2254
2255.status-button svg {
2256 width: 0.875rem;
2257 height: 0.875rem;
2258}
2259
2260.status-button-primary {
2261 background: var(--primary);
2262 color: white;
2263}
2264
2265.status-button-primary:hover {
2266 background: var(--primary-dark);
2267}
2268
2269.status-button-cancel {
2270 background: var(--error-bg);
2271 color: var(--error-text);
2272 border: 1px solid var(--error-border);
2273}
2274
2275.status-button-cancel:hover:not(:disabled) {
2276 background: var(--error-text);
2277 color: white;
2278}
2279
2280.status-button-cancel:disabled {
2281 opacity: 0.6;
2282 cursor: not-allowed;
2283}
2284
2285.status-button-text {
2286 background: transparent;
2287 color: var(--text-secondary);
2288 padding: 0.25rem;
2289}
2290
2291.status-button-text:hover {
2292 background: var(--bg-tertiary);
2293 color: var(--text-primary);
2294}
2295
2296/* Legacy disconnect/error banner classes (kept for compatibility but unused) */
2297.disconnect-banner {
2298 background: var(--gray-100);
2299 border-top: 1px solid var(--border);
2300 padding: 0.5rem 1rem;
2301}
2302
2303.dark .disconnect-banner {
2304 background: var(--gray-800);
2305}
2306
2307.disconnect-banner-content {
2308 display: flex;
2309 align-items: center;
2310 justify-content: center;
2311 gap: 0.75rem;
2312}
2313
2314.disconnect-message {
2315 color: var(--text-secondary);
2316 font-size: 0.875rem;
2317 margin: 0;
2318}
2319
2320.btn-reconnect {
2321 padding: 0.25rem 0.75rem;
2322 background: var(--primary);
2323 color: white;
2324 border-radius: 0.375rem;
2325 font-size: 0.875rem;
2326 font-weight: 500;
2327 transition: background-color 0.2s;
2328}
2329
2330.btn-reconnect:hover {
2331 background: var(--primary-dark);
2332}
2333
2334.error-banner {
2335 background: var(--error-bg);
2336 border-top: 1px solid var(--error-border);
2337 padding: 0.75rem 1rem;
2338}
2339
2340.error-banner-content {
2341 display: flex;
2342 align-items: center;
2343 justify-content: space-between;
2344}
2345
2346.error-message {
2347 color: var(--error-text);
2348 font-size: 0.875rem;
2349}
2350
2351/* Empty State */
2352.empty-state {
2353 display: flex;
2354 align-items: center;
2355 justify-content: center;
2356 height: 100%;
2357 color: var(--text-secondary);
2358}
2359
2360.empty-state-content {
2361 text-align: center;
2362}
2363
2364/* Scrollbar */
2365.scrollable {
2366 scrollbar-width: thin;
2367 scrollbar-color: rgba(156, 163, 175, 0.5) transparent;
2368}
2369
2370.scrollable::-webkit-scrollbar {
2371 width: 6px;
2372}
2373
2374.scrollable::-webkit-scrollbar-track {
2375 background: transparent;
2376}
2377
2378.scrollable::-webkit-scrollbar-thumb {
2379 background-color: rgba(156, 163, 175, 0.5);
2380 border-radius: 3px;
2381}
2382
2383.scrollable::-webkit-scrollbar-thumb:hover {
2384 background-color: rgba(156, 163, 175, 0.8);
2385}
2386
2387/* SVG Icons */
2388svg {
2389 width: 1.25rem;
2390 height: 1.25rem;
2391 display: block;
2392}
2393
2394.icon-sm svg {
2395 width: 1rem;
2396 height: 1rem;
2397}
2398
2399/* Utility Classes */
2400.relative {
2401 position: relative;
2402}
2403
2404.overflow-auto {
2405 overflow: auto;
2406}
2407
2408.overflow-hidden {
2409 overflow: hidden;
2410}
2411
2412.rounded {
2413 border-radius: 0.25rem;
2414}
2415
2416.rounded-lg {
2417 border-radius: 0.5rem;
2418}
2419
2420.border {
2421 border: 1px solid var(--border);
2422}
2423
2424.min-h-0 {
2425 min-height: 0;
2426}
2427
2428/* Overflow Menu */
2429.overflow-menu {
2430 position: absolute;
2431 top: calc(100% + 0.5rem);
2432 right: 0;
2433 background: var(--bg-secondary);
2434 border: 1px solid var(--border);
2435 border-radius: 0.5rem;
2436 box-shadow:
2437 0 4px 6px -1px rgba(0, 0, 0, 0.1),
2438 0 2px 4px -1px rgba(0, 0, 0, 0.06);
2439 min-width: 10rem;
2440 z-index: 50;
2441}
2442
2443.overflow-menu-item {
2444 display: flex;
2445 align-items: center;
2446 width: 100%;
2447 padding: 0.75rem 1rem;
2448 text-align: left;
2449 background: transparent;
2450 border: none;
2451 color: var(--text-primary);
2452 font-size: 0.875rem;
2453 cursor: pointer;
2454 transition: background-color 0.2s;
2455}
2456
2457.overflow-menu-item:hover {
2458 background: var(--bg-hover);
2459}
2460
2461.overflow-menu-item:first-child {
2462 border-top-left-radius: 0.5rem;
2463 border-top-right-radius: 0.5rem;
2464}
2465
2466.overflow-menu-item:last-child {
2467 border-bottom-left-radius: 0.5rem;
2468 border-bottom-right-radius: 0.5rem;
2469}
2470
2471.overflow-menu-divider {
2472 height: 1px;
2473 background: var(--border);
2474 margin: 0.5rem 0;
2475}
2476
2477.theme-toggle-row {
2478 display: flex;
2479 gap: 0.25rem;
2480 padding: 0.5rem;
2481}
2482
2483.theme-toggle-btn {
2484 flex: 1;
2485 display: flex;
2486 align-items: center;
2487 justify-content: center;
2488 padding: 0.5rem;
2489 background: transparent;
2490 border: 1px solid var(--border);
2491 border-radius: 0.375rem;
2492 color: var(--text-secondary);
2493 cursor: pointer;
2494 transition: all 0.15s;
2495}
2496
2497.theme-toggle-btn svg {
2498 width: 1.125rem;
2499 height: 1.125rem;
2500}
2501
2502.theme-toggle-btn:hover {
2503 background: var(--bg-tertiary);
2504 color: var(--text-primary);
2505}
2506
2507.theme-toggle-btn-selected {
2508 background: var(--primary);
2509 border-color: var(--primary);
2510 color: white;
2511}
2512
2513.theme-toggle-btn-selected:hover {
2514 background: var(--primary-dark);
2515 border-color: var(--primary-dark);
2516 color: white;
2517}
2518
2519/* Diff display styling */
2520.diff-display {
2521 font-family: var(--font-mono);
2522 font-size: 0.875rem;
2523 line-height: 1.5;
2524 background: var(--bg-base);
2525 padding: 1rem;
2526 border-radius: 0.25rem;
2527 overflow-x: auto;
2528 white-space: pre;
2529 color: var(--text-primary);
2530}
2531
2532/* Responsive adjustments */
2533@media (min-width: 768px) {
2534 .drawer {
2535 position: static;
2536 transform: translateX(0) !important;
2537 }
2538
2539 .drawer.collapsed {
2540 display: none;
2541 }
2542
2543 .hide-on-desktop {
2544 display: none !important;
2545 }
2546
2547 .show-on-desktop-only {
2548 display: flex !important;
2549 }
2550
2551 .backdrop {
2552 display: none !important;
2553 }
2554}
2555
2556/* Hide desktop-only elements on mobile */
2557@media (max-width: 767px) {
2558 .show-on-desktop-only {
2559 display: none !important;
2560 }
2561}
2562
2563/* Scroll to bottom button */
2564.scroll-to-bottom-button {
2565 position: absolute;
2566 bottom: 1rem;
2567 left: 50%;
2568 transform: translateX(-50%);
2569 background: var(--bg-elevated);
2570 border: 1px solid var(--border);
2571 border-radius: 2rem;
2572 padding: 0.5rem 1rem;
2573 display: flex;
2574 align-items: center;
2575 gap: 0.5rem;
2576 cursor: pointer;
2577 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
2578 transition: all 0.2s ease;
2579 color: var(--text-primary);
2580 font-size: 0.875rem;
2581 z-index: 10;
2582}
2583
2584.scroll-to-bottom-button:hover {
2585 background: var(--bg-hover);
2586 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
2587}
2588
2589.scroll-to-bottom-button:active {
2590 transform: translateX(-50%) scale(0.95);
2591}
2592
2593/* Wrapper for messages area to position scroll-to-bottom button */
2594.messages-area-wrapper {
2595 position: relative;
2596 flex: 1 1 auto;
2597 min-height: 0; /* Important for flex children to shrink properly */
2598 overflow: hidden;
2599}
2600
2601.messages-container {
2602 height: 100%;
2603}
2604
2605/* Status bar configuration controls for empty conversations */
2606.status-bar-config {
2607 display: flex;
2608 align-items: center;
2609 gap: 0.75rem;
2610 width: 100%;
2611}
2612
2613.status-bar-new-conversation {
2614 display: flex;
2615 align-items: center;
2616 justify-content: space-between;
2617 width: 100%;
2618 flex-wrap: wrap;
2619 gap: 0.5rem;
2620}
2621
2622/* On smaller screens, allow the fields to stack vertically */
2623@media (max-width: 600px) {
2624 .status-bar-new-conversation {
2625 flex-direction: column;
2626 align-items: stretch;
2627 }
2628
2629 .status-field {
2630 width: 100%;
2631 }
2632}
2633
2634.status-bar-controls {
2635 display: flex;
2636 align-items: center;
2637 gap: 0.5rem;
2638}
2639
2640/* Flexible containers for status fields that adapt to content */
2641.status-field {
2642 display: flex;
2643 align-items: center;
2644 gap: 0.25rem;
2645 min-width: 0; /* Allow flex items to shrink below content size */
2646}
2647
2648.status-field-label {
2649 font-size: 0.7rem;
2650 color: var(--text-secondary);
2651 flex-shrink: 0;
2652}
2653
2654.status-field-model {
2655 flex: 1 1 auto;
2656 min-width: 150px;
2657 max-width: 300px;
2658}
2659
2660.status-field-cwd {
2661 flex: 1 1 auto;
2662 min-width: 180px;
2663 max-width: 400px;
2664}
2665
2666/* Compact clickable chips for model and cwd */
2667.status-chip {
2668 padding: 0.25rem 0.5rem;
2669 border: 1px solid var(--border);
2670 border-radius: 0.25rem;
2671 background: var(--bg-tertiary);
2672 color: var(--text-primary);
2673 font-size: 0.75rem;
2674 font-family: var(--font-mono);
2675 cursor: pointer;
2676 transition: all 0.2s;
2677 white-space: normal; /* Allow text to wrap */
2678 word-break: break-word; /* Break long words if needed */
2679 overflow-wrap: break-word;
2680 width: 100%;
2681 text-align: left;
2682 box-sizing: border-box;
2683 line-height: 1.3; /* Better line height for multi-line text */
2684 min-height: 1.75rem; /* Minimum height to accommodate wrapped text */
2685}
2686
2687.status-chip:hover:not(:disabled) {
2688 background: var(--bg-secondary);
2689 border-color: var(--blue-text);
2690}
2691
2692.status-chip:disabled {
2693 opacity: 0.5;
2694 cursor: not-allowed;
2695}
2696
2697.status-chip-error {
2698 border-color: var(--red-text, #dc2626);
2699 background: rgba(220, 38, 38, 0.1);
2700}
2701
2702.status-field-error {
2703 position: relative;
2704}
2705
2706.status-input-error {
2707 border-color: var(--red-text, #dc2626);
2708}
2709
2710.status-select {
2711 padding: 0.25rem 0.5rem;
2712 border: 1px solid var(--blue-text);
2713 border-radius: 0.25rem;
2714 background: var(--bg-base);
2715 color: var(--text-primary);
2716 font-size: 0.75rem;
2717 font-family: var(--font-mono);
2718 cursor: pointer;
2719 transition: border-color 0.2s;
2720 width: 100%;
2721 box-sizing: border-box;
2722}
2723
2724.status-select:hover:not(:disabled) {
2725 border-color: var(--blue-text);
2726}
2727
2728.status-select:focus {
2729 outline: none;
2730 border-color: var(--blue-text);
2731 box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15);
2732}
2733
2734.status-select:disabled {
2735 opacity: 0.5;
2736 cursor: not-allowed;
2737}
2738
2739/* Model Picker Custom Dropdown */
2740.model-picker {
2741 position: relative;
2742 display: inline-block;
2743 width: 100%;
2744}
2745
2746.model-picker-trigger {
2747 display: flex;
2748 align-items: center;
2749 justify-content: space-between;
2750 gap: 0.5rem;
2751 padding: 0.25rem 0.5rem;
2752 border: 1px solid var(--border);
2753 border-radius: 0.25rem;
2754 background: var(--bg-tertiary);
2755 color: var(--text-primary);
2756 font-size: 0.75rem;
2757 font-family: var(--font-mono);
2758 cursor: pointer;
2759 transition: all 0.2s;
2760 width: 100%;
2761 text-align: left;
2762 box-sizing: border-box;
2763 min-height: 1.75rem;
2764}
2765
2766.model-picker-trigger:hover:not(:disabled) {
2767 background: var(--bg-secondary);
2768 border-color: var(--blue-text);
2769}
2770
2771.model-picker-trigger:disabled {
2772 opacity: 0.5;
2773 cursor: not-allowed;
2774}
2775
2776.model-picker-value {
2777 flex: 1;
2778 overflow: hidden;
2779 text-overflow: ellipsis;
2780 white-space: nowrap;
2781}
2782
2783.model-picker-chevron {
2784 flex-shrink: 0;
2785 transition: transform 0.2s;
2786 opacity: 0.6;
2787}
2788
2789.model-picker-chevron.open {
2790 transform: rotate(180deg);
2791}
2792
2793.model-picker-dropdown {
2794 position: absolute;
2795 top: 100%;
2796 left: 0;
2797 right: 0;
2798 margin-top: 2px;
2799 background: var(--bg-secondary);
2800 border: 1px solid var(--border);
2801 border-radius: 0.375rem;
2802 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
2803 z-index: 1000;
2804 max-height: 300px;
2805 overflow: hidden;
2806 display: flex;
2807 flex-direction: column;
2808}
2809
2810.model-picker-dropdown.open-upward {
2811 top: auto;
2812 bottom: 100%;
2813 margin-top: 0;
2814 margin-bottom: 2px;
2815}
2816
2817.model-picker-options {
2818 overflow-y: auto;
2819 max-height: 220px;
2820}
2821
2822.model-picker-option {
2823 display: flex;
2824 align-items: center;
2825 gap: 0.5rem;
2826 width: 100%;
2827 padding: 0.5rem 0.75rem;
2828 border: none;
2829 background: transparent;
2830 color: var(--text-primary);
2831 font-size: 0.8rem;
2832 font-family: var(--font-mono);
2833 cursor: pointer;
2834 text-align: left;
2835 transition: background 0.15s;
2836}
2837
2838.model-picker-option:hover:not(:disabled) {
2839 background: var(--bg-tertiary);
2840}
2841
2842.model-picker-option.selected {
2843 background: var(--bg-tertiary);
2844}
2845
2846.model-picker-option.disabled {
2847 opacity: 0.5;
2848 cursor: not-allowed;
2849}
2850
2851.model-picker-option-content {
2852 flex: 1;
2853 display: flex;
2854 flex-direction: column;
2855 gap: 0.125rem;
2856 min-width: 0;
2857}
2858
2859.model-picker-option-name {
2860 overflow: hidden;
2861 text-overflow: ellipsis;
2862 white-space: nowrap;
2863}
2864
2865.model-picker-option-source {
2866 font-size: 0.65rem;
2867 color: var(--text-secondary);
2868 overflow: hidden;
2869 text-overflow: ellipsis;
2870 white-space: nowrap;
2871}
2872
2873.model-picker-option-badge {
2874 font-size: 0.65rem;
2875 color: var(--text-secondary);
2876 background: var(--bg-base);
2877 padding: 0.125rem 0.375rem;
2878 border-radius: 0.25rem;
2879}
2880
2881.model-picker-option-check {
2882 flex-shrink: 0;
2883 color: var(--green-text);
2884}
2885
2886.model-picker-divider {
2887 height: 1px;
2888 background: var(--border);
2889 margin: 0.25rem 0;
2890}
2891
2892.model-picker-manage {
2893 color: var(--blue-text);
2894}
2895
2896.model-picker-manage:hover {
2897 background: var(--bg-tertiary);
2898}
2899
2900.model-picker-manage svg {
2901 flex-shrink: 0;
2902}
2903
2904.status-input {
2905 padding: 0.25rem 0.5rem;
2906 border: 1px solid var(--blue-text);
2907 border-radius: 0.25rem;
2908 background: var(--bg-base);
2909 color: var(--text-primary);
2910 font-size: 0.75rem;
2911 font-family: var(--font-mono);
2912 transition: border-color 0.2s;
2913 width: 100%;
2914 box-sizing: border-box;
2915}
2916
2917.status-input::placeholder {
2918 color: var(--text-secondary);
2919 opacity: 0.6;
2920}
2921
2922.status-input:hover:not(:disabled) {
2923 border-color: var(--blue-text);
2924}
2925
2926.status-input:focus {
2927 outline: none;
2928 border-color: var(--blue-text);
2929 box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15);
2930}
2931
2932.status-input:disabled {
2933 opacity: 0.5;
2934 cursor: not-allowed;
2935}
2936
2937/* Responsive adjustments for status bar controls */
2938@media (max-width: 768px) {
2939 .status-bar-config {
2940 flex-wrap: wrap;
2941 gap: 0.5rem;
2942 }
2943
2944 .status-bar-controls {
2945 flex-wrap: wrap;
2946 gap: 0.5rem;
2947 }
2948
2949 .status-field-model {
2950 min-width: 120px;
2951 max-width: 200px;
2952 }
2953
2954 .status-field-cwd {
2955 min-width: 140px;
2956 max-width: 250px;
2957 }
2958}
2959
2960/* Directory Picker Modal */
2961.directory-picker-modal {
2962 max-width: 32rem;
2963 max-height: 70vh;
2964 display: flex;
2965 flex-direction: column;
2966}
2967
2968.directory-picker-body {
2969 flex: 1;
2970 display: flex;
2971 flex-direction: column;
2972 min-height: 0;
2973 overflow: hidden;
2974}
2975
2976.directory-picker-input-container {
2977 margin-bottom: 0.75rem;
2978}
2979
2980.directory-picker-input {
2981 width: 100%;
2982 padding: 0.5rem 0.75rem;
2983 border: 1px solid var(--border);
2984 border-radius: 0.25rem;
2985 background: var(--bg-base);
2986 color: var(--text-primary);
2987 font-family: var(--font-mono);
2988 font-size: 0.875rem;
2989}
2990
2991.directory-picker-input:focus {
2992 outline: none;
2993 border-color: var(--primary);
2994 box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);
2995}
2996
2997.directory-picker-current {
2998 display: flex;
2999 align-items: center;
3000 gap: 0.5rem;
3001 font-size: 0.75rem;
3002 color: var(--text-secondary);
3003 font-family: var(--font-mono);
3004 margin-bottom: 0.5rem;
3005 padding: 0.25rem 0;
3006}
3007
3008.directory-picker-current-path {
3009 flex-shrink: 0;
3010}
3011
3012.directory-picker-current-git .directory-picker-current-path {
3013 color: var(--accent-color, #f97316);
3014}
3015
3016.directory-picker-current-subject {
3017 flex: 1;
3018 min-width: 0;
3019 color: var(--text-tertiary);
3020 white-space: nowrap;
3021 overflow: hidden;
3022 text-overflow: ellipsis;
3023 text-align: right;
3024}
3025
3026.directory-picker-filter {
3027 color: var(--primary);
3028 font-weight: 500;
3029}
3030
3031.directory-picker-error {
3032 padding: 0.5rem 0.75rem;
3033 background: var(--error-bg);
3034 border: 1px solid var(--error-border);
3035 border-radius: 0.25rem;
3036 color: var(--error-text);
3037 font-size: 0.875rem;
3038 margin-bottom: 0.75rem;
3039}
3040
3041.directory-picker-loading {
3042 display: flex;
3043 align-items: center;
3044 gap: 0.5rem;
3045 padding: 1rem;
3046 color: var(--text-secondary);
3047 font-size: 0.875rem;
3048}
3049
3050.directory-picker-list {
3051 flex: 1;
3052 overflow-y: auto;
3053 border: 1px solid var(--border);
3054 border-radius: 0.25rem;
3055 min-height: 200px;
3056 max-height: 300px;
3057}
3058
3059.directory-picker-entry {
3060 display: flex;
3061 align-items: center;
3062 gap: 0.5rem;
3063 width: 100%;
3064 padding: 0.5rem 0.75rem;
3065 text-align: left;
3066 background: transparent;
3067 border: none;
3068 border-bottom: 1px solid var(--border);
3069 color: var(--text-primary);
3070 font-size: 0.875rem;
3071 font-family: var(--font-mono);
3072 cursor: pointer;
3073 transition: background-color 0.15s;
3074}
3075
3076.directory-picker-entry:last-child {
3077 border-bottom: none;
3078}
3079
3080.directory-picker-entry:hover {
3081 background: var(--bg-tertiary);
3082}
3083
3084.directory-picker-entry-parent {
3085 color: var(--text-secondary);
3086 font-weight: 500;
3087}
3088
3089.directory-picker-icon {
3090 width: 1rem;
3091 height: 1rem;
3092 flex-shrink: 0;
3093 color: var(--text-secondary);
3094}
3095
3096.directory-picker-entry-name {
3097 flex-shrink: 0;
3098}
3099
3100.directory-picker-entry-git .directory-picker-icon {
3101 color: var(--accent-color, #f97316);
3102}
3103
3104.directory-picker-git-subject {
3105 flex: 1;
3106 min-width: 0;
3107 color: var(--text-tertiary);
3108 font-size: 0.75rem;
3109 white-space: nowrap;
3110 overflow: hidden;
3111 text-overflow: ellipsis;
3112 text-align: right;
3113}
3114
3115.directory-picker-empty {
3116 padding: 2rem;
3117 text-align: center;
3118 color: var(--text-tertiary);
3119 font-size: 0.875rem;
3120}
3121
3122.directory-picker-footer {
3123 display: flex;
3124 align-items: center;
3125 gap: 0.5rem;
3126 padding: 1rem;
3127 border-top: 1px solid var(--border);
3128}
3129
3130.directory-picker-footer-spacer {
3131 flex: 1;
3132}
3133
3134.directory-picker-new-btn {
3135 display: flex;
3136 align-items: center;
3137 gap: 0.375rem;
3138}
3139
3140.directory-picker-new-icon {
3141 width: 1rem;
3142 height: 1rem;
3143}
3144
3145/* Create directory form inside the list */
3146.directory-picker-create-form {
3147 display: flex;
3148 align-items: center;
3149 gap: 0.5rem;
3150 padding: 0.5rem 0.75rem;
3151 background: var(--bg-tertiary);
3152 border-bottom: 1px solid var(--border);
3153}
3154
3155.directory-picker-create-input {
3156 flex: 1;
3157 padding: 0.375rem 0.5rem;
3158 border: 1px solid var(--border);
3159 border-radius: 0.25rem;
3160 background: var(--bg-base);
3161 color: var(--text-primary);
3162 font-family: var(--font-mono);
3163 font-size: 0.875rem;
3164}
3165
3166.directory-picker-create-input:focus {
3167 outline: none;
3168 border-color: var(--primary);
3169}
3170
3171.directory-picker-create-btn {
3172 display: flex;
3173 align-items: center;
3174 justify-content: center;
3175 width: 1.75rem;
3176 height: 1.75rem;
3177 padding: 0;
3178 border: none;
3179 border-radius: 0.25rem;
3180 background: var(--primary);
3181 color: white;
3182 cursor: pointer;
3183 transition: background-color 0.15s;
3184}
3185
3186.directory-picker-create-btn:hover:not(:disabled) {
3187 background: var(--primary-hover);
3188}
3189
3190.directory-picker-create-btn:disabled {
3191 opacity: 0.5;
3192 cursor: not-allowed;
3193}
3194
3195.directory-picker-create-btn svg {
3196 width: 1rem;
3197 height: 1rem;
3198}
3199
3200.directory-picker-cancel-btn {
3201 background: var(--bg-secondary);
3202 color: var(--text-secondary);
3203}
3204
3205.directory-picker-cancel-btn:hover:not(:disabled) {
3206 background: var(--bg-tertiary);
3207}
3208
3209.directory-picker-create-error {
3210 padding: 0.375rem 0.75rem;
3211 background: var(--error-bg);
3212 color: var(--error-text);
3213 font-size: 0.75rem;
3214 border-bottom: 1px solid var(--error-border);
3215}
3216
3217/* Screen reader only */
3218.sr-only {
3219 position: absolute;
3220 width: 1px;
3221 height: 1px;
3222 padding: 0;
3223 margin: -1px;
3224 overflow: hidden;
3225 clip: rect(0, 0, 0, 0);
3226 white-space: nowrap;
3227 border: 0;
3228}
3229
3230/* Context Usage Bar */
3231/* Status bar for active conversation */
3232.status-bar-active {
3233 display: flex;
3234 align-items: center;
3235 justify-content: space-between;
3236 width: 100%;
3237}
3238
3239.status-working-group {
3240 display: flex;
3241 align-items: center;
3242 gap: 0.5rem;
3243}
3244
3245.status-stop-button {
3246 display: flex;
3247 align-items: center;
3248 gap: 0.25rem;
3249 padding: 0.25rem 0.5rem;
3250 border: none;
3251 border-radius: 0.25rem;
3252 background: var(--error-bg);
3253 color: var(--error-text);
3254 cursor: pointer;
3255 transition: all 0.15s ease;
3256 font-size: 0.75rem;
3257 font-weight: 500;
3258}
3259
3260.status-stop-button:hover:not(:disabled) {
3261 background: var(--error-text);
3262 color: white;
3263}
3264
3265.status-stop-button:disabled {
3266 opacity: 0.5;
3267 cursor: not-allowed;
3268}
3269
3270.status-stop-button svg {
3271 width: 0.75rem;
3272 height: 0.75rem;
3273 flex-shrink: 0;
3274}
3275
3276.status-stop-label {
3277 white-space: nowrap;
3278}
3279
3280/* Hide stop label on small screens */
3281@media (max-width: 500px) {
3282 .status-stop-label {
3283 display: none;
3284 }
3285 .status-stop-button {
3286 padding: 0.25rem;
3287 }
3288}
3289
3290.context-usage-bar-container {
3291 display: flex;
3292 align-items: center;
3293 gap: 4px;
3294}
3295
3296.context-warning-icon {
3297 font-size: 14px;
3298 line-height: 1;
3299 cursor: help;
3300}
3301
3302.context-usage-bar {
3303 width: 60px;
3304 height: 6px;
3305 background: var(--bg-tertiary);
3306 border-radius: 3px;
3307 overflow: hidden;
3308 cursor: pointer;
3309}
3310
3311.context-usage-fill {
3312 height: 100%;
3313 border-radius: 3px;
3314 transition:
3315 width 0.3s ease,
3316 background-color 0.3s ease;
3317}
3318
3319/* Mobile optimizations for tighter spacing */
3320@media (max-width: 767px) {
3321 .header {
3322 padding: 0.375rem 0.75rem;
3323 padding-top: calc(0.375rem + env(safe-area-inset-top, 0px));
3324 }
3325
3326 .status-bar {
3327 padding: 0.375rem 0.75rem;
3328 min-height: 2rem;
3329 }
3330
3331 .message-input-container {
3332 padding: 0.5rem 0.75rem;
3333 padding-bottom: calc(0.5rem + env(safe-area-inset-bottom, 0px));
3334 }
3335}
3336
3337/* Print styles - looks like the chat window, just without chrome */
3338@media print {
3339 /* Reset page layout */
3340 html,
3341 body {
3342 height: auto !important;
3343 overflow: visible !important;
3344 background: white !important;
3345 }
3346
3347 /* Hide interactive chrome but keep the header title */
3348 .status-bar,
3349 .message-input-container,
3350 .drawer,
3351 .backdrop,
3352 .scroll-to-bottom-button,
3353 .overflow-menu,
3354 .context-menu,
3355 .modal-overlay {
3356 display: none !important;
3357 }
3358
3359 /* Hide header buttons but keep the title */
3360 .header-actions,
3361 .header .btn-icon {
3362 display: none !important;
3363 }
3364
3365 /* Simplify header for print */
3366 .header {
3367 background: white !important;
3368 border-bottom: 1px solid #e5e7eb !important;
3369 padding: 0.75rem 1rem !important;
3370 }
3371
3372 .header-title {
3373 font-size: 1rem !important;
3374 }
3375
3376 /* Reset app container for print */
3377 .app-container {
3378 display: block !important;
3379 height: auto !important;
3380 background: white !important;
3381 }
3382
3383 .main-content {
3384 display: block !important;
3385 height: auto !important;
3386 }
3387
3388 /* Reset messages area to flow naturally */
3389 .messages-area-wrapper {
3390 height: auto !important;
3391 overflow: visible !important;
3392 position: static !important;
3393 background: white !important;
3394 }
3395
3396 .messages-container {
3397 height: auto !important;
3398 overflow: visible !important;
3399 position: static !important;
3400 background: white !important;
3401 }
3402
3403 .messages-list {
3404 background: white !important;
3405 }
3406
3407 /* Hide empty state in print */
3408 .empty-state {
3409 display: none !important;
3410 }
3411
3412 /* Keep message styling, just add page break hints */
3413 .message {
3414 page-break-inside: avoid;
3415 }
3416
3417 /* Tool results */
3418 .tool-result-details {
3419 page-break-inside: avoid;
3420 }
3421
3422 /* Code blocks */
3423 pre,
3424 code {
3425 page-break-inside: avoid;
3426 }
3427
3428 /* Screenshots and images - ensure they fit */
3429 .screenshot-preview,
3430 .screenshot-image,
3431 .read-image-preview {
3432 max-width: 100% !important;
3433 height: auto !important;
3434 page-break-inside: avoid;
3435 }
3436}
3437/* Diff Viewer Overlay */
3438.diff-viewer-overlay {
3439 position: fixed;
3440 top: 0;
3441 left: 0;
3442 right: 0;
3443 bottom: 0;
3444 background: rgba(0, 0, 0, 0.5);
3445 z-index: 1000;
3446 display: flex;
3447 align-items: center;
3448 justify-content: center;
3449 padding: 1rem;
3450 padding-top: max(1rem, env(safe-area-inset-top));
3451 padding-bottom: max(1rem, env(safe-area-inset-bottom));
3452}
3453
3454.diff-viewer-container {
3455 background: var(--bg-base);
3456 border-radius: 0.5rem;
3457 width: calc(100% - 2rem);
3458 max-width: none;
3459 height: calc(100% - 2rem);
3460 max-height: none;
3461 display: flex;
3462 flex-direction: column;
3463 overflow: hidden;
3464 box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
3465}
3466
3467.diff-viewer-header {
3468 display: flex;
3469 flex-direction: column;
3470 gap: 0.5rem;
3471 padding: 0.5rem 0.75rem;
3472 background: var(--bg-secondary);
3473 border-bottom: 1px solid var(--border-color);
3474}
3475
3476.diff-viewer-header-row {
3477 display: flex;
3478 align-items: center;
3479 gap: 0.5rem;
3480 width: 100%;
3481}
3482
3483.diff-viewer-selectors-row {
3484 display: flex;
3485 flex: 1;
3486 gap: 0.5rem;
3487 min-width: 0;
3488}
3489
3490.diff-viewer-selectors-row .diff-viewer-select {
3491 flex: 1;
3492 min-width: 0;
3493 max-width: none;
3494}
3495
3496.diff-viewer-file-selector-wrapper {
3497 display: flex;
3498 align-items: center;
3499 gap: 0.5rem;
3500 flex: 1;
3501 min-width: 0;
3502}
3503
3504.diff-viewer-file-selector-wrapper .diff-viewer-select {
3505 flex: 1;
3506 min-width: 0;
3507}
3508
3509.diff-viewer-file-index {
3510 font-size: 0.75rem;
3511 color: var(--text-secondary);
3512 white-space: nowrap;
3513 flex-shrink: 0;
3514}
3515
3516.diff-viewer-controls-row {
3517 display: flex;
3518 align-items: center;
3519 gap: 0.5rem;
3520 flex-shrink: 0;
3521}
3522
3523.diff-viewer-header-mobile {
3524 flex-direction: row;
3525 align-items: center;
3526 gap: 0.5rem;
3527 padding: 0.375rem 0.5rem;
3528}
3529
3530.diff-viewer-mobile-selectors {
3531 display: flex;
3532 flex: 1;
3533 gap: 0.375rem;
3534 min-width: 0;
3535}
3536
3537.diff-viewer-mobile-selectors .diff-viewer-select {
3538 flex: 1;
3539 min-width: 0;
3540 font-size: 0.75rem;
3541 padding: 0.375rem;
3542}
3543
3544.diff-viewer-mode-toggle {
3545 display: flex;
3546 border: 1px solid var(--border-color);
3547 border-radius: 0.25rem;
3548 overflow: hidden;
3549}
3550
3551.diff-viewer-mode-btn {
3552 padding: 0.25rem 0.5rem;
3553 border: none;
3554 background: var(--bg-base);
3555 color: var(--text-secondary);
3556 cursor: pointer;
3557 font-size: 0.875rem;
3558}
3559
3560.diff-viewer-mode-btn:first-child {
3561 border-right: 1px solid var(--border-color);
3562}
3563
3564.diff-viewer-mode-btn.active {
3565 background: var(--blue-bg);
3566 color: var(--blue-text);
3567}
3568
3569.diff-viewer-mode-btn:hover:not(.active) {
3570 background: var(--bg-tertiary);
3571}
3572
3573.diff-viewer-nav-buttons {
3574 display: flex;
3575 gap: 0.125rem;
3576}
3577
3578.diff-viewer-nav-btn {
3579 padding: 0.25rem 0.5rem;
3580 border: 1px solid var(--border-color);
3581 background: var(--bg-base);
3582 color: var(--text-primary);
3583 cursor: pointer;
3584 border-radius: 0.25rem;
3585 font-size: 0.875rem;
3586}
3587
3588.diff-viewer-nav-btn:disabled {
3589 opacity: 0.4;
3590 cursor: not-allowed;
3591}
3592
3593.diff-viewer-nav-btn:hover:not(:disabled) {
3594 background: var(--bg-tertiary);
3595}
3596
3597.diff-viewer-select {
3598 flex: 1;
3599 min-width: 120px;
3600 max-width: 300px;
3601 padding: 0.5rem;
3602 border: 1px solid var(--border-color);
3603 border-radius: 0.25rem;
3604 background: var(--bg-base);
3605 color: var(--text-primary);
3606 font-size: 0.875rem;
3607}
3608
3609.diff-viewer-close {
3610 width: 2rem;
3611 height: 2rem;
3612 border: none;
3613 background: transparent;
3614 color: var(--text-secondary);
3615 font-size: 1.5rem;
3616 cursor: pointer;
3617 border-radius: 0.25rem;
3618 display: flex;
3619 align-items: center;
3620 justify-content: center;
3621 flex-shrink: 0;
3622}
3623
3624.diff-viewer-close:hover {
3625 background: var(--bg-tertiary);
3626 color: var(--text-primary);
3627}
3628
3629.diff-viewer-error {
3630 padding: 0.5rem 1rem;
3631 background: var(--error-bg);
3632 color: var(--error-text);
3633 font-size: 0.875rem;
3634}
3635
3636.diff-viewer-toast {
3637 position: fixed;
3638 bottom: 24px;
3639 right: 24px;
3640 padding: 12px 16px;
3641 border-radius: 8px;
3642 font-size: 14px;
3643 font-weight: 500;
3644 z-index: 9999;
3645 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
3646 animation: toast-fade-in 0.2s ease;
3647 color: #ffffff;
3648}
3649
3650.diff-viewer-toast-saving {
3651 background: #1976d2;
3652}
3653
3654.diff-viewer-toast-saved {
3655 background: #2e7d32;
3656}
3657
3658.diff-viewer-toast-error {
3659 background: #d32f2f;
3660}
3661
3662.diff-viewer-toast-hint {
3663 background: var(--bg-tertiary);
3664 color: var(--text-primary);
3665 border: 1px solid var(--border-color);
3666}
3667
3668@keyframes toast-fade-in {
3669 from {
3670 opacity: 0;
3671 transform: translateY(10px);
3672 }
3673 to {
3674 opacity: 1;
3675 transform: translateY(0);
3676 }
3677}
3678
3679.diff-viewer-content {
3680 flex: 1;
3681 overflow: hidden;
3682 position: relative;
3683}
3684
3685.diff-viewer-loading,
3686.diff-viewer-empty {
3687 display: flex;
3688 flex-direction: column;
3689 align-items: center;
3690 justify-content: center;
3691 height: 100%;
3692 color: var(--text-secondary);
3693 gap: 0.5rem;
3694}
3695
3696.diff-viewer-hint {
3697 font-size: 0.875rem;
3698 opacity: 0.7;
3699}
3700
3701.diff-viewer-editor {
3702 height: 100%;
3703 width: 100%;
3704}
3705
3706/* Diff viewer line hover highlighting (via decoration API) */
3707.diff-viewer-editor .monaco-editor .diff-viewer-line-hover {
3708 background-color: rgba(37, 99, 235, 0.08) !important;
3709}
3710
3711.dark .diff-viewer-editor .monaco-editor .diff-viewer-line-hover {
3712 background-color: rgba(96, 165, 250, 0.12) !important;
3713}
3714
3715/* Comment indicator glyph in margin for diff viewer */
3716.diff-viewer-editor .monaco-editor .diff-viewer-comment-glyph {
3717 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'%3E%3C/path%3E%3Cline x1='9' y1='10' x2='15' y2='10'%3E%3C/line%3E%3C/svg%3E");
3718 background-size: 14px 14px;
3719 background-repeat: no-repeat;
3720 background-position: center;
3721 opacity: 0.6;
3722 cursor: pointer;
3723}
3724
3725.diff-viewer-editor .monaco-editor .diff-viewer-comment-glyph:hover {
3726 opacity: 1;
3727}
3728
3729.dark .diff-viewer-editor .monaco-editor .diff-viewer-comment-glyph {
3730 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'%3E%3C/path%3E%3Cline x1='9' y1='10' x2='15' y2='10'%3E%3C/line%3E%3C/svg%3E");
3731}
3732
3733/* Make diff viewer Monaco lines clickable with pointer cursor */
3734.diff-viewer-editor .monaco-editor .view-lines {
3735 cursor: pointer;
3736}
3737
3738.diff-viewer-comment-badge {
3739 position: absolute;
3740 bottom: 1rem;
3741 left: 1rem;
3742 padding: 0.5rem 1rem;
3743 background: var(--blue-bg);
3744 color: var(--blue-text);
3745 border-radius: 1rem;
3746 font-size: 0.875rem;
3747 font-weight: 500;
3748}
3749
3750/* Comment dialog */
3751.diff-viewer-comment-dialog {
3752 position: absolute;
3753 top: 50%;
3754 left: 50%;
3755 transform: translate(-50%, -50%);
3756 width: 90%;
3757 max-width: 500px;
3758 background: var(--bg-base);
3759 border: 1px solid var(--border-color);
3760 border-radius: 0.5rem;
3761 padding: 1rem;
3762 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
3763 z-index: 1001;
3764}
3765
3766.diff-viewer-comment-dialog h4 {
3767 margin: 0 0 0.75rem 0;
3768 color: var(--text-primary);
3769}
3770
3771.diff-viewer-selected-text {
3772 margin: 0 0 0.75rem 0;
3773 padding: 0.5rem;
3774 background: var(--bg-tertiary);
3775 border: 1px solid var(--border-color);
3776 border-radius: 0.25rem;
3777 font-size: 0.75rem;
3778 font-family: monospace;
3779 max-height: 150px;
3780 overflow: auto;
3781 white-space: pre;
3782}
3783
3784.diff-viewer-comment-input {
3785 width: 100%;
3786 min-height: 100px;
3787 padding: 0.5rem;
3788 border: 1px solid var(--border-color);
3789 border-radius: 0.25rem;
3790 background: var(--bg-base);
3791 color: var(--text-primary);
3792 font-size: 0.875rem;
3793 resize: vertical;
3794}
3795
3796.diff-viewer-comment-actions {
3797 display: flex;
3798 justify-content: flex-end;
3799 gap: 0.5rem;
3800 margin-top: 0.75rem;
3801}
3802
3803.diff-viewer-btn {
3804 padding: 0.5rem 1rem;
3805 border: none;
3806 border-radius: 0.25rem;
3807 font-size: 0.875rem;
3808 cursor: pointer;
3809}
3810
3811.diff-viewer-btn:disabled {
3812 opacity: 0.5;
3813 cursor: not-allowed;
3814}
3815
3816.diff-viewer-btn-primary {
3817 background: var(--blue-bg);
3818 color: var(--blue-text);
3819}
3820
3821.diff-viewer-btn-primary:hover:not(:disabled) {
3822 filter: brightness(0.95);
3823}
3824
3825.diff-viewer-btn-secondary {
3826 background: var(--bg-tertiary);
3827 color: var(--text-primary);
3828}
3829
3830.diff-viewer-btn-secondary:hover:not(:disabled) {
3831 background: var(--bg-secondary);
3832}
3833
3834/* Mobile floating nav buttons */
3835.diff-viewer-mobile-nav {
3836 position: absolute;
3837 bottom: 1.5rem;
3838 left: 50%;
3839 transform: translateX(-50%);
3840 display: flex;
3841 gap: 0.5rem;
3842 z-index: 100;
3843}
3844
3845.diff-viewer-mobile-nav-btn {
3846 width: 3rem;
3847 height: 3rem;
3848 border: none;
3849 border-radius: 50%;
3850 background: var(--bg-base);
3851 color: var(--text-primary);
3852 cursor: pointer;
3853 display: flex;
3854 align-items: center;
3855 justify-content: center;
3856 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
3857}
3858
3859.diff-viewer-mobile-nav-btn svg {
3860 width: 24px;
3861 height: 24px;
3862}
3863
3864.diff-viewer-mobile-nav-btn:disabled {
3865 opacity: 0.4;
3866 cursor: not-allowed;
3867}
3868
3869.diff-viewer-mobile-nav-btn:active:not(:disabled) {
3870 background: var(--bg-tertiary);
3871 transform: scale(0.95);
3872}
3873
3874.diff-viewer-mobile-mode-btn {
3875 font-size: 1.25rem;
3876}
3877
3878.diff-viewer-mobile-mode-btn.active {
3879 background: var(--blue-bg);
3880 color: var(--blue-text);
3881}
3882
3883/* Monaco comment glyph decoration */
3884/* Mobile optimizations for diff viewer */
3885@media (max-width: 767px) {
3886 .diff-viewer-overlay {
3887 padding: 0;
3888 }
3889
3890 .diff-viewer-container {
3891 border-radius: 0;
3892 width: 100%;
3893 max-width: 100%;
3894 height: 100%;
3895 max-height: 100%;
3896 }
3897
3898 .diff-viewer-close {
3899 width: 1.75rem;
3900 height: 1.75rem;
3901 font-size: 1.25rem;
3902 flex-shrink: 0;
3903 }
3904
3905 /* Monaco editor mobile styles - hide gutters completely */
3906 .diff-viewer-editor .monaco-editor .margin {
3907 display: none !important;
3908 width: 0 !important;
3909 }
3910
3911 .diff-viewer-editor .monaco-editor .margin-view-overlays {
3912 display: none !important;
3913 width: 0 !important;
3914 }
3915
3916 .diff-viewer-editor .monaco-editor .editor-scrollable {
3917 left: 0 !important;
3918 }
3919
3920 .diff-viewer-editor .monaco-editor .lines-content {
3921 margin-left: 0 !important;
3922 }
3923
3924 /* Ensure diff editor uses full width */
3925 .diff-viewer-editor .monaco-diff-editor {
3926 width: 100% !important;
3927 }
3928
3929 .diff-viewer-editor .monaco-diff-editor .editor.modified {
3930 width: 100% !important;
3931 left: 0 !important;
3932 }
3933
3934 /* Comment dialog on top half of screen for mobile (keyboard space) */
3935 .diff-viewer-comment-dialog {
3936 top: 10%;
3937 transform: translate(-50%, 0);
3938 max-height: 40vh;
3939 overflow-y: auto;
3940 }
3941
3942 .diff-viewer-comment-input {
3943 min-height: 60px;
3944 }
3945
3946 /* Patch Tool Monaco editor mobile styles - hide gutters completely */
3947 .patch-tool-monaco-editor .monaco-editor .margin {
3948 display: none !important;
3949 width: 0 !important;
3950 }
3951
3952 .patch-tool-monaco-editor .monaco-editor .margin-view-overlays {
3953 display: none !important;
3954 width: 0 !important;
3955 }
3956
3957 .patch-tool-monaco-editor .monaco-editor .editor-scrollable {
3958 left: 0 !important;
3959 }
3960
3961 .patch-tool-monaco-editor .monaco-editor .lines-content {
3962 margin-left: 0 !important;
3963 }
3964
3965 /* Ensure patch tool diff editor uses full width */
3966 .patch-tool-monaco-editor .monaco-diff-editor {
3967 width: 100% !important;
3968 }
3969
3970 .patch-tool-monaco-editor .monaco-diff-editor .editor.modified {
3971 width: 100% !important;
3972 left: 0 !important;
3973 }
3974}
3975
3976/* Injected text indicator (for diff comments) */
3977.injected-text-indicator {
3978 display: flex;
3979 align-items: center;
3980 justify-content: space-between;
3981 padding: 0.5rem 0.75rem;
3982 background: var(--blue-bg);
3983 border-bottom: 1px solid var(--border-color);
3984 gap: 0.5rem;
3985}
3986
3987.injected-text-label {
3988 font-size: 0.875rem;
3989 color: var(--blue-text);
3990 flex: 1;
3991 min-width: 0;
3992 overflow: hidden;
3993 text-overflow: ellipsis;
3994 white-space: nowrap;
3995}
3996
3997.injected-text-insert-btn {
3998 padding: 0.375rem 0.75rem;
3999 background: var(--blue-text);
4000 color: white;
4001 border: none;
4002 border-radius: 0.25rem;
4003 font-size: 0.75rem;
4004 font-weight: 500;
4005 cursor: pointer;
4006 white-space: nowrap;
4007 flex-shrink: 0;
4008}
4009
4010.injected-text-insert-btn:hover {
4011 filter: brightness(1.1);
4012}
4013
4014/* Links in message text */
4015.text-link {
4016 color: var(--blue-text);
4017 text-decoration: underline;
4018 text-underline-offset: 2px;
4019 text-decoration-color: var(--blue-border);
4020}
4021
4022.text-link:hover {
4023 text-decoration-color: var(--blue-text);
4024}
4025
4026/* Command Palette */
4027.command-palette-overlay {
4028 position: fixed;
4029 inset: 0;
4030 background: rgba(0, 0, 0, 0.5);
4031 z-index: 100;
4032 display: flex;
4033 align-items: flex-start;
4034 justify-content: center;
4035 padding-top: 15vh;
4036}
4037
4038.command-palette {
4039 background: var(--bg-base);
4040 border: 1px solid var(--border-color);
4041 border-radius: 0.75rem;
4042 box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
4043 width: 100%;
4044 max-width: 32rem;
4045 max-height: 60vh;
4046 display: flex;
4047 flex-direction: column;
4048 overflow: hidden;
4049}
4050
4051.command-palette-input-wrapper {
4052 display: flex;
4053 align-items: center;
4054 padding: 0.75rem 1rem;
4055 border-bottom: 1px solid var(--border-color);
4056 gap: 0.75rem;
4057}
4058
4059.command-palette-search-icon {
4060 color: var(--text-secondary);
4061 flex-shrink: 0;
4062}
4063
4064.command-palette-input {
4065 flex: 1;
4066 border: none;
4067 background: transparent;
4068 font-size: 1rem;
4069 color: var(--text-primary);
4070 outline: none;
4071}
4072
4073.command-palette-input::placeholder {
4074 color: var(--text-secondary);
4075}
4076
4077.command-palette-shortcut {
4078 flex-shrink: 0;
4079}
4080
4081.command-palette-spinner {
4082 width: 16px;
4083 height: 16px;
4084 border: 2px solid var(--border-color);
4085 border-top-color: var(--primary);
4086 border-radius: 50%;
4087 animation: spin 0.6s linear infinite;
4088 flex-shrink: 0;
4089}
4090
4091.command-palette-list {
4092 flex: 1;
4093 overflow-y: auto;
4094 padding: 0.5rem;
4095}
4096
4097.command-palette-empty {
4098 padding: 2rem 1rem;
4099 text-align: center;
4100 color: var(--text-secondary);
4101}
4102
4103.command-palette-item {
4104 display: flex;
4105 align-items: center;
4106 padding: 0.625rem 0.75rem;
4107 border-radius: 0.5rem;
4108 cursor: pointer;
4109 gap: 0.75rem;
4110}
4111
4112.command-palette-item:hover,
4113.command-palette-item.selected {
4114 background: var(--bg-secondary);
4115}
4116
4117.command-palette-item-icon {
4118 flex-shrink: 0;
4119 color: var(--text-secondary);
4120 display: flex;
4121 align-items: center;
4122 justify-content: center;
4123}
4124
4125.command-palette-item.selected .command-palette-item-icon {
4126 color: var(--primary);
4127}
4128
4129.command-palette-item-content {
4130 flex: 1;
4131 min-width: 0;
4132}
4133
4134.command-palette-item-title {
4135 font-size: 0.875rem;
4136 color: var(--text-primary);
4137 white-space: nowrap;
4138 overflow: hidden;
4139 text-overflow: ellipsis;
4140}
4141
4142.command-palette-item-subtitle {
4143 font-size: 0.75rem;
4144 color: var(--text-secondary);
4145 white-space: nowrap;
4146 overflow: hidden;
4147 text-overflow: ellipsis;
4148 margin-top: 0.125rem;
4149}
4150
4151.command-palette-item-badge {
4152 flex-shrink: 0;
4153 font-size: 0.625rem;
4154 text-transform: uppercase;
4155 letter-spacing: 0.05em;
4156 padding: 0.125rem 0.375rem;
4157 background: var(--bg-tertiary);
4158 border-radius: 0.25rem;
4159 color: var(--text-secondary);
4160}
4161
4162.command-palette-footer {
4163 display: flex;
4164 gap: 1rem;
4165 padding: 0.5rem 1rem;
4166 border-top: 1px solid var(--border-color);
4167 font-size: 0.75rem;
4168 color: var(--text-secondary);
4169}
4170
4171.command-palette-footer span {
4172 display: flex;
4173 align-items: center;
4174 gap: 0.25rem;
4175}
4176
4177@media (max-width: 640px) {
4178 .command-palette-overlay {
4179 padding: 1rem;
4180 padding-top: 5vh;
4181 }
4182
4183 .command-palette {
4184 max-height: 80vh;
4185 }
4186
4187 .command-palette-footer {
4188 display: none;
4189 }
4190}
4191
4192/* Models Modal Styles */
4193.models-modal {
4194 padding: 0.5rem;
4195}
4196
4197.models-loading {
4198 display: flex;
4199 align-items: center;
4200 justify-content: center;
4201 gap: 0.5rem;
4202 padding: 2rem;
4203 color: var(--text-secondary);
4204}
4205
4206.models-error {
4207 display: flex;
4208 align-items: center;
4209 justify-content: space-between;
4210 padding: 0.75rem 1rem;
4211 background: var(--error-bg);
4212 border: 1px solid var(--error-border);
4213 border-radius: 0.375rem;
4214 color: var(--error-text);
4215 margin-bottom: 1rem;
4216}
4217
4218.models-error-dismiss {
4219 background: none;
4220 border: none;
4221 font-size: 1.25rem;
4222 cursor: pointer;
4223 color: inherit;
4224 padding: 0;
4225 line-height: 1;
4226}
4227
4228.models-info {
4229 padding: 0.75rem 1rem;
4230 background: var(--bg-tertiary);
4231 border-radius: 0.375rem;
4232 margin-bottom: 1rem;
4233}
4234
4235.models-info p {
4236 margin: 0 0 0.5rem 0;
4237 color: var(--text-secondary);
4238}
4239
4240.builtin-list {
4241 margin: 0;
4242 padding-left: 1.25rem;
4243 color: var(--text-primary);
4244}
4245
4246.builtin-list li {
4247 margin: 0.25rem 0;
4248}
4249
4250.models-list {
4251 display: flex;
4252 flex-direction: column;
4253 gap: 0.75rem;
4254 margin-bottom: 1rem;
4255}
4256
4257.model-card {
4258 padding: 0.75rem 1rem;
4259 background: var(--bg-base);
4260 border: 1px solid var(--border);
4261 border-radius: 0.375rem;
4262}
4263
4264.model-header {
4265 display: flex;
4266 justify-content: space-between;
4267 align-items: flex-start;
4268 gap: 0.5rem;
4269}
4270
4271.model-info {
4272 display: flex;
4273 flex-wrap: wrap;
4274 align-items: center;
4275 gap: 0.5rem;
4276}
4277
4278.model-name {
4279 font-weight: 500;
4280 color: var(--text-primary);
4281}
4282
4283.model-provider {
4284 font-size: 0.75rem;
4285 padding: 0.125rem 0.5rem;
4286 background: var(--bg-tertiary);
4287 border-radius: 0.25rem;
4288 color: var(--text-secondary);
4289}
4290
4291.model-source {
4292 font-size: 0.75rem;
4293 padding: 0.125rem 0.5rem;
4294 background: var(--bg-tertiary);
4295 border-radius: 0.25rem;
4296 color: var(--text-secondary);
4297}
4298
4299.model-card-builtin {
4300 opacity: 0.8;
4301 background: var(--bg-secondary);
4302}
4303
4304.models-empty {
4305 padding: 2rem;
4306 text-align: center;
4307 color: var(--text-secondary);
4308}
4309
4310.models-empty-hint {
4311 font-size: 0.875rem;
4312 margin-top: 0.5rem;
4313 color: var(--text-tertiary);
4314}
4315
4316.model-badge {
4317 font-size: 0.625rem;
4318 text-transform: uppercase;
4319 letter-spacing: 0.05em;
4320 padding: 0.125rem 0.375rem;
4321 background: var(--blue-bg);
4322 border: 1px solid var(--blue-border);
4323 border-radius: 0.25rem;
4324 color: var(--blue-text);
4325}
4326
4327.model-actions {
4328 display: flex;
4329 gap: 0.25rem;
4330 flex-shrink: 0;
4331}
4332
4333.model-details {
4334 margin-top: 0.5rem;
4335 display: flex;
4336 flex-direction: column;
4337 gap: 0.25rem;
4338}
4339
4340.model-api-name {
4341 font-size: 0.75rem;
4342 font-family: var(--font-mono);
4343 color: var(--text-secondary);
4344}
4345
4346.model-endpoint {
4347 font-size: 0.75rem;
4348 color: var(--text-tertiary);
4349 word-break: break-all;
4350}
4351
4352.btn-icon {
4353 padding: 0.25rem;
4354 border-radius: 0.25rem;
4355 color: var(--text-secondary);
4356 background: transparent;
4357 border: none;
4358 cursor: pointer;
4359 display: flex;
4360 align-items: center;
4361 justify-content: center;
4362}
4363
4364.btn-icon:hover {
4365 background: var(--bg-tertiary);
4366 color: var(--text-primary);
4367}
4368
4369/* Version Checker Styles */
4370.version-update-dot {
4371 position: absolute;
4372 top: 2px;
4373 right: 2px;
4374 width: 8px;
4375 height: 8px;
4376 background: #ef4444;
4377 border-radius: 50%;
4378 border: 2px solid var(--bg-base);
4379}
4380
4381.version-menu-dot {
4382 width: 8px;
4383 height: 8px;
4384 background: #ef4444;
4385 border-radius: 50%;
4386 margin-left: auto;
4387 flex-shrink: 0;
4388}
4389
4390.version-modal-overlay {
4391 position: fixed;
4392 inset: 0;
4393 background: rgba(0, 0, 0, 0.5);
4394 display: flex;
4395 align-items: center;
4396 justify-content: center;
4397 z-index: 1000;
4398 padding: 1rem;
4399}
4400
4401.version-modal {
4402 background: var(--bg-base);
4403 border-radius: 0.5rem;
4404 box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
4405 max-width: 500px;
4406 width: 100%;
4407 max-height: 80vh;
4408 display: flex;
4409 flex-direction: column;
4410 overflow: hidden;
4411}
4412
4413.version-modal-header {
4414 display: flex;
4415 align-items: center;
4416 justify-content: space-between;
4417 padding: 1rem 1.25rem;
4418 border-bottom: 1px solid var(--border-color);
4419}
4420
4421.version-modal-header h2 {
4422 margin: 0;
4423 font-size: 1.125rem;
4424 font-weight: 600;
4425 color: var(--text-primary);
4426}
4427
4428.version-modal-close {
4429 background: none;
4430 border: none;
4431 padding: 0.25rem;
4432 cursor: pointer;
4433 color: var(--text-secondary);
4434 border-radius: 0.25rem;
4435}
4436
4437.version-modal-close:hover {
4438 background: var(--bg-tertiary);
4439 color: var(--text-primary);
4440}
4441
4442.version-modal-close svg {
4443 width: 1.25rem;
4444 height: 1.25rem;
4445}
4446
4447.version-modal-content {
4448 padding: 1.25rem;
4449 overflow-y: auto;
4450 display: flex;
4451 flex-direction: column;
4452 gap: 1rem;
4453}
4454
4455.version-info-row {
4456 display: flex;
4457 align-items: center;
4458 gap: 0.5rem;
4459 font-size: 0.875rem;
4460}
4461
4462.version-label {
4463 color: var(--text-secondary);
4464}
4465
4466.version-value {
4467 font-weight: 500;
4468 color: var(--text-primary);
4469 font-family: var(--font-mono);
4470}
4471
4472.version-date {
4473 color: var(--text-tertiary);
4474 font-size: 0.75rem;
4475}
4476
4477.version-error {
4478 padding: 0.75rem;
4479 background: var(--error-bg);
4480 border: 1px solid var(--error-border);
4481 border-radius: 0.375rem;
4482 font-size: 0.875rem;
4483 color: var(--error-text);
4484}
4485
4486.version-success {
4487 padding: 0.75rem;
4488 background: var(--success-bg);
4489 border: 1px solid var(--success-border);
4490 border-radius: 0.375rem;
4491 font-size: 0.875rem;
4492 color: var(--success-text);
4493}
4494
4495.version-changelog {
4496 border-top: 1px solid var(--border-color);
4497 padding-top: 1rem;
4498}
4499
4500.version-changelog h3 {
4501 margin: 0 0 0.75rem 0;
4502 font-size: 0.875rem;
4503 font-weight: 600;
4504}
4505
4506.changelog-link {
4507 color: var(--link-color);
4508 text-decoration: none;
4509}
4510
4511.changelog-link:hover {
4512 text-decoration: underline;
4513}
4514
4515.commit-list {
4516 margin: 0;
4517 padding: 0;
4518 list-style: none;
4519 max-height: 250px;
4520 overflow-y: auto;
4521 font-size: 0.8125rem;
4522}
4523
4524.commit-item {
4525 display: flex;
4526 gap: 0.5rem;
4527 padding: 0.5rem 0;
4528 border-bottom: 1px solid var(--border-color);
4529 align-items: flex-start;
4530}
4531
4532.commit-item:last-child {
4533 border-bottom: none;
4534}
4535
4536.commit-sha {
4537 font-family: var(--font-mono);
4538 color: var(--link-color);
4539 font-size: 0.75rem;
4540 flex-shrink: 0;
4541 text-decoration: none;
4542}
4543
4544.commit-sha:hover {
4545 text-decoration: underline;
4546}
4547
4548.commit-message {
4549 color: var(--text-primary);
4550 word-break: break-word;
4551 line-height: 1.4;
4552}
4553
4554.version-loading,
4555.version-no-commits {
4556 color: var(--text-secondary);
4557 font-size: 0.875rem;
4558 padding: 0.5rem 0;
4559}
4560
4561.version-actions {
4562 display: flex;
4563 flex-direction: column;
4564 gap: 0.75rem;
4565 border-top: 1px solid var(--border-color);
4566 padding-top: 1rem;
4567}
4568
4569.version-btn {
4570 padding: 0.5rem 1rem;
4571 border-radius: 0.375rem;
4572 font-size: 0.875rem;
4573 font-weight: 500;
4574 cursor: pointer;
4575 transition: background-color 0.15s;
4576}
4577
4578.version-btn:disabled {
4579 opacity: 0.6;
4580 cursor: not-allowed;
4581}
4582
4583.version-btn-primary {
4584 background: var(--primary);
4585 color: white;
4586 border: none;
4587}
4588
4589.version-btn-primary:hover:not(:disabled) {
4590 background: var(--primary-dark);
4591}
4592
4593.btn-icon.btn-danger:hover {
4594 background: var(--error-bg);
4595 color: var(--error-text);
4596}
4597
4598.add-model-btn {
4599 width: 100%;
4600}
4601
4602/* Model Form */
4603.model-form h3 {
4604 margin: 0 0 0.75rem 0;
4605 font-size: 1rem;
4606 font-weight: 600;
4607}
4608
4609.form-group {
4610 margin-bottom: 0.75rem;
4611}
4612
4613.form-group label {
4614 display: block;
4615 font-size: 0.875rem;
4616 font-weight: 500;
4617 margin-bottom: 0.25rem;
4618 color: var(--text-primary);
4619}
4620
4621.form-group label .optional {
4622 font-weight: 400;
4623 color: var(--text-secondary);
4624}
4625
4626.form-input {
4627 width: 100%;
4628 padding: 0.5rem 0.75rem;
4629 background: var(--bg-base);
4630 border: 1px solid var(--border);
4631 border-radius: 0.375rem;
4632 color: var(--text-primary);
4633 font-family: inherit;
4634 font-size: 0.875rem;
4635}
4636
4637.form-input:focus {
4638 outline: none;
4639 border-color: var(--primary);
4640 box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.2);
4641}
4642
4643.form-checkbox {
4644 display: flex;
4645 align-items: center;
4646}
4647
4648.form-checkbox label {
4649 display: flex;
4650 align-items: center;
4651 gap: 0.5rem;
4652 cursor: pointer;
4653 margin: 0;
4654}
4655
4656.form-checkbox input[type="checkbox"] {
4657 width: 1rem;
4658 height: 1rem;
4659 cursor: pointer;
4660}
4661
4662.info-icon-wrapper {
4663 position: relative;
4664 display: inline-flex;
4665 align-items: center;
4666 margin-left: 0.25rem;
4667}
4668
4669.info-icon {
4670 display: inline-flex;
4671 align-items: center;
4672 justify-content: center;
4673 color: var(--text-tertiary);
4674 cursor: pointer;
4675}
4676
4677.info-icon:hover {
4678 color: var(--text-secondary);
4679}
4680
4681.info-tooltip {
4682 position: absolute;
4683 top: 50%;
4684 left: 100%;
4685 transform: translateY(-50%);
4686 background: var(--bg-tertiary);
4687 border: 1px solid var(--border);
4688 border-radius: 0.375rem;
4689 padding: 0.5rem 0.75rem;
4690 font-size: 0.75rem;
4691 font-weight: 400;
4692 color: var(--text-primary);
4693 white-space: normal;
4694 width: 220px;
4695 margin-left: 0.375rem;
4696 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
4697 z-index: 100;
4698}
4699
4700.info-tooltip::after {
4701 content: "";
4702 position: absolute;
4703 top: 50%;
4704 right: 100%;
4705 transform: translateY(-50%);
4706 border: 6px solid transparent;
4707 border-right-color: var(--border);
4708}
4709
4710.provider-buttons {
4711 display: flex;
4712 gap: 0.5rem;
4713}
4714
4715.provider-btn {
4716 flex: 1;
4717 padding: 0.5rem;
4718 background: var(--bg-base);
4719 border: 1px solid var(--border);
4720 border-radius: 0.375rem;
4721 color: var(--text-primary);
4722 font-size: 0.875rem;
4723 cursor: pointer;
4724 transition: all 0.15s;
4725}
4726
4727.provider-btn:hover {
4728 background: var(--bg-tertiary);
4729}
4730
4731.provider-btn.selected {
4732 background: var(--primary);
4733 border-color: var(--primary);
4734 color: white;
4735}
4736
4737.endpoint-toggle {
4738 display: flex;
4739 gap: 0;
4740 margin-bottom: 0.5rem;
4741}
4742
4743.toggle-btn {
4744 flex: 1;
4745 padding: 0.375rem 0.75rem;
4746 background: var(--bg-base);
4747 border: 1px solid var(--border);
4748 color: var(--text-secondary);
4749 font-size: 0.75rem;
4750 cursor: pointer;
4751 transition: all 0.15s;
4752}
4753
4754.toggle-btn:first-child {
4755 border-radius: 0.375rem 0 0 0.375rem;
4756}
4757
4758.toggle-btn:last-child {
4759 border-radius: 0 0.375rem 0.375rem 0;
4760 border-left: none;
4761}
4762
4763.toggle-btn.selected {
4764 background: var(--bg-tertiary);
4765 color: var(--text-primary);
4766}
4767
4768.endpoint-display {
4769 padding: 0.5rem 0.75rem;
4770 background: var(--bg-tertiary);
4771 border-radius: 0.375rem;
4772 font-size: 0.75rem;
4773 color: var(--text-secondary);
4774 word-break: break-all;
4775}
4776
4777.model-presets {
4778 display: flex;
4779 flex-wrap: wrap;
4780 gap: 0.375rem;
4781 margin-bottom: 0.5rem;
4782}
4783
4784.preset-btn {
4785 padding: 0.25rem 0.625rem;
4786 background: var(--bg-base);
4787 border: 1px solid var(--border);
4788 border-radius: 0.25rem;
4789 color: var(--text-secondary);
4790 font-size: 0.75rem;
4791 cursor: pointer;
4792 transition: all 0.15s;
4793}
4794
4795.preset-btn:hover {
4796 background: var(--bg-tertiary);
4797 color: var(--text-primary);
4798}
4799
4800.preset-btn.selected {
4801 background: var(--blue-bg);
4802 border-color: var(--blue-border);
4803 color: var(--blue-text);
4804}
4805
4806.test-result {
4807 padding: 0.75rem 1rem;
4808 border-radius: 0.375rem;
4809 margin-bottom: 1rem;
4810 font-size: 0.875rem;
4811}
4812
4813.test-result.success {
4814 background: var(--success-bg);
4815 border: 1px solid var(--success-border);
4816 color: var(--success-text);
4817}
4818
4819.test-result.error {
4820 background: var(--error-bg);
4821 border: 1px solid var(--error-border);
4822 color: var(--error-text);
4823}
4824
4825.form-actions {
4826 display: flex;
4827 gap: 0.5rem;
4828 justify-content: flex-end;
4829 margin-top: 1rem;
4830 padding-bottom: 0.5rem;
4831}
4832
4833kbd {
4834 display: inline-block;
4835 padding: 0.125rem 0.375rem;
4836 font-size: 0.75rem;
4837 font-family: inherit;
4838 background: var(--bg-tertiary);
4839 border: 1px solid var(--border-color);
4840 border-radius: 0.25rem;
4841 color: var(--text-secondary);
4842}
4843
4844/* System Prompt View */
4845.system-prompt-view {
4846 background: var(--gray-100);
4847 border-radius: 0.5rem;
4848 margin: 0.5rem 0;
4849 width: 100%;
4850 border: 1px dashed var(--border);
4851}
4852
4853.dark .system-prompt-view {
4854 background: var(--gray-800);
4855}
4856
4857.system-prompt-header {
4858 display: flex;
4859 align-items: center;
4860 justify-content: space-between;
4861 padding: 0.75rem 1rem;
4862 cursor: pointer;
4863 user-select: none;
4864}
4865
4866.system-prompt-header:hover {
4867 background: rgba(0, 0, 0, 0.02);
4868 border-radius: 0.5rem;
4869}
4870
4871.dark .system-prompt-header:hover {
4872 background: rgba(255, 255, 255, 0.02);
4873}
4874
4875.system-prompt-summary {
4876 display: flex;
4877 align-items: center;
4878 gap: 0.5rem;
4879 flex: 1;
4880 min-width: 0;
4881}
4882
4883.system-prompt-icon {
4884 font-size: 1rem;
4885 flex-shrink: 0;
4886}
4887
4888.system-prompt-label {
4889 font-family: var(--font-mono);
4890 font-size: 0.875rem;
4891 color: var(--text-primary);
4892 font-weight: 500;
4893}
4894
4895.system-prompt-meta {
4896 font-size: 0.75rem;
4897 color: var(--text-secondary);
4898 flex-shrink: 0;
4899}
4900
4901.system-prompt-content {
4902 padding: 0 1rem 1rem 1rem;
4903}
4904
4905.system-prompt-text {
4906 font-family: var(--font-mono);
4907 font-size: 0.75rem;
4908 line-height: 1.5;
4909 color: var(--text-secondary);
4910 background: var(--bg-base);
4911 border: 1px solid var(--border);
4912 border-radius: 0.375rem;
4913 padding: 1rem;
4914 margin: 0;
4915 max-height: 400px;
4916 overflow: auto;
4917 white-space: pre-wrap;
4918 word-wrap: break-word;
4919}
4920
4921.dark .system-prompt-text {
4922 background: var(--gray-900);
4923}