PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.0.0
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.0.0
3.5.9 3.5.8 3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / themes / sass / _common.scss
ai-engine / themes / sass Last commit date
_common.scss 10 months ago chatgpt.scss 10 months ago messages.scss 10 months ago timeless.scss 10 months ago
_common.scss
1974 lines
1 // main: chatgpt.scss, messages.scss
2
3 @mixin discussions-styles {
4 &.mwai-discussions {
5 border-radius: var(--mwai-borderRadius);
6 background: var(--mwai-backgroundHeaderColor);
7 overflow: hidden;
8
9 * {
10 box-sizing: border-box;
11 }
12
13 .mwai-discussion {
14 display: flex;
15 position: relative;
16 padding-left: calc(var(--mwai-spacing) / 2);
17 padding-right: calc(var(--mwai-spacing) / 2);
18 padding-bottom: calc(var(--mwai-spacing) / 2);
19 color: var(--mwai-conversationsTextColor);
20 opacity: 0.65;
21 align-items: center;
22
23 .mwai-discussion-content {
24 flex: 1;
25 padding: 5px 10px;
26 overflow: hidden;
27 }
28
29 .mwai-discussion-title {
30 display: block;
31 overflow: hidden;
32 text-overflow: ellipsis;
33 white-space: nowrap;
34 font-size: var(--mwai-fontSize);
35 margin-bottom: 4px;
36 }
37
38 .mwai-discussion-info {
39 display: flex;
40 gap: 12px;
41 font-size: calc(var(--mwai-fontSize) * 0.85);
42 opacity: 0.7;
43
44 .mwai-info-item {
45 display: flex;
46 align-items: center;
47 gap: 4px;
48
49 svg {
50 opacity: 0.6;
51 }
52 }
53 }
54
55 .mwai-discussion-actions {
56 position: absolute;
57 top: 50%;
58 right: calc(var(--mwai-spacing) / 2);
59 transform: translateY(-50%);
60 opacity: 0;
61 transition: opacity 0.2s ease-out;
62 z-index: 100;
63
64 .mwai-menu-icon {
65 width: 28px;
66 height: 28px;
67 display: flex;
68 align-items: center;
69 justify-content: center;
70 cursor: pointer;
71 color: var(--mwai-conversationsTextColor);
72 }
73
74 }
75
76 &.mwai-active {
77 cursor: pointer;
78
79 .mwai-discussion-content {
80 background: var(--mwai-backgroundPrimaryColor);
81 border-radius: var(--mwai-borderRadius);
82 opacity: 1;
83 }
84 }
85
86 &:hover {
87 cursor: pointer;
88
89 .mwai-discussion-content {
90 background: var(--mwai-backgroundPrimaryColor);
91 border-radius: var(--mwai-borderRadius);
92 opacity: 1;
93 }
94
95 .mwai-discussion-actions {
96 opacity: 1;
97 }
98 }
99
100 // Keep actions visible when menu is open
101 &:has(.mwai-context-menu) {
102 .mwai-discussion-actions {
103 opacity: 1;
104 }
105 }
106
107 &:first-child {
108 margin-top: calc(var(--mwai-spacing) / 2);
109 }
110 }
111
112 .mwai-header {
113 color: var(--mwai-headerColor);
114 padding: var(--mwai-spacing);
115 display: flex;
116 justify-content: space-between;
117 align-items: center;
118 gap: 10px;
119
120 button {
121 background: var(--mwai-backgroundPrimaryColor);
122 color: var(--mwai-fontColor);
123 border: none;
124 padding: 8px 16px;
125 border-radius: var(--mwai-borderRadius);
126 cursor: pointer;
127 transition: all 0.2s ease-out;
128
129 &:hover:not(:disabled) {
130 background: var(--mwai-iconTextBackgroundColor);
131 }
132
133 &:disabled {
134 opacity: 0.5;
135 cursor: not-allowed;
136 }
137 }
138
139 .mwai-refresh-btn {
140 padding: 8px;
141 display: flex;
142 align-items: center;
143 justify-content: center;
144 }
145 }
146
147 .mwai-body {
148 background: var(--mwai-conversationsBackgroundColor);
149 list-style: none;
150 padding: 0;
151 margin: 0;
152 position: relative;
153 min-height: 200px;
154 display: flex;
155 flex-direction: column;
156 border-radius: 0;
157 z-index: 1;
158 }
159
160 .mwai-loading-overlay {
161 position: absolute;
162 top: 0;
163 left: 0;
164 right: 0;
165 bottom: 0;
166 background: var(--mwai-conversationsBackgroundColor);
167 opacity: 0.9;
168 display: flex;
169 align-items: center;
170 justify-content: center;
171 z-index: 10;
172 }
173
174 .mwai-spinner {
175 animation: spin 1s linear infinite;
176 color: var(--mwai-fontColor);
177 }
178
179 @keyframes spin {
180 from { transform: rotate(0deg); }
181 to { transform: rotate(360deg); }
182 }
183
184 .mwai-pagination {
185 background: var(--mwai-backgroundHeaderColor);
186 padding: var(--mwai-spacing);
187 display: flex;
188 justify-content: space-between;
189 align-items: center;
190 border-top: 1px solid var(--mwai-backgroundPrimaryColor);
191
192 button {
193 background: var(--mwai-backgroundPrimaryColor);
194 color: var(--mwai-fontColor);
195 border: none;
196 padding: 8px 12px;
197 border-radius: var(--mwai-borderRadius);
198 cursor: pointer;
199 transition: all 0.2s ease-out;
200 display: flex;
201 align-items: center;
202 justify-content: center;
203
204 &:hover:not(:disabled) {
205 background: var(--mwai-iconTextBackgroundColor);
206 }
207
208 &:disabled {
209 opacity: 0.3;
210 cursor: not-allowed;
211 }
212 }
213
214 span {
215 color: var(--mwai-headerColor);
216 font-size: var(--mwai-fontSize);
217 font-weight: 500;
218 }
219
220 .mwai-page-indicator {
221 color: var(--mwai-headerColor);
222 font-size: calc(var(--mwai-fontSize) * 0.85);
223 font-weight: 400;
224 opacity: 0.8;
225 }
226 }
227 }
228 }
229
230 @mixin file-upload-icon-sprites {
231 $icon-size: 32px;
232
233 &.mwai-idle-add {
234 background-position: -1 * $icon-size -3 * $icon-size;
235 }
236
237 &.mwai-image-add {
238 background-position: -1 * $icon-size -0 * $icon-size;
239 }
240
241 &.mwai-image-up {
242 background-position: -2 * $icon-size -0 * $icon-size;
243 }
244
245 &.mwai-image-del {
246 background-position: -3 * $icon-size -0 * $icon-size;
247 }
248
249 &.mwai-image-ok {
250 background-position: -4 * $icon-size -0 * $icon-size;
251 }
252
253 &.mwai-document-add {
254 background-position: -1 * $icon-size -2 * $icon-size;
255 }
256
257 &.mwai-document-up {
258 background-position: -2 * $icon-size -2 * $icon-size;
259 }
260
261 &.mwai-document-del {
262 background-position: -3 * $icon-size -2 * $icon-size;
263 }
264
265 &.mwai-document-ok {
266 background-position: -4 * $icon-size -2 * $icon-size;
267 }
268
269 .mwai-file-upload-progress {
270 position: absolute;
271 font-size: 8px;
272 width: 21px;
273 top: 24px;
274 left: 23px;
275 overflow: hidden;
276 text-align: center;
277 font-weight: bold;
278 color: white;
279 }
280 }
281
282 @mixin microphone {
283
284 display: flex;
285 justify-content: center;
286 align-items: center;
287
288 svg {
289 opacity: 0.5;
290 filter: grayscale(100%);
291 transition: opacity 0.3s ease-out;
292 cursor: pointer;
293 }
294
295 &[active=true]=true] svg {
296 opacity: 1;
297 }
298
299 &[disabled]] svg {
300 opacity: 0;
301 cursor: not-allowed;
302 }
303 }
304
305 @mixin fullscreen-window {
306 position: fixed;
307 left: 0 !important;
308 right: 0 !important;
309 bottom: 0 !important;
310 top: 0 !important;
311 width: 100%;
312 height: 100%;
313 max-height: 100%;
314 max-width: 100%;
315 display: flex;
316 flex-direction: column;
317 margin: 0;
318 z-index: 999999;
319 background-color: var(--mwai-backgroundSecondaryColor);
320
321 .mwai-header {
322 border-radius: 0;
323 }
324
325 .mwai-body {
326 height: 100%;
327 max-height: inherit;
328 border-radius: 0;
329 display: flex !important;
330 flex-direction: column !important;
331
332 .mwai-conversation {
333 flex: 0 1 auto !important; // Can shrink but doesn't grow by default - important to override theme styles
334 max-height: none;
335 overflow-y: auto;
336 min-height: 0; // Important for flexbox to allow shrinking
337 }
338
339 // Spacer for fullscreen mode to push input to bottom
340 .mwai-fullscreen-spacer {
341 flex: 1 1 auto !important;
342 min-height: 0;
343 }
344
345 // Ensure input and footer stay at bottom
346 .mwai-input {
347 flex: 0 0 auto;
348 }
349
350 .mwai-footer {
351 flex: 0 0 auto;
352 }
353
354 .mwai-files {
355 flex: 0 0 auto;
356 }
357 }
358 }
359
360 // Mobile-specific fullscreen that handles safe areas and animations
361 @mixin mobile-fullscreen-window {
362 position: fixed;
363 // Use env() for safe area insets on modern mobile devices
364 top: 0 !important;
365 top: env(safe-area-inset-top, 0) !important;
366 left: 0 !important;
367 left: env(safe-area-inset-left, 0) !important;
368 right: 0 !important;
369 right: env(safe-area-inset-right, 0) !important;
370 bottom: 0 !important;
371 bottom: env(safe-area-inset-bottom, 0) !important;
372
373 width: 100%;
374 height: 100%;
375 height: 100vh;
376 height: 100dvh; // Dynamic viewport height for mobile browsers
377 max-height: 100%;
378 max-width: 100%;
379 margin: 0;
380 z-index: 999999;
381 // Use backgroundPrimaryColor as fallback, then backgroundSecondaryColor if that doesn't exist
382 background-color: var(--mwai-backgroundPrimaryColor, var(--mwai-backgroundSecondaryColor));
383 border-radius: 0 !important;
384 box-shadow: none !important;
385 border: none !important;
386
387 // Handle the window-box wrapper for animations
388 .mwai-window-box {
389 width: 100%;
390 height: 100%;
391 display: flex;
392 flex-direction: column;
393 border-radius: 0 !important;
394 box-shadow: none !important;
395 border: none !important;
396 background: transparent !important;
397 }
398
399 // Hide header completely on mobile
400 .mwai-header {
401 display: none !important;
402 }
403
404 .mwai-body {
405 flex: 1;
406 min-height: 0; // Allow body to shrink properly
407 display: flex;
408 flex-direction: column;
409 border-radius: 0 !important;
410 overflow: hidden;
411 // Ensure body background is preserved on mobile fullscreen
412 background: var(--mwai-backgroundPrimaryColor, var(--mwai-backgroundSecondaryColor));
413
414 .mwai-conversation {
415 flex: 1;
416 overflow-y: auto;
417 max-height: none;
418 // No padding needed - close button is overlay
419 }
420
421 .mwai-input {
422 flex-shrink: 0; // Keep input at bottom
423 }
424 }
425
426 // Mobile header - fixed header for mobile devices
427 .mwai-mobile-header {
428 display: flex; // Always flex when rendered (React controls visibility)
429 position: sticky;
430 top: 0;
431 left: 0;
432 right: 0;
433 height: 50px;
434 background: var(--mwai-backgroundHeaderColor);
435 border-bottom: 1px solid var(--mwai-lineColor);
436 padding: 0 15px;
437 padding-left: calc(15px + env(safe-area-inset-left, 0));
438 padding-right: calc(15px + env(safe-area-inset-right, 0));
439 align-items: center;
440 justify-content: space-between;
441 z-index: 10;
442
443 .mwai-mobile-header-title {
444 font-size: 16px;
445 font-weight: 600;
446 color: var(--mwai-headerColor);
447 flex: 1;
448 overflow: hidden;
449 text-overflow: ellipsis;
450 white-space: nowrap;
451 }
452
453 .mwai-mobile-header-close {
454 all: unset;
455 display: flex;
456 align-items: center;
457 justify-content: center;
458 width: 32px;
459 height: 32px;
460 min-width: 32px;
461 cursor: pointer;
462 border-radius: 6px;
463 transition: background-color 0.2s ease;
464 -webkit-tap-highlight-color: transparent;
465
466 &:hover, &:active {
467 background-color: var(--mwai-backgroundSecondaryColor);
468 }
469
470 svg {
471 width: 20px;
472 height: 20px;
473
474 path {
475 stroke: var(--mwai-headerColor);
476 }
477 }
478 }
479 }
480 }
481
482 @mixin files-preview-styles {
483 .mwai-files {
484 display: flex;
485 flex-direction: column;
486 padding: var(--mwai-spacing);
487 background: var(--mwai-backgroundSecondaryColor);
488 border-top: 1px solid var(--mwai-backgroundPrimaryColor);
489 max-height: 150px;
490 overflow-y: auto;
491
492 // Custom scrollbar for webkit browsers
493 &::-webkit-scrollbar {
494 width: 6px;
495 }
496
497 &::-webkit-scrollbar-track {
498 background: var(--mwai-backgroundPrimaryColor);
499 border-radius: 3px;
500 }
501
502 &::-webkit-scrollbar-thumb {
503 background: var(--mwai-backgroundHeaderColor);
504 border-radius: 3px;
505
506 &:hover {
507 background: var(--mwai-primaryColor);
508 }
509 }
510
511 .mwai-file-preview {
512 position: relative;
513
514 .mwai-file-content {
515 display: flex;
516 align-items: center;
517 gap: 8px;
518 }
519
520 .mwai-file-thumbnail {
521 width: 32px;
522 height: 32px;
523 object-fit: cover;
524 border-radius: 4px;
525 border: 1px solid var(--mwai-backgroundHeaderColor);
526 display: block;
527 flex-shrink: 0;
528 }
529
530 .mwai-file-icon {
531 width: 32px;
532 height: 32px;
533 display: flex;
534 align-items: center;
535 justify-content: center;
536 background: var(--mwai-backgroundSecondaryColor);
537 border-radius: 4px;
538 color: var(--mwai-fontColor);
539 opacity: 0.6;
540 flex-shrink: 0;
541
542 svg {
543 width: 18px;
544 height: 18px;
545 }
546 }
547
548 .mwai-file-info {
549 flex: 1;
550 min-width: 0;
551 display: flex;
552 flex-direction: column;
553 gap: 2px;
554 }
555
556 .mwai-file-name {
557 font-size: calc(var(--mwai-fontSize) * 0.85);
558 color: var(--mwai-fontColor);
559 white-space: nowrap;
560 overflow: hidden;
561 text-overflow: ellipsis;
562 line-height: 1.2;
563 }
564
565 .mwai-file-size {
566 font-size: calc(var(--mwai-fontSize) * 0.7);
567 color: var(--mwai-fontColor);
568 opacity: 0.5;
569 line-height: 1;
570 }
571
572 .mwai-file-progress {
573 position: absolute;
574 bottom: 0;
575 left: 0;
576 right: 0;
577 height: 2px;
578 background: var(--mwai-backgroundHeaderColor);
579 border-radius: 0 0 calc(var(--mwai-borderRadius) / 2) calc(var(--mwai-borderRadius) / 2);
580 overflow: hidden;
581
582 .mwai-file-progress-bar {
583 height: 100%;
584 background: var(--mwai-primaryColor);
585 transition: width 0.3s ease;
586 }
587 }
588
589 .mwai-file-remove {
590 display: flex;
591 align-items: center;
592 justify-content: center;
593 background: none;
594 cursor: pointer;
595 color: var(--mwai-fontColor);
596 padding: 4px;
597 border: none;
598 line-height: 0;
599 min-width: inherit;
600 margin-left: auto;
601 opacity: 0.6;
602 transition: opacity 0.2s ease;
603
604 &:hover {
605 opacity: 1;
606 }
607
608 svg {
609 width: 20px;
610 height: 20px;
611 }
612 }
613 }
614
615 // Empty state when no files
616 &:empty {
617 display: none;
618 }
619 }
620 }
621
622 @mixin common-styles {
623
624 // Include files preview styles
625 @include files-preview-styles;
626
627 // File upload icon adjustment
628 .mwai-file-upload-icon {
629 margin-bottom: -3px;
630 }
631
632 // Terminal Messages Component Styles
633 .mwai-terminal {
634 --mwai-terminal-active-color: var(--mwai-fontColor); // Default, themes can override
635
636 font-family: ui-monospace, SFMono-Regular, 'SF Mono', Monaco, Menlo, Consolas, "Liberation Mono", "Courier New", monospace;
637 font-size: 12px;
638 background: var(--mwai-backgroundPrimaryColor);
639 color: var(--mwai-fontColor);
640 padding: var(--mwai-spacing);
641 height: 100%;
642 overflow-y: auto;
643 cursor: text;
644 display: flex;
645 flex-direction: column;
646 flex: 1 1 auto;
647 min-height: 0; // ensure it can shrink so footer stays visible
648 padding-bottom: calc(var(--mwai-spacing) * 1.25); // leave room for the typing line
649
650 &:focus {
651 outline: none;
652 }
653
654 .mwai-terminal-line {
655 display: flex;
656 align-items: flex-start; // align to top for multi-line text
657 margin: calc(var(--mwai-spacing) / 2) 0;
658 white-space: pre-wrap;
659 word-wrap: break-word;
660 word-break: break-word;
661
662 // Past user messages - low opacity
663 &.mwai-terminal-user {
664 color: var(--mwai-fontColor);
665 opacity: 0.35;
666 }
667
668 // Currently typing line - use active color for everything
669 &.mwai-terminal-user-typing {
670 color: var(--mwai-terminal-active-color);
671 opacity: 1;
672
673 .mwai-terminal-prompt {
674 color: var(--mwai-terminal-active-color);
675 }
676 }
677
678 &.mwai-terminal-assistant {
679 color: var(--mwai-fontColor);
680 }
681
682 &.mwai-terminal-system {
683 color: #608b4e;
684 font-style: italic;
685 }
686 }
687
688
689 // User prompt (ChevronRight icon) - uses active color by default
690 .mwai-terminal-prompt {
691 color: var(--mwai-terminal-active-color);
692 margin-left: -4px; // slight global nudge for icon bounding-box
693 margin-right: 4px; // space after prompt
694 display: inline-flex; // use flex to vertically center the icon within the text box
695 align-items: center;
696 height: 1.5em; // Taller height for better visual alignment
697 line-height: 1.2; // Normalized line height
698 flex-shrink: 0; // prevent prompt from shrinking
699 align-self: flex-start; // align to top of line
700 // Normalize Lucide icon box to text metrics (same visual size as text)
701 svg {
702 display: block; // remove inline descender space
703 width: 1.4em;
704 height: 1.4em;
705 }
706 }
707
708 .mwai-terminal-text {
709 color: inherit;
710 }
711
712 // Input wrapper to keep cursor inline with text
713 .mwai-terminal-input-wrapper {
714 flex: 1; // take remaining space
715 display: inline;
716 white-space: pre-wrap;
717 word-wrap: break-word;
718 word-break: break-word;
719 }
720
721 // Currently typing text - uses active color
722 .mwai-terminal-typed {
723 color: var(--mwai-terminal-active-color);
724 white-space: pre-wrap;
725 word-wrap: break-word;
726 word-break: break-word;
727 }
728
729 // Cursor - always uses active color (white)
730 .mwai-terminal-cursor {
731 display: inline-block; // inline-block to stay with text flow
732 width: 8px; // fixed width for better visibility
733 height: 16px; // fixed height for consistent appearance
734 background: var(--mwai-terminal-active-color);
735 vertical-align: text-bottom; // align with text baseline
736 margin-left: 2px;
737 transition: opacity 0.2s ease;
738 opacity: 0.35; // Default to inactive
739 animation: none; // Default to no animation
740
741 // Active state - focused and can type (blinking)
742 &.mwai-terminal-cursor-active {
743 opacity: 1;
744 animation: mwai-caret-blink 1s steps(2, start) infinite;
745 }
746
747 // Typing state - solid cursor while typing
748 &.mwai-terminal-cursor-typing {
749 opacity: 1;
750 animation: none; // no blinking while typing
751 }
752
753 // Inactive state - not focused or can't type
754 &.mwai-terminal-cursor-inactive {
755 opacity: 0.35;
756 animation: none; // stop blinking
757 }
758 }
759
760 // Firefox scrollbar
761 scrollbar-width: thin;
762 scrollbar-color: rgba(128, 128, 128, 0.3) transparent;
763
764 // Custom scrollbar for terminal
765 &::-webkit-scrollbar {
766 width: 8px;
767 background: transparent;
768 }
769
770 &::-webkit-scrollbar-track {
771 background: transparent;
772 }
773
774 &::-webkit-scrollbar-thumb {
775 background: rgba(128, 128, 128, 0.3);
776 border-radius: 4px;
777
778 &:hover {
779 background: rgba(128, 128, 128, 0.5);
780 }
781 }
782
783 // When terminal is used with chatgpt theme, fix compliance spacing
784 & + .mwai-compliance {
785 margin-top: 0;
786 }
787 }
788
789 // Transitions
790
791 &.mwai-transition, .mwai-transition {
792 opacity: 0;
793 transition: opacity 350ms ease-in-out;
794 }
795
796 &.mwai-transition-visible, .mwai-transition-visible {
797 opacity: 1;
798 }
799
800 .mwai-text {
801 overflow-wrap: anywhere;
802
803 img {
804 max-width: 100%;
805 }
806
807 div {
808 p:first-child {
809 margin-top: 0;
810 }
811 p:last-child {
812 margin-bottom: 0;
813 }
814 }
815 }
816
817 // The icon when the chat window is closed.
818
819 .mwai-trigger {
820 position: absolute;
821 right: 0;
822 bottom: 0;
823 transition: all 0.2s ease-out;
824 z-index: 9999;
825 display: flex;
826 flex-direction: column;
827 align-items: end;
828
829 .mwai-icon-text-container {
830 display: flex;
831 flex-direction: column;
832 align-items: flex-end;
833
834 .mwai-icon-text {
835 background: var(--mwai-iconTextBackgroundColor);
836 color: var(--mwai-iconTextColor);
837 box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.15);
838 max-width: 200px;
839 font-size: 13px;
840 margin-bottom: 15px;
841 padding: 10px 15px;
842 border-radius: 8px;
843 }
844
845 .mwai-icon-text-close {
846 color: var(--mwai-iconTextColor);
847 background: var(--mwai-iconTextBackgroundColor);
848 padding: 0;
849 width: 24px;
850 height: 24px;
851 border-radius: 50%;
852 display: none;
853 justify-content: center;
854 align-items: center;
855 margin-bottom: 3px;
856 }
857
858 &:hover {
859 cursor: pointer;
860
861 .mwai-icon-text-close {
862 display: flex;
863 font-size: 12px;
864
865 &:hover {
866 filter: brightness(1.2);
867 }
868 }
869 }
870
871 @media (max-width: 760px) {
872 .mwai-icon-text-close {
873 display: flex;
874 }
875 }
876
877 }
878
879 .mwai-icon-container {
880
881 .mwai-icon {
882 filter: drop-shadow(0px 0px 15px rgba(0, 0, 0, 0.15));
883 transition: all 0.2s ease-out;
884
885 &:hover {
886 cursor: pointer;
887 transform: scale(1.05);
888 }
889 }
890 }
891 }
892
893 // Handle the chat window and fullscreen.
894 // Let's keep this common for all themes.
895
896 &.mwai-window {
897 position: fixed;
898 right: 30px;
899 bottom: 30px;
900 width: var(--mwai-width);
901 z-index: 9999;
902
903 .mwai-header {
904 display: none;
905 justify-content: flex-end;
906 align-items: center;
907 border-radius: var(--mwai-borderRadius) var(--mwai-borderRadius) 0 0;
908 background: var(--mwai-backgroundHeaderColor);
909
910 .mwai-buttons {
911 display: flex;
912 align-items: center;
913
914 .mwai-resize-button {
915 justify-content: center;
916 height: 32px;
917 width: 32px;
918 cursor: pointer;
919 display: flex;
920 justify-content: center;
921 align-items: center;
922
923 &:before {
924 transition: all 0.2s ease-out;
925 content: ' ';
926 cursor: pointer;
927 position: absolute;
928 height: 13px;
929 width: 13px;
930 border: 1px solid var(--mwai-headerColor);
931 }
932
933 &:hover:before {
934 width: 16px;
935 height: 16px;
936 }
937 }
938
939 .mwai-close-button {
940 justify-content: center;
941 height: 32px;
942 width: 32px;
943 cursor: pointer;
944 border-radius: var(--mwai-borderRadius);
945 margin-left: -10px;
946
947 &:before {
948 transition: all 0.2s ease-out;
949 transform: translate(16px, 5px) rotate(45deg);
950 }
951 &:after {
952 transition: all 0.2s ease-out;
953 transform: translate(16px, 5px) rotate(-45deg);
954 }
955 }
956
957 .mwai-close-button:before, .mwai-close-button:after {
958 content: ' ';
959 cursor: pointer;
960 position: absolute;
961 height: 22px;
962 width: 1px;
963 background-color: var(--mwai-headerColor);
964 }
965
966 .mwai-close-button:hover {
967 &:before {
968 opacity: 1;
969 transform: translate(16px, 5px) rotate(135deg);
970 }
971 &:after {
972 opacity: 1;
973 transform: translate(16px, 5px) rotate(45deg);
974 }
975 }
976
977 }
978 }
979
980 .mwai-body {
981 display: none;
982 opacity: 0;
983 max-height: var(--mwai-maxHeight);
984 border-radius: 0 0 var(--mwai-borderRadius) var(--mwai-borderRadius);
985 }
986
987 &.mwai-bottom-left {
988 bottom: 30px;
989 right: inherit;
990 left: 30px;
991
992 .mwai-trigger {
993 right: inherit;
994 left: 0;
995 }
996 }
997
998 &.mwai-top-right {
999 top: 30px;
1000 bottom: inherit;
1001 right: 30px;
1002
1003 .mwai-trigger {
1004 top: 0;
1005 bottom: inherit;
1006 }
1007 }
1008
1009 &.mwai-top-left {
1010 top: 30px;
1011 bottom: inherit;
1012 right: inherit;
1013 left: 30px;
1014
1015 .mwai-trigger {
1016 top: 0;
1017 bottom: inherit;
1018 right: inherit;
1019 left: 0;
1020 }
1021 }
1022
1023 &.mwai-center-open {
1024 // When center-open is enabled and chatbot is open
1025 &.mwai-open {
1026 top: 50%;
1027 left: 50%;
1028 transform: translate(-50%, -50%);
1029 right: inherit;
1030 bottom: inherit;
1031
1032 // Mobile adjustments
1033 @media (max-width: 760px) {
1034 width: calc(100% - 40px);
1035 max-width: var(--mwai-width);
1036 }
1037 }
1038 }
1039
1040 &.mwai-top-left, &.mwai-bottom-left {
1041
1042 .mwai-trigger {
1043 align-items: flex-start;
1044 }
1045 }
1046
1047 &.mwai-top-right, &.mwai-top-left {
1048
1049 .mwai-trigger {
1050 flex-direction: column-reverse;
1051
1052 .mwai-icon-text {
1053 margin-bottom: 0;
1054 margin-top: 15px;
1055 }
1056 }
1057 }
1058 }
1059
1060 // Popup chat is fullscreen
1061
1062 &.mwai-window.mwai-fullscreen {
1063
1064 .mwai-header {
1065
1066 .mwai-buttons {
1067 margin-bottom: 0px;
1068
1069 .mwai-resize-button {
1070 &:before {
1071 width: 16px;
1072 height: 16px;
1073 }
1074
1075 &:hover:before {
1076 width: 13px;
1077 height: 13px;
1078 }
1079 }
1080 }
1081 }
1082 }
1083
1084 // Standard chat is fullscreen
1085
1086 &.mwai-fullscreen:not(.mwai-window) {
1087 @include fullscreen-window;
1088 // Ensure the non-window fullscreen chatbot is visible and takes full space
1089 display: flex !important;
1090 visibility: visible !important;
1091 opacity: 1 !important;
1092
1093 .mwai-window-box {
1094 width: 100%;
1095 height: 100%;
1096 display: flex;
1097 flex-direction: column;
1098 }
1099
1100 .mwai-header {
1101 display: flex !important;
1102 visibility: visible !important;
1103 opacity: 1 !important;
1104 flex: 0 0 auto;
1105 }
1106
1107 .mwai-body {
1108 display: flex !important;
1109 visibility: visible !important;
1110 opacity: 1 !important;
1111 flex: 1 1 auto;
1112 flex-direction: column;
1113 min-height: 0;
1114 height: 100%;
1115 }
1116 }
1117
1118 &.mwai-fullscreen.mwai-window.mwai-open {
1119 @include fullscreen-window;
1120
1121 .mwai-window-box {
1122 width: 100%;
1123 height: 100%;
1124 display: flex;
1125 flex-direction: column;
1126 }
1127
1128 .mwai-body {
1129 flex: 1 1 auto;
1130 min-height: 0;
1131 }
1132 }
1133
1134 // Popup chat is open
1135
1136 &.mwai-window.mwai-open {
1137
1138 .mwai-header {
1139 display: flex;
1140 }
1141
1142 .mwai-body {
1143 display: flex;
1144 transition: opacity 200ms ease-in-out 0s;
1145 opacity: 1;
1146 }
1147
1148 .mwai-trigger {
1149 display: none;
1150 }
1151 }
1152
1153 // Old error style - kept for backwards compatibility
1154 .mwai-body > .mwai-error {
1155 margin: var(--mwai-spacing);
1156 color: white;
1157 background: rgba(180, 55, 55, 0.55);
1158 padding: var(--mwai-spacing);
1159 border-radius: var(--mwai-borderRadius);
1160
1161 &:hover {
1162 cursor: pointer;
1163 background: rgba(180, 44, 44, 0.85);
1164 }
1165 }
1166
1167 // Error message specific styles
1168 .mwai-reply.mwai-error {
1169 .mwai-text {
1170 color: #ff5656; // ChatGPT-style red for error text
1171
1172 // Style links in error messages
1173 a {
1174 color: #ff5656;
1175 text-decoration: underline;
1176 }
1177 }
1178
1179 // Style action buttons in error messages
1180 .mwai-reply-actions {
1181 .mwai-action-button {
1182 fill: var(--mwai-fontColor);
1183 padding: 3px 5px;
1184 width: 24px;
1185 height: 24px;
1186 background: var(--mwai-backgroundPrimaryColor);
1187 cursor: pointer;
1188 border-radius: 5px;
1189
1190 &:hover {
1191 filter: brightness(1.2);
1192 }
1193 }
1194 }
1195 }
1196
1197 // Reply actions visibility
1198 .mwai-reply-actions {
1199 opacity: 0;
1200 transition: opacity 0.2s ease-in-out;
1201 }
1202
1203 // Show reply actions on hover of entire reply container
1204 .mwai-reply:hover .mwai-reply-actions {
1205 opacity: 1 !important;
1206 }
1207
1208 // Show reply actions on hover for AI Forms output fields
1209 .mwai-form-output-container:hover .mwai-reply-actions {
1210 opacity: 1 !important;
1211 }
1212
1213 // Override mwai-hidden class on hover for forms
1214 .mwai-form-output-container:hover .mwai-reply-actions.mwai-hidden {
1215 opacity: 1 !important;
1216 }
1217
1218 &.mwai-bubble .mwai-trigger .mwai-icon-container {
1219 background: var(--mwai-bubbleColor) !important;
1220 width: 60px !important;
1221 height: 60px !important;
1222 border-radius: 100% !important;
1223 transition: all 0.2s ease-out;
1224 display: flex !important;
1225 justify-content: center !important;
1226 align-items: center !important;
1227
1228 .mwai-icon {
1229 max-width: 50% !important;
1230 max-height: 50% !important;
1231 filter: none !important;
1232
1233 &:hover {
1234 transform: none !important;
1235 }
1236 }
1237
1238 .mwai-emoji {
1239 font-size: 30px !important;
1240 }
1241
1242 &:hover {
1243 cursor: pointer;
1244 filter: brightness(1.1);
1245 }
1246 }
1247
1248 @media (max-width: 760px) {
1249 &.mwai-window.mwai-open {
1250 @include mobile-fullscreen-window;
1251
1252 // Override center-open positioning on mobile
1253 &.mwai-center-open {
1254 top: 0 !important;
1255 left: 0 !important;
1256 transform: none !important;
1257 right: 0 !important;
1258 bottom: 0 !important;
1259 width: 100% !important;
1260 max-width: 100% !important;
1261 }
1262
1263 .mwai-input {
1264 flex-direction: column;
1265
1266 button {
1267 font-size: 16px;
1268 margin-left: 0;
1269 width: 100%;
1270 }
1271
1272 .mwai-input-text {
1273 //margin-bottom: var(--mwai-spacing);
1274 width: 100%;
1275
1276 // This is to avoid iOS from zooming in when focusing on an input field.
1277 input, textarea {
1278 font-size: 16px;
1279 }
1280 }
1281 }
1282
1283 .mwai-body {
1284 display: flex;
1285 transition: opacity 200ms ease-in-out 0s;
1286 opacity: 1;
1287 height: 100%;
1288 max-height: inherit;
1289
1290 .mwai-conversation {
1291 flex: auto;
1292 max-height: none;
1293 }
1294 }
1295
1296 .mwai-resize-button {
1297 display: none !important;
1298 }
1299
1300 .mwai-trigger {
1301 display: none;
1302 }
1303 }
1304 }
1305
1306 // Keyframes for buttons
1307
1308 @keyframes mwai-button-spinner {
1309
1310 from {
1311 transform: rotate(0turn);
1312 }
1313 to {
1314 transform: rotate(1turn);
1315 }
1316 }
1317
1318 // Safari-specific fix for spinner cleanup
1319 button:not(.mwai-busy):before {
1320 content: none !important;
1321 display: none !important;
1322 animation: none !important;
1323 }
1324
1325 // WordPress Admin Bar
1326
1327 .admin-bar .mwai-fullscreen:not(.mwai-window),
1328 .admin-bar .mwai-fullscreen.mwai-window.mwai-open {
1329 top: 32px;
1330 }
1331
1332 // Terminal Input line (when used as an input component)
1333 .mwai-input .mwai-terminal-line {
1334 display: flex;
1335 align-items: flex-start; // align to top for multi-line
1336 color: var(--mwai-terminal-active-color, var(--mwai-fontColor));
1337 // Inherit font-size/line-height from theme
1338
1339 .mwai-terminal-prompt {
1340 color: var(--mwai-terminal-active-color, currentColor);
1341 margin-left: -4px;
1342 margin-right: 4px; // space after prompt
1343 display: inline-flex;
1344 align-items: center;
1345 height: 1.5em; // Taller height for better visual alignment
1346 line-height: 1.2;
1347 flex-shrink: 0;
1348 align-self: flex-start;
1349 svg { display: block; width: 1.4em; height: 1.4em; }
1350 }
1351
1352 .mwai-terminal-input-wrapper {
1353 flex: 1;
1354 display: inline;
1355 white-space: pre-wrap;
1356 word-wrap: break-word;
1357 word-break: break-word;
1358 }
1359
1360 .mwai-terminal-typed {
1361 white-space: pre-wrap;
1362 word-wrap: break-word;
1363 word-break: break-word;
1364 }
1365
1366 .mwai-terminal-cursor {
1367 display: inline-block;
1368 width: 8px;
1369 height: 16px;
1370 background: currentColor;
1371 vertical-align: text-bottom;
1372 margin-left: 2px;
1373 transition: opacity 0.2s ease;
1374 opacity: 0.35; // Default to inactive
1375 animation: none; // Default to no animation
1376
1377 &.mwai-terminal-cursor-active {
1378 opacity: 1;
1379 animation: mwai-caret-blink 1s steps(2, start) infinite;
1380 }
1381
1382 &.mwai-terminal-cursor-typing {
1383 opacity: 1;
1384 animation: none; // solid while typing
1385 }
1386
1387 &.mwai-terminal-cursor-inactive {
1388 opacity: 0.35;
1389 animation: none;
1390 }
1391 }
1392 }
1393
1394 }
1395
1396 // Global keyframes used by terminal cursor
1397 @keyframes mwai-caret-blink { to { visibility: hidden; } }
1398
1399 // Unified footer tools section across themes (modeled after Timeless)
1400 @mixin footer-tools {
1401 .mwai-footer {
1402 display: flex;
1403 align-items: center;
1404 background: var(--mwai-backgroundAiColor, var(--mwai-backgroundSecondaryColor));
1405 border-top: 1px solid var(--mwai-backgroundPrimaryColor);
1406 padding: 6px var(--mwai-spacing);
1407
1408 .mwai-tools {
1409 display: flex;
1410 align-items: center;
1411 gap: 8px;
1412 margin-right: calc(var(--mwai-spacing) / 2);
1413
1414 .mwai-file-upload { display: inline-block; }
1415
1416 // Generic lucide variant for small action icons (upload/clear)
1417 .mwai-file-upload-icon.mwai-lucide {
1418 display: inline-flex;
1419 align-items: center;
1420 justify-content: center;
1421 position: relative; // allow corner badge
1422 min-width: 16px;
1423 height: 16px;
1424 color: var(--mwai-fontColor);
1425 opacity: 0.75;
1426 margin: 0; // rely on parent gap for spacing
1427 &:hover { opacity: 1; }
1428 svg { width: 16px; height: 16px; }
1429
1430 // Tiny corner badge for count
1431 .mwai-upload-count {
1432 position: absolute;
1433 top: -5px;
1434 right: -6px;
1435 min-width: 12px;
1436 height: 12px;
1437 padding: 0 2px; // subtle horizontal padding
1438 border-radius: 999px;
1439 background: var(--mwai-backgroundHeaderColor); // use main theme color
1440 color: #fff;
1441 border: 2px solid var(--mwai-backgroundAiColor, var(--mwai-backgroundSecondaryColor));
1442 font-size: 8px; // smaller numeral
1443 font-family: system-ui;
1444 font-weight: 700;
1445 line-height: 1;
1446 display: inline-flex;
1447 align-items: center;
1448 justify-content: center;
1449 user-select: none;
1450 cursor: pointer;
1451 }
1452 .mwai-upload-count::after { content: attr(data-count); }
1453 &.mwai-hover .mwai-upload-count::after { content: '-'; }
1454 }
1455 }
1456
1457 .mwai-compliance {
1458 opacity: 0.50;
1459 font-size: 11px;
1460 line-height: 11px;
1461 color: var(--mwai-fontColor);
1462 flex: 1;
1463 text-align: left; // Default to left when alone
1464 padding: calc(var(--mwai-spacing) / 2) 0;
1465 margin: 0;
1466 }
1467
1468 // When tools are present, align compliance text to the right
1469 .mwai-tools + .mwai-compliance {
1470 text-align: right;
1471 }
1472 }
1473 }
1474
1475 @mixin code-dark {
1476
1477 pre code.hljs {
1478 display: block;
1479 overflow-x: auto;
1480 padding: 1em;
1481 }
1482
1483 code.hljs {
1484 padding: 3px 5px;
1485 }
1486
1487 .hljs {
1488 color: #fff;
1489
1490 &-subst {
1491 color: #fff;
1492 }
1493
1494 &-comment {
1495 color: #999;
1496 }
1497
1498 &-attr,
1499 &-doctag,
1500 &-keyword,
1501 &-meta .hljs-keyword,
1502 &-section,
1503 &-selector-tag {
1504 color: #88aece;
1505 }
1506
1507 &-attribute {
1508 color: #c59bc1;
1509 }
1510
1511 &-name,
1512 &-number,
1513 &-quote,
1514 &-selector-id,
1515 &-template-tag,
1516 &-type {
1517 color: #f08d49;
1518 }
1519
1520 &-selector-class {
1521 color: #88aece;
1522 }
1523
1524 &-link,
1525 &-regexp,
1526 &-selector-attr,
1527 &-string,
1528 &-symbol,
1529 &-template-variable,
1530 &-variable {
1531 color: #b5bd68;
1532 }
1533
1534 &-meta,
1535 &-selector-pseudo {
1536 color: #88aece;
1537 }
1538
1539 &-built_in,
1540 &-literal,
1541 &-title {
1542 color: #f08d49;
1543 }
1544
1545 &-bullet,
1546 &-code {
1547 color: #ccc;
1548 }
1549
1550 &-meta .hljs-string {
1551 color: #b5bd68;
1552 }
1553
1554 &-deletion {
1555 color: #de7176;
1556 }
1557
1558 &-addition {
1559 color: #76c490;
1560 }
1561
1562 &-emphasis {
1563 font-style: italic;
1564 }
1565
1566 &-strong {
1567 font-weight: 700;
1568 }
1569 }
1570 }
1571
1572 @mixin code-light {
1573
1574 pre code.hljs {
1575 display: block;
1576 overflow-x: auto;
1577 padding: 1em;
1578 }
1579
1580 code.hljs {
1581 padding: 3px 5px;
1582 }
1583
1584 .hljs {
1585 color: #333;
1586 background: #f0f0f0;
1587
1588 &-subst {
1589 color: #333;
1590 }
1591
1592 &-comment {
1593 color: #888;
1594 }
1595
1596 &-attr,
1597 &-doctag,
1598 &-keyword,
1599 &-meta .hljs-keyword,
1600 &-section,
1601 &-selector-tag {
1602 color: #0077cc;
1603 }
1604
1605 &-attribute {
1606 color: #aa3377;
1607 }
1608
1609 &-name,
1610 &-number,
1611 &-quote,
1612 &-selector-id,
1613 &-template-tag,
1614 &-type {
1615 color: #c18401;
1616 }
1617
1618 &-selector-class {
1619 color: #0077cc;
1620 }
1621
1622 &-link,
1623 &-regexp,
1624 &-selector-attr,
1625 &-string,
1626 &-symbol,
1627 &-template-variable,
1628 &-variable {
1629 color: #689700;
1630 }
1631
1632 &-meta,
1633 &-selector-pseudo {
1634 color: #0077cc;
1635 }
1636
1637 &-built_in,
1638 &-literal,
1639 &-title {
1640 color: #c18401;
1641 }
1642
1643 &-bullet,
1644 &-code {
1645 color: #555;
1646 }
1647
1648 &-meta .hljs-string {
1649 color: #689700;
1650 }
1651
1652 &-deletion {
1653 color: #b71c1c;
1654 }
1655
1656 &-addition {
1657 color: #1b5e20;
1658 }
1659
1660 &-emphasis {
1661 font-style: italic;
1662 }
1663
1664 &-strong {
1665 font-weight: 700;
1666 }
1667 }
1668 }
1669
1670 @mixin reply-actions {
1671 .mwai-reply-actions {
1672 position: absolute;
1673 border-radius: 5px;
1674 top: 10px;
1675 right: 10px;
1676 display: flex;
1677 align-items: center;
1678 padding: 2px 2px;
1679 z-index: 100;
1680 background: var(--mwai-backgroundPrimaryColor);
1681 box-shadow: 0 0 8px rgba(0, 0, 0, 0.25);
1682 z-index: 100;
1683
1684 .mwai-copy-button {
1685 fill: var(--mwai-fontColor);
1686 padding: 3px 5px;
1687 width: 24px;
1688 height: 24px;
1689 background: var(--mwai-backgroundPrimaryColor);
1690 cursor: pointer;
1691 border-radius: 5px;
1692
1693 &:hover {
1694 filter: brightness(1.2);
1695 }
1696 }
1697
1698 &.mwai-hidden {
1699 opacity: 0;
1700 }
1701 }
1702 }
1703
1704 @mixin realtime {
1705 .mwai-realtime {
1706 padding: var(--mwai-spacing);
1707
1708 .mwai-visualizer {
1709 display: flex;
1710 justify-content: center;
1711 align-items: center;
1712
1713 hr {
1714 width: 100px;
1715 margin-right: var(--mwai-spacing);
1716 margin-left: var(--mwai-spacing);
1717 border: 1px solid var(--mwai-backgroundPrimaryColor);
1718 }
1719
1720 .mwai-animation {
1721 background: var(--mwai-backgroundPrimaryColor);
1722 }
1723 }
1724
1725 .mwai-controls {
1726 display: flex;
1727 justify-content: center;
1728 align-items: center;
1729 margin-bottom: var(--mwai-spacing);
1730
1731 > * + * {
1732 margin-left: 10px;
1733 }
1734
1735 button {
1736 border-radius: 100%;
1737 width: 50px;
1738 height: 50px;
1739 margin: 5px;
1740 padding: 5px;
1741 display: flex;
1742 align-items: center;
1743 justify-content: center;
1744 color: var(--mwai-fontColor);
1745 border: 2px solid var(--mwai-backgroundPrimaryColor);
1746 background: none;
1747 cursor: pointer;
1748 transition: all 0.2s ease-out;
1749 min-width: inherit;
1750 max-width: inherit;
1751
1752 &:hover:not(:disabled) {
1753 background: var(--mwai-backgroundPrimaryColor);
1754 }
1755
1756 &:disabled {
1757 opacity: 0.5;
1758 cursor: not-allowed;
1759 background: none;
1760 }
1761
1762 &.mwai-active {
1763 border: 2px solid var(--mwai-fontColor);
1764 }
1765 }
1766 }
1767
1768 .mwai-last-transcript {
1769 margin: var(--mwai-spacing);
1770 margin-top: 0;
1771 border: 2px solid var(--mwai-backgroundPrimaryColor);
1772 padding: calc(var(--mwai-spacing) / 2);
1773 border-radius: var(--mwai-borderRadius);
1774 display: flex;
1775 justify-content: center;
1776 font-size: 80%;
1777 }
1778
1779 .mwai-statistics {
1780 display: grid;
1781 grid-template-columns: 1fr 1fr 1fr;
1782 grid-row-gap: 10px;
1783 font-size: 14px;
1784
1785 div {
1786 display: flex;
1787 flex-direction: column;
1788 align-items: center;
1789 }
1790
1791 label {
1792 font-size: 11px;
1793 opacity: 0.5;
1794 text-transform: uppercase;
1795 }
1796 }
1797
1798 .mwai-options {
1799 margin-top: var(--mwai-spacing);
1800 display: flex;
1801 align-items: center;
1802
1803 .mwai-option {
1804 cursor: pointer;
1805 opacity: 0.5;
1806 margin-right: 2px;
1807
1808 &.mwai-active {
1809 opacity: 1;
1810 }
1811 }
1812 }
1813 }
1814 }
1815
1816 // Context Menu Portal (appears at document body level)
1817 .mwai-context-menu-portal {
1818 .mwai-context-menu {
1819 background: var(--mwai-backgroundHeaderColor);
1820 border: 1px solid rgba(0, 0, 0, 0.1);
1821 border-radius: var(--mwai-borderRadius);
1822 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1823 font-size: 13px;
1824 color: var(--mwai-fontColor);
1825
1826 .mwai-menu-item {
1827 display: flex;
1828 align-items: center;
1829 gap: 8px;
1830 padding: 8px 12px;
1831 cursor: pointer;
1832 transition: background-color 0.2s;
1833
1834 &:hover {
1835 background-color: rgba(0, 0, 0, 0.05);
1836 }
1837
1838 &.mwai-danger {
1839 color: #dc3545;
1840
1841 &:hover {
1842 background-color: rgba(220, 53, 69, 0.1);
1843 }
1844 }
1845
1846 svg {
1847 flex-shrink: 0;
1848 }
1849 }
1850 }
1851 }
1852
1853
1854 // ChatbotChunks - Debug Stream Events Display
1855 .mwai-chunks {
1856 padding: 8px;
1857 background: rgba(0, 0, 0, 0.03);
1858 font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
1859 font-size: 11px;
1860 border-top: 1px solid rgba(0, 0, 0, 0.06);
1861
1862 &.mwai-chunks-collapsed {
1863 .mwai-chunks-header {
1864 margin-bottom: 0 !important;
1865 }
1866 }
1867
1868 .mwai-chunks-header {
1869 display: flex;
1870 align-items: center;
1871 gap: 2px;
1872 margin-bottom: 8px;
1873 color: #6b7280;
1874 font-size: 10px;
1875 text-transform: uppercase;
1876 letter-spacing: 0.05em;
1877
1878 .mwai-chunks-title {
1879 flex: 1; // This pushes the buttons to the right
1880 overflow: hidden;
1881 text-overflow: ellipsis;
1882 white-space: nowrap;
1883 }
1884
1885 .mwai-chunks-status {
1886 margin-left: 4px;
1887 font-weight: 500;
1888 }
1889
1890 .mwai-chunks-toggle {
1891 background: none;
1892 border: 1px solid rgba(0, 0, 0, 0.1);
1893 border-radius: 3px;
1894 padding: 2px;
1895 width: 30px;
1896 height: 20px;
1897 cursor: pointer;
1898 color: #6b7280;
1899 display: flex;
1900 align-items: center;
1901 justify-content: center;
1902 transition: all 0.2s ease;
1903 margin-left: 4px;
1904
1905 &:hover {
1906 background: rgba(0, 0, 0, 0.05);
1907 color: #374151;
1908 }
1909 }
1910 }
1911
1912 .mwai-chunk {
1913 margin-bottom: 4px;
1914 padding: 6px 8px;
1915 background: white;
1916 border-radius: 4px;
1917 border: 1px solid rgba(0, 0, 0, 0.06);
1918 transition: all 0.2s ease;
1919
1920 .mwai-chunk-header {
1921 display: flex;
1922 align-items: center;
1923 gap: 8px;
1924 cursor: pointer;
1925 user-select: none;
1926
1927 .mwai-chunk-time {
1928 color: #9ca3af;
1929 font-size: 10px;
1930 font-variant-numeric: tabular-nums;
1931 }
1932
1933 .mwai-chunk-type {
1934 display: flex;
1935 align-items: center;
1936 gap: 4px;
1937 padding: 2px 6px;
1938 border-radius: 3px;
1939 font-size: 10px;
1940 font-weight: 500;
1941 color: white;
1942 }
1943
1944 .mwai-chunk-data {
1945 flex: 1;
1946 color: #374151;
1947 overflow: hidden;
1948 text-overflow: ellipsis;
1949 white-space: nowrap;
1950 }
1951
1952 .mwai-chunk-expand {
1953 color: #9ca3af;
1954 transition: transform 0.2s ease;
1955 }
1956 }
1957
1958 .mwai-chunk-details {
1959 margin-top: 8px;
1960 padding: 8px;
1961 background: rgba(0, 0, 0, 0.02);
1962 border-radius: 3px;
1963 overflow-x: auto;
1964
1965 pre {
1966 margin: 0;
1967 white-space: pre-wrap;
1968 word-break: break-word;
1969 color: #4b5563;
1970 }
1971 }
1972 }
1973 }
1974