@bytexbyte/nxtlinq-ai-agent-ui-react-development 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/ChatBot.d.ts +5 -0
  2. package/dist/ChatBot.d.ts.map +1 -0
  3. package/dist/ChatBot.js +35 -0
  4. package/dist/assets/images/adiSideItalicDataUri.d.ts +2 -0
  5. package/dist/assets/images/adiSideItalicDataUri.d.ts.map +1 -0
  6. package/dist/assets/images/adiSideItalicDataUri.js +1 -0
  7. package/dist/context/ChatBotContext.d.ts +5 -0
  8. package/dist/context/ChatBotContext.d.ts.map +1 -0
  9. package/dist/context/ChatBotContext.js +2908 -0
  10. package/dist/index.d.ts +5 -13
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -11
  13. package/dist/legacy/chatbot/context/ChatBotContext.d.ts.map +1 -1
  14. package/dist/legacy/chatbot/context/ChatBotContext.js +14 -0
  15. package/dist/types/ChatBotTypes.d.ts +166 -0
  16. package/dist/types/ChatBotTypes.d.ts.map +1 -0
  17. package/dist/types/ChatBotTypes.js +1 -0
  18. package/dist/ui/BerifyMeModal.d.ts +17 -0
  19. package/dist/ui/BerifyMeModal.d.ts.map +1 -0
  20. package/dist/ui/BerifyMeModal.js +110 -0
  21. package/dist/ui/ChatBotHeader.d.ts +15 -0
  22. package/dist/ui/ChatBotHeader.d.ts.map +1 -0
  23. package/dist/ui/ChatBotHeader.js +62 -0
  24. package/dist/ui/ChatBotUI.d.ts +3 -0
  25. package/dist/ui/ChatBotUI.d.ts.map +1 -0
  26. package/dist/ui/ChatBotUI.js +557 -0
  27. package/dist/ui/MessageInput.d.ts +3 -0
  28. package/dist/ui/MessageInput.d.ts.map +1 -0
  29. package/dist/ui/MessageInput.js +321 -0
  30. package/dist/ui/MessageList.d.ts +4 -0
  31. package/dist/ui/MessageList.d.ts.map +1 -0
  32. package/dist/ui/MessageList.js +455 -0
  33. package/dist/ui/ModelSelector.d.ts +4 -0
  34. package/dist/ui/ModelSelector.d.ts.map +1 -0
  35. package/dist/ui/ModelSelector.js +122 -0
  36. package/dist/ui/NotificationModal.d.ts +15 -0
  37. package/dist/ui/NotificationModal.d.ts.map +1 -0
  38. package/dist/ui/NotificationModal.js +53 -0
  39. package/dist/ui/PermissionForm.d.ts +8 -0
  40. package/dist/ui/PermissionForm.d.ts.map +1 -0
  41. package/dist/ui/PermissionForm.js +465 -0
  42. package/dist/ui/PresetMessages.d.ts +4 -0
  43. package/dist/ui/PresetMessages.d.ts.map +1 -0
  44. package/dist/ui/PresetMessages.js +33 -0
  45. package/dist/ui/VoiceModePanel.d.ts +3 -0
  46. package/dist/ui/VoiceModePanel.d.ts.map +1 -0
  47. package/dist/ui/VoiceModePanel.js +95 -0
  48. package/dist/ui/chatBotHeaderParts.d.ts +15 -0
  49. package/dist/ui/chatBotHeaderParts.d.ts.map +1 -0
  50. package/dist/ui/chatBotHeaderParts.js +50 -0
  51. package/dist/ui/index.d.ts +9 -0
  52. package/dist/ui/index.d.ts.map +1 -0
  53. package/dist/ui/index.js +8 -0
  54. package/dist/ui/styles/isolatedStyles.d.ts +73 -0
  55. package/dist/ui/styles/isolatedStyles.d.ts.map +1 -0
  56. package/dist/ui/styles/isolatedStyles.js +985 -0
  57. package/package.json +3 -3
  58. package/src/{legacy/chatbot/context → context}/ChatBotContext.tsx +0 -1
  59. package/src/index.ts +17 -40
  60. package/src/{legacy/chatbot/ui → ui}/ModelSelector.tsx +1 -1
  61. package/src/{legacy/chatbot/ui → ui}/VoiceModePanel.tsx +1 -1
  62. package/src/ui/index.ts +8 -0
  63. package/src/NxtlinqAgentChat.tsx +0 -79
  64. package/src/components/AgentAssistantShell.tsx +0 -104
  65. package/src/components/AgentComposer.tsx +0 -134
  66. package/src/components/AgentMessageList.tsx +0 -78
  67. package/src/components/AgentRemoteAudio.tsx +0 -34
  68. package/src/components/AgentVoiceBar.tsx +0 -173
  69. package/src/components/PresetMessageChips.tsx +0 -41
  70. package/src/context/AgentAssistantContext.tsx +0 -294
  71. package/src/legacy/index.ts +0 -26
  72. package/src/theme/defaultTheme.ts +0 -22
  73. package/src/types.ts +0 -65
  74. package/src/voice/useVoiceConnectOrchestration.ts +0 -117
  75. package/src/voice/useVoiceMicState.ts +0 -117
  76. package/src/voice/useVoiceTranscriptMessages.ts +0 -188
  77. package/src/voice/voiceMicConstants.ts +0 -13
  78. package/src/voice/voiceUserBubble.ts +0 -71
  79. /package/src/{legacy/chatbot/ChatBot.tsx → ChatBot.tsx} +0 -0
  80. /package/src/{legacy/assets → assets}/images/adiSideItalicDataUri.ts +0 -0
  81. /package/src/{legacy/chatbot/types → types}/ChatBotTypes.ts +0 -0
  82. /package/src/{legacy/chatbot/ui → ui}/BerifyMeModal.tsx +0 -0
  83. /package/src/{legacy/chatbot/ui → ui}/ChatBotHeader.tsx +0 -0
  84. /package/src/{legacy/chatbot/ui → ui}/ChatBotUI.tsx +0 -0
  85. /package/src/{legacy/chatbot/ui → ui}/MessageInput.tsx +0 -0
  86. /package/src/{legacy/chatbot/ui → ui}/MessageList.tsx +0 -0
  87. /package/src/{legacy/chatbot/ui → ui}/NotificationModal.tsx +0 -0
  88. /package/src/{legacy/chatbot/ui → ui}/PermissionForm.tsx +0 -0
  89. /package/src/{legacy/chatbot/ui → ui}/PresetMessages.tsx +0 -0
  90. /package/src/{legacy/chatbot/ui → ui}/chatBotHeaderParts.tsx +0 -0
  91. /package/src/{legacy/chatbot/ui → ui}/styles/isolatedStyles.ts +0 -0
@@ -0,0 +1,985 @@
1
+ import { css } from '@emotion/react';
2
+ // Light CSS Reset for SDK components - only reset problematic inherited styles
3
+ export const sdkReset = css `
4
+ /* Only reset problematic inherited styles, keep the rest */
5
+ box-sizing: border-box !important;
6
+
7
+ /* Ensure consistent font rendering */
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
9
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
10
+ sans-serif !important;
11
+
12
+ /* Reset only problematic inherited styles */
13
+ text-decoration: none !important;
14
+ text-transform: none !important;
15
+ letter-spacing: normal !important;
16
+ word-spacing: normal !important;
17
+ text-align: left !important;
18
+
19
+ /* Reset list styles if needed */
20
+ list-style: none !important;
21
+
22
+ /* Reset form elements outline */
23
+ outline: none !important;
24
+
25
+ /* Reset user select for better UX */
26
+ user-select: auto !important;
27
+ `;
28
+ // Base container styles with light isolation
29
+ export const sdkContainer = css `
30
+ /* Light isolation - only reset problematic inherited styles */
31
+ ${sdkReset}
32
+
33
+ /* Ensure all text elements have proper color inheritance */
34
+ &, & * {
35
+ color: inherit !important;
36
+ }
37
+
38
+ /* Ensure consistent box-sizing for all children */
39
+ & * {
40
+ box-sizing: border-box !important;
41
+ }
42
+
43
+ /* Light reset for buttons to prevent external button styles */
44
+ & button {
45
+ box-sizing: border-box !important;
46
+ font-family: inherit !important;
47
+ cursor: pointer !important;
48
+ }
49
+
50
+ /* Light reset for form elements */
51
+ & input, & textarea {
52
+ box-sizing: border-box !important;
53
+ font-family: inherit !important;
54
+ }
55
+
56
+ /* Light reset for text elements */
57
+ & div, & span, & p, & h1, & h2, & h3, & h4, & h5, & h6 {
58
+ box-sizing: border-box !important;
59
+ font-family: inherit !important;
60
+ }
61
+
62
+ /* Light reset for lists */
63
+ & ul, & ol, & li {
64
+ box-sizing: border-box !important;
65
+ font-family: inherit !important;
66
+ }
67
+
68
+ /* Light reset for links */
69
+ & a {
70
+ box-sizing: border-box !important;
71
+ font-family: inherit !important;
72
+ color: inherit !important;
73
+ text-decoration: none !important;
74
+ }
75
+
76
+ /* Special styling for AI Agent URL links */
77
+ & a[href^="http"], & a[href^="https"] {
78
+ color: #007bff !important;
79
+ text-decoration: underline !important;
80
+ cursor: pointer !important;
81
+ }
82
+
83
+ /* Specific class for AI Agent URL links */
84
+ & .ai-agent-url-link {
85
+ color: #007bff !important;
86
+ text-decoration: underline !important;
87
+ cursor: pointer !important;
88
+ }
89
+
90
+ /* Light reset for images */
91
+ & img {
92
+ box-sizing: border-box !important;
93
+ max-width: 100% !important;
94
+ height: auto !important;
95
+ }
96
+ `;
97
+ // Floating button styles
98
+ export const floatingButton = css `
99
+ position: fixed !important;
100
+ background-color: #007bff !important;
101
+ color: white !important;
102
+ border: none !important;
103
+ padding: 10px 20px !important;
104
+ border-radius: 20px !important;
105
+ cursor: pointer !important;
106
+ box-shadow: 0 2px 5px rgba(0,0,0,0.2) !important;
107
+ transition: all 0.3s ease !important;
108
+ z-index: 1000 !important;
109
+ font-size: 14px !important;
110
+ font-weight: 500 !important;
111
+ font-family: inherit !important;
112
+ max-width: calc(100vw - 40px) !important;
113
+ white-space: nowrap !important;
114
+
115
+ &:disabled {
116
+ cursor: not-allowed !important;
117
+ opacity: 0.6 !important;
118
+ }
119
+
120
+ &:hover:not(:disabled) {
121
+ background-color: #0056b3 !important;
122
+ transform: translateY(-2px) !important;
123
+ }
124
+
125
+ /* Responsive adjustments for small windows */
126
+ @media (max-width: 768px) {
127
+ max-width: calc(100vw - 30px) !important;
128
+ padding: 8px 16px !important;
129
+ font-size: 13px !important;
130
+ touch-action: manipulation !important;
131
+ cursor: pointer !important;
132
+ }
133
+
134
+ @media (max-width: 480px) {
135
+ max-width: calc(100vw - 20px) !important;
136
+ padding: 6px 12px !important;
137
+ font-size: 12px !important;
138
+ border-radius: 16px !important;
139
+ }
140
+
141
+ /* Ensure button is visible when viewport is very small */
142
+ @media (max-height: 200px) {
143
+ padding: 4px 8px !important;
144
+ font-size: 11px !important;
145
+ }
146
+
147
+ @media (max-width: 200px) {
148
+ padding: 4px 8px !important;
149
+ font-size: 11px !important;
150
+ }
151
+ `;
152
+ // Chat window container styles
153
+ export const chatWindow = css `
154
+ position: fixed !important;
155
+ bottom: 20px !important;
156
+ right: 20px !important;
157
+ width: 500px !important;
158
+ max-width: calc(100vw - 40px) !important;
159
+ height: 600px !important;
160
+ max-height: calc(100vh - 40px) !important;
161
+ background-color: white !important;
162
+ border-radius: 10px !important;
163
+ box-shadow: 0 5px 15px rgba(0,0,0,0.2) !important;
164
+ display: flex !important;
165
+ flex-direction: column !important;
166
+ z-index: 1001 !important;
167
+ overflow: hidden !important;
168
+ font-family: inherit !important;
169
+
170
+ /* Mobile: near-fullscreen when open (inline dimensions from ChatBotUI still apply; hosts may override) */
171
+ @media (max-width: 768px) {
172
+ width: calc(100vw - 24px) !important;
173
+ max-width: calc(100vw - 24px) !important;
174
+ height: calc(100dvh - 24px) !important;
175
+ max-height: calc(100dvh - 24px) !important;
176
+ bottom: auto !important;
177
+ right: auto !important;
178
+ border-radius: 12px !important;
179
+ }
180
+ `;
181
+ // Resize handles — one per corner (hit area above header drag strip)
182
+ const resizeCornerBase = css `
183
+ position: absolute !important;
184
+ width: 18px !important;
185
+ height: 18px !important;
186
+ border-radius: 4px !important;
187
+ background: transparent !important;
188
+ border: none !important;
189
+ box-shadow: none !important;
190
+ z-index: 10 !important;
191
+ display: grid !important;
192
+ place-items: center !important;
193
+ `;
194
+ /** @deprecated Use resizeHandleNW — kept for compatibility */
195
+ export const resizeHandle = css `
196
+ ${resizeCornerBase}
197
+ top: 6px !important;
198
+ left: 6px !important;
199
+ cursor: nwse-resize !important;
200
+ `;
201
+ export const resizeHandleNW = css `
202
+ ${resizeCornerBase}
203
+ top: 6px !important;
204
+ left: 6px !important;
205
+ cursor: nwse-resize !important;
206
+ `;
207
+ export const resizeHandleNE = css `
208
+ ${resizeCornerBase}
209
+ top: 6px !important;
210
+ right: 6px !important;
211
+ cursor: nesw-resize !important;
212
+ `;
213
+ export const resizeHandleSW = css `
214
+ ${resizeCornerBase}
215
+ bottom: 6px !important;
216
+ left: 6px !important;
217
+ cursor: nesw-resize !important;
218
+ `;
219
+ export const resizeHandleSE = css `
220
+ ${resizeCornerBase}
221
+ bottom: 6px !important;
222
+ right: 6px !important;
223
+ cursor: nwse-resize !important;
224
+ `;
225
+ // Header styles
226
+ export const chatHeader = css `
227
+ padding: 15px !important;
228
+ background-color: #007bff !important;
229
+ color: white !important;
230
+ border-radius: 10px 10px 0 0 !important;
231
+ display: flex !important;
232
+ justify-content: space-between !important;
233
+ align-items: center !important;
234
+ font-family: inherit !important;
235
+ `;
236
+ // Header title styles
237
+ export const headerTitle = css `
238
+ margin: 0 !important;
239
+ font-size: 16px !important;
240
+ font-weight: 600 !important;
241
+ color: white !important;
242
+ font-family: inherit !important;
243
+ `;
244
+ // Header button styles
245
+ export const headerButton = css `
246
+ background: none !important;
247
+ border: none !important;
248
+ color: white !important;
249
+ font-size: 18px !important;
250
+ cursor: pointer !important;
251
+ padding: 0 !important;
252
+ display: flex !important;
253
+ align-items: center !important;
254
+ justify-content: center !important;
255
+ border-radius: 4px !important;
256
+ transition: background-color 0.2s !important;
257
+ font-family: inherit !important;
258
+ width: 32px !important;
259
+ height: 32px !important;
260
+ line-height: 0 !important;
261
+ vertical-align: middle !important;
262
+
263
+ &:disabled {
264
+ cursor: not-allowed !important;
265
+ opacity: 0.6 !important;
266
+ }
267
+
268
+ &:hover:not(:disabled) {
269
+ background-color: rgba(255, 255, 255, 0.2) !important;
270
+ }
271
+ `;
272
+ // Close button styles
273
+ export const closeButton = css `
274
+ background: none !important;
275
+ border: none !important;
276
+ color: white !important;
277
+ font-size: 18px !important;
278
+ cursor: pointer !important;
279
+ padding: 0 !important;
280
+ display: flex !important;
281
+ align-items: center !important;
282
+ justify-content: center !important;
283
+ font-family: inherit !important;
284
+ width: 32px !important;
285
+ height: 32px !important;
286
+ line-height: 0 !important;
287
+ vertical-align: middle !important;
288
+
289
+ &:disabled {
290
+ cursor: not-allowed !important;
291
+ opacity: 0.6 !important;
292
+ }
293
+ `;
294
+ // Message list container styles
295
+ export const messageListContainer = css `
296
+ flex: 1 !important;
297
+ padding: 15px !important;
298
+ overflow-y: auto !important;
299
+ overflow-x: hidden !important;
300
+ display: flex !important;
301
+ flex-direction: column !important;
302
+ gap: 10px !important;
303
+ font-family: inherit !important;
304
+ `;
305
+ // Message bubble styles
306
+ export const messageBubble = css `
307
+ align-self: flex-start !important;
308
+ max-width: 80% !important;
309
+ margin-bottom: 10px !important;
310
+ font-family: inherit !important;
311
+ `;
312
+ // User message styles
313
+ export const userMessage = css `
314
+ align-self: flex-end !important;
315
+ width: fit-content !important;
316
+ max-width: 80% !important;
317
+ margin-bottom: 10px !important;
318
+ font-family: inherit !important;
319
+ `;
320
+ // Message content styles
321
+ export const messageContent = css `
322
+ background-color: #f1f1f1 !important;
323
+ color: #333 !important;
324
+ padding: 10px 15px !important;
325
+ border-radius: 15px !important;
326
+ word-wrap: break-word !important;
327
+ position: relative !important;
328
+ font-family: inherit !important;
329
+ `;
330
+ // User message content styles
331
+ export const userMessageContent = css `
332
+ background-color: #007bff !important;
333
+ color: white !important;
334
+ padding: 10px 15px !important;
335
+ border-radius: 15px !important;
336
+ word-wrap: break-word !important;
337
+ position: relative !important;
338
+ font-family: inherit !important;
339
+ `;
340
+ // Retry message content styles
341
+ export const retryMessageContent = css `
342
+ background-color: #fff3cd !important;
343
+ color: #856404 !important;
344
+ padding: 10px 15px !important;
345
+ border-radius: 15px !important;
346
+ word-wrap: break-word !important;
347
+ position: relative !important;
348
+ border: 1px solid #ffeaa7 !important;
349
+ font-family: inherit !important;
350
+ `;
351
+ // Chatbot button styles (for buttons inside chatbot window)
352
+ export const chatbotButton = css `
353
+ padding: 8px 16px !important;
354
+ background-color: #007bff !important;
355
+ color: white !important;
356
+ border: none !important;
357
+ border-radius: 5px !important;
358
+ cursor: pointer !important;
359
+ font-size: 14px !important;
360
+ font-family: inherit !important;
361
+
362
+ &:disabled {
363
+ background-color: #6c757d !important;
364
+ cursor: not-allowed !important;
365
+ opacity: 0.8 !important;
366
+ }
367
+ `;
368
+ // Action button styles (for buttons outside chatbot window)
369
+ export const actionButton = css `
370
+ padding: 8px 16px !important;
371
+ background-color: #007bff !important;
372
+ color: white !important;
373
+ border: none !important;
374
+ border-radius: 5px !important;
375
+ cursor: pointer !important;
376
+ font-size: 14px !important;
377
+ font-family: inherit !important;
378
+
379
+ &:disabled {
380
+ background-color: #6c757d !important;
381
+ cursor: not-allowed !important;
382
+ opacity: 0.8 !important;
383
+ }
384
+ `;
385
+ // Connected button styles
386
+ export const connectedButton = css `
387
+ padding: 8px 16px !important;
388
+ background-color: #28a745 !important;
389
+ color: white !important;
390
+ border: none !important;
391
+ border-radius: 5px !important;
392
+ cursor: pointer !important;
393
+ font-size: 14px !important;
394
+ font-family: inherit !important;
395
+
396
+ &:disabled {
397
+ cursor: not-allowed !important;
398
+ opacity: 0.8 !important;
399
+ }
400
+ `;
401
+ // Loading indicator styles
402
+ export const loadingIndicator = css `
403
+ align-self: flex-start !important;
404
+ background-color: #f1f1f1 !important;
405
+ color: #333 !important;
406
+ padding: 10px 15px !important;
407
+ border-radius: 15px !important;
408
+ max-width: 80% !important;
409
+ font-family: inherit !important;
410
+ `;
411
+ // Model indicator styles
412
+ export const modelIndicator = css `
413
+ display: flex !important;
414
+ align-items: center !important;
415
+ margin-top: 4px !important;
416
+ margin-left: 8px !important;
417
+ font-family: inherit !important;
418
+ `;
419
+ // Model badge styles
420
+ export const modelBadge = css `
421
+ background-color: #e3f2fd !important;
422
+ color: #1976d2 !important;
423
+ padding: 2px 8px !important;
424
+ border-radius: 10px !important;
425
+ font-size: 10px !important;
426
+ font-weight: 500 !important;
427
+ border: 1px solid #bbdefb !important;
428
+ display: flex !important;
429
+ align-items: center !important;
430
+ gap: 4px !important;
431
+ font-family: inherit !important;
432
+ `;
433
+ // Model dot styles
434
+ export const modelDot = css `
435
+ width: 6px !important;
436
+ height: 6px !important;
437
+ background-color: #1976d2 !important;
438
+ border-radius: 50% !important;
439
+ display: inline-block !important;
440
+ `;
441
+ // Toast notification styles
442
+ export const toastNotification = css `
443
+ position: fixed !important;
444
+ padding: 12px 24px !important;
445
+ border-radius: 8px !important;
446
+ z-index: 2000 !important;
447
+ font-weight: 600 !important;
448
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
449
+ transition: all 0.3s ease !important;
450
+ display: flex !important;
451
+ align-items: center !important;
452
+ gap: 12px !important;
453
+ min-width: 300px !important;
454
+ max-width: 500px !important;
455
+ font-family: inherit !important;
456
+ `;
457
+ // Success toast styles
458
+ export const successToast = css `
459
+ ${toastNotification}
460
+ background: #4caf50 !important;
461
+ color: white !important;
462
+ `;
463
+ // Error toast styles
464
+ export const errorToast = css `
465
+ ${toastNotification}
466
+ background: #f44336 !important;
467
+ color: white !important;
468
+ `;
469
+ // Warning toast styles
470
+ export const warningToast = css `
471
+ ${toastNotification}
472
+ background: #ff9800 !important;
473
+ color: white !important;
474
+ `;
475
+ // Info toast styles
476
+ export const infoToast = css `
477
+ ${toastNotification}
478
+ background: #2196f3 !important;
479
+ color: white !important;
480
+ `;
481
+ // Toast close button styles
482
+ export const toastCloseButton = css `
483
+ background: none !important;
484
+ border: none !important;
485
+ color: white !important;
486
+ font-size: 18px !important;
487
+ cursor: pointer !important;
488
+ padding: 4px !important;
489
+ display: flex !important;
490
+ align-items: center !important;
491
+ justify-content: center !important;
492
+ border-radius: 4px !important;
493
+ transition: background-color 0.2s !important;
494
+ font-family: inherit !important;
495
+
496
+ &:hover {
497
+ background-color: rgba(255, 255, 255, 0.2) !important;
498
+ }
499
+ `;
500
+ // Modal overlay styles
501
+ export const modalOverlay = css `
502
+ position: fixed !important;
503
+ top: 0 !important;
504
+ left: 0 !important;
505
+ right: 0 !important;
506
+ bottom: 0 !important;
507
+ background-color: rgba(0, 0, 0, 0.5) !important;
508
+ display: flex !important;
509
+ align-items: center !important;
510
+ justify-content: center !important;
511
+ z-index: 1002 !important;
512
+ padding: 20px !important;
513
+
514
+ /* Mobile responsive adjustments */
515
+ @media (max-width: 768px) {
516
+ padding: 15px !important;
517
+ align-items: flex-start !important;
518
+ padding-top: 20px !important;
519
+ }
520
+
521
+ @media (max-width: 480px) {
522
+ padding: 10px !important;
523
+ align-items: flex-start !important;
524
+ padding-top: 15px !important;
525
+ }
526
+ `;
527
+ // IDV banner styles
528
+ export const idvBanner = css `
529
+ background-color: #fff3cd !important;
530
+ border: 1px solid #ffeaa7 !important;
531
+ border-left: 4px solid #f39c12 !important;
532
+ margin: 16px !important;
533
+ padding: 16px !important;
534
+ border-radius: 8px !important;
535
+ display: flex !important;
536
+ align-items: center !important;
537
+ gap: 12px !important;
538
+ font-family: inherit !important;
539
+ `;
540
+ // IDV banner title styles
541
+ export const idvBannerTitle = css `
542
+ margin: 0 0 8px 0 !important;
543
+ font-size: 14px !important;
544
+ font-weight: 600 !important;
545
+ color: #856404 !important;
546
+ font-family: inherit !important;
547
+ `;
548
+ // IDV banner text styles
549
+ export const idvBannerText = css `
550
+ margin: 0 0 12px 0 !important;
551
+ font-size: 13px !important;
552
+ color: #856404 !important;
553
+ line-height: 1.4 !important;
554
+ font-family: inherit !important;
555
+ `;
556
+ // IDV verify button styles
557
+ export const idvVerifyButton = css `
558
+ padding: 8px 16px !important;
559
+ background-color: #f39c12 !important;
560
+ color: white !important;
561
+ border: none !important;
562
+ border-radius: 6px !important;
563
+ cursor: pointer !important;
564
+ font-size: 13px !important;
565
+ font-weight: 500 !important;
566
+ transition: background-color 0.2s !important;
567
+ font-family: inherit !important;
568
+
569
+ &:disabled {
570
+ cursor: not-allowed !important;
571
+ opacity: 0.6 !important;
572
+ }
573
+
574
+ &:hover:not(:disabled) {
575
+ background-color: #e67e22 !important;
576
+ }
577
+ `;
578
+ // IDV dismiss button styles
579
+ export const idvDismissButton = css `
580
+ background: none !important;
581
+ border: none !important;
582
+ color: #856404 !important;
583
+ font-size: 18px !important;
584
+ cursor: pointer !important;
585
+ padding: 4px !important;
586
+ border-radius: 4px !important;
587
+ transition: background-color 0.2s !important;
588
+ font-family: inherit !important;
589
+
590
+ &:disabled {
591
+ cursor: not-allowed !important;
592
+ opacity: 0.6 !important;
593
+ }
594
+
595
+ &:hover:not(:disabled) {
596
+ background-color: rgba(133, 100, 4, 0.1) !important;
597
+ }
598
+ `;
599
+ // Loading spinner styles
600
+ export const loadingSpinner = css `
601
+ width: 12px !important;
602
+ height: 12px !important;
603
+ border: 2px solid rgba(255, 255, 255, 0.3) !important;
604
+ border-top: 2px solid white !important;
605
+ border-radius: 50% !important;
606
+ animation: spin 1s linear infinite !important;
607
+ `;
608
+ // Streaming partial text block (token-level)
609
+ export const streamingPartialText = css `
610
+ color: #333 !important;
611
+ white-space: pre-wrap !important;
612
+ word-break: break-word !important;
613
+ `;
614
+ // Streaming indicator container styles
615
+ export const streamingContainer = css `
616
+ margin-bottom: 12px !important;
617
+ padding: 12px !important;
618
+ background: linear-gradient(135deg, #f5f7fa 0%, #e8eef5 100%) !important;
619
+ border-radius: 8px !important;
620
+ border-left: 3px solid #667eea !important;
621
+ font-family: inherit !important;
622
+ `;
623
+ // Streaming header styles
624
+ export const streamingHeader = css `
625
+ display: flex !important;
626
+ align-items: center !important;
627
+ gap: 8px !important;
628
+ margin-bottom: 8px !important;
629
+ font-family: inherit !important;
630
+ `;
631
+ // Streaming icon styles
632
+ export const streamingIcon = css `
633
+ font-size: 16px !important;
634
+ animation: pulse 1.5s ease-in-out infinite !important;
635
+
636
+ @keyframes pulse {
637
+ 0%, 100% {
638
+ opacity: 1 !important;
639
+ transform: scale(1) !important;
640
+ }
641
+ 50% {
642
+ opacity: 0.6 !important;
643
+ transform: scale(1.1) !important;
644
+ }
645
+ }
646
+ `;
647
+ // Streaming tool name styles
648
+ export const streamingToolName = css `
649
+ font-weight: 600 !important;
650
+ color: #667eea !important;
651
+ font-size: 14px !important;
652
+ font-family: inherit !important;
653
+ `;
654
+ // Streaming progress percentage styles
655
+ export const streamingProgressPercent = css `
656
+ margin-left: auto !important;
657
+ color: #888 !important;
658
+ font-size: 12px !important;
659
+ font-weight: 600 !important;
660
+ font-family: inherit !important;
661
+ `;
662
+ // Streaming progress bar container styles
663
+ export const streamingProgressContainer = css `
664
+ width: 100% !important;
665
+ height: 4px !important;
666
+ background: rgba(102, 126, 234, 0.1) !important;
667
+ border-radius: 2px !important;
668
+ overflow: hidden !important;
669
+ margin-bottom: 8px !important;
670
+ `;
671
+ // Streaming progress bar fill styles
672
+ export const streamingProgressBar = css `
673
+ height: 100% !important;
674
+ background: linear-gradient(90deg, #667eea, #764ba2) !important;
675
+ transition: width 0.3s ease !important;
676
+ `;
677
+ // Streaming status message styles
678
+ export const streamingStatus = css `
679
+ font-size: 13px !important;
680
+ color: #555 !important;
681
+ font-style: italic !important;
682
+ font-family: inherit !important;
683
+ `;
684
+ // Streaming caret (blinking)
685
+ export const streamingCaret = css `
686
+ margin-left: 2px !important;
687
+ animation: blink 1s infinite !important;
688
+
689
+ @keyframes blink {
690
+ 0%, 50% {
691
+ opacity: 1 !important;
692
+ }
693
+ 51%, 100% {
694
+ opacity: 0 !important;
695
+ }
696
+ }
697
+ `;
698
+ // Streaming steps container styles
699
+ export const streamingStepsContainer = css `
700
+ margin-top: 8px !important;
701
+ font-size: 12px !important;
702
+ font-family: inherit !important;
703
+ `;
704
+ // Streaming step item styles
705
+ export const streamingStepItem = css `
706
+ display: flex !important;
707
+ align-items: center !important;
708
+ gap: 6px !important;
709
+ margin-top: 4px !important;
710
+ color: #666 !important;
711
+ font-family: inherit !important;
712
+ `;
713
+ // Streaming step checkmark styles
714
+ export const streamingStepCheck = css `
715
+ color: #4caf50 !important;
716
+ `;
717
+ // ===== PII Pipeline Stepper Styles =====
718
+ // Stepper outer container — flex, right-aligned for user messages
719
+ export const piiStepperContainer = css `
720
+ display: flex !important;
721
+ align-items: center !important;
722
+ gap: 4px !important;
723
+ margin-top: 6px !important;
724
+ justify-content: flex-end !important;
725
+ font-family: inherit !important;
726
+ font-size: 11px !important;
727
+ font-weight: 500 !important;
728
+ max-width: 100% !important;
729
+ overflow: hidden !important;
730
+ `;
731
+ // Arrow between steps
732
+ export const piiStepArrow = css `
733
+ color: #bdbdbd !important;
734
+ font-size: 10px !important;
735
+ margin: 0 1px !important;
736
+ user-select: none !important;
737
+ `;
738
+ // Step base style
739
+ export const piiStepBase = css `
740
+ display: inline-flex !important;
741
+ align-items: center !important;
742
+ gap: 3px !important;
743
+ padding: 2px 7px !important;
744
+ border-radius: 10px !important;
745
+ font-size: 10px !important;
746
+ font-weight: 500 !important;
747
+ white-space: nowrap !important;
748
+ transition: all 0.2s ease !important;
749
+ font-family: inherit !important;
750
+ `;
751
+ // Active step — green with pulse
752
+ export const piiStepActiveStyle = css `
753
+ background-color: #e8f5e9 !important;
754
+ color: #2e7d32 !important;
755
+ border: 1px solid #a5d6a7 !important;
756
+
757
+ @keyframes piiPulse {
758
+ 0%, 100% { opacity: 1; }
759
+ 50% { opacity: 0.5; }
760
+ }
761
+ animation: piiPulse 1.5s ease-in-out infinite !important;
762
+ `;
763
+ // Done step — green checkmark
764
+ export const piiStepDoneStyle = css `
765
+ background-color: #e8f5e9 !important;
766
+ color: #2e7d32 !important;
767
+ border: 1px solid #c8e6c9 !important;
768
+ `;
769
+ // Pending step — grey
770
+ export const piiStepPendingStyle = css `
771
+ background-color: #f5f5f5 !important;
772
+ color: #9e9e9e !important;
773
+ border: 1px solid #e0e0e0 !important;
774
+ `;
775
+ // Badge outer container — column layout keeps badge anchored right
776
+ export const piiBadgeContainer = css `
777
+ display: flex !important;
778
+ flex-direction: column !important;
779
+ align-items: flex-end !important;
780
+ margin-top: 6px !important;
781
+ `;
782
+ // Clickable badge button
783
+ export const piiBadgeButton = css `
784
+ display: inline-flex !important;
785
+ align-items: center !important;
786
+ gap: 5px !important;
787
+ padding: 3px 10px !important;
788
+ background-color: #e8f5e9 !important;
789
+ color: #2e7d32 !important;
790
+ border: 1px solid #c8e6c9 !important;
791
+ border-radius: 10px !important;
792
+ font-size: 11px !important;
793
+ font-weight: 500 !important;
794
+ cursor: pointer !important;
795
+ font-family: inherit !important;
796
+ transition: background-color 0.2s ease !important;
797
+ line-height: 1.4 !important;
798
+
799
+ &:hover {
800
+ background-color: #c8e6c9 !important;
801
+ }
802
+ `;
803
+ // Detail panel (expanded under badge) — fixed width prevents layout shift
804
+ export const piiDetailPanel = css `
805
+ margin-top: 6px !important;
806
+ padding: 10px 12px !important;
807
+ background-color: #fafafa !important;
808
+ border: 1px solid #e0e0e0 !important;
809
+ border-radius: 8px !important;
810
+ font-size: 11px !important;
811
+ font-family: inherit !important;
812
+ width: max-content !important;
813
+ max-width: 100% !important;
814
+ `;
815
+ // Mini pipeline row inside detail panel
816
+ export const piiMiniPipeline = css `
817
+ display: flex !important;
818
+ align-items: center !important;
819
+ gap: 4px !important;
820
+ margin-bottom: 8px !important;
821
+ padding-bottom: 8px !important;
822
+ border-bottom: 1px solid #e0e0e0 !important;
823
+ font-size: 10px !important;
824
+ font-weight: 500 !important;
825
+ `;
826
+ // Mapping table container
827
+ export const piiMappingTable = css `
828
+ display: flex !important;
829
+ flex-direction: column !important;
830
+ gap: 4px !important;
831
+ `;
832
+ // Single mapping row
833
+ export const piiMappingRow = css `
834
+ display: flex !important;
835
+ align-items: center !important;
836
+ gap: 6px !important;
837
+ font-size: 11px !important;
838
+ line-height: 1.4 !important;
839
+ `;
840
+ // Original value — red strikethrough
841
+ export const piiMappingOriginal = css `
842
+ color: #d32f2f !important;
843
+ text-decoration: line-through !important;
844
+ font-family: inherit !important;
845
+ `;
846
+ // Token value — blue monospace
847
+ export const piiMappingToken = css `
848
+ color: #1565c0 !important;
849
+ font-family: monospace !important;
850
+ font-weight: 600 !important;
851
+ `;
852
+ // "No sensitive data found" indicator with fadeOut
853
+ export const piiNoPiiIndicator = css `
854
+ display: flex !important;
855
+ align-items: center !important;
856
+ justify-content: flex-end !important;
857
+ gap: 5px !important;
858
+ margin-top: 6px !important;
859
+ font-size: 11px !important;
860
+ font-weight: 500 !important;
861
+ color: #66bb6a !important;
862
+ font-family: inherit !important;
863
+
864
+ @keyframes piiFadeOut {
865
+ 0% { opacity: 1; }
866
+ 70% { opacity: 1; }
867
+ 100% { opacity: 0; }
868
+ }
869
+ animation: piiFadeOut 2s ease-out forwards !important;
870
+ `;
871
+ // Shimmer overlay on original text while PII pipeline is scanning (steps 0-1)
872
+ // Uses negative margin/padding to extend ::after over the full bubble (including parent padding)
873
+ export const piiScanningShimmer = css `
874
+ position: relative !important;
875
+ /* Extend this div to cover parent's padding area */
876
+ margin: -10px -15px !important;
877
+ padding: 10px 15px !important;
878
+ overflow: hidden !important;
879
+ border-radius: 15px !important;
880
+
881
+ &::after {
882
+ content: '' !important;
883
+ position: absolute !important;
884
+ top: 0 !important;
885
+ left: 0 !important;
886
+ width: 100% !important;
887
+ height: 100% !important;
888
+ background: linear-gradient(
889
+ 90deg,
890
+ transparent 0%,
891
+ rgba(255, 255, 255, 0.1) 40%,
892
+ rgba(255, 255, 255, 0.28) 50%,
893
+ rgba(255, 255, 255, 0.1) 60%,
894
+ transparent 100%
895
+ ) !important;
896
+ pointer-events: none !important;
897
+ border-radius: 15px !important;
898
+
899
+ @keyframes piiShimmer {
900
+ 0% { transform: translateX(-150%); }
901
+ 100% { transform: translateX(150%); }
902
+ }
903
+ animation: piiShimmer 1.8s ease-in-out infinite !important;
904
+ }
905
+ `;
906
+ // Content swap-in animation — scan sweep + fade (plays when content switches to redacted)
907
+ export const piiContentSwapIn = css `
908
+ position: relative !important;
909
+ overflow: hidden !important;
910
+
911
+ @keyframes piiContentFadeIn {
912
+ 0% { opacity: 0.15; }
913
+ 40% { opacity: 0.5; }
914
+ 100% { opacity: 1; }
915
+ }
916
+ animation: piiContentFadeIn 1.2s ease-out !important;
917
+
918
+ /* Green scan line sweeping across */
919
+ &::after {
920
+ content: '' !important;
921
+ position: absolute !important;
922
+ top: 0 !important;
923
+ left: 0 !important;
924
+ width: 100% !important;
925
+ height: 100% !important;
926
+ background: linear-gradient(
927
+ 90deg,
928
+ transparent 0%,
929
+ rgba(46, 125, 50, 0.05) 30%,
930
+ rgba(46, 125, 50, 0.25) 48%,
931
+ rgba(255, 255, 255, 0.4) 50%,
932
+ rgba(46, 125, 50, 0.25) 52%,
933
+ rgba(46, 125, 50, 0.05) 70%,
934
+ transparent 100%
935
+ ) !important;
936
+ pointer-events: none !important;
937
+ border-radius: inherit !important;
938
+
939
+ @keyframes piiScanSweep {
940
+ 0% { transform: translateX(-150%); }
941
+ 100% { transform: translateX(150%); }
942
+ }
943
+ animation: piiScanSweep 1.4s ease-in-out forwards !important;
944
+ }
945
+ `;
946
+ // Static token style (no animation — for loaded history)
947
+ export const piiContentStatic = css ``;
948
+ // Token reveal glow animation (applied to individual tokens during live transition)
949
+ // Uses animation-fill-mode: both — keyframe 0% applies BEFORE delay, 100% sticks AFTER.
950
+ // Do NOT set opacity on the element itself — let the animation control it.
951
+ export const piiTokenReveal = css `
952
+ display: inline !important;
953
+ font-family: monospace !important;
954
+ font-weight: 400 !important;
955
+
956
+ @keyframes piiTokenGlow {
957
+ 0% {
958
+ opacity: 0;
959
+ background-color: rgba(46, 125, 50, 0.5);
960
+ color: #1b5e20;
961
+ box-shadow: 0 0 12px rgba(46, 125, 50, 0.5);
962
+ transform: scale(1.08);
963
+ }
964
+ 30% {
965
+ opacity: 1;
966
+ background-color: rgba(46, 125, 50, 0.3);
967
+ box-shadow: 0 0 8px rgba(46, 125, 50, 0.3);
968
+ transform: scale(1.02);
969
+ }
970
+ 70% {
971
+ opacity: 1;
972
+ background-color: rgba(46, 125, 50, 0.1);
973
+ box-shadow: 0 0 2px rgba(46, 125, 50, 0.1);
974
+ transform: scale(1.0);
975
+ }
976
+ 100% {
977
+ opacity: 1;
978
+ background-color: transparent;
979
+ color: inherit;
980
+ box-shadow: none;
981
+ transform: scale(1.0);
982
+ }
983
+ }
984
+ animation: piiTokenGlow 1.0s ease-out both !important;
985
+ `;