@bytexbyte/nxtlinq-ai-agent-ui-react-development 0.1.1

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