@eeacms/volto-eea-chatbot 1.0.9

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.
Files changed (133) hide show
  1. package/.coverage.babel.config.js +9 -0
  2. package/.eslintrc.js +68 -0
  3. package/.husky/pre-commit +2 -0
  4. package/.release-it.json +17 -0
  5. package/AGENTS.md +89 -0
  6. package/CHANGELOG.md +770 -0
  7. package/DEVELOP.md +124 -0
  8. package/LICENSE.md +9 -0
  9. package/README.md +170 -0
  10. package/RELEASE.md +74 -0
  11. package/TESTING.md +5 -0
  12. package/babel.config.js +17 -0
  13. package/bootstrap +41 -0
  14. package/cypress.config.js +27 -0
  15. package/docker-compose.yml +32 -0
  16. package/jest-addon.config.js +465 -0
  17. package/jest.setup.js +65 -0
  18. package/locales/de/LC_MESSAGES/volto.po +14 -0
  19. package/locales/en/LC_MESSAGES/volto.po +14 -0
  20. package/locales/it/LC_MESSAGES/volto.po +14 -0
  21. package/locales/ro/LC_MESSAGES/volto.po +14 -0
  22. package/locales/volto.pot +16 -0
  23. package/package.json +98 -0
  24. package/razzle.extend.js +40 -0
  25. package/src/ChatBlock/ChatBlockEdit.jsx +46 -0
  26. package/src/ChatBlock/ChatBlockView.jsx +21 -0
  27. package/src/ChatBlock/chat/AIMessage.tsx +566 -0
  28. package/src/ChatBlock/chat/ChatMessage.tsx +35 -0
  29. package/src/ChatBlock/chat/ChatWindow.tsx +288 -0
  30. package/src/ChatBlock/chat/UserMessage.tsx +27 -0
  31. package/src/ChatBlock/chat/index.ts +4 -0
  32. package/src/ChatBlock/components/AutoResizeTextarea.jsx +67 -0
  33. package/src/ChatBlock/components/BlinkingDot.tsx +3 -0
  34. package/src/ChatBlock/components/ChatMessageFeedback.jsx +77 -0
  35. package/src/ChatBlock/components/EmptyState.jsx +70 -0
  36. package/src/ChatBlock/components/FeedbackModal.jsx +125 -0
  37. package/src/ChatBlock/components/HalloumiFeedback.jsx +126 -0
  38. package/src/ChatBlock/components/Icon.tsx +35 -0
  39. package/src/ChatBlock/components/QualityCheckToggle.jsx +26 -0
  40. package/src/ChatBlock/components/RelatedQuestions.jsx +59 -0
  41. package/src/ChatBlock/components/Source.jsx +93 -0
  42. package/src/ChatBlock/components/SourceChip.tsx +55 -0
  43. package/src/ChatBlock/components/Spinner.jsx +3 -0
  44. package/src/ChatBlock/components/UserActionsToolbar.jsx +44 -0
  45. package/src/ChatBlock/components/WebResultIcon.tsx +42 -0
  46. package/src/ChatBlock/components/markdown/Citation.jsx +70 -0
  47. package/src/ChatBlock/components/markdown/ClaimModal.jsx +98 -0
  48. package/src/ChatBlock/components/markdown/ClaimSegments.jsx +172 -0
  49. package/src/ChatBlock/components/markdown/RenderClaimView.jsx +96 -0
  50. package/src/ChatBlock/components/markdown/colors.js +29 -0
  51. package/src/ChatBlock/components/markdown/colors.less +52 -0
  52. package/src/ChatBlock/components/markdown/colors.test.js +69 -0
  53. package/src/ChatBlock/components/markdown/index.js +115 -0
  54. package/src/ChatBlock/fonts/DejaVuSans.ttf +0 -0
  55. package/src/ChatBlock/hocs/withOnyxData.jsx +46 -0
  56. package/src/ChatBlock/hooks/index.ts +7 -0
  57. package/src/ChatBlock/hooks/useChatController.ts +333 -0
  58. package/src/ChatBlock/hooks/useChatStreaming.ts +82 -0
  59. package/src/ChatBlock/hooks/useDeepCompareMemoize.js +17 -0
  60. package/src/ChatBlock/hooks/useMarked.js +44 -0
  61. package/src/ChatBlock/hooks/useQualityMarkers.js +119 -0
  62. package/src/ChatBlock/hooks/useScrollonStream.ts +131 -0
  63. package/src/ChatBlock/hooks/useToolDisplayTiming.ts +80 -0
  64. package/src/ChatBlock/index.js +32 -0
  65. package/src/ChatBlock/packets/MultiToolRenderer.tsx +235 -0
  66. package/src/ChatBlock/packets/RendererComponent.tsx +115 -0
  67. package/src/ChatBlock/packets/index.ts +4 -0
  68. package/src/ChatBlock/packets/renderers/CustomToolRenderer.tsx +63 -0
  69. package/src/ChatBlock/packets/renderers/FetchToolRenderer.tsx +59 -0
  70. package/src/ChatBlock/packets/renderers/ImageToolRenderer.tsx +62 -0
  71. package/src/ChatBlock/packets/renderers/MessageTextRenderer.tsx +172 -0
  72. package/src/ChatBlock/packets/renderers/ReasoningRenderer.tsx +122 -0
  73. package/src/ChatBlock/packets/renderers/SearchToolRenderer.tsx +323 -0
  74. package/src/ChatBlock/packets/renderers/index.ts +6 -0
  75. package/src/ChatBlock/schema.js +403 -0
  76. package/src/ChatBlock/services/index.ts +3 -0
  77. package/src/ChatBlock/services/messageProcessor.ts +348 -0
  78. package/src/ChatBlock/services/packetUtils.ts +48 -0
  79. package/src/ChatBlock/services/streamingService.ts +342 -0
  80. package/src/ChatBlock/style.less +1881 -0
  81. package/src/ChatBlock/tests/AIMessage.test.jsx +95 -0
  82. package/src/ChatBlock/tests/AutoResizeTextarea.test.jsx +49 -0
  83. package/src/ChatBlock/tests/BlinkingDot.test.jsx +71 -0
  84. package/src/ChatBlock/tests/ChatMessageFeedback.test.jsx +73 -0
  85. package/src/ChatBlock/tests/Citation.test.jsx +107 -0
  86. package/src/ChatBlock/tests/EmptyState.test.jsx +137 -0
  87. package/src/ChatBlock/tests/FeedbackModal.test.jsx +138 -0
  88. package/src/ChatBlock/tests/HalloumiFeedback.test.jsx +94 -0
  89. package/src/ChatBlock/tests/QualityCheckToggle.test.jsx +105 -0
  90. package/src/ChatBlock/tests/RelatedQuestions.test.jsx +215 -0
  91. package/src/ChatBlock/tests/Source.test.jsx +79 -0
  92. package/src/ChatBlock/tests/Spinner.test.jsx +18 -0
  93. package/src/ChatBlock/tests/index.test.js +51 -0
  94. package/src/ChatBlock/tests/messageProcessor.test.jsx +154 -0
  95. package/src/ChatBlock/tests/schema.test.js +166 -0
  96. package/src/ChatBlock/tests/useDeepCompareMemoize.test.js +107 -0
  97. package/src/ChatBlock/tests/useToolDisplayTiming.test.jsx +151 -0
  98. package/src/ChatBlock/types/cssmodules.d.ts +7 -0
  99. package/src/ChatBlock/types/interfaces.ts +154 -0
  100. package/src/ChatBlock/types/slate.d.ts +3 -0
  101. package/src/ChatBlock/types/streamingModels.ts +267 -0
  102. package/src/ChatBlock/types/volto.d.ts +3 -0
  103. package/src/ChatBlock/utils/citations.ts +25 -0
  104. package/src/ChatBlock/utils/index.tsx +114 -0
  105. package/src/halloumi/README.md +1 -0
  106. package/src/halloumi/generative.js +219 -0
  107. package/src/halloumi/generative.test.js +88 -0
  108. package/src/halloumi/middleware.js +70 -0
  109. package/src/halloumi/postprocessing.js +273 -0
  110. package/src/halloumi/postprocessing.test.js +441 -0
  111. package/src/halloumi/preprocessing.js +115 -0
  112. package/src/halloumi/preprocessing.test.js +245 -0
  113. package/src/icons/bot.svg +1 -0
  114. package/src/icons/check.svg +1 -0
  115. package/src/icons/chevron.svg +3 -0
  116. package/src/icons/clear.svg +1 -0
  117. package/src/icons/copy.svg +1 -0
  118. package/src/icons/done.svg +5 -0
  119. package/src/icons/external-link.svg +1 -0
  120. package/src/icons/file.svg +1 -0
  121. package/src/icons/glasses.svg +1 -0
  122. package/src/icons/globe.svg +1 -0
  123. package/src/icons/rotate.svg +1 -0
  124. package/src/icons/search.svg +5 -0
  125. package/src/icons/send.svg +1 -0
  126. package/src/icons/square-pen.svg +1 -0
  127. package/src/icons/stop.svg +9 -0
  128. package/src/icons/thumbs-down.svg +1 -0
  129. package/src/icons/thumbs-up.svg +1 -0
  130. package/src/icons/user.svg +1 -0
  131. package/src/index.js +58 -0
  132. package/src/middleware.js +250 -0
  133. package/tsconfig.json +40 -0
@@ -0,0 +1,1881 @@
1
+ // Font imports
2
+ @font-face {
3
+ font-family: 'DejaVu Sans';
4
+ font-style: normal;
5
+ font-weight: normal;
6
+ src: url('./fonts/DejaVuSans.ttf') format('truetype');
7
+ }
8
+
9
+ // Import color variables from colors.less
10
+ @import './components/markdown/colors.less';
11
+
12
+ @blue: #005c97;
13
+ @grey: #3d5265;
14
+ @teal: #00b3ae;
15
+ @lightGrey: #f9f9f9;
16
+ @hoverGreyColor: #f1f1f1;
17
+ @citationCircleColor: #e6e7e8;
18
+ @citationCircleHoverColor: @grey;
19
+ @borderRadius: 0.4rem;
20
+ @marginBottom: 1.5em;
21
+ @sm: 500px;
22
+ @md: 800px;
23
+ @lg: 1200px;
24
+
25
+ @keyframes dot-flashing {
26
+ 0% {
27
+ background-color: @grey;
28
+ }
29
+
30
+ 50%,
31
+ 100% {
32
+ background-color: rgba(61, 82, 101, 0.2);
33
+ }
34
+ }
35
+
36
+ @keyframes spin-rotate {
37
+ 0% {
38
+ transform: rotate(0deg);
39
+ }
40
+
41
+ 50% {
42
+ transform: rotate(180deg);
43
+ }
44
+
45
+ 100% {
46
+ transform: rotate(360deg);
47
+ }
48
+ }
49
+
50
+ @keyframes shimmer {
51
+ 0% {
52
+ background-position: 200% 0;
53
+ }
54
+
55
+ 100% {
56
+ background-position: -200% 0;
57
+ }
58
+ }
59
+
60
+ @keyframes blink-dot {
61
+ 0%,
62
+ 80%,
63
+ 100% {
64
+ opacity: 0.3;
65
+ transform: scale(0.8);
66
+ }
67
+
68
+ 40% {
69
+ opacity: 1;
70
+ transform: scale(1);
71
+ }
72
+ }
73
+
74
+ @keyframes pulse {
75
+ 0%,
76
+ 100% {
77
+ opacity: 1;
78
+ }
79
+
80
+ 50% {
81
+ opacity: 0.3;
82
+ }
83
+ }
84
+
85
+ @keyframes fadeInScale {
86
+ from {
87
+ opacity: 0;
88
+ transform: scale(0.95);
89
+ }
90
+
91
+ to {
92
+ opacity: 1;
93
+ transform: scale(1);
94
+ }
95
+ }
96
+
97
+ @keyframes fadeIn {
98
+ from {
99
+ opacity: 0;
100
+ transform: translateX(-8px);
101
+ }
102
+
103
+ to {
104
+ opacity: 1;
105
+ transform: translateX(0);
106
+ }
107
+ }
108
+
109
+ @keyframes pulseRing {
110
+ 0% {
111
+ opacity: 0.8;
112
+ transform: scale(0.8);
113
+ }
114
+
115
+ 50% {
116
+ opacity: 0.3;
117
+ transform: scale(1.2);
118
+ }
119
+
120
+ 100% {
121
+ opacity: 0;
122
+ transform: scale(1.5);
123
+ }
124
+ }
125
+
126
+ @keyframes popIn {
127
+ 0% {
128
+ opacity: 0;
129
+ transform: scale(0);
130
+ }
131
+
132
+ 50% {
133
+ transform: scale(1.2);
134
+ }
135
+
136
+ 100% {
137
+ opacity: 1;
138
+ transform: scale(1);
139
+ }
140
+ }
141
+
142
+ @keyframes fadeInSlide {
143
+ from {
144
+ opacity: 0;
145
+ transform: translateX(-8px);
146
+ }
147
+
148
+ to {
149
+ opacity: 1;
150
+ transform: translateX(0);
151
+ }
152
+ }
153
+
154
+ @keyframes dots {
155
+ 0% {
156
+ content: '⠋';
157
+ }
158
+
159
+ 10% {
160
+ content: '⠙';
161
+ }
162
+
163
+ 20% {
164
+ content: '⠹';
165
+ }
166
+
167
+ 30% {
168
+ content: '⠸';
169
+ }
170
+
171
+ 40% {
172
+ content: '⠼';
173
+ }
174
+
175
+ 50% {
176
+ content: '⠴';
177
+ }
178
+
179
+ 60% {
180
+ content: '⠦';
181
+ }
182
+
183
+ 70% {
184
+ content: '⠧';
185
+ }
186
+
187
+ 80% {
188
+ content: '⠇';
189
+ }
190
+
191
+ 90% {
192
+ content: '⠏';
193
+ }
194
+ }
195
+
196
+ .flex-center(@dir: row, @gap: 0) {
197
+ display: flex;
198
+ flex-direction: @dir;
199
+ align-items: center;
200
+ gap: @gap;
201
+ }
202
+
203
+ .line-clamp(@lines: 3) {
204
+ display: -webkit-box;
205
+ overflow: hidden;
206
+ -webkit-box-orient: vertical;
207
+ -webkit-line-clamp: @lines;
208
+ line-clamp: @lines;
209
+ }
210
+
211
+ .text-ellipsis(@width: 100%) {
212
+ overflow: hidden;
213
+ width: @width;
214
+ text-align: left;
215
+ text-overflow: ellipsis;
216
+ white-space: nowrap;
217
+ }
218
+
219
+ .include-scrollbar {
220
+ overflow: auto;
221
+ scrollbar-width: thin;
222
+ }
223
+
224
+ mark {
225
+ background-color: #ff0;
226
+ color: #000;
227
+ }
228
+
229
+ .chat-window,
230
+ .claim-modal {
231
+ h2,
232
+ h3,
233
+ h4,
234
+ h5 {
235
+ margin: calc(2rem - 0.1em) 0 1rem;
236
+ }
237
+
238
+ h2 {
239
+ font-size: 2rem;
240
+ }
241
+
242
+ h3 {
243
+ font-size: 1.625rem;
244
+ }
245
+
246
+ h4 {
247
+ font-size: 1.25rem;
248
+ }
249
+
250
+ h5 {
251
+ font-size: 1.125rem;
252
+ }
253
+
254
+ ol li,
255
+ ul li,
256
+ p {
257
+ font-size: inherit;
258
+ }
259
+ }
260
+
261
+ .chat-window {
262
+ margin: 1.5em 0;
263
+
264
+ .sources-sidebar {
265
+ padding: 1em;
266
+ background-color: #fff;
267
+ box-shadow: -4px 0 4px rgba(0, 0, 0, 0.25) !important;
268
+
269
+ .sources-sidebar-heading {
270
+ justify-content: space-between;
271
+ padding-bottom: 1em;
272
+ border-bottom: 1px solid @grey;
273
+ margin-bottom: 1em;
274
+ .flex-center(row);
275
+
276
+ .ui.button {
277
+ margin: 0;
278
+
279
+ &:hover,
280
+ &:active,
281
+ &:focus {
282
+ border: none;
283
+ box-shadow: none;
284
+ }
285
+
286
+ svg {
287
+ height: auto;
288
+ }
289
+ }
290
+
291
+ h4 {
292
+ margin: 0;
293
+ }
294
+ }
295
+
296
+ .source {
297
+ &:not(:first-child) {
298
+ padding-top: 0.8em !important;
299
+ margin-top: 0.8em !important;
300
+ }
301
+
302
+ .source-header {
303
+ .flex-center(row, 3px);
304
+
305
+ .chat-citation {
306
+ top: 0;
307
+ margin-right: 0;
308
+ }
309
+
310
+ svg {
311
+ top: -1px;
312
+ }
313
+ }
314
+
315
+ .source-title {
316
+ display: inline-block !important;
317
+ margin: 0 3px !important;
318
+ font-size: 15px;
319
+ .text-ellipsis(250px);
320
+ }
321
+
322
+ .source-desc {
323
+ font-size: 14px;
324
+ .line-clamp(2);
325
+ }
326
+ }
327
+ }
328
+
329
+ .ui.button.clear-chat,
330
+ .ui.button.claims-btn {
331
+ .flex-center(row, 0.5em);
332
+
333
+ svg {
334
+ width: 18px;
335
+ height: 18px;
336
+ }
337
+ }
338
+
339
+ .messages ul {
340
+ margin-bottom: 0;
341
+ }
342
+
343
+ .empty-state {
344
+ margin-top: 2em;
345
+ }
346
+
347
+ .comment {
348
+ display: flex;
349
+ margin-bottom: @marginBottom;
350
+ gap: 0.8em;
351
+
352
+ .comment-content {
353
+ flex: 1;
354
+ }
355
+
356
+ i.inverted.circular.grey.icon {
357
+ background-color: @grey !important;
358
+ }
359
+
360
+ i.icon,
361
+ i.icons {
362
+ font-size: 1em;
363
+ }
364
+
365
+ ul,
366
+ ol {
367
+ li {
368
+ padding-bottom: 0.5em;
369
+ }
370
+ }
371
+ }
372
+
373
+ .chat-related-questions {
374
+ margin-bottom: 2em;
375
+ }
376
+
377
+ .answer-tab {
378
+ // margin-top: 1.5em;
379
+
380
+ .sources {
381
+ display: flex;
382
+ flex-direction: row;
383
+ flex-wrap: wrap;
384
+ margin-bottom: @marginBottom;
385
+ gap: 0.8em;
386
+
387
+ .source-link:hover {
388
+ .source {
389
+ background-color: @hoverGreyColor;
390
+ }
391
+ }
392
+
393
+ .source {
394
+ display: flex;
395
+ width: 200px;
396
+ flex-direction: column;
397
+ padding: 0.6em 0.7em;
398
+ border-radius: @borderRadius;
399
+ background-color: @lightGrey;
400
+ gap: 0.3em;
401
+
402
+ &:hover {
403
+ background-color: @hoverGreyColor;
404
+ }
405
+
406
+ @media screen and (max-width: @md) {
407
+ width: calc(50% - 0.4em) !important;
408
+ }
409
+
410
+ @media screen and (max-width: @sm) {
411
+ width: 100% !important;
412
+ }
413
+ }
414
+
415
+ .source-header {
416
+ @media screen and (max-width: @sm) {
417
+ display: block !important;
418
+
419
+ .source-title {
420
+ display: inline;
421
+ }
422
+
423
+ svg.icon {
424
+ position: relative;
425
+ top: 2px;
426
+ margin-left: 5px;
427
+ }
428
+ }
429
+ }
430
+
431
+ .source-header,
432
+ .source-header a {
433
+ width: 100%;
434
+ color: @grey;
435
+
436
+ .flex-center(row);
437
+ }
438
+
439
+ .source-title {
440
+ padding-left: 0.2em;
441
+ color: @grey;
442
+ font-size: 13px;
443
+ font-weight: bold;
444
+
445
+ @media screen and (min-width: @sm) {
446
+ .text-ellipsis(140px);
447
+ }
448
+ }
449
+
450
+ .source-date span {
451
+ padding: 0.2em 0.4em;
452
+ border-radius: @borderRadius;
453
+ background-color: #e5e7eb;
454
+ font-size: 11px;
455
+ }
456
+ }
457
+
458
+ .source-desc {
459
+ padding-top: 2px;
460
+ color: @grey;
461
+ font-size: 12px;
462
+ text-align: left;
463
+
464
+ .line-clamp(@lines: 2);
465
+ }
466
+ }
467
+
468
+ .source-date {
469
+ margin-top: 0.3em;
470
+ line-height: 1;
471
+
472
+ span {
473
+ padding: 0.2em 0.4em;
474
+ border-radius: 5px;
475
+ background-color: #e5e7eb;
476
+ color: @grey;
477
+ font-size: 10px;
478
+ }
479
+ }
480
+
481
+ .sources-listing {
482
+ .source {
483
+ &:not(:first-child) {
484
+ display: inline-block;
485
+ padding-top: 1em;
486
+ border-top: 1px solid #eee;
487
+ margin-top: 1em;
488
+ }
489
+
490
+ &:hover {
491
+ .source-title {
492
+ color: #008f8b;
493
+ }
494
+
495
+ svg {
496
+ color: #008f8b;
497
+ }
498
+ }
499
+ }
500
+
501
+ .source-header {
502
+ margin-bottom: 0.5em;
503
+ color: @grey;
504
+ font-size: 17px;
505
+ font-weight: bold;
506
+
507
+ .source-title {
508
+ display: inline;
509
+ margin: 0 5px;
510
+ }
511
+
512
+ .chat-citation {
513
+ position: relative;
514
+ top: -2px;
515
+
516
+ &:hover {
517
+ border: 1px solid #dbd9d9;
518
+ background-color: #e6e7e8;
519
+ color: #3d5265;
520
+ }
521
+ }
522
+
523
+ svg {
524
+ position: relative;
525
+ top: 3px;
526
+ margin-left: 1px;
527
+ }
528
+ }
529
+
530
+ .source-desc {
531
+ padding-top: 2px;
532
+ color: @grey;
533
+ font-size: 15px;
534
+ text-align: left;
535
+ .line-clamp(@lines: 3);
536
+ }
537
+ }
538
+
539
+ .loader-container {
540
+ display: flex;
541
+ height: 30px;
542
+ align-items: center;
543
+ }
544
+
545
+ .loader {
546
+ position: relative;
547
+ width: 10px;
548
+ height: 10px;
549
+ border-radius: 5px;
550
+ margin-left: 15px;
551
+ animation: dot-flashing 1s infinite linear alternate;
552
+ animation-delay: 0.5s;
553
+ background-color: @grey;
554
+
555
+ &:before,
556
+ &:after {
557
+ position: absolute;
558
+ top: 0;
559
+ display: inline-block;
560
+ content: '';
561
+ }
562
+
563
+ &:before {
564
+ left: -15px;
565
+ width: 10px;
566
+ height: 10px;
567
+ border-radius: 5px;
568
+ animation: dot-flashing 1s infinite alternate;
569
+ animation-delay: 0s;
570
+ background-color: @grey;
571
+ }
572
+
573
+ &:after {
574
+ left: 15px;
575
+ width: 10px;
576
+ height: 10px;
577
+ border-radius: 5px;
578
+ animation: dot-flashing 1s infinite alternate;
579
+ animation-delay: 1s;
580
+ background-color: @grey;
581
+ }
582
+ }
583
+ }
584
+
585
+ .circle {
586
+ width: 30px;
587
+ height: 30px;
588
+ flex: none;
589
+ justify-content: center;
590
+ border-radius: 50%;
591
+ text-align: center;
592
+
593
+ .flex-center(column);
594
+
595
+ &.user {
596
+ background-color: @teal;
597
+ }
598
+
599
+ &.assistant {
600
+ background-color: @grey;
601
+
602
+ &.placeholder {
603
+ background-color: transparent;
604
+ }
605
+ }
606
+
607
+ svg {
608
+ margin: 0 auto;
609
+ }
610
+ }
611
+
612
+ .quality-check-toggle {
613
+ .ui.toggle.checkbox {
614
+ input:checked ~ label {
615
+ color: @grey !important;
616
+ }
617
+
618
+ label {
619
+ color: @grey;
620
+
621
+ &:before {
622
+ border: none !important;
623
+ }
624
+ }
625
+ }
626
+ }
627
+
628
+ .quality-check-popup.ui.popup {
629
+ padding: 0.6em 0.9em;
630
+ font-size: 14px;
631
+ }
632
+
633
+ .claim {
634
+ position: relative;
635
+ display: inline;
636
+ cursor: pointer;
637
+ text-decoration: underline;
638
+ text-decoration-color: var(--claim-color);
639
+ text-decoration-style: wavy;
640
+
641
+ &:hover {
642
+ background-color: var(--claim-lighter-color);
643
+ }
644
+ }
645
+
646
+ .ui.message.claim-message {
647
+ background-color: var(--claim-lighter-color) !important;
648
+ box-shadow:
649
+ 0px 0px 0px 1px var(--claim-darker-color) inset,
650
+ 0px 0px 0px 0px rgba(0, 0, 0, 0) !important;
651
+ color: var(--claim-darker-color) !important;
652
+ }
653
+
654
+ .ui.modal.claim-modal {
655
+ .chat-window {
656
+ margin-top: 1em;
657
+ margin-bottom: 0;
658
+ }
659
+
660
+ .header {
661
+ display: flex;
662
+ flex-direction: column;
663
+ padding-bottom: 1em;
664
+ border-bottom: 1px solid @gray-200;
665
+ gap: 0;
666
+ }
667
+
668
+ // Modal header structure
669
+ .claim-modal-header {
670
+ width: 100%;
671
+ }
672
+
673
+ .claim-header-top {
674
+ display: flex;
675
+ align-items: center;
676
+ margin-bottom: 0.75em;
677
+ gap: 0.5em;
678
+ }
679
+
680
+ .claim-label {
681
+ color: @grey;
682
+ font-size: 0.875rem;
683
+ font-weight: 600;
684
+ letter-spacing: 0.05em;
685
+ text-transform: uppercase;
686
+ }
687
+
688
+ .claim-quote {
689
+ position: relative;
690
+ padding: 1em 1.25em;
691
+ border: none;
692
+ border-radius: 0 @borderRadius @borderRadius 0;
693
+ border-left: 4px solid var(--claim-color);
694
+ margin: 0;
695
+ background-color: @gray-50;
696
+ color: @grey;
697
+ font-size: 1rem;
698
+ font-style: italic;
699
+ font-weight: 500;
700
+ line-height: 1.5;
701
+ }
702
+
703
+ // Verification card styles
704
+ .claim-verification-card {
705
+ display: flex;
706
+ padding: 1em;
707
+ border: 1px solid @gray-200;
708
+ border-radius: @borderRadius;
709
+ margin-bottom: 1.5em;
710
+ background-color: @gray-50;
711
+ gap: 1.5em;
712
+
713
+ @media screen and (max-width: @md) {
714
+ flex-direction: column;
715
+ gap: 1em;
716
+ }
717
+ }
718
+
719
+ .score-badge-section {
720
+ display: flex;
721
+ flex-direction: column;
722
+ flex-shrink: 0;
723
+ gap: 0.5em;
724
+ }
725
+
726
+ .score-badge {
727
+ position: relative;
728
+ display: flex;
729
+ min-width: 100px;
730
+ flex-direction: column;
731
+ align-items: center;
732
+ justify-content: center;
733
+ padding: 0.75em 1em;
734
+ border-radius: @borderRadius;
735
+ background-color: var(--claim-lighter-color);
736
+ color: var(--claim-darker-color);
737
+ text-align: center;
738
+ }
739
+
740
+ .score-percentage {
741
+ font-size: 1.5rem;
742
+ font-weight: 700;
743
+ line-height: 1.2;
744
+ }
745
+
746
+ .score-label {
747
+ font-size: 0.75rem;
748
+ font-weight: 500;
749
+ letter-spacing: 0.025em;
750
+ text-transform: uppercase;
751
+ }
752
+
753
+ .score-progress-bar {
754
+ overflow: hidden;
755
+ width: 100%;
756
+ height: 6px;
757
+ border-radius: 3px;
758
+ background-color: @gray-200;
759
+ }
760
+
761
+ .score-progress-fill {
762
+ height: 100%;
763
+ border-radius: 3px;
764
+ background-color: var(--claim-color);
765
+ transition: width 0.3s ease;
766
+ }
767
+
768
+ .rationale-section {
769
+ flex: 1;
770
+ }
771
+
772
+ .rationale-header {
773
+ margin: 0 0 0.5em 0;
774
+ color: @grey;
775
+ font-size: 0.875rem;
776
+ font-weight: 600;
777
+ letter-spacing: 0.05em;
778
+ text-transform: uppercase;
779
+ }
780
+
781
+ .claim-rationale {
782
+ margin: 0;
783
+ color: @gray-500;
784
+ font-size: 0.9375rem;
785
+ line-height: 1.6;
786
+ }
787
+
788
+ // Source card header styles
789
+ .source-card-header {
790
+ display: flex;
791
+ align-items: center;
792
+ justify-content: space-between;
793
+ padding: 0.75em 1em;
794
+ border: 1px solid @gray-200;
795
+ border-radius: @borderRadius;
796
+ margin-bottom: 1em;
797
+ background-color: @gray-50;
798
+ }
799
+
800
+ .source-card-info {
801
+ display: flex;
802
+ overflow: hidden;
803
+ flex: 1;
804
+ align-items: center;
805
+ gap: 0.75em;
806
+ }
807
+
808
+ .source-icon {
809
+ flex-shrink: 0;
810
+ color: @grey;
811
+ }
812
+
813
+ .source-card-details {
814
+ display: flex;
815
+ overflow: hidden;
816
+ flex: 1;
817
+ flex-direction: column;
818
+ gap: 0.25em;
819
+ }
820
+
821
+ .source-card-title {
822
+ overflow: hidden;
823
+ margin: 0;
824
+ color: @grey;
825
+ font-size: 1rem;
826
+ font-weight: 600;
827
+ line-height: 1.3;
828
+ text-overflow: ellipsis;
829
+ white-space: nowrap;
830
+ }
831
+
832
+ .source-type-badge {
833
+ width: fit-content;
834
+ padding: 0.125em 0.5em;
835
+ border-radius: 9999px;
836
+ background-color: @gray-200;
837
+ color: @gray-500;
838
+ font-size: 0.75rem;
839
+ font-weight: 500;
840
+ }
841
+
842
+ .source-external-link {
843
+ display: flex;
844
+ flex-shrink: 0;
845
+ align-items: center;
846
+ justify-content: center;
847
+ padding: 0.5em;
848
+ border-radius: @borderRadius;
849
+ margin-left: 0.5em;
850
+ color: @grey;
851
+ transition:
852
+ background-color 0.2s,
853
+ color 0.2s;
854
+
855
+ &:hover {
856
+ background-color: @gray-200;
857
+ color: @teal;
858
+ }
859
+ }
860
+
861
+ // Citation chips styles
862
+ .citation-chips-section {
863
+ margin-bottom: 1em;
864
+ }
865
+
866
+ .citation-chips-header {
867
+ margin: 0 0 0.5em 0;
868
+ color: @grey;
869
+ font-size: 0.875rem;
870
+ font-weight: 600;
871
+ }
872
+
873
+ .citation-chips-container {
874
+ display: flex;
875
+ flex-wrap: wrap;
876
+ gap: 0.5em;
877
+ }
878
+
879
+ .citation-chip {
880
+ display: inline-flex;
881
+ align-items: center;
882
+ justify-content: center;
883
+ padding: 0.375em 0.75em;
884
+ border: 1px solid @gray-300;
885
+ border-radius: 9999px;
886
+ background-color: #fff;
887
+ color: @grey;
888
+ cursor: pointer;
889
+ font-family: inherit;
890
+ font-size: 0.875rem;
891
+ font-weight: 500;
892
+ transition: all 0.2s;
893
+
894
+ &:hover {
895
+ border-color: @teal;
896
+ background-color: fadeout(@teal, 95%);
897
+ color: @teal;
898
+ }
899
+
900
+ &.active {
901
+ border-color: @teal;
902
+ background-color: @teal;
903
+ color: #fff;
904
+ }
905
+
906
+ &.more-chip {
907
+ background-color: @gray-100;
908
+ font-weight: 600;
909
+
910
+ &:hover {
911
+ background-color: @gray-200;
912
+ }
913
+ }
914
+ }
915
+
916
+ // Citation text container styles
917
+ .citation-text-container {
918
+ overflow: auto;
919
+ max-height: 400px;
920
+ padding: 1em;
921
+ border: 1px solid @gray-200;
922
+ border-radius: @borderRadius;
923
+ background-color: #fff;
924
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.05);
925
+ scrollbar-color: @gray-300 transparent;
926
+ scrollbar-width: thin;
927
+
928
+ &::-webkit-scrollbar {
929
+ width: 8px;
930
+ }
931
+
932
+ &::-webkit-scrollbar-track {
933
+ background: transparent;
934
+ }
935
+
936
+ &::-webkit-scrollbar-thumb {
937
+ border-radius: 4px;
938
+ background-color: @gray-300;
939
+
940
+ &:hover {
941
+ background-color: @gray-400;
942
+ }
943
+ }
944
+ }
945
+
946
+ .citation-text-content {
947
+ color: @grey;
948
+ font-size: 0.9375rem;
949
+ line-height: 1.75;
950
+ }
951
+
952
+ .citation-line {
953
+ display: inline;
954
+ color: inherit;
955
+ }
956
+
957
+ .citation-segment {
958
+ &.active .citation-highlight {
959
+ background-color: @yellow-200;
960
+ box-shadow: 0 0 0 2px @yellow-300;
961
+ }
962
+ }
963
+
964
+ .citation-highlight {
965
+ padding: 0.125em 0.25em;
966
+ border-radius: 2px;
967
+ background-color: @yellow-100;
968
+ color: @grey;
969
+ transition:
970
+ background-color 0.2s,
971
+ box-shadow 0.2s;
972
+ }
973
+
974
+ .citation-ref {
975
+ padding: 0 0.25em;
976
+ color: @gray-500;
977
+ font-size: 0.75em;
978
+ font-weight: 600;
979
+ }
980
+
981
+ span.br {
982
+ display: block;
983
+ height: 0.5em;
984
+ }
985
+
986
+ // Source tabs - simplified display
987
+ .ui.secondary.pointing.menu {
988
+ display: flex;
989
+ flex-wrap: nowrap;
990
+ padding-bottom: 0.125rem;
991
+ border-width: 2px;
992
+ gap: 0;
993
+ overflow-x: auto;
994
+
995
+ &::-webkit-scrollbar {
996
+ height: 4px;
997
+ }
998
+
999
+ .item {
1000
+ flex-shrink: 0;
1001
+ padding: 0.75em 1em;
1002
+ border-bottom-width: 2px;
1003
+ margin: 0 0 -2px;
1004
+ color: @gray-500;
1005
+
1006
+ &.active,
1007
+ &:hover {
1008
+ border-color: @grey !important;
1009
+ color: @grey !important;
1010
+ font-weight: bold;
1011
+ }
1012
+
1013
+ span {
1014
+ display: block;
1015
+ overflow: hidden;
1016
+ max-width: 180px;
1017
+ font-size: 14px;
1018
+ font-weight: 600;
1019
+ text-align: left;
1020
+ text-overflow: ellipsis;
1021
+ white-space: nowrap;
1022
+ }
1023
+ }
1024
+ }
1025
+
1026
+ @media only screen and (min-width: @lg) {
1027
+ width: 1100px;
1028
+ }
1029
+ }
1030
+
1031
+ .comment-tabs {
1032
+ // margin-top: 0.5em;
1033
+
1034
+ .ui.secondary.pointing.menu {
1035
+ border-width: 2px;
1036
+ margin-bottom: 1.5em;
1037
+
1038
+ .item {
1039
+ border-bottom-width: 2px;
1040
+ margin-bottom: 0 !important;
1041
+ color: #6c8295;
1042
+ font-size: 16px;
1043
+ font-weight: bold;
1044
+
1045
+ &.active,
1046
+ &:hover {
1047
+ border-color: @grey !important;
1048
+ border-bottom-width: 2px !important;
1049
+ margin-bottom: 0 !important;
1050
+ color: @grey !important;
1051
+ font-weight: bold;
1052
+ }
1053
+ }
1054
+
1055
+ &.without-sources {
1056
+ display: none;
1057
+ }
1058
+ }
1059
+
1060
+ .ui.segment {
1061
+ padding: 0;
1062
+ }
1063
+ }
1064
+
1065
+ .ui.button.source.show-all-sources-btn {
1066
+ display: inline-block;
1067
+ margin: 0;
1068
+ box-shadow: none;
1069
+ text-align: left;
1070
+
1071
+ &:hover,
1072
+ &:active {
1073
+ background-color: @hoverGreyColor;
1074
+ }
1075
+
1076
+ .source-header {
1077
+ display: block;
1078
+ }
1079
+
1080
+ .chat-citation {
1081
+ width: 1em;
1082
+ height: 1em;
1083
+ }
1084
+
1085
+ .source-title {
1086
+ padding: 0;
1087
+ margin-top: 5px;
1088
+
1089
+ @media screen and (max-width: @sm) {
1090
+ display: inline-block;
1091
+ margin-top: 10px;
1092
+ }
1093
+ }
1094
+ }
1095
+
1096
+ .sources-count {
1097
+ font-family: monospace;
1098
+ font-size: 14px;
1099
+ }
1100
+
1101
+ .verify-claims {
1102
+ display: flex;
1103
+ gap: 0.5em;
1104
+ }
1105
+
1106
+ .related-questions-loader {
1107
+ .flex-center(row, 0.5em);
1108
+ }
1109
+
1110
+ .starter-messages-container {
1111
+ display: grid;
1112
+ width: 100%;
1113
+ grid-gap: 0.7rem;
1114
+ grid-template-columns: repeat(2, 1fr);
1115
+
1116
+ @media screen and (max-width: 580px) {
1117
+ grid-template-columns: 1fr;
1118
+ }
1119
+ }
1120
+
1121
+ .relatedQuestionButton {
1122
+ margin-bottom: 0.3em;
1123
+ cursor: pointer;
1124
+ -webkit-user-select: none; /* Safari */
1125
+ -ms-user-select: none; /* IE 10 and IE 11 */
1126
+ user-select: none; /* Standard syntax */
1127
+
1128
+ &:hover {
1129
+ color: rgba(61, 82, 101, 0.8);
1130
+ }
1131
+ }
1132
+
1133
+ .feedback-modal {
1134
+ h3 {
1135
+ color: @grey;
1136
+ }
1137
+
1138
+ .ui.form textarea {
1139
+ max-width: 100%;
1140
+ }
1141
+
1142
+ .reason-buttons {
1143
+ display: flex;
1144
+ flex-wrap: wrap;
1145
+ justify-content: flex-start;
1146
+ margin-bottom: @marginBottom;
1147
+ gap: 0.5em;
1148
+ }
1149
+
1150
+ .ui.primary.button {
1151
+ background-color: @grey !important;
1152
+
1153
+ &:hover {
1154
+ background-color: #334555 !important;
1155
+ }
1156
+ }
1157
+
1158
+ .ui.inverted.primary.button {
1159
+ background-color: #fff !important;
1160
+ box-shadow: 0px 0px 0px 2px @grey inset !important;
1161
+ color: @grey;
1162
+
1163
+ &:hover {
1164
+ background-color: @grey !important;
1165
+ box-shadow: 0px 0px 0px 2px @grey inset !important;
1166
+ color: #fff;
1167
+ }
1168
+ }
1169
+ }
1170
+
1171
+ .message-actions {
1172
+ margin: 0.8em 0;
1173
+
1174
+ .ui.basic.button {
1175
+ padding: 6px 8px;
1176
+ margin-right: 0.2em;
1177
+
1178
+ &:active,
1179
+ &:focus {
1180
+ box-shadow: none;
1181
+ outline: none;
1182
+ }
1183
+
1184
+ svg {
1185
+ width: 15px;
1186
+ height: 15px;
1187
+ margin: 0 !important;
1188
+ stroke: #0a0a0a;
1189
+ }
1190
+
1191
+ &:hover {
1192
+ border-radius: 3px;
1193
+ background-color: @lightGrey !important;
1194
+ box-shadow: none;
1195
+ }
1196
+ }
1197
+ }
1198
+
1199
+ .ui.button.starter-message {
1200
+ display: flex;
1201
+ flex-direction: column;
1202
+ align-items: flex-start;
1203
+ padding: 0.7rem;
1204
+ border: 1px solid #e5e5e5;
1205
+ border-radius: @borderRadius;
1206
+ margin: 0;
1207
+ background-color: white;
1208
+ color: inherit;
1209
+ gap: 5px;
1210
+ line-height: normal;
1211
+ text-align: left;
1212
+ transition: background-color 0.3s ease;
1213
+
1214
+ &:hover,
1215
+ &:active {
1216
+ background-color: #fbfbfb;
1217
+ }
1218
+
1219
+ .starter-message-desc {
1220
+ color: #6b7280;
1221
+ font-size: 14px;
1222
+ font-weight: normal;
1223
+ }
1224
+ }
1225
+
1226
+ .chat-citation {
1227
+ display: inline-flex;
1228
+ width: 1.7em;
1229
+ height: 1.7em;
1230
+ align-items: center;
1231
+ justify-content: center;
1232
+ border: 1px solid #dbd9d9;
1233
+ border-radius: 3em;
1234
+ margin: 0 3px;
1235
+ background-color: @citationCircleColor;
1236
+ color: @grey;
1237
+ cursor: pointer;
1238
+ font-size: 10px;
1239
+ font-weight: bold;
1240
+ line-height: 1.7em;
1241
+ text-align: center;
1242
+
1243
+ &:hover {
1244
+ border: 1px solid @citationCircleHoverColor;
1245
+ background-color: @citationCircleHoverColor;
1246
+ color: #ffffff;
1247
+ }
1248
+ }
1249
+
1250
+ #chat-citation-popup {
1251
+ .ui.popup {
1252
+ padding: 0.8em;
1253
+ font-size: 13px;
1254
+ }
1255
+
1256
+ .ui.popup > .header {
1257
+ font-size: 15px;
1258
+ }
1259
+ }
1260
+
1261
+ .chat-form .ui.form {
1262
+ margin-top: 2em;
1263
+
1264
+ .textarea-wrapper {
1265
+ width: 100%;
1266
+ align-items: center;
1267
+ justify-content: space-between;
1268
+ padding: 0.6em 0.8em;
1269
+ border: 1px solid #e5e5e5;
1270
+ border-radius: @borderRadius;
1271
+ background-color: #fbfbfb;
1272
+ .flex-center(row);
1273
+
1274
+ textarea {
1275
+ max-width: none;
1276
+ min-height: auto !important;
1277
+ max-height: none !important;
1278
+ padding: 0;
1279
+ border: none !important;
1280
+ background: none !important;
1281
+ resize: none !important;
1282
+
1283
+ @media only screen and (min-width: 800px) {
1284
+ width: 80% !important;
1285
+ }
1286
+ }
1287
+
1288
+ @media only screen and (max-width: 800px) {
1289
+ flex-direction: column;
1290
+ }
1291
+ }
1292
+
1293
+ .ui.button.submit-btn {
1294
+ padding: 0;
1295
+ margin: 0 0.5em 0 0.8em;
1296
+ background: none;
1297
+
1298
+ &:hover {
1299
+ background: none;
1300
+ }
1301
+
1302
+ svg {
1303
+ margin-top: 0.1em;
1304
+ color: @grey;
1305
+ }
1306
+ }
1307
+ }
1308
+
1309
+ #fact-check-toggle[disabled] ~ label {
1310
+ opacity: 1;
1311
+ }
1312
+
1313
+ .halloumi-feedback-button {
1314
+ margin-top: 1.5em;
1315
+ font-size: 15px;
1316
+ }
1317
+
1318
+ .spinner {
1319
+ width: 22px;
1320
+ height: 22px;
1321
+ border: 6px solid @teal;
1322
+ border-radius: 50%;
1323
+ border-top: 6px solid @blue;
1324
+ animation: spin-rotate 1s infinite linear; // spin 2s linear infinite;
1325
+ animation-delay: 0.5s;
1326
+ }
1327
+
1328
+ .feedback-toast {
1329
+ position: fixed;
1330
+ z-index: 9999;
1331
+ bottom: -100px;
1332
+ left: 50%;
1333
+ display: flex;
1334
+ align-items: center;
1335
+ padding: 15px 25px;
1336
+ border-radius: 3px;
1337
+ font-size: 18px;
1338
+ opacity: 0;
1339
+ transform: translateX(-50%);
1340
+ transition:
1341
+ bottom 0.35s ease-in-out,
1342
+ opacity 0.35s ease-in-out;
1343
+
1344
+ &.active {
1345
+ bottom: 20px;
1346
+ opacity: 1;
1347
+ }
1348
+
1349
+ &.success {
1350
+ border: 1px solid #2c662d;
1351
+ background-color: #fcfff5;
1352
+ color: #2c662d;
1353
+ }
1354
+
1355
+ &.error {
1356
+ border: 1px solid #db2828;
1357
+ background-color: #ffe8e6;
1358
+ color: #db2828;
1359
+ }
1360
+ }
1361
+
1362
+ .chat-right-actions {
1363
+ display: flex;
1364
+ margin-left: auto;
1365
+ }
1366
+
1367
+ .chat-controls {
1368
+ display: flex;
1369
+ align-items: center;
1370
+ margin-top: 1em;
1371
+ gap: 1em;
1372
+ }
1373
+
1374
+ .message-content {
1375
+ width: 100%;
1376
+ }
1377
+
1378
+ // BlinkingDot component styles
1379
+ .blinking-dot {
1380
+ display: inline-block;
1381
+ width: 12px;
1382
+ height: 12px;
1383
+ border-radius: 50%;
1384
+ animation: pulse 1.5s ease-in-out infinite;
1385
+ background-color: @grey;
1386
+
1387
+ &.with-margin {
1388
+ margin-left: 8px;
1389
+ }
1390
+ }
1391
+
1392
+ // SourceChip component styles
1393
+ .source-chip {
1394
+ display: inline-flex;
1395
+ max-width: 15rem;
1396
+ align-items: center;
1397
+ padding: 4px 12px;
1398
+ border: 1px solid #e0e0e0;
1399
+ border-radius: 16px;
1400
+ background-color: @lightGrey;
1401
+ color: @grey;
1402
+ cursor: pointer;
1403
+ font-size: 0.875rem;
1404
+ gap: 6px;
1405
+ transition: all 0.2s ease;
1406
+
1407
+ &:hover {
1408
+ background-color: @hoverGreyColor;
1409
+ }
1410
+
1411
+ &.animate-in {
1412
+ animation: fadeInScale 0.3s ease-out;
1413
+ }
1414
+
1415
+ span {
1416
+ overflow: hidden;
1417
+ text-overflow: ellipsis;
1418
+ white-space: nowrap;
1419
+ }
1420
+
1421
+ .source-chip-icon {
1422
+ display: flex;
1423
+ width: 16px;
1424
+ height: 16px;
1425
+ flex-shrink: 0;
1426
+ align-items: center;
1427
+ justify-content: center;
1428
+ }
1429
+
1430
+ .source-chip-remove {
1431
+ margin-left: 4px;
1432
+ cursor: pointer;
1433
+ font-size: 12px;
1434
+
1435
+ &:hover {
1436
+ opacity: 0.7;
1437
+ }
1438
+ }
1439
+ }
1440
+
1441
+ // Search and tool renderer styles
1442
+ .search-tool-renderer,
1443
+ .fetch-tool-renderer {
1444
+ .queries-section,
1445
+ .results-section {
1446
+ margin-bottom: 1em;
1447
+
1448
+ &:last-child {
1449
+ margin-bottom: 0;
1450
+ }
1451
+ }
1452
+
1453
+ .queries-header,
1454
+ .results-header {
1455
+ margin-bottom: 0.5em;
1456
+ color: @grey;
1457
+ font-size: 13px;
1458
+ font-weight: 600;
1459
+ }
1460
+
1461
+ .queries-list,
1462
+ .results-list {
1463
+ display: flex;
1464
+ flex-wrap: wrap;
1465
+ gap: 0.5em;
1466
+ }
1467
+
1468
+ .query-item,
1469
+ .result-item {
1470
+ animation: fadeIn 0.15s ease-out backwards;
1471
+
1472
+ &.more-button {
1473
+ .source-chip {
1474
+ background-color: #e9ecef;
1475
+ font-weight: 500;
1476
+
1477
+ &:hover {
1478
+ background-color: #dee2e6;
1479
+ }
1480
+ }
1481
+ }
1482
+ }
1483
+ }
1484
+
1485
+ // Error message styles
1486
+ .message-error {
1487
+ margin: 1em 0;
1488
+
1489
+ .error-message {
1490
+ width: 100%;
1491
+ padding: 1em;
1492
+ border-radius: @borderRadius;
1493
+
1494
+ .error-title {
1495
+ margin-bottom: 0.5em;
1496
+ font-size: 1rem;
1497
+ font-weight: bold;
1498
+ }
1499
+
1500
+ .error-content {
1501
+ font-family: monospace;
1502
+ font-size: 0.9rem;
1503
+ white-space: pre-wrap;
1504
+ word-break: break-word;
1505
+ }
1506
+ }
1507
+ }
1508
+
1509
+ // MultiToolRenderer - Expanded tool item styles
1510
+ .tool-item-expanded {
1511
+ position: relative;
1512
+
1513
+ // Connector line between tools
1514
+ .tool-connector-line {
1515
+ position: absolute;
1516
+ z-index: 0;
1517
+ top: 20px;
1518
+ bottom: 0;
1519
+ left: 10px;
1520
+ width: 1px;
1521
+ background-color: #e5e7eb;
1522
+ }
1523
+
1524
+ // Main row with icon and content
1525
+ .tool-item-row {
1526
+ position: relative;
1527
+ z-index: 10;
1528
+ display: flex;
1529
+ align-items: flex-start;
1530
+ color: @grey;
1531
+ gap: 0.5rem;
1532
+ }
1533
+
1534
+ // Icon column
1535
+ .tool-icon-wrapper {
1536
+ display: flex;
1537
+ width: 1.25rem;
1538
+ flex-direction: column;
1539
+ flex-shrink: 0;
1540
+ align-items: center;
1541
+ }
1542
+
1543
+ .tool-icon-circle {
1544
+ display: flex;
1545
+ width: 1.25rem;
1546
+ height: 1.25rem;
1547
+ flex-shrink: 0;
1548
+ align-items: center;
1549
+ justify-content: center;
1550
+ border-radius: 50%;
1551
+
1552
+ svg {
1553
+ width: 14px;
1554
+ height: 14px;
1555
+ }
1556
+ }
1557
+
1558
+ .tool-icon-default {
1559
+ display: inline-block;
1560
+ width: 0.5rem;
1561
+ height: 0.5rem;
1562
+ border-radius: 50%;
1563
+ background-color: currentColor;
1564
+ }
1565
+
1566
+ // Content column
1567
+ .tool-content {
1568
+ flex: 1;
1569
+
1570
+ &.with-padding {
1571
+ padding-bottom: 1rem;
1572
+ }
1573
+ }
1574
+
1575
+ .tool-status-row {
1576
+ display: flex;
1577
+ }
1578
+
1579
+ .tool-status {
1580
+ display: flex;
1581
+ align-items: center;
1582
+ border-radius: 12px;
1583
+ margin-bottom: 0.25rem;
1584
+ color: @teal;
1585
+ font-size: 0.875rem;
1586
+ font-weight: 500;
1587
+ gap: 0.25rem;
1588
+ }
1589
+
1590
+ .tool-text {
1591
+ color: #6b7280;
1592
+ font-size: 0.75rem;
1593
+
1594
+ &.expanded {
1595
+ color: @grey;
1596
+ font-size: 0.875rem;
1597
+ }
1598
+ }
1599
+ }
1600
+
1601
+ // Multi-tool renderer container styles
1602
+ .multi-tool-renderer {
1603
+ margin-bottom: 1em;
1604
+
1605
+ // Common header styles for both collapsed and summary headers
1606
+ .tools-collapsed-header,
1607
+ .tools-summary-header {
1608
+ position: relative;
1609
+ display: flex;
1610
+ align-items: center;
1611
+ justify-content: space-between;
1612
+ padding: 0.625rem 0.875rem;
1613
+ background-color: @lightGrey;
1614
+ cursor: pointer;
1615
+ transition: background-color 0.2s;
1616
+
1617
+ &:hover {
1618
+ background-color: @hoverGreyColor;
1619
+ }
1620
+
1621
+ &:focus {
1622
+ outline: 2px solid @teal;
1623
+ outline-offset: 2px;
1624
+ }
1625
+
1626
+ &:focus:not(:focus-visible) {
1627
+ outline: none;
1628
+ }
1629
+ }
1630
+
1631
+ // Tools count display
1632
+ .tools-count {
1633
+ display: flex;
1634
+ align-items: center;
1635
+ color: @grey;
1636
+ font-size: 0.875rem;
1637
+ font-weight: 600;
1638
+ gap: 0.25rem;
1639
+ }
1640
+
1641
+ // Expand/collapse chevron
1642
+ .expand-chevron {
1643
+ display: inline-flex;
1644
+ align-items: center;
1645
+ justify-content: center;
1646
+ color: @grey;
1647
+ transition: transform 0.2s ease;
1648
+
1649
+ &.expanded {
1650
+ transform: rotate(180deg);
1651
+ }
1652
+ }
1653
+
1654
+ // Tools container
1655
+ .tools-container {
1656
+ width: 100%;
1657
+ border-radius: @borderRadius;
1658
+ margin-bottom: 0.5rem;
1659
+ background-color: @lightGrey;
1660
+
1661
+ > div {
1662
+ width: 100%;
1663
+ }
1664
+
1665
+ &.collapsed-view {
1666
+ overflow: hidden;
1667
+ padding: 0;
1668
+ }
1669
+ }
1670
+
1671
+ // Tools list
1672
+ .tools-list {
1673
+ display: flex;
1674
+ flex-direction: column;
1675
+ }
1676
+
1677
+ // Collapsed tools list
1678
+ .tools-collapsed-list {
1679
+ overflow: hidden;
1680
+ max-height: 0;
1681
+ padding: 0 0.875rem;
1682
+ opacity: 0;
1683
+ transition:
1684
+ max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1),
1685
+ padding 0.3s cubic-bezier(0.4, 0, 0.2, 1),
1686
+ opacity 0.2s;
1687
+
1688
+ &.expanded {
1689
+ max-height: 500px;
1690
+ padding: 0.25rem 0.875rem;
1691
+ opacity: 1;
1692
+ }
1693
+ }
1694
+
1695
+ // Tool item wrappers
1696
+ .tool-collapsed-wrapper {
1697
+ &:not(:last-child) {
1698
+ margin-bottom: 0.25rem;
1699
+ }
1700
+ }
1701
+
1702
+ // Collapsed tool items
1703
+ .tool-item-collapsed {
1704
+ display: flex;
1705
+ align-items: center;
1706
+ padding: 0.375rem 0;
1707
+ color: @grey;
1708
+ font-size: 0.8125rem;
1709
+ gap: 0.5rem;
1710
+
1711
+ &.completed {
1712
+ opacity: 0.7;
1713
+
1714
+ .tool-collapsed-status {
1715
+ text-decoration: line-through;
1716
+ text-decoration-color: rgba(61, 82, 101, 0.4);
1717
+ }
1718
+ }
1719
+
1720
+ &.active {
1721
+ .tool-collapsed-icon {
1722
+ position: relative;
1723
+ color: @teal;
1724
+ }
1725
+
1726
+ .tool-collapsed-status {
1727
+ animation: shimmer 2.5s linear infinite;
1728
+ background: linear-gradient(
1729
+ 90deg,
1730
+ @teal 0%,
1731
+ @teal 40%,
1732
+ rgba(0, 179, 174, 0.5) 50%,
1733
+ @teal 60%,
1734
+ @teal 100%
1735
+ );
1736
+ -webkit-background-clip: text;
1737
+ background-clip: text;
1738
+ background-size: 200% 100%;
1739
+ -webkit-text-fill-color: transparent;
1740
+ }
1741
+ }
1742
+
1743
+ .tool-collapsed-icon {
1744
+ display: flex;
1745
+ width: 1rem;
1746
+ height: 1rem;
1747
+ flex-shrink: 0;
1748
+ align-items: center;
1749
+ justify-content: center;
1750
+ }
1751
+
1752
+ .tool-icon-dot {
1753
+ display: inline-block;
1754
+ width: 6px;
1755
+ height: 6px;
1756
+ border-radius: 50%;
1757
+ background-color: currentColor;
1758
+ }
1759
+
1760
+ .tool-collapsed-status {
1761
+ flex: 1;
1762
+ font-weight: 500;
1763
+ }
1764
+ }
1765
+
1766
+ // Streaming-specific styles
1767
+ &.streaming {
1768
+ .tools-count {
1769
+ &::before {
1770
+ animation: dots 1s steps(10) infinite;
1771
+ color: @teal;
1772
+ content: '⠋';
1773
+ font-family: 'DejaVu Sans', sans-serif;
1774
+ font-size: 1.1rem;
1775
+ font-weight: bold;
1776
+ }
1777
+ }
1778
+ }
1779
+
1780
+ // Complete-specific styles
1781
+ &.complete {
1782
+ .tools-collapsed-header,
1783
+ .tools-summary-header {
1784
+ margin-bottom: 1rem;
1785
+ }
1786
+
1787
+ .tools-summary-header {
1788
+ padding: 0.5em 0.8em;
1789
+ transition: all 0.2s;
1790
+ }
1791
+
1792
+ .tools-count {
1793
+ &::before {
1794
+ color: @teal;
1795
+ content: '✓';
1796
+ font-weight: bold;
1797
+ }
1798
+ }
1799
+
1800
+ .tools-expanded-content {
1801
+ overflow: hidden;
1802
+ max-height: 0;
1803
+ transition: max-height 0.3s ease-out;
1804
+
1805
+ &.visible {
1806
+ max-height: 5000px;
1807
+ transition: max-height 0.5s ease-in;
1808
+ }
1809
+ }
1810
+
1811
+ .tools-list {
1812
+ padding-top: 1em;
1813
+ }
1814
+ }
1815
+
1816
+ // Empty state
1817
+ &.empty {
1818
+ display: none;
1819
+ }
1820
+ }
1821
+
1822
+ // Tool done node styles
1823
+ .tool-done-node {
1824
+ position: relative;
1825
+
1826
+ .tool-done-connector {
1827
+ position: absolute;
1828
+ z-index: 0;
1829
+ top: -12px;
1830
+ left: 10px;
1831
+ width: 1px;
1832
+ height: 32px;
1833
+ background-color: #e5e7eb;
1834
+ }
1835
+
1836
+ .tool-done-row {
1837
+ position: relative;
1838
+ z-index: 10;
1839
+ display: flex;
1840
+ align-items: flex-start;
1841
+ padding-bottom: 0.75rem;
1842
+ color: @grey;
1843
+ gap: 0.5rem;
1844
+
1845
+ .tool-icon-wrapper {
1846
+ display: flex;
1847
+ width: 1.25rem;
1848
+ flex-direction: column;
1849
+ flex-shrink: 0;
1850
+ align-items: center;
1851
+ }
1852
+
1853
+ .tool-icon-circle {
1854
+ display: flex;
1855
+ width: 1.25rem;
1856
+ height: 1.25rem;
1857
+ flex-shrink: 0;
1858
+ align-items: center;
1859
+ justify-content: center;
1860
+ border-radius: 50%;
1861
+
1862
+ .check-icon {
1863
+ width: 0.75rem;
1864
+ height: 0.75rem;
1865
+ border-radius: 50%;
1866
+ font-size: 0.75rem;
1867
+ font-weight: bold;
1868
+ }
1869
+ }
1870
+ }
1871
+
1872
+ .tool-done-content {
1873
+ flex: 1;
1874
+ }
1875
+
1876
+ .tool-done-text {
1877
+ display: inline-block;
1878
+ font-size: 0.875rem;
1879
+ font-weight: 600;
1880
+ }
1881
+ }