@fadenstack/ui-web 0.0.0-stage → 0.2.0-rc.2

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/styles.css ADDED
@@ -0,0 +1,1246 @@
1
+ /*
2
+ * The chat panel's look. By default it is Chrome's own (Material 3, Chrome 2023 refresh): its neutral surfaces,
3
+ * its blue, the system UI font, native scroll bars and controls -- and it follows the browser's light or dark
4
+ * setting as it changes (`data-theme="system"`). A host changes any token on `.fdn-chat`, e.g. the console's
5
+ * accent: `.fdn-chat { --fdn-accent: #4C6A92; }`.
6
+ *
7
+ * Shapes: one 12 px radius for rectangular surfaces (cards, bubbles, the composer, menus, buttons); pills for
8
+ * chips; circles for icon buttons. Nested surfaces stay concentric (inner = outer - inset).
9
+ *
10
+ * Every web skin (@fadenstack/ui-react, @fadenstack/ui-vue) draws the same markup with these classes. Directions
11
+ * are logical (start and end, not left and right), so the panel mirrors for a right-to-left language.
12
+ */
13
+
14
+ .fdn-chat {
15
+ --fdn-radius: 12px;
16
+ --fdn-font: system-ui, "Segoe UI Variable Text", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", Arial, sans-serif;
17
+ --fdn-mono: ui-monospace, "Cascadia Mono", "Cascadia Code", Consolas, "SF Mono", Menlo, monospace;
18
+
19
+ --fdn-bg: #ffffff;
20
+ --fdn-surface: #f0f4f9;
21
+ --fdn-surface-high: #e9eef6;
22
+ --fdn-surface-hover: rgba(31, 31, 31, 0.06);
23
+ --fdn-text: #1f1f1f;
24
+ --fdn-text-muted: #474747;
25
+ --fdn-text-faint: #757775;
26
+ --fdn-border: #c7c7c7;
27
+ --fdn-hairline: #e3e3e3;
28
+ --fdn-accent: #0b57d0;
29
+ --fdn-on-accent: #ffffff;
30
+ --fdn-accent-soft: #d3e3fd;
31
+ --fdn-on-accent-soft: #041e49;
32
+ --fdn-danger: #b3261e;
33
+ --fdn-danger-soft: #f9dedc;
34
+ --fdn-warning: #8c4a00;
35
+ --fdn-warning-soft: #ffeedc;
36
+ --fdn-success: #146c2e;
37
+ --fdn-code-bg: #f0f4f9;
38
+ --fdn-focus: #0b57d0;
39
+ --fdn-shadow: 0 2px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.3);
40
+
41
+ /* The agent avatar (the Fadenstack stack): navy plates, the rose thread plate. */
42
+ --fdn-agent-plate: #1c2436;
43
+ --fdn-agent-plate-side: #0a0e1a;
44
+ --fdn-agent-thread: #e2325a;
45
+ --fdn-agent-thread-side: #a8143e;
46
+ --fdn-agent-hollow: rgba(10, 14, 26, 0.38);
47
+ --fdn-agent-eye: #ffffff;
48
+ --fdn-agent-pupil: #0a0e1a;
49
+
50
+ color-scheme: light;
51
+ }
52
+
53
+ .fdn-chat[data-theme="dark"] {
54
+ --fdn-bg: #1f1f1f;
55
+ --fdn-surface: #282a2c;
56
+ --fdn-surface-high: #333537;
57
+ --fdn-surface-hover: rgba(227, 227, 227, 0.08);
58
+ --fdn-text: #e3e3e3;
59
+ --fdn-text-muted: #c4c7c5;
60
+ --fdn-text-faint: #8e918f;
61
+ --fdn-border: #5c5f5e;
62
+ --fdn-hairline: #444746;
63
+ --fdn-accent: #a8c7fa;
64
+ --fdn-on-accent: #062e6f;
65
+ --fdn-accent-soft: #0842a0;
66
+ --fdn-on-accent-soft: #d3e3fd;
67
+ --fdn-danger: #f2b8b5;
68
+ --fdn-danger-soft: #601410;
69
+ --fdn-warning: #ffb871;
70
+ --fdn-warning-soft: #4a2800;
71
+ --fdn-success: #6dd58c;
72
+ --fdn-code-bg: #282a2c;
73
+ --fdn-focus: #a8c7fa;
74
+ --fdn-shadow: 0 2px 6px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.5);
75
+ --fdn-agent-plate: #f3f4f6;
76
+ --fdn-agent-plate-side: #aeb7c6;
77
+ --fdn-agent-thread: #ff4d6d;
78
+ --fdn-agent-thread-side: #c21e48;
79
+ --fdn-agent-hollow: rgba(10, 14, 26, 0.55);
80
+
81
+ color-scheme: dark;
82
+ }
83
+
84
+ @media (prefers-color-scheme: dark) {
85
+ .fdn-chat[data-theme="system"] {
86
+ --fdn-bg: #1f1f1f;
87
+ --fdn-surface: #282a2c;
88
+ --fdn-surface-high: #333537;
89
+ --fdn-surface-hover: rgba(227, 227, 227, 0.08);
90
+ --fdn-text: #e3e3e3;
91
+ --fdn-text-muted: #c4c7c5;
92
+ --fdn-text-faint: #8e918f;
93
+ --fdn-border: #5c5f5e;
94
+ --fdn-hairline: #444746;
95
+ --fdn-accent: #a8c7fa;
96
+ --fdn-on-accent: #062e6f;
97
+ --fdn-accent-soft: #0842a0;
98
+ --fdn-on-accent-soft: #d3e3fd;
99
+ --fdn-danger: #f2b8b5;
100
+ --fdn-danger-soft: #601410;
101
+ --fdn-warning: #ffb871;
102
+ --fdn-warning-soft: #4a2800;
103
+ --fdn-success: #6dd58c;
104
+ --fdn-code-bg: #282a2c;
105
+ --fdn-focus: #a8c7fa;
106
+ --fdn-shadow: 0 2px 6px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.5);
107
+ --fdn-agent-plate: #f3f4f6;
108
+ --fdn-agent-plate-side: #aeb7c6;
109
+ --fdn-agent-thread: #ff4d6d;
110
+ --fdn-agent-thread-side: #c21e48;
111
+ --fdn-agent-hollow: rgba(10, 14, 26, 0.55);
112
+
113
+ color-scheme: dark;
114
+ }
115
+ }
116
+
117
+ /* High contrast (Windows contrast themes): the system's colours throughout. */
118
+ @media (forced-colors: active) {
119
+ .fdn-chat {
120
+ --fdn-bg: Canvas;
121
+ --fdn-surface: Canvas;
122
+ --fdn-surface-high: Canvas;
123
+ --fdn-text: CanvasText;
124
+ --fdn-text-muted: CanvasText;
125
+ --fdn-text-faint: GrayText;
126
+ --fdn-border: CanvasText;
127
+ --fdn-hairline: CanvasText;
128
+ --fdn-accent: Highlight;
129
+ --fdn-on-accent: HighlightText;
130
+ --fdn-focus: Highlight;
131
+ --fdn-agent-plate: CanvasText;
132
+ --fdn-agent-plate-side: CanvasText;
133
+ --fdn-agent-thread: Highlight;
134
+ --fdn-agent-thread-side: Highlight;
135
+ --fdn-agent-hollow: transparent;
136
+ --fdn-agent-eye: Canvas;
137
+ --fdn-agent-pupil: CanvasText;
138
+ }
139
+ }
140
+
141
+ /* -- the frame --------------------------------------------------------------------------------- */
142
+
143
+ .fdn-chat {
144
+ display: flex;
145
+ flex-direction: column;
146
+ height: 100%;
147
+ min-height: 0;
148
+ background: var(--fdn-bg);
149
+ color: var(--fdn-text);
150
+ font: 13px/1.5 var(--fdn-font);
151
+ -webkit-font-smoothing: antialiased;
152
+ }
153
+
154
+ .fdn-chat *,
155
+ .fdn-chat *::before,
156
+ .fdn-chat *::after {
157
+ box-sizing: border-box;
158
+ }
159
+
160
+ .fdn-chat button {
161
+ font: inherit;
162
+ color: inherit;
163
+ }
164
+
165
+ .fdn-chat :focus-visible {
166
+ outline: 2px solid var(--fdn-focus);
167
+ outline-offset: 2px;
168
+ }
169
+
170
+ .fdn-icon {
171
+ flex: none;
172
+ display: block;
173
+ }
174
+
175
+ .fdn-muted {
176
+ color: var(--fdn-text-faint);
177
+ }
178
+
179
+ /* -- the header -------------------------------------------------------------------------------- */
180
+
181
+ .fdn-header {
182
+ display: flex;
183
+ align-items: center;
184
+ gap: 2px;
185
+ min-height: 44px;
186
+ padding-block: 4px;
187
+ padding-inline: 14px 6px;
188
+ border-bottom: 1px solid var(--fdn-hairline);
189
+ }
190
+
191
+ .fdn-header-title {
192
+ flex: 1;
193
+ min-width: 0;
194
+ overflow: hidden;
195
+ text-overflow: ellipsis;
196
+ white-space: nowrap;
197
+ font-size: 14px;
198
+ font-weight: 500;
199
+ }
200
+
201
+ .fdn-icon-button {
202
+ display: inline-grid;
203
+ place-items: center;
204
+ width: 32px;
205
+ height: 32px;
206
+ padding: 0;
207
+ border: 0;
208
+ border-radius: 50%;
209
+ background: transparent;
210
+ color: var(--fdn-text-muted);
211
+ cursor: pointer;
212
+ }
213
+
214
+ .fdn-icon-button.fdn-small {
215
+ width: 26px;
216
+ height: 26px;
217
+ }
218
+
219
+ .fdn-icon-button:hover:not(:disabled) {
220
+ background: var(--fdn-surface-hover);
221
+ color: var(--fdn-text);
222
+ }
223
+
224
+ .fdn-icon-button:disabled {
225
+ opacity: 0.38;
226
+ cursor: default;
227
+ }
228
+
229
+ .fdn-mode-button {
230
+ display: inline-flex;
231
+ align-items: center;
232
+ gap: 4px;
233
+ height: 28px;
234
+ padding-block: 0;
235
+ padding-inline: 10px 8px;
236
+ border: 1px solid var(--fdn-border);
237
+ border-radius: var(--fdn-radius);
238
+ background: transparent;
239
+ color: var(--fdn-text-muted);
240
+ font-size: 12px;
241
+ cursor: pointer;
242
+ }
243
+
244
+ .fdn-mode-button:hover:not(:disabled) {
245
+ background: var(--fdn-surface-hover);
246
+ color: var(--fdn-text);
247
+ }
248
+
249
+ .fdn-menu-anchor {
250
+ position: relative;
251
+ }
252
+
253
+ .fdn-menu {
254
+ position: absolute;
255
+ z-index: 10;
256
+ top: calc(100% + 4px);
257
+ inset-inline-end: 0;
258
+ min-width: 260px;
259
+ max-width: min(340px, calc(100vw - 16px));
260
+ padding: 6px;
261
+ border-radius: var(--fdn-radius);
262
+ background: var(--fdn-surface);
263
+ box-shadow: var(--fdn-shadow);
264
+ }
265
+
266
+ .fdn-menu-item {
267
+ display: flex;
268
+ gap: 8px;
269
+ width: 100%;
270
+ padding-block: 8px;
271
+ padding-inline: 6px 10px;
272
+ border: 0;
273
+ border-radius: 6px; /* concentric: 12 - 6 */
274
+ background: transparent;
275
+ text-align: start;
276
+ cursor: pointer;
277
+ }
278
+
279
+ .fdn-menu-item:hover:not(:disabled) {
280
+ background: var(--fdn-surface-hover);
281
+ }
282
+
283
+ .fdn-menu-item:disabled {
284
+ opacity: 0.45;
285
+ cursor: default;
286
+ }
287
+
288
+ .fdn-menu-check {
289
+ width: 16px;
290
+ padding-top: 2px;
291
+ color: var(--fdn-accent);
292
+ }
293
+
294
+ .fdn-menu-label {
295
+ display: block;
296
+ font-weight: 500;
297
+ }
298
+
299
+ .fdn-menu-description,
300
+ .fdn-menu-note {
301
+ display: block;
302
+ color: var(--fdn-text-faint);
303
+ font-size: 12px;
304
+ }
305
+
306
+ .fdn-menu-note {
307
+ padding: 6px 10px;
308
+ }
309
+
310
+ /* The settings: a heading over each group (the languages), the host's own items below a line. */
311
+ .fdn-menu-heading {
312
+ display: block;
313
+ padding-block: 6px 2px;
314
+ padding-inline: 10px;
315
+ color: var(--fdn-text-faint);
316
+ font-size: 12px;
317
+ font-weight: 500;
318
+ }
319
+
320
+ .fdn-menu-extra {
321
+ margin-block-start: 4px;
322
+ padding-block-start: 4px;
323
+ border-block-start: 1px solid var(--fdn-hairline);
324
+ }
325
+
326
+ .fdn-settings {
327
+ max-height: min(480px, 75vh);
328
+ overflow-y: auto;
329
+ }
330
+
331
+ .fdn-history {
332
+ max-height: min(420px, 70vh);
333
+ overflow-y: auto;
334
+ }
335
+
336
+ .fdn-history-item {
337
+ display: flex;
338
+ align-items: center;
339
+ border-radius: 6px;
340
+ }
341
+
342
+ .fdn-history-item:hover,
343
+ .fdn-history-item.fdn-current {
344
+ background: var(--fdn-surface-hover);
345
+ }
346
+
347
+ .fdn-history-open {
348
+ flex: 1;
349
+ min-width: 0;
350
+ display: flex;
351
+ gap: 8px;
352
+ padding-block: 7px;
353
+ padding-inline: 10px 4px;
354
+ border: 0;
355
+ background: transparent;
356
+ text-align: start;
357
+ cursor: pointer;
358
+ }
359
+
360
+ .fdn-history-title {
361
+ flex: 1;
362
+ min-width: 0;
363
+ overflow: hidden;
364
+ text-overflow: ellipsis;
365
+ white-space: nowrap;
366
+ }
367
+
368
+ .fdn-history-when {
369
+ color: var(--fdn-text-faint);
370
+ font-size: 12px;
371
+ white-space: nowrap;
372
+ }
373
+
374
+ /* -- the conversation -------------------------------------------------------------------------- */
375
+
376
+ .fdn-body {
377
+ flex: 1;
378
+ min-height: 0;
379
+ overflow-y: auto;
380
+ scrollbar-width: thin;
381
+ scrollbar-gutter: stable;
382
+ }
383
+
384
+ .fdn-body-center {
385
+ display: grid;
386
+ place-items: center;
387
+ padding: 16px;
388
+ }
389
+
390
+ .fdn-turns {
391
+ display: flex;
392
+ flex-direction: column;
393
+ gap: 18px;
394
+ padding: 14px 14px 18px;
395
+ }
396
+
397
+ .fdn-turn {
398
+ display: flex;
399
+ flex-direction: column;
400
+ gap: 10px;
401
+ /* Long sessions: turns out of view are not laid out or painted. */
402
+ content-visibility: auto;
403
+ contain-intrinsic-size: auto 160px;
404
+ }
405
+
406
+ .fdn-earlier {
407
+ align-self: center;
408
+ padding: 4px 12px;
409
+ border: 0;
410
+ border-radius: var(--fdn-radius);
411
+ background: transparent;
412
+ color: var(--fdn-accent);
413
+ cursor: pointer;
414
+ }
415
+
416
+ .fdn-earlier:hover {
417
+ background: var(--fdn-surface-hover);
418
+ }
419
+
420
+ .fdn-user {
421
+ display: flex;
422
+ flex-direction: column;
423
+ align-items: flex-end;
424
+ gap: 4px;
425
+ }
426
+
427
+ .fdn-user-bubble {
428
+ max-width: 88%;
429
+ padding: 8px 12px;
430
+ border-radius: var(--fdn-radius);
431
+ background: var(--fdn-surface-high);
432
+ white-space: pre-wrap;
433
+ overflow-wrap: anywhere;
434
+ }
435
+
436
+ .fdn-user-blocked .fdn-user-bubble {
437
+ background: transparent;
438
+ border: 1px dashed var(--fdn-border);
439
+ color: var(--fdn-text-muted);
440
+ }
441
+
442
+ .fdn-user-note {
443
+ display: flex;
444
+ gap: 8px;
445
+ color: var(--fdn-text-faint);
446
+ font-size: 12px;
447
+ }
448
+
449
+ .fdn-link {
450
+ padding: 0;
451
+ border: 0;
452
+ background: none;
453
+ color: var(--fdn-accent);
454
+ cursor: pointer;
455
+ }
456
+
457
+ .fdn-answer {
458
+ display: flex;
459
+ flex-direction: column;
460
+ gap: 8px;
461
+ min-width: 0;
462
+ }
463
+
464
+ .fdn-status {
465
+ display: flex;
466
+ align-items: center;
467
+ gap: 8px;
468
+ color: var(--fdn-text-muted);
469
+ }
470
+
471
+ .fdn-error-text {
472
+ color: var(--fdn-danger);
473
+ }
474
+
475
+ .fdn-turn-actions {
476
+ display: flex;
477
+ align-items: center;
478
+ gap: 2px;
479
+ margin-inline-start: -4px;
480
+ font-size: 12px;
481
+ opacity: 0.85;
482
+ }
483
+
484
+ .fdn-turn-actions .fdn-muted {
485
+ margin-inline-start: 6px;
486
+ }
487
+
488
+ .fdn-spinner {
489
+ display: inline-block;
490
+ flex: none;
491
+ border: 2px solid var(--fdn-hairline);
492
+ border-top-color: var(--fdn-accent);
493
+ border-radius: 50%;
494
+ animation: fdn-spin 0.8s linear infinite;
495
+ }
496
+
497
+ @keyframes fdn-spin {
498
+ to {
499
+ transform: rotate(360deg);
500
+ }
501
+ }
502
+
503
+ @media (prefers-reduced-motion: reduce) {
504
+ .fdn-spinner {
505
+ animation-duration: 2.4s;
506
+ }
507
+ }
508
+
509
+ /* -- markdown ---------------------------------------------------------------------------------- */
510
+
511
+ .fdn-md {
512
+ overflow-wrap: anywhere;
513
+ }
514
+
515
+ .fdn-md > :first-child {
516
+ margin-top: 0;
517
+ }
518
+
519
+ .fdn-md > :last-child {
520
+ margin-bottom: 0;
521
+ }
522
+
523
+ .fdn-md p,
524
+ .fdn-md ul,
525
+ .fdn-md ol,
526
+ .fdn-md blockquote,
527
+ .fdn-md .fdn-md-table,
528
+ .fdn-md .fdn-md-code {
529
+ margin: 0 0 8px;
530
+ }
531
+
532
+ .fdn-md h3,
533
+ .fdn-md h4,
534
+ .fdn-md h5,
535
+ .fdn-md h6 {
536
+ margin: 12px 0 4px;
537
+ line-height: 1.3;
538
+ }
539
+
540
+ .fdn-md .fdn-md-h1 {
541
+ font-size: 16px;
542
+ }
543
+
544
+ .fdn-md .fdn-md-h2 {
545
+ font-size: 15px;
546
+ }
547
+
548
+ .fdn-md .fdn-md-h3,
549
+ .fdn-md .fdn-md-h4,
550
+ .fdn-md .fdn-md-h5,
551
+ .fdn-md .fdn-md-h6 {
552
+ font-size: 13px;
553
+ }
554
+
555
+ .fdn-md ul,
556
+ .fdn-md ol {
557
+ padding-inline-start: 20px;
558
+ }
559
+
560
+ .fdn-md li + li {
561
+ margin-top: 2px;
562
+ }
563
+
564
+ .fdn-md .fdn-md-task {
565
+ list-style: none;
566
+ margin-inline-start: -18px;
567
+ }
568
+
569
+ .fdn-md .fdn-md-task input {
570
+ margin-block: 0;
571
+ margin-inline: 0 6px;
572
+ vertical-align: -1px;
573
+ }
574
+
575
+ .fdn-md li > .fdn-md-li {
576
+ display: block;
577
+ }
578
+
579
+ /* A task's text stays beside its box. */
580
+ .fdn-md .fdn-md-task > input + .fdn-md-li {
581
+ display: inline;
582
+ }
583
+
584
+ .fdn-md blockquote {
585
+ padding-block: 0;
586
+ padding-inline: 10px 0;
587
+ border-inline-start: 3px solid var(--fdn-border);
588
+ color: var(--fdn-text-muted);
589
+ }
590
+
591
+ .fdn-md a {
592
+ color: var(--fdn-accent);
593
+ text-decoration: underline;
594
+ text-underline-offset: 2px;
595
+ }
596
+
597
+ .fdn-md :not(pre) > code {
598
+ padding: 1px 4px;
599
+ border-radius: 4px;
600
+ background: var(--fdn-code-bg);
601
+ font: 12px var(--fdn-mono);
602
+ }
603
+
604
+ .fdn-md-image {
605
+ color: var(--fdn-text-muted);
606
+ }
607
+
608
+ .fdn-md hr {
609
+ margin: 12px 0;
610
+ border: 0;
611
+ border-top: 1px solid var(--fdn-hairline);
612
+ }
613
+
614
+ .fdn-md-code {
615
+ border-radius: var(--fdn-radius);
616
+ background: var(--fdn-code-bg);
617
+ overflow: hidden;
618
+ }
619
+
620
+ .fdn-md-code-bar {
621
+ display: flex;
622
+ align-items: center;
623
+ justify-content: space-between;
624
+ min-height: 30px;
625
+ padding-block: 2px 0;
626
+ padding-inline: 12px 4px;
627
+ color: var(--fdn-text-faint);
628
+ font-size: 12px;
629
+ }
630
+
631
+ .fdn-md-code pre {
632
+ margin: 0;
633
+ padding: 0 12px 10px;
634
+ overflow-x: auto;
635
+ scrollbar-width: thin;
636
+ font: 12px/1.55 var(--fdn-mono);
637
+ }
638
+
639
+ .fdn-md-table-scroll {
640
+ overflow-x: auto;
641
+ scrollbar-width: thin;
642
+ }
643
+
644
+ .fdn-md-table-bar {
645
+ display: flex;
646
+ justify-content: flex-end;
647
+ margin-top: 2px;
648
+ }
649
+
650
+ .fdn-chat table {
651
+ border-collapse: collapse;
652
+ font-size: 12.5px;
653
+ }
654
+
655
+ .fdn-chat th,
656
+ .fdn-chat td {
657
+ padding: 4px 10px;
658
+ border: 1px solid var(--fdn-hairline);
659
+ text-align: start;
660
+ vertical-align: top;
661
+ /* Not "anywhere" (as the answer around it): a column keeps its longest word; a wider table scrolls sideways. */
662
+ overflow-wrap: break-word;
663
+ }
664
+
665
+ .fdn-chat th {
666
+ background: var(--fdn-surface);
667
+ font-weight: 600;
668
+ }
669
+
670
+ /* Text still arriving: a caret after the last block. */
671
+ .fdn-md-streaming > :last-child::after {
672
+ content: "";
673
+ display: inline-block;
674
+ width: 7px;
675
+ height: 13px;
676
+ margin-inline-start: 2px;
677
+ vertical-align: -2px;
678
+ border-radius: 2px;
679
+ background: var(--fdn-text-faint);
680
+ animation: fdn-blink 1s steps(2) infinite;
681
+ }
682
+
683
+ .fdn-md-streaming > .fdn-md-code:last-child::after,
684
+ .fdn-md-streaming > .fdn-md-table:last-child::after,
685
+ .fdn-md-streaming > ul:last-child::after,
686
+ .fdn-md-streaming > ol:last-child::after {
687
+ display: none;
688
+ }
689
+
690
+ @keyframes fdn-blink {
691
+ to {
692
+ visibility: hidden;
693
+ }
694
+ }
695
+
696
+ /* -- tool calls, approvals, notices ------------------------------------------------------------ */
697
+
698
+ .fdn-tool {
699
+ border-radius: var(--fdn-radius);
700
+ }
701
+
702
+ .fdn-tool-line {
703
+ display: flex;
704
+ align-items: center;
705
+ gap: 8px;
706
+ width: 100%;
707
+ min-height: 30px;
708
+ padding: 4px 8px;
709
+ border: 1px solid var(--fdn-hairline);
710
+ border-radius: var(--fdn-radius);
711
+ background: transparent;
712
+ color: var(--fdn-text-muted);
713
+ text-align: start;
714
+ cursor: pointer;
715
+ }
716
+
717
+ .fdn-tool-line:hover:not(:disabled) {
718
+ background: var(--fdn-surface-hover);
719
+ }
720
+
721
+ .fdn-tool-line:disabled {
722
+ cursor: default;
723
+ }
724
+
725
+ .fdn-tool-status {
726
+ display: grid;
727
+ place-items: center;
728
+ width: 16px;
729
+ color: var(--fdn-success);
730
+ }
731
+
732
+ .fdn-tool-failed .fdn-tool-status {
733
+ color: var(--fdn-danger);
734
+ }
735
+
736
+ .fdn-tool-denied .fdn-tool-status {
737
+ color: var(--fdn-text-faint);
738
+ }
739
+
740
+ .fdn-tool-title {
741
+ flex: 1;
742
+ min-width: 0;
743
+ overflow: hidden;
744
+ text-overflow: ellipsis;
745
+ white-space: nowrap;
746
+ font-family: var(--fdn-mono);
747
+ font-size: 12px;
748
+ }
749
+
750
+ .fdn-tool-duration {
751
+ color: var(--fdn-text-faint);
752
+ font-size: 11.5px;
753
+ white-space: nowrap;
754
+ }
755
+
756
+ .fdn-chevron {
757
+ display: grid;
758
+ transition: transform 0.15s;
759
+ }
760
+
761
+ .fdn-chevron.fdn-open {
762
+ transform: rotate(180deg);
763
+ }
764
+
765
+ .fdn-tool-details {
766
+ margin-block: 4px 0;
767
+ margin-inline: 24px 0;
768
+ padding: 8px 10px;
769
+ border-radius: var(--fdn-radius);
770
+ background: var(--fdn-code-bg);
771
+ }
772
+
773
+ .fdn-tool-details pre,
774
+ .fdn-approval-args {
775
+ max-height: 260px;
776
+ margin: 2px 0 8px;
777
+ overflow: auto;
778
+ scrollbar-width: thin;
779
+ white-space: pre-wrap;
780
+ overflow-wrap: anywhere;
781
+ font: 12px/1.5 var(--fdn-mono);
782
+ }
783
+
784
+ .fdn-tool-details pre:last-child {
785
+ margin-bottom: 0;
786
+ }
787
+
788
+ .fdn-label {
789
+ color: var(--fdn-text-faint);
790
+ font-size: 11.5px;
791
+ font-weight: 500;
792
+ }
793
+
794
+ .fdn-badge {
795
+ flex: none;
796
+ padding: 1px 7px;
797
+ border-radius: 999px;
798
+ background: var(--fdn-surface-high);
799
+ color: var(--fdn-text-muted);
800
+ font-size: 11px;
801
+ line-height: 16px;
802
+ white-space: nowrap;
803
+ }
804
+
805
+ .fdn-badge.fdn-class-write {
806
+ background: var(--fdn-accent-soft);
807
+ color: var(--fdn-on-accent-soft);
808
+ }
809
+
810
+ .fdn-badge.fdn-class-destructive,
811
+ .fdn-badge.fdn-class-unknown {
812
+ background: var(--fdn-danger-soft);
813
+ color: var(--fdn-danger);
814
+ }
815
+
816
+ .fdn-approval {
817
+ padding: 10px 12px 12px;
818
+ border: 1px solid var(--fdn-border);
819
+ border-radius: var(--fdn-radius);
820
+ background: var(--fdn-surface);
821
+ }
822
+
823
+ .fdn-approval-danger {
824
+ border-color: var(--fdn-danger);
825
+ }
826
+
827
+ .fdn-approval-head {
828
+ display: flex;
829
+ align-items: center;
830
+ gap: 8px;
831
+ }
832
+
833
+ .fdn-approval-head strong {
834
+ flex: 1;
835
+ min-width: 0;
836
+ overflow-wrap: anywhere;
837
+ }
838
+
839
+ .fdn-approval-danger .fdn-approval-head .fdn-icon {
840
+ color: var(--fdn-danger);
841
+ }
842
+
843
+ .fdn-approval-reason {
844
+ margin: 6px 0 0;
845
+ color: var(--fdn-text-muted);
846
+ }
847
+
848
+ .fdn-approval-args {
849
+ margin-top: 8px;
850
+ padding: 8px 10px;
851
+ border-radius: 6px; /* concentric: 12 - 6 */
852
+ background: var(--fdn-bg);
853
+ }
854
+
855
+ .fdn-approval-actions {
856
+ display: flex;
857
+ flex-wrap: wrap;
858
+ gap: 6px;
859
+ margin-top: 10px;
860
+ }
861
+
862
+ .fdn-approval-state {
863
+ margin-top: 8px;
864
+ color: var(--fdn-text-faint);
865
+ font-size: 12px;
866
+ }
867
+
868
+ .fdn-approval-approved,
869
+ .fdn-approval-approved_for_session {
870
+ color: var(--fdn-success);
871
+ }
872
+
873
+ .fdn-button {
874
+ height: 32px;
875
+ padding: 0 14px;
876
+ border: 1px solid var(--fdn-border);
877
+ border-radius: var(--fdn-radius);
878
+ background: transparent;
879
+ color: var(--fdn-accent);
880
+ font-weight: 500;
881
+ cursor: pointer;
882
+ }
883
+
884
+ .fdn-button:hover:not(:disabled) {
885
+ background: var(--fdn-surface-hover);
886
+ }
887
+
888
+ .fdn-button.fdn-primary {
889
+ border-color: var(--fdn-accent);
890
+ background: var(--fdn-accent);
891
+ color: var(--fdn-on-accent);
892
+ }
893
+
894
+ .fdn-button.fdn-primary:hover:not(:disabled) {
895
+ background: var(--fdn-accent);
896
+ filter: brightness(1.08);
897
+ }
898
+
899
+ .fdn-button.fdn-quiet {
900
+ border-color: transparent;
901
+ color: var(--fdn-text-muted);
902
+ }
903
+
904
+ .fdn-button:disabled {
905
+ opacity: 0.45;
906
+ cursor: default;
907
+ }
908
+
909
+ .fdn-notice {
910
+ display: flex;
911
+ gap: 8px;
912
+ padding: 9px 12px;
913
+ border-radius: var(--fdn-radius);
914
+ background: var(--fdn-surface);
915
+ }
916
+
917
+ .fdn-notice .fdn-icon {
918
+ margin-top: 2px;
919
+ color: var(--fdn-text-muted);
920
+ }
921
+
922
+ .fdn-notice-warning {
923
+ background: var(--fdn-warning-soft);
924
+ }
925
+
926
+ .fdn-notice-warning .fdn-icon {
927
+ color: var(--fdn-warning);
928
+ }
929
+
930
+ .fdn-notice-blocked,
931
+ .fdn-notice-error {
932
+ background: var(--fdn-danger-soft);
933
+ }
934
+
935
+ .fdn-notice-blocked .fdn-icon,
936
+ .fdn-notice-error .fdn-icon {
937
+ color: var(--fdn-danger);
938
+ }
939
+
940
+ .fdn-notice-detail {
941
+ color: var(--fdn-text-faint);
942
+ font-size: 11.5px;
943
+ }
944
+
945
+ .fdn-collapsible-head {
946
+ display: inline-flex;
947
+ align-items: center;
948
+ gap: 6px;
949
+ padding-block: 3px;
950
+ padding-inline: 6px 8px;
951
+ border: 0;
952
+ border-radius: var(--fdn-radius);
953
+ background: transparent;
954
+ color: var(--fdn-text-muted);
955
+ cursor: pointer;
956
+ }
957
+
958
+ .fdn-collapsible-head:hover {
959
+ background: var(--fdn-surface-hover);
960
+ }
961
+
962
+ .fdn-reasoning {
963
+ margin-block: 4px 0;
964
+ margin-inline: 8px 0;
965
+ padding-inline-start: 12px;
966
+ border-inline-start: 2px solid var(--fdn-hairline);
967
+ color: var(--fdn-text-muted);
968
+ white-space: pre-wrap;
969
+ }
970
+
971
+ .fdn-citations {
972
+ margin: 4px 0 0;
973
+ padding-inline-start: 28px;
974
+ color: var(--fdn-text-muted);
975
+ }
976
+
977
+ .fdn-card {
978
+ padding: 10px 12px;
979
+ border: 1px solid var(--fdn-hairline);
980
+ border-radius: var(--fdn-radius);
981
+ }
982
+
983
+ .fdn-card dl {
984
+ display: grid;
985
+ gap: 2px;
986
+ margin: 6px 0 0;
987
+ }
988
+
989
+ .fdn-card dl > div {
990
+ display: flex;
991
+ gap: 8px;
992
+ }
993
+
994
+ .fdn-card dt {
995
+ min-width: 90px;
996
+ color: var(--fdn-text-faint);
997
+ }
998
+
999
+ .fdn-card dd {
1000
+ margin: 0;
1001
+ }
1002
+
1003
+ .fdn-progress {
1004
+ display: flex;
1005
+ align-items: center;
1006
+ gap: 8px;
1007
+ }
1008
+
1009
+ .fdn-progress progress {
1010
+ flex: 1;
1011
+ accent-color: var(--fdn-accent);
1012
+ }
1013
+
1014
+ .fdn-diff pre {
1015
+ margin: 4px 0 0;
1016
+ padding: 8px 10px;
1017
+ border-radius: var(--fdn-radius);
1018
+ background: var(--fdn-code-bg);
1019
+ overflow-x: auto;
1020
+ font: 12px/1.5 var(--fdn-mono);
1021
+ }
1022
+
1023
+ .fdn-diff-added {
1024
+ color: var(--fdn-success);
1025
+ }
1026
+
1027
+ .fdn-diff-removed {
1028
+ color: var(--fdn-danger);
1029
+ }
1030
+
1031
+ /* -- the empty chat ------------------------------------------------------------------------------ */
1032
+
1033
+ .fdn-empty {
1034
+ display: flex;
1035
+ flex-direction: column;
1036
+ align-items: center;
1037
+ gap: 12px;
1038
+ padding: 36px 8px 12px;
1039
+ text-align: center;
1040
+ }
1041
+
1042
+ /* The agent's face, on its own: the stack has its own silhouette, so no circle behind it. */
1043
+ .fdn-empty-mark {
1044
+ display: grid;
1045
+ place-items: center;
1046
+ }
1047
+
1048
+ .fdn-agent-avatar {
1049
+ display: block;
1050
+ flex: none;
1051
+ overflow: visible;
1052
+ }
1053
+
1054
+ .fdn-greeting {
1055
+ max-width: 320px;
1056
+ margin: 0;
1057
+ color: var(--fdn-text-muted);
1058
+ font-size: 14px;
1059
+ }
1060
+
1061
+ .fdn-suggestions {
1062
+ display: flex;
1063
+ flex-direction: column;
1064
+ gap: 6px;
1065
+ width: 100%;
1066
+ max-width: 340px;
1067
+ }
1068
+
1069
+ .fdn-suggestion {
1070
+ padding: 8px 12px;
1071
+ border: 1px solid var(--fdn-hairline);
1072
+ border-radius: var(--fdn-radius);
1073
+ background: transparent;
1074
+ text-align: start;
1075
+ cursor: pointer;
1076
+ }
1077
+
1078
+ .fdn-suggestion:hover:not(:disabled) {
1079
+ background: var(--fdn-surface-hover);
1080
+ }
1081
+
1082
+ /* -- the composer ---------------------------------------------------------------------------------- */
1083
+
1084
+ .fdn-banner {
1085
+ margin: 0 12px 8px;
1086
+ padding: 8px 12px;
1087
+ border-radius: var(--fdn-radius);
1088
+ background: var(--fdn-danger-soft);
1089
+ color: var(--fdn-danger);
1090
+ }
1091
+
1092
+ .fdn-composer {
1093
+ margin: 0 10px 10px;
1094
+ padding-block: 8px 6px; /* the send button sits 6 in from the 12 corner */
1095
+ padding-inline: 12px 6px;
1096
+ border: 1px solid var(--fdn-border);
1097
+ border-radius: var(--fdn-radius);
1098
+ background: var(--fdn-bg);
1099
+ }
1100
+
1101
+ .fdn-composer:focus-within {
1102
+ border-color: var(--fdn-accent);
1103
+ box-shadow: 0 0 0 1px var(--fdn-accent);
1104
+ }
1105
+
1106
+ .fdn-composer textarea {
1107
+ display: block;
1108
+ width: 100%;
1109
+ min-height: 22px;
1110
+ padding-block: 0;
1111
+ padding-inline: 0 6px;
1112
+ border: 0;
1113
+ outline: 0;
1114
+ resize: none;
1115
+ background: transparent;
1116
+ color: var(--fdn-text);
1117
+ font: inherit;
1118
+ line-height: 1.5;
1119
+ scrollbar-width: thin;
1120
+ }
1121
+
1122
+ /* The composer draws the focus ring; the text box inside it does not draw a second one. */
1123
+ .fdn-composer textarea:focus-visible {
1124
+ outline: none;
1125
+ }
1126
+
1127
+ .fdn-composer textarea::placeholder {
1128
+ color: var(--fdn-text-faint);
1129
+ }
1130
+
1131
+ .fdn-composer-bar {
1132
+ display: flex;
1133
+ align-items: center;
1134
+ gap: 6px;
1135
+ margin-top: 6px;
1136
+ }
1137
+
1138
+ .fdn-composer-accessory {
1139
+ flex: 1;
1140
+ min-width: 0;
1141
+ display: flex;
1142
+ align-items: center;
1143
+ gap: 4px;
1144
+ }
1145
+
1146
+ .fdn-send {
1147
+ display: grid;
1148
+ place-items: center;
1149
+ width: 30px;
1150
+ height: 30px;
1151
+ padding: 0;
1152
+ border: 0;
1153
+ border-radius: 50%;
1154
+ background: var(--fdn-accent);
1155
+ color: var(--fdn-on-accent);
1156
+ cursor: pointer;
1157
+ }
1158
+
1159
+ /* The arrow points the way the text runs. */
1160
+ .fdn-send .fdn-icon:dir(rtl) {
1161
+ transform: scaleX(-1);
1162
+ }
1163
+
1164
+ .fdn-send:disabled {
1165
+ background: var(--fdn-surface-high);
1166
+ color: var(--fdn-text-faint);
1167
+ cursor: default;
1168
+ }
1169
+
1170
+ .fdn-chips {
1171
+ display: flex;
1172
+ flex-wrap: wrap;
1173
+ gap: 4px;
1174
+ margin-bottom: 6px;
1175
+ }
1176
+
1177
+ .fdn-user-bubble .fdn-chips {
1178
+ margin: 6px 0 0;
1179
+ }
1180
+
1181
+ .fdn-chip {
1182
+ display: inline-flex;
1183
+ align-items: center;
1184
+ gap: 4px;
1185
+ max-width: 100%;
1186
+ height: 24px;
1187
+ padding-block: 0;
1188
+ padding-inline: 8px 4px;
1189
+ border: 1px solid var(--fdn-hairline);
1190
+ border-radius: 999px;
1191
+ background: var(--fdn-surface);
1192
+ color: var(--fdn-text-muted);
1193
+ font-size: 12px;
1194
+ }
1195
+
1196
+ .fdn-chip-static {
1197
+ padding-inline-end: 8px;
1198
+ background: var(--fdn-bg);
1199
+ }
1200
+
1201
+ .fdn-chip-off {
1202
+ opacity: 0.55;
1203
+ border-style: dashed;
1204
+ }
1205
+
1206
+ .fdn-chip-off .fdn-chip-title {
1207
+ text-decoration: line-through;
1208
+ }
1209
+
1210
+ .fdn-chip-toggle {
1211
+ display: inline-flex;
1212
+ align-items: center;
1213
+ gap: 4px;
1214
+ min-width: 0;
1215
+ padding-block: 0;
1216
+ padding-inline: 0 4px;
1217
+ border: 0;
1218
+ background: transparent;
1219
+ cursor: pointer;
1220
+ }
1221
+
1222
+ .fdn-chip-title {
1223
+ overflow: hidden;
1224
+ text-overflow: ellipsis;
1225
+ white-space: nowrap;
1226
+ }
1227
+
1228
+ .fdn-chip-sub {
1229
+ color: var(--fdn-text-faint);
1230
+ }
1231
+
1232
+ .fdn-chip-remove {
1233
+ display: grid;
1234
+ place-items: center;
1235
+ width: 18px;
1236
+ height: 18px;
1237
+ padding: 0;
1238
+ border: 0;
1239
+ border-radius: 50%;
1240
+ background: transparent;
1241
+ cursor: pointer;
1242
+ }
1243
+
1244
+ .fdn-chip-remove:hover {
1245
+ background: var(--fdn-surface-hover);
1246
+ }