@xingjisoft/neutrino 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/web/style.css ADDED
@@ -0,0 +1,1088 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #0b0e14;
4
+ --panel: #0d1119;
5
+ --panel-2: #121826;
6
+ --border: #1e2633;
7
+ --border-soft: #171e29;
8
+ --text: #d6deeb;
9
+ --muted: #7b8aa3;
10
+ --muted-2: #55627a;
11
+ --accent: #5cc8ff;
12
+ --accent-2: #7c9cff;
13
+ --green: #8bd450;
14
+ --yellow: #ffd479;
15
+ --red: #ff6b81;
16
+ --user: #8bd450;
17
+ --radius: 10px;
18
+ --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
19
+ }
20
+
21
+ * {
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ html,
26
+ body {
27
+ height: 100%;
28
+ margin: 0;
29
+ }
30
+
31
+ body {
32
+ font-family: var(--mono);
33
+ font-size: 13px;
34
+ line-height: 1.55;
35
+ background: var(--bg);
36
+ color: var(--text);
37
+ overflow: hidden;
38
+ }
39
+
40
+ button {
41
+ font-family: inherit;
42
+ font-size: inherit;
43
+ color: inherit;
44
+ cursor: pointer;
45
+ }
46
+
47
+ .hidden {
48
+ display: none !important;
49
+ }
50
+
51
+ #app {
52
+ display: flex;
53
+ height: 100vh;
54
+ height: 100dvh;
55
+ width: 100%;
56
+ }
57
+
58
+ /* ---------------------------------------------------------------- sidebar */
59
+
60
+ #sidebar {
61
+ width: 340px;
62
+ min-width: 260px;
63
+ max-width: 42vw;
64
+ display: flex;
65
+ flex-direction: column;
66
+ background: var(--panel);
67
+ border-right: 1px solid var(--border);
68
+ }
69
+
70
+ .brand {
71
+ display: flex;
72
+ flex-shrink: 0;
73
+ align-items: center;
74
+ gap: 10px;
75
+ padding: 14px 14px 12px;
76
+ border-bottom: 1px solid var(--border);
77
+ }
78
+
79
+ .logo {
80
+ width: 30px;
81
+ height: 30px;
82
+ display: grid;
83
+ place-items: center;
84
+ border-radius: 8px;
85
+ background: linear-gradient(135deg, rgba(92, 200, 255, 0.18), rgba(124, 156, 255, 0.18));
86
+ border: 1px solid rgba(92, 200, 255, 0.35);
87
+ color: var(--accent);
88
+ font-size: 16px;
89
+ }
90
+
91
+ .brand-text {
92
+ display: flex;
93
+ flex-direction: column;
94
+ line-height: 1.2;
95
+ flex: 1;
96
+ }
97
+
98
+ .brand-text strong {
99
+ letter-spacing: 0.08em;
100
+ font-size: 13px;
101
+ }
102
+
103
+ .status {
104
+ font-size: 10.5px;
105
+ color: var(--muted);
106
+ letter-spacing: 0.04em;
107
+ text-transform: lowercase;
108
+ }
109
+
110
+ .status.online {
111
+ color: var(--green);
112
+ }
113
+
114
+ .status.live {
115
+ color: var(--accent);
116
+ }
117
+
118
+ .status.offline {
119
+ color: var(--red);
120
+ }
121
+
122
+ .icon-btn {
123
+ background: transparent;
124
+ border: 1px solid var(--border);
125
+ border-radius: 8px;
126
+ width: 30px;
127
+ height: 30px;
128
+ color: var(--muted);
129
+ display: grid;
130
+ place-items: center;
131
+ transition: color 0.15s, border-color 0.15s, transform 0.3s;
132
+ }
133
+
134
+ .icon-btn:hover {
135
+ color: var(--accent);
136
+ border-color: rgba(92, 200, 255, 0.4);
137
+ transform: rotate(90deg);
138
+ }
139
+
140
+ .sessions {
141
+ flex: 1;
142
+ min-height: 0;
143
+ overflow-y: auto;
144
+ padding: 8px 8px 24px;
145
+ }
146
+
147
+ .empty-side {
148
+ color: var(--muted-2);
149
+ padding: 18px 12px;
150
+ font-size: 12px;
151
+ }
152
+
153
+ .group {
154
+ margin-bottom: 4px;
155
+ }
156
+
157
+ .group-header {
158
+ width: 100%;
159
+ display: flex;
160
+ align-items: center;
161
+ gap: 6px;
162
+ background: transparent;
163
+ border: 0;
164
+ padding: 7px 8px;
165
+ border-radius: 8px;
166
+ color: var(--muted);
167
+ text-align: left;
168
+ }
169
+
170
+ .group-header:hover {
171
+ background: var(--panel-2);
172
+ color: var(--text);
173
+ }
174
+
175
+ .chevron {
176
+ width: 12px;
177
+ color: var(--muted-2);
178
+ flex: none;
179
+ }
180
+
181
+ .group-header .path {
182
+ flex: 1;
183
+ overflow: hidden;
184
+ text-overflow: ellipsis;
185
+ white-space: nowrap;
186
+ text-align: left;
187
+ font-size: 11.5px;
188
+ }
189
+
190
+ .group-header .count {
191
+ flex: none;
192
+ font-size: 10px;
193
+ color: var(--muted-2);
194
+ background: var(--panel-2);
195
+ border: 1px solid var(--border);
196
+ border-radius: 999px;
197
+ padding: 0 7px;
198
+ }
199
+
200
+ .group-items {
201
+ display: flex;
202
+ flex-direction: column;
203
+ gap: 2px;
204
+ padding-left: 6px;
205
+ border-left: 1px solid var(--border-soft);
206
+ margin-left: 13px;
207
+ }
208
+
209
+ .session {
210
+ display: block;
211
+ width: 100%;
212
+ text-align: left;
213
+ background: transparent;
214
+ border: 1px solid transparent;
215
+ border-radius: 8px;
216
+ padding: 7px 9px;
217
+ }
218
+
219
+ .session:hover {
220
+ background: var(--panel-2);
221
+ }
222
+
223
+ .session.selected {
224
+ background: linear-gradient(90deg, rgba(92, 200, 255, 0.14), rgba(92, 200, 255, 0.04));
225
+ border-color: rgba(92, 200, 255, 0.35);
226
+ }
227
+
228
+ .session-top {
229
+ display: flex;
230
+ align-items: center;
231
+ gap: 6px;
232
+ }
233
+
234
+ .session-title {
235
+ flex: 1;
236
+ overflow: hidden;
237
+ text-overflow: ellipsis;
238
+ white-space: nowrap;
239
+ font-size: 12px;
240
+ color: var(--text);
241
+ }
242
+
243
+ .session-meta {
244
+ display: flex;
245
+ flex-wrap: wrap;
246
+ gap: 10px;
247
+ margin-top: 2px;
248
+ font-size: 10px;
249
+ color: var(--muted-2);
250
+ }
251
+
252
+ .session-meta .model {
253
+ color: var(--muted);
254
+ }
255
+
256
+ .dot {
257
+ flex: none;
258
+ width: 7px;
259
+ height: 7px;
260
+ border-radius: 50%;
261
+ background: var(--green);
262
+ box-shadow: 0 0 0 0 rgba(139, 212, 80, 0.6);
263
+ animation: pulse 1.8s infinite;
264
+ }
265
+
266
+ .session.live .session-title {
267
+ color: #eaf5ff;
268
+ }
269
+
270
+ .more {
271
+ margin: 2px 0 4px;
272
+ background: transparent;
273
+ border: 1px dashed var(--border);
274
+ border-radius: 8px;
275
+ padding: 5px 8px;
276
+ color: var(--muted);
277
+ font-size: 11px;
278
+ }
279
+
280
+ .more:hover {
281
+ color: var(--accent);
282
+ border-color: rgba(92, 200, 255, 0.4);
283
+ }
284
+
285
+ /* ------------------------------------------------------------------- main */
286
+
287
+ #main {
288
+ flex: 1;
289
+ display: flex;
290
+ flex-direction: column;
291
+ min-width: 0;
292
+ min-height: 0;
293
+ background:
294
+ radial-gradient(1200px 500px at 80% -10%, rgba(92, 200, 255, 0.05), transparent 60%),
295
+ var(--bg);
296
+ }
297
+
298
+ .main-header {
299
+ display: flex;
300
+ flex-shrink: 0;
301
+ align-items: flex-start;
302
+ gap: 16px;
303
+ padding: 14px 22px 12px;
304
+ border-bottom: 1px solid var(--border);
305
+ background: rgba(13, 17, 25, 0.7);
306
+ backdrop-filter: blur(6px);
307
+ }
308
+
309
+ .main-title {
310
+ min-width: 0;
311
+ flex: 1;
312
+ }
313
+
314
+ .back-to-menu {
315
+ display: none;
316
+ }
317
+
318
+ .main-title h1 {
319
+ margin: 0;
320
+ font-size: 14px;
321
+ font-weight: 600;
322
+ letter-spacing: 0.01em;
323
+ white-space: nowrap;
324
+ overflow: hidden;
325
+ text-overflow: ellipsis;
326
+ }
327
+
328
+ .sub {
329
+ margin-top: 3px;
330
+ font-size: 10.5px;
331
+ color: var(--muted);
332
+ white-space: nowrap;
333
+ overflow: hidden;
334
+ text-overflow: ellipsis;
335
+ }
336
+
337
+ .controls {
338
+ display: flex;
339
+ align-items: center;
340
+ gap: 8px;
341
+ flex-wrap: wrap;
342
+ justify-content: flex-end;
343
+ }
344
+
345
+ .badge {
346
+ font-size: 10px;
347
+ letter-spacing: 0.06em;
348
+ text-transform: uppercase;
349
+ padding: 3px 8px;
350
+ border-radius: 999px;
351
+ border: 1px solid var(--border);
352
+ color: var(--muted);
353
+ background: var(--panel-2);
354
+ }
355
+
356
+ .badge.busy {
357
+ color: var(--yellow);
358
+ border-color: rgba(255, 212, 121, 0.4);
359
+ background: rgba(255, 212, 121, 0.08);
360
+ }
361
+
362
+ .badge.paused {
363
+ color: var(--red);
364
+ border-color: rgba(255, 107, 129, 0.4);
365
+ background: rgba(255, 107, 129, 0.08);
366
+ }
367
+
368
+ .badge.idle {
369
+ color: var(--green);
370
+ border-color: rgba(139, 212, 80, 0.3);
371
+ background: rgba(139, 212, 80, 0.06);
372
+ }
373
+
374
+ /* A transcript loaded from disk: nothing is running, so nothing can be driven. */
375
+ .badge.readonly {
376
+ color: var(--muted);
377
+ border-style: dashed;
378
+ }
379
+
380
+ .control {
381
+ background: var(--panel-2);
382
+ border: 1px solid var(--border);
383
+ border-radius: 8px;
384
+ padding: 4px 10px;
385
+ color: var(--text);
386
+ font-size: 11px;
387
+ }
388
+
389
+ .control:hover {
390
+ border-color: rgba(92, 200, 255, 0.45);
391
+ color: var(--accent);
392
+ }
393
+
394
+ .control.primary {
395
+ border-color: rgba(92, 200, 255, 0.45);
396
+ color: var(--accent);
397
+ background: rgba(92, 200, 255, 0.1);
398
+ }
399
+
400
+ .control.primary:disabled {
401
+ opacity: 0.6;
402
+ cursor: default;
403
+ }
404
+
405
+ .queued,
406
+ .tokens {
407
+ font-size: 10px;
408
+ color: var(--muted-2);
409
+ border: 1px solid var(--border);
410
+ border-radius: 999px;
411
+ padding: 2px 8px;
412
+ }
413
+
414
+ .queued {
415
+ color: var(--yellow);
416
+ border-color: rgba(255, 212, 121, 0.3);
417
+ }
418
+
419
+ /* --------------------------------------------------------------- messages */
420
+
421
+ .messages {
422
+ flex: 1;
423
+ min-height: 0;
424
+ overflow-y: auto;
425
+ padding: 22px clamp(16px, 6vw, 120px) 28px;
426
+ }
427
+
428
+ .empty {
429
+ color: var(--muted-2);
430
+ text-align: center;
431
+ margin-top: 12vh;
432
+ font-size: 12.5px;
433
+ }
434
+
435
+ .message {
436
+ margin: 0 0 18px;
437
+ max-width: 900px;
438
+ }
439
+
440
+ .message .who {
441
+ font-size: 10px;
442
+ letter-spacing: 0.12em;
443
+ text-transform: uppercase;
444
+ color: var(--muted);
445
+ margin-bottom: 5px;
446
+ }
447
+
448
+ .message.user .who {
449
+ color: var(--user);
450
+ }
451
+
452
+ .message.user .body {
453
+ border-left: 2px solid rgba(139, 212, 80, 0.5);
454
+ padding-left: 12px;
455
+ }
456
+
457
+ .message.assistant .body {
458
+ border-left: 2px solid rgba(92, 200, 255, 0.35);
459
+ padding-left: 12px;
460
+ }
461
+
462
+ .message .body {
463
+ overflow-wrap: anywhere;
464
+ }
465
+
466
+ .message .body p {
467
+ margin: 0 0 8px;
468
+ }
469
+
470
+ .message .body > *:last-child {
471
+ margin-bottom: 0;
472
+ }
473
+
474
+ .message code {
475
+ background: rgba(124, 156, 255, 0.12);
476
+ border: 1px solid rgba(124, 156, 255, 0.18);
477
+ border-radius: 5px;
478
+ padding: 0 4px;
479
+ font-size: 0.94em;
480
+ color: #bfe3ff;
481
+ }
482
+
483
+ .message pre.code {
484
+ margin: 10px 0;
485
+ padding: 12px 14px;
486
+ background: #070a10;
487
+ border: 1px solid var(--border);
488
+ border-radius: var(--radius);
489
+ overflow-x: auto;
490
+ }
491
+
492
+ .message pre.code code {
493
+ background: transparent;
494
+ border: 0;
495
+ padding: 0;
496
+ color: #c7d6ec;
497
+ }
498
+
499
+ .message a {
500
+ color: var(--accent);
501
+ text-decoration: none;
502
+ border-bottom: 1px solid rgba(92, 200, 255, 0.35);
503
+ }
504
+
505
+ .message.streaming .body::after {
506
+ content: "▋";
507
+ margin-left: 2px;
508
+ color: var(--accent);
509
+ animation: blink 1s steps(2, start) infinite;
510
+ }
511
+
512
+ .details,
513
+ .message details.tool {
514
+ background: var(--panel);
515
+ border: 1px solid var(--border);
516
+ border-radius: var(--radius);
517
+ padding: 8px 12px;
518
+ }
519
+
520
+ .message details.tool summary {
521
+ cursor: pointer;
522
+ list-style: none;
523
+ display: flex;
524
+ align-items: baseline;
525
+ gap: 10px;
526
+ overflow: hidden;
527
+ }
528
+
529
+ .message details.tool summary::-webkit-details-marker {
530
+ display: none;
531
+ }
532
+
533
+ .tool-name {
534
+ flex: none;
535
+ color: var(--accent-2);
536
+ font-size: 11.5px;
537
+ }
538
+
539
+ .tool-args {
540
+ flex: 1;
541
+ overflow: hidden;
542
+ text-overflow: ellipsis;
543
+ white-space: nowrap;
544
+ color: var(--muted-2);
545
+ font-size: 11px;
546
+ }
547
+
548
+ .tool-result {
549
+ margin: 10px 0 0;
550
+ padding: 10px 12px;
551
+ max-height: 420px;
552
+ overflow: auto;
553
+ background: #070a10;
554
+ border: 1px solid var(--border-soft);
555
+ border-radius: 8px;
556
+ font-size: 11.5px;
557
+ white-space: pre-wrap;
558
+ overflow-wrap: anywhere;
559
+ color: #aebcd4;
560
+ }
561
+
562
+ .message.summary .body {
563
+ background: rgba(255, 212, 121, 0.05);
564
+ border: 1px dashed rgba(255, 212, 121, 0.3);
565
+ border-radius: var(--radius);
566
+ padding: 10px 12px;
567
+ color: #c9c2a8;
568
+ }
569
+
570
+ .summary-label {
571
+ font-size: 10px;
572
+ letter-spacing: 0.08em;
573
+ text-transform: uppercase;
574
+ color: var(--yellow);
575
+ margin-bottom: 6px;
576
+ }
577
+
578
+ .conversation-history {
579
+ border: 1px dashed var(--border);
580
+ border-radius: var(--radius);
581
+ padding: 10px 12px;
582
+ }
583
+
584
+ .conversation-history > summary {
585
+ cursor: pointer;
586
+ color: var(--yellow);
587
+ font-size: 12px;
588
+ }
589
+
590
+ .history-messages {
591
+ display: flex;
592
+ flex-direction: column;
593
+ gap: 18px;
594
+ }
595
+
596
+ .conversation-history[open] > summary {
597
+ margin-bottom: 18px;
598
+ }
599
+
600
+ /* A finished turn: one summary line, the whole round one click away. */
601
+ .turn {
602
+ border: 1px dashed var(--border-soft);
603
+ border-radius: var(--radius);
604
+ padding: 8px 12px;
605
+ margin-bottom: 18px;
606
+ }
607
+
608
+ .turn > summary {
609
+ cursor: pointer;
610
+ list-style: none;
611
+ display: flex;
612
+ align-items: baseline;
613
+ gap: 8px;
614
+ overflow: hidden;
615
+ }
616
+
617
+ .turn > summary::-webkit-details-marker {
618
+ display: none;
619
+ }
620
+
621
+ .turn-chevron {
622
+ flex: none;
623
+ display: inline-block;
624
+ color: var(--yellow);
625
+ transition: transform 0.15s;
626
+ }
627
+
628
+ .turn-you {
629
+ flex: 1 1 auto;
630
+ min-width: 0;
631
+ overflow: hidden;
632
+ text-overflow: ellipsis;
633
+ white-space: nowrap;
634
+ color: var(--user);
635
+ }
636
+
637
+ .turn-meta {
638
+ flex: 0 1 auto;
639
+ min-width: 0;
640
+ overflow: hidden;
641
+ text-overflow: ellipsis;
642
+ white-space: nowrap;
643
+ color: var(--muted-2);
644
+ font-size: 11px;
645
+ }
646
+
647
+ .turn-hint {
648
+ color: var(--muted);
649
+ }
650
+
651
+ .turn[open] > summary {
652
+ margin-bottom: 14px;
653
+ }
654
+
655
+ .turn[open] .turn-chevron {
656
+ transform: rotate(90deg);
657
+ }
658
+
659
+ .turn-messages {
660
+ display: flex;
661
+ flex-direction: column;
662
+ }
663
+
664
+ .turn-messages > .message:last-child {
665
+ margin-bottom: 0;
666
+ }
667
+
668
+ /* --------------------------------------------------------------- composer */
669
+
670
+ .composer {
671
+ display: flex;
672
+ flex-shrink: 0;
673
+ gap: 10px;
674
+ align-items: flex-end;
675
+ padding: 12px clamp(16px, 6vw, 120px) 16px;
676
+ border-top: 1px solid var(--border);
677
+ background: linear-gradient(180deg, transparent, rgba(11, 14, 20, 0.9));
678
+ }
679
+
680
+ .composer textarea {
681
+ flex: 1;
682
+ min-width: 0;
683
+ resize: none;
684
+ min-height: 42px;
685
+ max-height: 220px;
686
+ padding: 11px 13px;
687
+ background: var(--panel-2);
688
+ color: var(--text);
689
+ border: 1px solid var(--border);
690
+ border-radius: var(--radius);
691
+ font-family: inherit;
692
+ font-size: 12.5px;
693
+ line-height: 1.5;
694
+ outline: none;
695
+ }
696
+
697
+ .composer textarea:focus {
698
+ border-color: rgba(92, 200, 255, 0.5);
699
+ box-shadow: 0 0 0 3px rgba(92, 200, 255, 0.08);
700
+ }
701
+
702
+ .primary {
703
+ background: linear-gradient(135deg, #2f7fb5, #3c63c9);
704
+ border: 1px solid rgba(92, 200, 255, 0.4);
705
+ color: #eaf6ff;
706
+ border-radius: var(--radius);
707
+ padding: 11px 18px;
708
+ font-size: 12px;
709
+ letter-spacing: 0.03em;
710
+ }
711
+
712
+ .primary:hover {
713
+ filter: brightness(1.12);
714
+ }
715
+
716
+ .primary:active {
717
+ transform: translateY(1px);
718
+ }
719
+
720
+ /* --------------------------------------------------------------- scrollbar */
721
+
722
+ * {
723
+ scrollbar-width: thin;
724
+ scrollbar-color: #2a3444 transparent;
725
+ }
726
+
727
+ *::-webkit-scrollbar {
728
+ width: 9px;
729
+ height: 9px;
730
+ }
731
+
732
+ *::-webkit-scrollbar-thumb {
733
+ background: #263041;
734
+ border-radius: 999px;
735
+ border: 2px solid transparent;
736
+ background-clip: content-box;
737
+ }
738
+
739
+ *::-webkit-scrollbar-thumb:hover {
740
+ background: #33405a;
741
+ background-clip: content-box;
742
+ }
743
+
744
+ @keyframes blink {
745
+ 0%,
746
+ 49% {
747
+ opacity: 1;
748
+ }
749
+ 50%,
750
+ 100% {
751
+ opacity: 0;
752
+ }
753
+ }
754
+
755
+ @keyframes pulse {
756
+ 0% {
757
+ box-shadow: 0 0 0 0 rgba(139, 212, 80, 0.55);
758
+ }
759
+ 70% {
760
+ box-shadow: 0 0 0 6px rgba(139, 212, 80, 0);
761
+ }
762
+ 100% {
763
+ box-shadow: 0 0 0 0 rgba(139, 212, 80, 0);
764
+ }
765
+ }
766
+
767
+ /* ---- approval banner ------------------------------------------------- */
768
+ /* Orange, like the TUI: an approval is a stop-the-line event. */
769
+ .approval {
770
+ flex-shrink: 0;
771
+ max-height: min(58vh, 520px);
772
+ min-height: 0;
773
+ margin: 0 18px 10px;
774
+ padding: 10px 14px;
775
+ border: 1px solid #ff9e3d;
776
+ border-left-width: 4px;
777
+ border-radius: 8px;
778
+ background: rgba(255, 158, 61, 0.12);
779
+ color: #ffd8ac;
780
+ font-size: 13px;
781
+ display: flex;
782
+ flex-direction: column;
783
+ gap: 8px;
784
+ }
785
+
786
+ .approval.hidden {
787
+ display: none;
788
+ }
789
+
790
+ .approval-head {
791
+ flex-shrink: 0;
792
+ display: flex;
793
+ flex-wrap: wrap;
794
+ align-items: center;
795
+ justify-content: space-between;
796
+ gap: 10px;
797
+ color: #ff9e3d;
798
+ }
799
+
800
+ .approval-risk {
801
+ font-size: 11px;
802
+ letter-spacing: 0.08em;
803
+ padding: 2px 8px;
804
+ border-radius: 999px;
805
+ background: #ff9e3d;
806
+ color: #24160a;
807
+ font-weight: 700;
808
+ }
809
+
810
+ .approval-details {
811
+ min-height: 0;
812
+ overflow: auto;
813
+ overscroll-behavior: contain;
814
+ }
815
+
816
+ .approval-location {
817
+ margin: 4px 0;
818
+ font-size: 11px;
819
+ overflow-wrap: anywhere;
820
+ }
821
+
822
+ .approval-code {
823
+ margin: 6px 0;
824
+ padding: 10px;
825
+ border-radius: 5px;
826
+ background: rgba(0, 0, 0, 0.22);
827
+ font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);
828
+ font-size: 12px;
829
+ white-space: pre-wrap;
830
+ overflow-wrap: anywhere;
831
+ word-break: break-word;
832
+ user-select: text;
833
+ }
834
+
835
+ .approval-why {
836
+ margin: 6px 0;
837
+ font-size: 12px;
838
+ line-height: 1.45;
839
+ overflow-wrap: anywhere;
840
+ user-select: text;
841
+ }
842
+
843
+ .approval-why strong { color: #ffd8ac; }
844
+
845
+ .approval-arguments summary { cursor: pointer; }
846
+ .approval-reasons { margin: 6px 0 0; padding-left: 20px; overflow-wrap: anywhere; }
847
+
848
+ .approval-tool {
849
+ font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);
850
+ color: #ffd8ac;
851
+ word-break: break-word;
852
+ }
853
+
854
+ .approval-actions {
855
+ flex-shrink: 0;
856
+ display: flex;
857
+ gap: 8px;
858
+ }
859
+
860
+ .approval-actions button {
861
+ border: 1px solid #ff9e3d;
862
+ background: transparent;
863
+ color: #ff9e3d;
864
+ border-radius: 6px;
865
+ padding: 5px 14px;
866
+ font: inherit;
867
+ cursor: pointer;
868
+ }
869
+
870
+ .approval-actions .approve-btn {
871
+ background: #ff9e3d;
872
+ color: #24160a;
873
+ font-weight: 700;
874
+ }
875
+
876
+ .approval-actions button:hover {
877
+ filter: brightness(1.1);
878
+ }
879
+
880
+ /* -------------------------------------------------------------------- gate */
881
+ /* Modal password login remains above the app and settings. */
882
+
883
+ .gate {
884
+ position: fixed;
885
+ inset: 0;
886
+ z-index: 100;
887
+ width: 100vw;
888
+ height: 100dvh;
889
+ max-width: none;
890
+ max-height: none;
891
+ margin: 0;
892
+ border: 0;
893
+ color: var(--text);
894
+ display: flex;
895
+ align-items: center;
896
+ justify-content: center;
897
+ padding: 24px;
898
+ background: rgba(6, 9, 14, 0.82);
899
+ backdrop-filter: blur(3px);
900
+ }
901
+
902
+ .gate-card {
903
+ width: min(420px, 100%);
904
+ display: flex;
905
+ flex-direction: column;
906
+ gap: 12px;
907
+ margin: 0;
908
+ padding: 22px;
909
+ background: var(--panel-2);
910
+ border: 1px solid var(--border);
911
+ border-radius: var(--radius);
912
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.55);
913
+ }
914
+
915
+ .gate-card h2 {
916
+ margin: 0;
917
+ font-size: 14px;
918
+ letter-spacing: 0.02em;
919
+ }
920
+
921
+ .gate-card p {
922
+ margin: 0;
923
+ color: var(--muted);
924
+ font-size: 12px;
925
+ }
926
+
927
+ .gate-card code {
928
+ color: var(--accent);
929
+ }
930
+
931
+ .gate-card input {
932
+ font-family: var(--mono);
933
+ font-size: 12px;
934
+ color: var(--text);
935
+ background: var(--bg);
936
+ border: 1px solid var(--border);
937
+ border-radius: var(--radius);
938
+ padding: 10px 12px;
939
+ }
940
+
941
+ .gate-card input:focus {
942
+ outline: none;
943
+ border-color: rgba(92, 200, 255, 0.5);
944
+ box-shadow: 0 0 0 3px rgba(92, 200, 255, 0.08);
945
+ }
946
+
947
+ /* ----------------------------------------------------- model and settings */
948
+ .model-picker {
949
+ display: flex;
950
+ flex-shrink: 0;
951
+ flex-wrap: wrap;
952
+ align-items: end;
953
+ gap: 10px;
954
+ padding: 12px 22px 8px;
955
+ border-bottom: 1px solid var(--border);
956
+ }
957
+
958
+ .model-picker label,
959
+ .settings-fields label {
960
+ display: flex;
961
+ flex-direction: column;
962
+ gap: 5px;
963
+ color: var(--muted);
964
+ font-size: 11px;
965
+ min-width: 0;
966
+ }
967
+
968
+ .model-picker label { flex: 1 1 140px; }
969
+ .model-picker label:nth-child(2) { flex-grow: 2; }
970
+
971
+ .settings-fields input[type="password"],
972
+ .settings-fields input[type="number"],
973
+ select {
974
+ width: 100%;
975
+ padding: 7px 10px;
976
+ border: 1px solid var(--border);
977
+ border-radius: 7px;
978
+ background: var(--panel-2);
979
+ color: var(--text);
980
+ font: inherit;
981
+ font-size: 12px;
982
+ }
983
+
984
+ .settings-fields input[type="password"]:focus-visible,
985
+ .settings-fields input[type="number"]:focus-visible,
986
+ select:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
987
+ .form-feedback { flex: 1 0 100%; margin: 0; color: var(--muted); font-size: 11px; overflow-wrap: anywhere; }
988
+ .form-feedback.error { color: var(--red); }
989
+ .settings-dialog {
990
+ width: min(620px, calc(100vw - 24px));
991
+ max-height: calc(100vh - 24px);
992
+ max-height: calc(100dvh - 24px);
993
+ padding: 0;
994
+ border: 1px solid var(--border);
995
+ border-radius: var(--radius);
996
+ background: var(--panel);
997
+ color: var(--text);
998
+ }
999
+ .settings-dialog::backdrop { background: rgba(0, 0, 0, 0.65); backdrop-filter: blur(3px); }
1000
+ .settings-header { display: flex; justify-content: space-between; align-items: center; padding: 18px 22px; border-bottom: 1px solid var(--border); }
1001
+ .settings-header h2 { margin: 0; font-size: 16px; }
1002
+ .settings-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; padding: 20px 22px; }
1003
+ .settings-fields h3 { grid-column: 1 / -1; margin: 4px 0 0; font-size: 12px; font-weight: 500; color: var(--text); }
1004
+ .settings-fields .checkbox-label { grid-column: 1 / -1; flex-direction: row; align-items: center; font-size: 12px; color: var(--text); }
1005
+ .settings-note, .settings-fields .form-feedback { grid-column: 1 / -1; margin: 0; font-size: 11px; color: var(--muted); }
1006
+ .settings-fields .form-feedback.error { color: var(--red); }
1007
+ .settings-actions { display: flex; justify-content: end; gap: 10px; padding: 14px 22px; border-top: 1px solid var(--border); }
1008
+ /* Phones use one full-width pane: the conversation list opens first. */
1009
+ @media (max-width: 760px) {
1010
+ #sidebar {
1011
+ width: 100%;
1012
+ min-width: 0;
1013
+ max-width: none;
1014
+ border-right: 0;
1015
+ padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
1016
+ }
1017
+
1018
+ #main { display: none; }
1019
+ #app.conversation-open #sidebar { display: none; }
1020
+ #app.conversation-open #main { display: flex; }
1021
+
1022
+ #main {
1023
+ padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
1024
+ }
1025
+
1026
+ .brand { padding: 12px; }
1027
+ .icon-btn { width: 44px; height: 44px; flex: none; }
1028
+ .session { padding: 12px 9px; min-height: 56px; }
1029
+ .session-title { font-size: 13px; }
1030
+ .group-header, .more { min-height: 44px; }
1031
+
1032
+ .main-header {
1033
+ display: grid;
1034
+ grid-template-columns: 44px minmax(0, 1fr);
1035
+ align-items: center;
1036
+ gap: 8px 10px;
1037
+ padding: 8px 12px;
1038
+ }
1039
+ .back-to-menu { display: grid; }
1040
+ .back-to-menu:hover { transform: none; }
1041
+ .back-to-menu:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
1042
+ .controls {
1043
+ grid-column: 1 / -1;
1044
+ justify-content: flex-start;
1045
+ max-height: 20vh;
1046
+ max-height: 20dvh;
1047
+ overflow: auto;
1048
+ }
1049
+ .controls:empty { display: none; }
1050
+ .controls .control { min-height: 36px; }
1051
+ .controls label { min-width: 0; max-width: 100%; }
1052
+
1053
+ .model-picker {
1054
+ gap: 8px;
1055
+ padding: 10px 12px;
1056
+ max-height: 30vh;
1057
+ max-height: 30dvh;
1058
+ overflow: auto;
1059
+ }
1060
+ .model-picker label { flex: 1 1 calc(50% - 8px); }
1061
+ .model-picker .control { flex: 1 1 calc(50% - 8px); min-height: 44px; }
1062
+
1063
+ .messages { padding: 16px 12px; }
1064
+ .composer { padding: 10px 12px; gap: 8px; }
1065
+ .composer textarea { max-height: min(220px, 25dvh); }
1066
+ .composer .primary { min-height: 44px; padding: 11px 12px; }
1067
+ .approval { margin: 0 12px 8px; max-height: 35dvh; padding: 10px; }
1068
+ .approval-actions { flex-wrap: wrap; }
1069
+ .approval-actions button { min-height: 44px; }
1070
+
1071
+ /* Keep inputs at 16px to avoid automatic zoom when focused on iOS. */
1072
+ .composer textarea, .gate-card input, .settings-fields input, select { font-size: 16px; }
1073
+ .settings-header, .settings-fields, .settings-actions { padding: 14px 16px; }
1074
+ .settings-fields { grid-template-columns: 1fr; }
1075
+ .settings-fields label, .settings-note { overflow-wrap: anywhere; }
1076
+ .settings-actions button { min-height: 44px; }
1077
+ .gate { padding: 16px; overflow-y: auto; }
1078
+ .gate-card { margin: auto; }
1079
+ }
1080
+
1081
+ /* Short landscape screens and the onscreen keyboard leave less vertical room. */
1082
+ @media (max-width: 760px) and (max-height: 600px) {
1083
+ .main-header { flex-shrink: 1; min-height: 60px; overflow-y: auto; }
1084
+ .model-picker { flex-shrink: 1; min-height: 44px; padding-top: 6px; padding-bottom: 6px; }
1085
+ .messages { min-height: 40px; padding-top: 8px; padding-bottom: 8px; }
1086
+ .approval { max-height: 30dvh; overflow-y: auto; }
1087
+ .approval-details { min-height: 64px; }
1088
+ }