@xingjisoft/neutrino 0.1.3 → 0.1.5

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