@green-on-grey/ui-kit 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1288 @@
1
+ /* Design tokens: colours, radii, shadows, fonts, the light and the dark theme. Green and amber
2
+ are reserved for statuses and never used decoratively. */
3
+ :root {
4
+ --bg: #eeedf3;
5
+ --surface: #ffffff;
6
+ --surface-2: #f6f5fa;
7
+ --border: #e1dfea;
8
+ --border-strong: #c9c5d8;
9
+ --text: #1b1830;
10
+ --text-2: #55506e;
11
+ --muted: #8a86a0;
12
+ --violet: #6d4aff;
13
+ --violet-soft: #eeeaff;
14
+ --violet-text: #4b2fd6;
15
+ --green: #12a876;
16
+ --green-soft: #e3f6ef;
17
+ --amber: #b87400;
18
+ --amber-soft: #fff3dc;
19
+ --red: #c8333f;
20
+ --red-soft: #fde8ea;
21
+ --shadow: 0 1px 2px rgba(27, 24, 48, 0.06), 0 8px 24px rgba(27, 24, 48, 0.06);
22
+ --r-s: 6px;
23
+ --r-m: 10px;
24
+ --r-l: 16px;
25
+ --font: "Onest", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
26
+ --mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
27
+ --overlay: rgba(27, 24, 48, 0.35);
28
+ color-scheme: light;
29
+ }
30
+ @media (prefers-color-scheme: dark) {
31
+ :root:not([data-theme="light"]) {
32
+ --bg: #0f0d1a;
33
+ --surface: #1a1829;
34
+ --surface-2: #221f35;
35
+ --border: #2f2b46;
36
+ --border-strong: #433e60;
37
+ --text: #eceaf6;
38
+ --text-2: #b3aecb;
39
+ --muted: #7f7a99;
40
+ --violet: #8f74ff;
41
+ --violet-soft: #2a2350;
42
+ --violet-text: #bfb0ff;
43
+ --green: #3dd6a0;
44
+ --green-soft: #153a30;
45
+ --amber: #f0b44a;
46
+ --amber-soft: #3a2d12;
47
+ --red: #ff6b76;
48
+ --red-soft: #3c1a20;
49
+ --shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 8px 24px rgba(0, 0, 0, 0.25);
50
+ --overlay: rgba(0, 0, 0, 0.55);
51
+ color-scheme: dark;
52
+ }
53
+ }
54
+ :root[data-theme="dark"] {
55
+ --bg: #0f0d1a;
56
+ --surface: #1a1829;
57
+ --surface-2: #221f35;
58
+ --border: #2f2b46;
59
+ --border-strong: #433e60;
60
+ --text: #eceaf6;
61
+ --text-2: #b3aecb;
62
+ --muted: #7f7a99;
63
+ --violet: #8f74ff;
64
+ --violet-soft: #2a2350;
65
+ --violet-text: #bfb0ff;
66
+ --green: #3dd6a0;
67
+ --green-soft: #153a30;
68
+ --amber: #f0b44a;
69
+ --amber-soft: #3a2d12;
70
+ --red: #ff6b76;
71
+ --red-soft: #3c1a20;
72
+ --shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 8px 24px rgba(0, 0, 0, 0.25);
73
+ --overlay: rgba(0, 0, 0, 0.55);
74
+ color-scheme: dark;
75
+ }
76
+ :root:lang(zh-CN) {
77
+ --font:
78
+ "Onest", "PingFang SC", "Noto Sans SC", "Microsoft YaHei", system-ui,
79
+ sans-serif;
80
+ }
81
+
82
+ /* Reset, focus, icons and the utilities: text tones, rows, the hidden label. */
83
+ *,
84
+ *::before,
85
+ *::after {
86
+ box-sizing: border-box;
87
+ }
88
+ html,
89
+ body,
90
+ #root {
91
+ height: 100%;
92
+ }
93
+ body {
94
+ margin: 0;
95
+ background: var(--bg);
96
+ color: var(--text);
97
+ font: 15px/1.5 var(--font);
98
+ -webkit-font-smoothing: antialiased;
99
+ }
100
+ img {
101
+ max-width: 100%;
102
+ }
103
+ a {
104
+ color: var(--violet-text);
105
+ }
106
+ button {
107
+ font: inherit;
108
+ color: inherit;
109
+ cursor: pointer;
110
+ }
111
+ input,
112
+ select,
113
+ textarea {
114
+ font: inherit;
115
+ color: inherit;
116
+ }
117
+ :focus-visible {
118
+ outline: 2px solid var(--violet);
119
+ outline-offset: 2px;
120
+ }
121
+ svg.i {
122
+ width: 18px;
123
+ height: 18px;
124
+ flex: none;
125
+ stroke: currentColor;
126
+ fill: none;
127
+ stroke-width: 1.8;
128
+ stroke-linecap: round;
129
+ stroke-linejoin: round;
130
+ }
131
+ .mono {
132
+ font-family: var(--mono);
133
+ font-size: 0.86em;
134
+ }
135
+ .muted {
136
+ color: var(--muted);
137
+ }
138
+ .t2 {
139
+ color: var(--text-2);
140
+ }
141
+ .small {
142
+ font-size: 13px;
143
+ }
144
+ .sr-only {
145
+ position: absolute;
146
+ width: 1px;
147
+ height: 1px;
148
+ margin: -1px;
149
+ padding: 0;
150
+ border: 0;
151
+ overflow: hidden;
152
+ clip: rect(0 0 0 0);
153
+ white-space: nowrap;
154
+ }
155
+ .row {
156
+ display: flex;
157
+ gap: 8px;
158
+ align-items: center;
159
+ flex-wrap: wrap;
160
+ }
161
+ .grow {
162
+ flex: 1;
163
+ min-width: 0;
164
+ }
165
+ .spacer {
166
+ flex: 1;
167
+ }
168
+
169
+ /* The frame of an application: the top bar, the brand, the search, the avatar, the main area. */
170
+ .app {
171
+ display: flex;
172
+ flex-direction: column;
173
+ height: 100%;
174
+ }
175
+ .topbar {
176
+ display: flex;
177
+ align-items: center;
178
+ gap: 16px;
179
+ padding: 10px 20px;
180
+ border-bottom: 1px solid var(--border);
181
+ background: var(--surface);
182
+ position: relative;
183
+ z-index: 5;
184
+ }
185
+ .brand {
186
+ display: flex;
187
+ align-items: center;
188
+ gap: 10px;
189
+ font-weight: 600;
190
+ font-size: 16px;
191
+ color: var(--text);
192
+ text-decoration: none;
193
+ }
194
+ .brand img {
195
+ width: 30px;
196
+ height: 30px;
197
+ border-radius: 8px;
198
+ }
199
+ .search {
200
+ flex: 1;
201
+ max-width: 460px;
202
+ display: flex;
203
+ align-items: center;
204
+ gap: 8px;
205
+ background: var(--surface-2);
206
+ border: 1px solid var(--border);
207
+ border-radius: var(--r-m);
208
+ padding: 7px 12px;
209
+ color: var(--muted);
210
+ }
211
+ .search input {
212
+ border: 0;
213
+ background: none;
214
+ outline: none;
215
+ flex: 1;
216
+ min-width: 0;
217
+ color: var(--text);
218
+ }
219
+ .top-actions {
220
+ margin-left: auto;
221
+ display: flex;
222
+ align-items: center;
223
+ gap: 10px;
224
+ }
225
+ .avatar {
226
+ width: 32px;
227
+ height: 32px;
228
+ border-radius: 50%;
229
+ background: var(--violet-soft);
230
+ color: var(--violet-text);
231
+ font-weight: 600;
232
+ font-size: 13px;
233
+ display: grid;
234
+ place-items: center;
235
+ flex: none;
236
+ border: 0;
237
+ padding: 0;
238
+ overflow: hidden;
239
+ }
240
+ .avatar img {
241
+ width: 100%;
242
+ height: 100%;
243
+ object-fit: cover;
244
+ }
245
+ .avatar.s {
246
+ width: 24px;
247
+ height: 24px;
248
+ font-size: 10px;
249
+ }
250
+ .avatar.agent {
251
+ background: linear-gradient(135deg, #6d4aff, #22c58b);
252
+ color: #fff;
253
+ }
254
+ .avatar.agent.business {
255
+ background: linear-gradient(135deg, #3b4a8f, #6d4aff);
256
+ }
257
+ .avatar.agent.friendly {
258
+ background: linear-gradient(135deg, #f08a3c, #22c58b);
259
+ }
260
+ .avatar.agent.mentor {
261
+ background: linear-gradient(135deg, #6d4aff, #c04ad8);
262
+ }
263
+ .main {
264
+ padding: 24px 28px 48px;
265
+ min-width: 0;
266
+ overflow-y: auto;
267
+ }
268
+ .main.narrow {
269
+ max-width: 980px;
270
+ }
271
+
272
+ /* Buttons, icon buttons, chips, status badges, sections, cards. */
273
+ .btn {
274
+ display: inline-flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+ gap: 6px;
278
+ border: 1px solid var(--border-strong);
279
+ background: var(--surface);
280
+ border-radius: var(--r-m);
281
+ padding: 8px 14px;
282
+ font-size: 14px;
283
+ font-weight: 500;
284
+ text-decoration: none;
285
+ color: var(--text);
286
+ text-align: center;
287
+ }
288
+ .btn.primary {
289
+ background: var(--violet);
290
+ border-color: var(--violet);
291
+ color: #fff;
292
+ }
293
+ .btn.ok {
294
+ background: var(--green);
295
+ border-color: var(--green);
296
+ color: #fff;
297
+ }
298
+ .btn.ghost {
299
+ border-color: transparent;
300
+ background: none;
301
+ color: var(--text-2);
302
+ }
303
+ .btn.danger {
304
+ color: var(--red);
305
+ border-color: var(--red-soft);
306
+ }
307
+ .btn.danger-fill {
308
+ background: var(--red);
309
+ border-color: var(--red);
310
+ color: #fff;
311
+ }
312
+ .btn.sm {
313
+ padding: 5px 10px;
314
+ font-size: 13px;
315
+ }
316
+ .btn[disabled] {
317
+ opacity: 0.45;
318
+ cursor: not-allowed;
319
+ }
320
+ .iconbtn {
321
+ border: 0;
322
+ background: none;
323
+ width: 36px;
324
+ height: 36px;
325
+ border-radius: var(--r-m);
326
+ display: grid;
327
+ place-items: center;
328
+ color: var(--text-2);
329
+ flex: none;
330
+ padding: 0;
331
+ }
332
+ .iconbtn:hover {
333
+ background: var(--surface-2);
334
+ }
335
+ .iconbtn.fill {
336
+ background: var(--violet);
337
+ color: #fff;
338
+ }
339
+ .iconbtn.rec {
340
+ background: var(--red);
341
+ color: #fff;
342
+ }
343
+ .iconbtn[disabled] {
344
+ opacity: 0.45;
345
+ cursor: not-allowed;
346
+ }
347
+ .chip {
348
+ display: inline-flex;
349
+ align-items: center;
350
+ gap: 6px;
351
+ font-size: 13px;
352
+ padding: 5px 11px;
353
+ border-radius: 999px;
354
+ border: 1px solid var(--border);
355
+ color: var(--text-2);
356
+ background: var(--surface);
357
+ white-space: nowrap;
358
+ }
359
+ button.chip:hover {
360
+ border-color: var(--border-strong);
361
+ }
362
+ .chip.on {
363
+ background: var(--violet-soft);
364
+ border-color: transparent;
365
+ color: var(--violet-text);
366
+ font-weight: 500;
367
+ }
368
+ .chips {
369
+ display: flex;
370
+ gap: 6px;
371
+ flex-wrap: wrap;
372
+ align-items: center;
373
+ }
374
+ .st {
375
+ display: inline-flex;
376
+ align-items: center;
377
+ gap: 5px;
378
+ font-size: 12px;
379
+ font-weight: 500;
380
+ padding: 2px 8px;
381
+ border-radius: 999px;
382
+ white-space: nowrap;
383
+ }
384
+ .st::before {
385
+ content: "";
386
+ width: 6px;
387
+ height: 6px;
388
+ border-radius: 50%;
389
+ background: currentColor;
390
+ }
391
+ .st.draft {
392
+ background: var(--surface-2);
393
+ color: var(--text-2);
394
+ }
395
+ h3.sec {
396
+ font-size: 15px;
397
+ font-weight: 600;
398
+ margin: 0 0 10px;
399
+ display: flex;
400
+ align-items: center;
401
+ gap: 8px;
402
+ }
403
+ .count {
404
+ font-size: 12px;
405
+ font-weight: 600;
406
+ background: var(--amber-soft);
407
+ color: var(--amber);
408
+ border-radius: 999px;
409
+ padding: 1px 8px;
410
+ }
411
+ .card {
412
+ border: 1px solid var(--border);
413
+ border-radius: var(--r-m);
414
+ background: var(--surface);
415
+ padding: 16px 18px;
416
+ }
417
+ .loading {
418
+ padding: 40px;
419
+ text-align: center;
420
+ color: var(--muted);
421
+ }
422
+
423
+ /* The empty state and toasts. */
424
+ .empty {
425
+ text-align: center;
426
+ padding: 36px 20px;
427
+ color: var(--text-2);
428
+ }
429
+ .empty.dashed {
430
+ border: 1px dashed var(--border-strong);
431
+ border-radius: var(--r-m);
432
+ }
433
+ .empty .ic {
434
+ width: 44px;
435
+ height: 44px;
436
+ border-radius: 50%;
437
+ background: var(--surface-2);
438
+ display: grid;
439
+ place-items: center;
440
+ margin: 0 auto 12px;
441
+ color: var(--muted);
442
+ }
443
+ .empty b {
444
+ display: block;
445
+ color: var(--text);
446
+ font-weight: 600;
447
+ margin-bottom: 4px;
448
+ }
449
+ .empty .acts {
450
+ display: flex;
451
+ gap: 8px;
452
+ justify-content: center;
453
+ margin-top: 14px;
454
+ flex-wrap: wrap;
455
+ }
456
+ .toast-wrap {
457
+ position: fixed;
458
+ right: 24px;
459
+ bottom: 24px;
460
+ z-index: 60;
461
+ display: flex;
462
+ flex-direction: column;
463
+ gap: 10px;
464
+ max-width: calc(100vw - 32px);
465
+ }
466
+ .toast {
467
+ width: 380px;
468
+ max-width: 100%;
469
+ background: var(--surface);
470
+ border: 1px solid var(--border);
471
+ border-left: 3px solid var(--violet);
472
+ border-radius: var(--r-m);
473
+ box-shadow: var(--shadow);
474
+ padding: 14px 16px;
475
+ }
476
+ .toast.error {
477
+ border-left-color: var(--red);
478
+ }
479
+ .toast.ok {
480
+ border-left-color: var(--green);
481
+ }
482
+ .toast b {
483
+ display: block;
484
+ margin-bottom: 2px;
485
+ }
486
+ .toast .acts {
487
+ display: flex;
488
+ gap: 8px;
489
+ margin-top: 12px;
490
+ }
491
+
492
+ /* The modal dialog, fields, inputs, hints, the switch. */
493
+ .overlay {
494
+ position: fixed;
495
+ inset: 0;
496
+ background: var(--overlay);
497
+ display: grid;
498
+ place-items: center;
499
+ padding: 24px;
500
+ z-index: 50;
501
+ overflow-y: auto;
502
+ }
503
+ .modal {
504
+ width: 480px;
505
+ max-width: 100%;
506
+ background: var(--surface);
507
+ border-radius: var(--r-l);
508
+ box-shadow: var(--shadow);
509
+ border: 1px solid var(--border);
510
+ }
511
+ .modal.wide {
512
+ width: 760px;
513
+ }
514
+ .modal header {
515
+ padding: 18px 22px 6px;
516
+ font-size: 18px;
517
+ font-weight: 600;
518
+ }
519
+ .modal .mb {
520
+ padding: 8px 22px 4px;
521
+ }
522
+ .modal footer {
523
+ display: flex;
524
+ justify-content: flex-end;
525
+ gap: 8px;
526
+ padding: 16px 22px 20px;
527
+ flex-wrap: wrap;
528
+ }
529
+ .field {
530
+ margin-bottom: 14px;
531
+ }
532
+ .field > label {
533
+ display: block;
534
+ font-size: 13px;
535
+ font-weight: 500;
536
+ margin-bottom: 5px;
537
+ }
538
+ .inp {
539
+ width: 100%;
540
+ border: 1px solid var(--border-strong);
541
+ border-radius: var(--r-m);
542
+ padding: 9px 12px;
543
+ background: var(--surface);
544
+ }
545
+ textarea.inp {
546
+ resize: vertical;
547
+ min-height: 80px;
548
+ }
549
+ .hint {
550
+ font-size: 12px;
551
+ color: var(--muted);
552
+ margin-top: 4px;
553
+ }
554
+ .err-text {
555
+ font-size: 13px;
556
+ color: var(--red);
557
+ margin-top: 6px;
558
+ }
559
+ .switch {
560
+ position: relative;
561
+ display: inline-flex;
562
+ align-items: center;
563
+ gap: 10px;
564
+ font-size: 14px;
565
+ background: none;
566
+ border: 0;
567
+ padding: 0;
568
+ text-align: left;
569
+ }
570
+ .sw {
571
+ width: 36px;
572
+ height: 20px;
573
+ border-radius: 999px;
574
+ background: var(--border-strong);
575
+ position: relative;
576
+ flex: none;
577
+ transition: background 0.15s;
578
+ }
579
+ .sw::after {
580
+ content: "";
581
+ position: absolute;
582
+ left: 2px;
583
+ top: 2px;
584
+ width: 16px;
585
+ height: 16px;
586
+ border-radius: 50%;
587
+ background: #fff;
588
+ transition: left 0.15s;
589
+ }
590
+ .sw.on {
591
+ background: var(--violet);
592
+ }
593
+ .sw.on::after {
594
+ left: 18px;
595
+ }
596
+
597
+ /* Messages, bubbles, the typing mark, the composer, the transcript of a recording. */
598
+ .msgs {
599
+ flex: 1;
600
+ padding: 14px;
601
+ display: flex;
602
+ flex-direction: column;
603
+ gap: 12px;
604
+ overflow-y: auto;
605
+ min-height: 0;
606
+ }
607
+ .m {
608
+ max-width: 88%;
609
+ font-size: 14px;
610
+ line-height: 1.5;
611
+ }
612
+ .m .bub {
613
+ padding: 9px 12px;
614
+ border-radius: 14px;
615
+ white-space: pre-wrap;
616
+ overflow-wrap: anywhere;
617
+ }
618
+ .m.a .bub {
619
+ background: var(--surface-2);
620
+ border-top-left-radius: 4px;
621
+ }
622
+ .m.u {
623
+ align-self: flex-end;
624
+ }
625
+ .m.u .bub {
626
+ background: var(--violet);
627
+ color: #fff;
628
+ border-top-right-radius: 4px;
629
+ }
630
+ .m.err .bub {
631
+ background: var(--red-soft);
632
+ color: var(--text);
633
+ }
634
+ .m .edit {
635
+ display: inline-flex;
636
+ align-items: center;
637
+ gap: 5px;
638
+ margin: 6px 4px 0 0;
639
+ font-size: 12px;
640
+ color: var(--violet-text);
641
+ border: 1px solid var(--violet-soft);
642
+ border-radius: 999px;
643
+ padding: 2px 9px;
644
+ }
645
+ .m .atts {
646
+ display: flex;
647
+ gap: 6px;
648
+ flex-wrap: wrap;
649
+ margin-top: 6px;
650
+ justify-content: flex-end;
651
+ }
652
+ .m .atts a {
653
+ font-size: 12px;
654
+ color: var(--text-2);
655
+ }
656
+ .typing {
657
+ display: inline-flex;
658
+ gap: 3px;
659
+ }
660
+ .typing i {
661
+ width: 6px;
662
+ height: 6px;
663
+ border-radius: 50%;
664
+ background: var(--muted);
665
+ animation: blink 1.2s infinite;
666
+ }
667
+ .typing i:nth-child(2) {
668
+ animation-delay: 0.2s;
669
+ }
670
+ .typing i:nth-child(3) {
671
+ animation-delay: 0.4s;
672
+ }
673
+ @keyframes blink {
674
+ 0%,
675
+ 80%,
676
+ 100% {
677
+ opacity: 0.2;
678
+ }
679
+ 40% {
680
+ opacity: 1;
681
+ }
682
+ }
683
+ .composer {
684
+ border-top: 1px solid var(--border);
685
+ padding: 10px;
686
+ display: flex;
687
+ align-items: flex-end;
688
+ gap: 6px;
689
+ }
690
+ .composer textarea {
691
+ flex: 1;
692
+ border: 1px solid var(--border-strong);
693
+ border-radius: var(--r-m);
694
+ padding: 8px 10px;
695
+ font-size: 14px;
696
+ min-height: 38px;
697
+ max-height: 160px;
698
+ resize: none;
699
+ background: var(--surface);
700
+ }
701
+ .composer .rec-box {
702
+ flex: 1;
703
+ color: var(--red);
704
+ font-size: 14px;
705
+ padding: 8px 10px;
706
+ }
707
+ .pending-files {
708
+ display: flex;
709
+ gap: 6px;
710
+ flex-wrap: wrap;
711
+ padding: 8px 10px 0;
712
+ }
713
+ .transcript {
714
+ border: 1px solid var(--violet);
715
+ border-radius: var(--r-m);
716
+ padding: 10px;
717
+ font-size: 14px;
718
+ background: var(--surface);
719
+ margin: 10px;
720
+ }
721
+ .transcript textarea {
722
+ width: 100%;
723
+ border: 0;
724
+ background: none;
725
+ resize: vertical;
726
+ min-height: 60px;
727
+ outline: none;
728
+ }
729
+ .transcript .row2 {
730
+ display: flex;
731
+ gap: 6px;
732
+ justify-content: flex-end;
733
+ }
734
+
735
+ /* The profile menu, the segmented switch, the layout of administration, tables, tabs, sign-in. */
736
+ .menu {
737
+ position: absolute;
738
+ right: 16px;
739
+ top: 52px;
740
+ width: 340px;
741
+ max-width: calc(100vw - 32px);
742
+ border: 1px solid var(--border);
743
+ border-radius: var(--r-l);
744
+ background: var(--surface);
745
+ box-shadow: var(--shadow);
746
+ padding: 8px;
747
+ z-index: 40;
748
+ max-height: calc(100vh - 70px);
749
+ overflow-y: auto;
750
+ }
751
+ .menu .sec {
752
+ padding: 10px;
753
+ border-top: 1px solid var(--border);
754
+ }
755
+ .menu .sec:first-child {
756
+ border-top: 0;
757
+ }
758
+ .menu .line {
759
+ display: flex;
760
+ align-items: center;
761
+ justify-content: space-between;
762
+ gap: 8px;
763
+ font-size: 14px;
764
+ }
765
+ .menu .lab {
766
+ font-size: 12px;
767
+ color: var(--muted);
768
+ margin-bottom: 8px;
769
+ }
770
+ .menu .action {
771
+ display: flex;
772
+ gap: 8px;
773
+ align-items: center;
774
+ background: none;
775
+ border: 0;
776
+ padding: 0;
777
+ width: 100%;
778
+ text-align: left;
779
+ color: var(--text);
780
+ text-decoration: none;
781
+ font-size: 14px;
782
+ }
783
+ .menu .action + .action {
784
+ margin-top: 10px;
785
+ }
786
+ .menu .action.danger {
787
+ color: var(--red);
788
+ }
789
+ .mini-seg {
790
+ display: flex;
791
+ border: 1px solid var(--border);
792
+ border-radius: var(--r-s);
793
+ overflow: hidden;
794
+ }
795
+ .mini-seg button {
796
+ font-size: 12px;
797
+ padding: 4px 10px;
798
+ color: var(--text-2);
799
+ background: none;
800
+ border: 0;
801
+ }
802
+ .mini-seg button.on {
803
+ background: var(--violet);
804
+ color: #fff;
805
+ }
806
+ .admin {
807
+ display: grid;
808
+ grid-template-columns: 220px minmax(0, 1fr);
809
+ flex: 1;
810
+ min-height: 0;
811
+ }
812
+ .side {
813
+ border-right: 1px solid var(--border);
814
+ padding: 18px 12px;
815
+ background: var(--surface-2);
816
+ }
817
+ .side a {
818
+ display: flex;
819
+ align-items: center;
820
+ gap: 8px;
821
+ padding: 8px 10px;
822
+ border-radius: var(--r-m);
823
+ color: var(--text-2);
824
+ text-decoration: none;
825
+ font-size: 14px;
826
+ }
827
+ .side a.active {
828
+ background: var(--surface);
829
+ color: var(--text);
830
+ font-weight: 500;
831
+ box-shadow: var(--shadow);
832
+ }
833
+ .side .lab {
834
+ font-size: 12px;
835
+ color: var(--muted);
836
+ padding: 0 10px 8px;
837
+ }
838
+ table.t {
839
+ width: 100%;
840
+ border-collapse: collapse;
841
+ font-size: 14px;
842
+ }
843
+ table.t th {
844
+ text-align: left;
845
+ font-weight: 500;
846
+ font-size: 12px;
847
+ color: var(--muted);
848
+ padding: 8px 10px;
849
+ border-bottom: 1px solid var(--border);
850
+ }
851
+ table.t td {
852
+ padding: 10px;
853
+ border-bottom: 1px solid var(--border);
854
+ vertical-align: top;
855
+ }
856
+ table.t td:first-child {
857
+ white-space: nowrap;
858
+ }
859
+ table.t tr.sel {
860
+ background: var(--surface-2);
861
+ }
862
+ table.t tr.clickable {
863
+ cursor: pointer;
864
+ }
865
+ .tabs {
866
+ display: flex;
867
+ gap: 4px;
868
+ border-bottom: 1px solid var(--border);
869
+ margin-bottom: 14px;
870
+ flex-wrap: wrap;
871
+ }
872
+ .tabs button {
873
+ padding: 8px 12px;
874
+ font-size: 14px;
875
+ color: var(--text-2);
876
+ border: 0;
877
+ background: none;
878
+ border-bottom: 2px solid transparent;
879
+ margin-bottom: -1px;
880
+ }
881
+ .tabs button.on {
882
+ color: var(--text);
883
+ border-color: var(--violet);
884
+ font-weight: 500;
885
+ }
886
+ .warn {
887
+ color: var(--amber);
888
+ }
889
+ .err {
890
+ color: var(--red);
891
+ }
892
+ .login {
893
+ min-height: 100%;
894
+ display: grid;
895
+ place-items: center;
896
+ background:
897
+ radial-gradient(600px 300px at 50% 35%, var(--violet-soft), transparent),
898
+ var(--bg);
899
+ padding: 24px;
900
+ }
901
+ .login img {
902
+ width: 96px;
903
+ height: 96px;
904
+ border-radius: 22px;
905
+ margin-bottom: 18px;
906
+ }
907
+ .login h1 {
908
+ font-size: 26px;
909
+ margin: 0 0 4px;
910
+ font-weight: 600;
911
+ letter-spacing: -0.01em;
912
+ }
913
+ .login .btn {
914
+ width: 100%;
915
+ padding: 11px 16px;
916
+ }
917
+
918
+ /* One column on a phone. */
919
+ @media (max-width: 900px) {
920
+ .topbar {
921
+ padding: 10px 14px;
922
+ gap: 10px;
923
+ }
924
+ .topbar .search {
925
+ display: none;
926
+ }
927
+ .topbar .hide-m {
928
+ display: none;
929
+ }
930
+ .main {
931
+ padding: 16px 14px 32px;
932
+ }
933
+ .admin {
934
+ grid-template-columns: 1fr;
935
+ }
936
+ .side {
937
+ border-right: 0;
938
+ border-bottom: 1px solid var(--border);
939
+ display: flex;
940
+ flex-wrap: wrap;
941
+ gap: 4px;
942
+ padding: 10px;
943
+ }
944
+ .side .lab {
945
+ display: none;
946
+ }
947
+ }
948
+ @media (prefers-reduced-motion: reduce) {
949
+ * {
950
+ transition: none !important;
951
+ animation: none !important;
952
+ }
953
+ }
954
+
955
+ /* Sections of the top bar and the burger, numbers, tables, Markdown, the model error. */
956
+ .main.wide {
957
+ max-width: none;
958
+ }
959
+ .ellipsis {
960
+ overflow: hidden;
961
+ text-overflow: ellipsis;
962
+ white-space: nowrap;
963
+ min-width: 0;
964
+ }
965
+ .keys {
966
+ display: inline-flex;
967
+ gap: 4px;
968
+ flex-wrap: wrap;
969
+ }
970
+ .tabs a {
971
+ padding: 8px 12px;
972
+ font-size: 14px;
973
+ color: var(--text-2);
974
+ text-decoration: none;
975
+ border-bottom: 2px solid transparent;
976
+ margin-bottom: -1px;
977
+ }
978
+ .tabs a.on,
979
+ .tabs a[aria-current="page"] {
980
+ color: var(--text);
981
+ border-color: var(--violet);
982
+ font-weight: 500;
983
+ }
984
+ .nav {
985
+ display: flex;
986
+ gap: 2px;
987
+ }
988
+ .nav a,
989
+ .navmenu a {
990
+ padding: 6px 12px;
991
+ border-radius: var(--r-s);
992
+ font-size: 14px;
993
+ color: var(--text-2);
994
+ text-decoration: none;
995
+ white-space: nowrap;
996
+ }
997
+ .nav a:hover {
998
+ background: var(--surface-2);
999
+ color: var(--text);
1000
+ }
1001
+ .nav a.on {
1002
+ background: var(--violet-soft);
1003
+ color: var(--violet-text);
1004
+ font-weight: 500;
1005
+ }
1006
+ .burger {
1007
+ display: none;
1008
+ position: relative;
1009
+ }
1010
+ .burger .iconbtn.on {
1011
+ background: var(--surface-2);
1012
+ color: var(--text);
1013
+ }
1014
+ .navmenu {
1015
+ position: absolute;
1016
+ right: 0;
1017
+ top: calc(100% + 8px);
1018
+ z-index: 40;
1019
+ min-width: 200px;
1020
+ display: flex;
1021
+ flex-direction: column;
1022
+ gap: 2px;
1023
+ padding: 6px;
1024
+ border: 1px solid var(--border);
1025
+ border-radius: var(--r-l);
1026
+ background: var(--surface);
1027
+ box-shadow: var(--shadow);
1028
+ }
1029
+ .navmenu a {
1030
+ padding: 10px 12px;
1031
+ font-size: 15px;
1032
+ color: var(--text);
1033
+ }
1034
+ .navmenu a.on {
1035
+ background: var(--violet-soft);
1036
+ color: var(--violet-text);
1037
+ font-weight: 600;
1038
+ }
1039
+ .kpi {
1040
+ display: grid;
1041
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
1042
+ gap: 10px;
1043
+ margin: 12px 0 18px;
1044
+ }
1045
+ .kpi > div {
1046
+ border: 1px solid var(--border);
1047
+ border-radius: var(--r-m);
1048
+ background: var(--surface);
1049
+ padding: 10px 14px;
1050
+ display: flex;
1051
+ flex-direction: column;
1052
+ gap: 2px;
1053
+ }
1054
+ .kpi b {
1055
+ font-size: 22px;
1056
+ font-weight: 600;
1057
+ }
1058
+ .kpi span {
1059
+ font-size: 12px;
1060
+ color: var(--muted);
1061
+ }
1062
+ @keyframes spin {
1063
+ to {
1064
+ transform: rotate(360deg);
1065
+ }
1066
+ }
1067
+ .table {
1068
+ display: flex;
1069
+ flex-direction: column;
1070
+ gap: 6px;
1071
+ }
1072
+ .svc {
1073
+ border: 1px solid var(--border);
1074
+ border-radius: var(--r-m);
1075
+ background: var(--surface);
1076
+ padding: 12px 14px;
1077
+ margin-bottom: 12px;
1078
+ }
1079
+ .svc > .h {
1080
+ display: flex;
1081
+ align-items: center;
1082
+ gap: 8px;
1083
+ margin-bottom: 8px;
1084
+ flex-wrap: wrap;
1085
+ }
1086
+ table.cov {
1087
+ width: 100%;
1088
+ border-collapse: collapse;
1089
+ font-size: 13px;
1090
+ margin: 8px 0;
1091
+ }
1092
+ table.cov th {
1093
+ text-align: left;
1094
+ font-weight: 500;
1095
+ font-size: 12px;
1096
+ color: var(--muted);
1097
+ padding: 6px 8px;
1098
+ border-bottom: 1px solid var(--border);
1099
+ }
1100
+ table.cov td {
1101
+ padding: 6px 8px;
1102
+ border-bottom: 1px solid var(--border);
1103
+ vertical-align: top;
1104
+ }
1105
+ table.cov tr.gap td {
1106
+ background: var(--red-soft);
1107
+ }
1108
+ .webhook {
1109
+ font-family: var(--mono);
1110
+ font-size: 12px;
1111
+ white-space: pre-wrap;
1112
+ word-break: break-all;
1113
+ background: var(--surface-2);
1114
+ border: 1px solid var(--border);
1115
+ border-radius: var(--r-s);
1116
+ padding: 10px 12px;
1117
+ margin-top: 8px;
1118
+ }
1119
+ .prose {
1120
+ line-height: 1.55;
1121
+ overflow-wrap: anywhere;
1122
+ }
1123
+ .prose > :first-child {
1124
+ margin-top: 0;
1125
+ }
1126
+ .prose > :last-child {
1127
+ margin-bottom: 0;
1128
+ }
1129
+ .prose h1,
1130
+ .prose h2,
1131
+ .prose h3 {
1132
+ font-size: 15px;
1133
+ margin: 14px 0 6px;
1134
+ }
1135
+ .prose pre {
1136
+ font-family: var(--mono);
1137
+ font-size: 12px;
1138
+ background: var(--surface-2);
1139
+ padding: 8px 10px;
1140
+ border-radius: var(--r-s);
1141
+ overflow-x: auto;
1142
+ }
1143
+ .prose code {
1144
+ font-family: var(--mono);
1145
+ font-size: 0.92em;
1146
+ }
1147
+ .prose ul,
1148
+ .prose ol {
1149
+ padding-left: 20px;
1150
+ }
1151
+ @media (max-width: 900px) {
1152
+ .nav {
1153
+ display: none;
1154
+ }
1155
+ .burger {
1156
+ display: block;
1157
+ }
1158
+ }
1159
+ .side a.sub {
1160
+ padding-left: 22px;
1161
+ }
1162
+ select.inp.inherit {
1163
+ border-style: dashed;
1164
+ color: var(--muted);
1165
+ }
1166
+ .llmerr {
1167
+ display: flex;
1168
+ flex-direction: column;
1169
+ gap: 4px;
1170
+ padding: 10px 14px;
1171
+ border-radius: var(--r-m);
1172
+ background: var(--red-soft);
1173
+ color: var(--text);
1174
+ font-size: 14px;
1175
+ }
1176
+ .llmerr.amber {
1177
+ background: var(--amber-soft);
1178
+ }
1179
+ .llmerr .row {
1180
+ gap: 8px;
1181
+ margin-top: 4px;
1182
+ }
1183
+ .t .num {
1184
+ text-align: right;
1185
+ font-variant-numeric: tabular-nums;
1186
+ }
1187
+ .nowrap {
1188
+ white-space: nowrap;
1189
+ }
1190
+ @media (min-width: 901px) {
1191
+ .topbar > .search { margin-left: auto; }
1192
+ .topbar > .search + .top-actions { margin-left: 0; }
1193
+ }
1194
+
1195
+ /* What came with Nabu: the chat with the list of conversations, channel marks, tool steps,
1196
+ the page, key-value rows, the hint box, the dark sign-in, the state of a turn, panels. */
1197
+ .brand img{border-radius:8px}
1198
+ .nb-app{position:relative;display:grid;grid-template-columns:260px minmax(0,1fr) auto;flex:1;min-height:0}
1199
+ .nb-side{border-right:1px solid var(--border);padding:14px 12px;background:var(--surface);overflow-y:auto}
1200
+ .nb-side .h{font-size:12px;color:var(--muted);margin:14px 6px 6px}
1201
+ .nb-side .it{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--r-m);font-size:14px;width:100%;border:0;background:none;text-align:left;color:var(--text)}
1202
+ .nb-side .it:hover{background:var(--surface-2)}
1203
+ .nb-side .it.on{background:var(--violet-soft);color:var(--violet-text);font-weight:500}
1204
+ .nb-side .it.arch{color:var(--muted)}
1205
+ .nb-side .it .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
1206
+ .nb-side .it .sub{margin-left:auto;font-size:11px;color:var(--muted);white-space:nowrap}
1207
+ .nb-scrim{display:none}
1208
+ .nb-chat{display:flex;flex-direction:column;min-width:0;min-height:0;position:relative}
1209
+ .nb-chat .hd{display:flex;align-items:center;gap:10px;padding:12px 20px;border-bottom:1px solid var(--border);background:var(--surface)}
1210
+ .nb-chat .msgs{flex:1;padding:18px 20px;display:flex;flex-direction:column;gap:12px;overflow-y:auto}
1211
+ .nb-chat .m{max-width:75%}
1212
+ .nb-chat .m.u{max-width:70%}
1213
+ .nb-chat .composer{background:var(--surface)}
1214
+ .chan{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--muted);margin-bottom:3px}
1215
+ .m.u .chan{align-self:flex-end}
1216
+ .tool{border:1px solid var(--border);border-radius:var(--r-m);padding:7px 10px;font-size:13px;background:var(--surface-2);display:flex;align-items:center;gap:8px;max-width:520px;margin-bottom:6px;cursor:pointer;text-align:left;width:100%;color:var(--text)}
1217
+ .tool .ok{color:var(--green)}
1218
+ .tool .er{color:var(--red)}
1219
+ .tool .run{color:var(--muted)}
1220
+ .tool .tx{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
1221
+ .tools-fold{font-size:12px;color:var(--muted);border:0;background:none;padding:2px 0;margin-bottom:4px}
1222
+ .ok-t{color:var(--green)}
1223
+ .err-t{color:var(--red)}
1224
+ .warn-t{color:var(--amber)}
1225
+ .page{padding:24px 28px;max-width:1180px;width:100%;margin:0 auto;overflow-y:auto}
1226
+ .page h1{font-size:22px;font-weight:600;margin:0 0 4px;letter-spacing:-.01em}
1227
+ .page .lead{color:var(--text-2);margin:0 0 18px;font-size:14px}
1228
+ .hintbox{display:flex;gap:10px;align-items:flex-start;padding:12px 14px;border-radius:var(--r-m);background:var(--violet-soft);color:var(--violet-text);font-size:14px;margin-bottom:16px}
1229
+ .kv{display:grid;grid-template-columns:160px 1fr;gap:6px 14px;font-size:14px}
1230
+ .kv dt{color:var(--muted)}
1231
+ .kv dd{margin:0}
1232
+ .form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
1233
+ @media (max-width:860px){
1234
+ .nb-app{grid-template-columns:1fr}
1235
+ .nb-side{display:none}
1236
+ .nb-side.open{display:block;position:absolute;inset:0 30% 0 0;z-index:15;box-shadow:var(--shadow)}
1237
+ .nb-scrim{display:block;position:absolute;inset:0;z-index:14;border:0;padding:0;background:rgba(0,0,0,.25)}
1238
+ .nb-chat .m,.nb-chat .m.u{max-width:92%}
1239
+ .form-grid{grid-template-columns:1fr}
1240
+ .page{padding:16px}}
1241
+ .login{min-height:100vh;min-height:100dvh;display:grid;place-items:center;background:radial-gradient(ellipse at 30% 40%,rgba(109,74,255,.25),transparent 60%),radial-gradient(ellipse at 70% 60%,rgba(18,168,118,.22),transparent 60%),#0B0A14;padding:24px}
1242
+ .login .box{text-align:center;color:#fff;max-width:360px;width:100%}
1243
+ .login img{width:120px;height:120px;border-radius:24px}
1244
+ .login h1{font-size:44px;letter-spacing:.06em;margin:14px 0 4px;font-weight:600}
1245
+ .login .tag{font-family:var(--mono);background:linear-gradient(90deg,#B36BFF,#22D3C5);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:16px}
1246
+ .login .btn{margin-top:28px;width:100%;justify-content:center;padding:11px 16px}
1247
+ .login .sub{margin-top:10px;font-size:13px;color:#9a97b5}
1248
+ .login .err-text{margin-top:12px}
1249
+ .login .chips{justify-content:center;margin-top:24px}
1250
+ .login .chip{background:transparent;color:#cfcbe6;border-color:#2F2B46}
1251
+ .login .chip.on{background:#2A2350;color:#fff}
1252
+ .avatar.agent.brief{background:linear-gradient(135deg,#1b1830,#5b5872)}
1253
+ .hintbox.warn{background:var(--amber-soft);color:var(--amber);border-color:transparent}
1254
+ .unread{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--violet);color:#fff;font-size:11px;font-weight:600}
1255
+ .confirm{border:1px solid var(--amber);border-radius:var(--r-m);background:var(--amber-soft);padding:12px 14px;margin:8px 0;font-size:14px}
1256
+ .confirm .h{display:flex;gap:8px;align-items:center;font-weight:600;color:var(--amber)}
1257
+ .confirm pre{white-space:pre-wrap;word-break:break-word;font-family:var(--mono);font-size:12px;margin:8px 0;color:var(--text-2);max-height:160px;overflow:auto}
1258
+ .confirm .acts{display:flex;gap:8px;flex-wrap:wrap}
1259
+ .sysnote{font-size:13px;color:var(--muted);text-align:center;margin:6px 0}
1260
+ .warn-t{color:var(--amber)}
1261
+ .turnstate{display:flex;align-items:center;justify-content:flex-end;gap:6px;font-size:12px;color:var(--muted);margin-top:5px}
1262
+ .turnstate.q{color:var(--amber)}
1263
+ .spin{display:inline-block;width:11px;height:11px;border-radius:50%;border:2px solid var(--border-strong);border-top-color:var(--violet);animation:nb-spin 1s linear infinite}
1264
+ @keyframes nb-spin{to{transform:rotate(360deg)}}
1265
+ @media (prefers-reduced-motion:reduce){
1266
+ .spin{animation:none}}
1267
+ .page.wide{max-width:1320px}
1268
+ .sel{border:1px solid var(--border-strong);border-radius:var(--r-m);padding:6px 8px;font-size:13px;background:var(--surface);color:var(--text);max-width:200px}
1269
+ .panel{border:1px solid var(--border);border-radius:var(--r-m);background:var(--surface);box-shadow:var(--shadow);padding:16px;font-size:14px;position:sticky;top:0;max-height:calc(100vh - 150px);overflow-y:auto}
1270
+ .panel-h{display:flex;align-items:flex-start;gap:6px}
1271
+ .panel h4{margin:0 0 4px;font-size:16px;font-weight:600}
1272
+ .panel .lab{font-size:12px;color:var(--muted);margin:14px 0 5px}
1273
+ .linkish{border:0;background:none;padding:0;color:var(--violet-text);font:inherit;font-size:13px;cursor:pointer;text-align:left}
1274
+ .nowrap{white-space:nowrap}
1275
+ .kvrow{display:grid;grid-template-columns:110px minmax(0,1fr);gap:10px;align-items:center;font-size:13px;margin-top:8px}
1276
+ .kvrow.top{align-items:start}
1277
+ .stack{display:grid;gap:8px;min-width:0}
1278
+ @media (max-width:860px){
1279
+ .panel{position:fixed;inset:0;z-index:40;max-height:none;border-radius:0;border:0}
1280
+ .kvrow{grid-template-columns:minmax(0,1fr)}}
1281
+
1282
+ /* A narrow place — a side panel: the same as on a phone, asked for by the product
1283
+ with ChatLayout narrow (FTR.NAB.CMN-0005 design §6.2). */
1284
+ .nb-app.narrow{grid-template-columns:1fr}
1285
+ .nb-app.narrow .nb-side{display:none}
1286
+ .nb-app.narrow .nb-side.open{display:block;position:absolute;inset:0 30% 0 0;z-index:15;box-shadow:var(--shadow)}
1287
+ .nb-app.narrow .nb-scrim{display:block;position:absolute;inset:0;z-index:14;border:0;padding:0;background:rgba(0,0,0,.25)}
1288
+ .nb-app.narrow .nb-chat .m,.nb-app.narrow .nb-chat .m.u{max-width:92%}