PluginProbe
MxChat – AI Chatbot & Content Generation for WordPress / trunk
MxChat – AI Chatbot & Content Generation for WordPress vtrunk
3.2.21 3.2.20 3.2.19 3.2.18 3.2.17 3.2.16 3.2.15 3.2.14 3.2.12 3.2.13 3.2.11 3.2.10 3.2.9 3.2.8 3.2.7 3.2.6 3.2.5 3.2.4 3.2.3 3.2.2 3.2.1 2.0.3 2.0.4 2.0.5 2.0.6 All 152 releases
mxchat-basic / css / admin-sidebar.css

admin-sidebar.css in MxChat – AI Chatbot & Content Generation for WordPress trunk, at css/admin-sidebar.css

2,975 lines 72.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* ==========================================================================
2 MxChat Admin Sidebar Navigation - v2.0
3 Clean, modern CSS for the redesigned settings page
4 ========================================================================== */
5
6 /* ==========================================================================
7 CSS Variables
8 ========================================================================== */
9 :root {
10 /* Brand Colors */
11 --mxch-primary: #7873f5;
12 --mxch-primary-hover: #6863e5;
13 --mxch-primary-light: rgba(120, 115, 245, 0.1);
14 --mxch-primary-lighter: rgba(120, 115, 245, 0.05);
15
16 /* Sidebar */
17 --mxch-sidebar-width: 260px;
18 --mxch-sidebar-bg: #212121;
19 --mxch-sidebar-text: #a0a0b0;
20 --mxch-sidebar-text-hover: #ffffff;
21 --mxch-sidebar-active-bg: rgba(120, 115, 245, 0.15);
22 --mxch-sidebar-border: rgba(255, 255, 255, 0.08);
23
24 /* Content Area */
25 --mxch-content-bg: #f0f2f5;
26 --mxch-card-bg: #ffffff;
27 --mxch-card-border: #e2e4e9;
28 --mxch-card-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
29 --mxch-card-shadow-hover: 0 4px 12px rgba(0, 0, 0, 0.1);
30
31 /* Text */
32 --mxch-text-primary: #1a1a2e;
33 --mxch-text-secondary: #64748b;
34 --mxch-text-muted: #94a3b8;
35
36 /* Form Elements */
37 --mxch-input-border: #d1d5db;
38 --mxch-input-focus: #7873f5;
39 --mxch-input-bg: #ffffff;
40
41 /* Status Colors */
42 --mxch-success: #10b981;
43 --mxch-warning: #f59e0b;
44 --mxch-warning-light: rgba(245, 158, 11, 0.12);
45 --mxch-warning-text: #92400e;
46 --mxch-error: #ef4444;
47 --mxch-info: #3b82f6;
48
49 /* Spacing */
50 --mxch-spacing-xs: 4px;
51 --mxch-spacing-sm: 8px;
52 --mxch-spacing-md: 16px;
53 --mxch-spacing-lg: 24px;
54 --mxch-spacing-xl: 32px;
55
56 /* Border Radius */
57 --mxch-radius-sm: 4px;
58 --mxch-radius-md: 8px;
59 --mxch-radius-lg: 12px;
60
61 /* Transitions */
62 --mxch-transition-fast: 0.15s ease;
63 --mxch-transition: 0.25s ease;
64 }
65
66 /* ==========================================================================
67 Main Layout Container
68 ========================================================================== */
69 .mxch-admin-wrapper {
70 display: flex;
71 height: calc(100vh - 32px);
72 margin-left: -20px;
73 background: var(--mxch-content-bg);
74 overflow: hidden;
75 position: fixed;
76 top: 32px;
77 left: 160px; /* WordPress admin menu width */
78 right: 0;
79 bottom: 0;
80 }
81
82 /* Account for collapsed admin menu */
83 .folded .mxch-admin-wrapper {
84 left: 36px;
85 }
86
87 /* Account for admin bar on mobile */
88 @media screen and (max-width: 782px) {
89 .mxch-admin-wrapper {
90 top: 46px;
91 height: calc(100vh - 46px);
92 left: 0;
93 margin-left: 0;
94 }
95 }
96
97 /* ==========================================================================
98 RTL locales (Arabic, Hebrew, Persian, Urdu, …)
99 On an RTL locale WordPress moves its admin menu to the RIGHT and sets the
100 `rtl` class + `direction: rtl` on <body>. The base wrapper is pinned
101 `left: 160px; right: 0` for a LEFT-side admin menu, so under RTL its right
102 edge slides under the (now right-side) WP menu and a dead 160px gap opens on
103 the left — the nav ends up hidden/overlapped. Mirror the fixed offsets and
104 the negative content margin. The internal sidebar/content flex row reverses
105 automatically under the inherited `direction: rtl`, so the sidebar lands on
106 the wrapper's right edge (just inside the WP menu) as expected for RTL — no
107 per-child repositioning needed.
108 ========================================================================== */
109 body.rtl .mxch-admin-wrapper {
110 left: 0;
111 right: 160px; /* WordPress admin menu width (now on the right) */
112 margin-left: 0;
113 margin-right: -20px;
114 }
115
116 /* Collapsed/folded admin menu (narrower) on RTL */
117 body.rtl.folded .mxch-admin-wrapper {
118 left: 0;
119 right: 36px;
120 }
121
122 /* On mobile the WP admin menu collapses to the top bar, so the wrapper is
123 full-width in both directions — clear the RTL right offset too. */
124 @media screen and (max-width: 782px) {
125 body.rtl .mxch-admin-wrapper {
126 left: 0;
127 right: 0;
128 margin-right: 0;
129 }
130 }
131
132 /* Active nav-item accent sits on the sidebar's inner edge; flip it for RTL. */
133 body.rtl .mxch-nav-link.active {
134 border-right: none;
135 border-left: 3px solid var(--mxch-primary);
136 }
137
138 /* ==========================================================================
139 Sidebar Navigation
140 ========================================================================== */
141 .mxch-sidebar {
142 width: var(--mxch-sidebar-width);
143 min-width: var(--mxch-sidebar-width);
144 background: var(--mxch-sidebar-bg);
145 display: flex;
146 flex-direction: column;
147 height: 100%;
148 overflow-y: auto;
149 overflow-x: hidden;
150 z-index: 100;
151 flex-shrink: 0;
152 position: relative;
153 }
154
155 /* Custom Scrollbar for Sidebar */
156 .mxch-sidebar::-webkit-scrollbar {
157 width: 6px;
158 }
159
160 .mxch-sidebar::-webkit-scrollbar-track {
161 background: transparent;
162 }
163
164 .mxch-sidebar::-webkit-scrollbar-thumb {
165 background: rgba(255, 255, 255, 0.15);
166 border-radius: 3px;
167 }
168
169 .mxch-sidebar::-webkit-scrollbar-thumb:hover {
170 background: rgba(255, 255, 255, 0.25);
171 }
172
173 /* Firefox scrollbar */
174 .mxch-sidebar {
175 scrollbar-width: thin;
176 scrollbar-color: rgba(255, 255, 255, 0.15) transparent;
177 }
178
179 .mxch-sidebar::before {
180 content: '';
181 position: absolute;
182 top: 0;
183 left: 0;
184 width: 100%;
185 height: 100%;
186 background: radial-gradient(circle at center, rgba(250, 115, 230, 0.08) 0%, rgba(120, 115, 245, 0.08) 50%, rgba(58, 201, 209, 0.08) 100%);
187 z-index: 0;
188 pointer-events: none;
189 }
190
191 /* Sidebar Header / Logo */
192 .mxch-sidebar-header {
193 padding: var(--mxch-spacing-lg);
194 border-bottom: 4px solid transparent;
195 border-image: linear-gradient(135deg, #fa73e6, #7873f5, #3ac9d1);
196 border-image-slice: 1;
197 position: relative;
198 z-index: 1;
199 }
200
201 .mxch-sidebar-logo {
202 display: flex;
203 align-items: center;
204 gap: var(--mxch-spacing-sm);
205 text-decoration: none;
206 }
207
208 .mxch-sidebar-logo-icon {
209 width: 32px;
210 height: 32px;
211 flex-shrink: 0;
212 }
213
214 .mxch-sidebar-logo-icon img {
215 width: 100%;
216 height: 100%;
217 object-fit: contain;
218 }
219
220 .mxch-sidebar-logo-text {
221 font-size: 20px;
222 font-weight: 700;
223 color: #ffffff;
224 letter-spacing: -0.5px;
225 }
226
227 .mxch-sidebar-version {
228 font-size: 11px;
229 color: var(--mxch-sidebar-text);
230 margin-left: auto;
231 padding: 2px 8px;
232 background: rgba(255, 255, 255, 0.05);
233 border-radius: 10px;
234 }
235
236 /* Sidebar Navigation */
237 .mxch-sidebar-nav {
238 flex: 1;
239 padding: var(--mxch-spacing-md) 0;
240 overflow-y: auto;
241 position: relative;
242 z-index: 1;
243 }
244
245 .mxch-nav-section {
246 margin-bottom: var(--mxch-spacing-xs);
247 }
248
249 .mxch-nav-section-title {
250 font-size: 11px;
251 font-weight: 600;
252 text-transform: uppercase;
253 letter-spacing: 0.5px;
254 color: var(--mxch-sidebar-text);
255 padding: var(--mxch-spacing-md) var(--mxch-spacing-lg) var(--mxch-spacing-sm);
256 opacity: 0.7;
257 }
258
259 /* Nav Items */
260 .mxch-nav-item {
261 position: relative;
262 }
263
264 .mxch-nav-link {
265 display: flex;
266 align-items: center;
267 gap: var(--mxch-spacing-sm);
268 padding: 10px var(--mxch-spacing-lg);
269 color: var(--mxch-sidebar-text);
270 text-decoration: none;
271 font-size: 14px;
272 font-weight: 500;
273 transition: all var(--mxch-transition-fast);
274 cursor: pointer;
275 border: none;
276 background: none;
277 width: 100%;
278 text-align: left;
279 }
280
281 .mxch-nav-link:hover {
282 color: var(--mxch-sidebar-text-hover);
283 background: rgba(255, 255, 255, 0.05);
284 }
285
286 .mxch-nav-link.active {
287 color: var(--mxch-sidebar-text-hover);
288 background: var(--mxch-sidebar-active-bg);
289 border-right: 3px solid var(--mxch-primary);
290 }
291
292 .mxch-nav-link-icon {
293 width: 20px;
294 height: 20px;
295 display: flex;
296 align-items: center;
297 justify-content: center;
298 opacity: 0.8;
299 }
300
301 .mxch-nav-link-icon svg {
302 width: 18px;
303 height: 18px;
304 stroke-width: 1.5;
305 }
306
307 .mxch-nav-link.active .mxch-nav-link-icon {
308 opacity: 1;
309 color: var(--mxch-primary);
310 }
311
312 .mxch-nav-link-text {
313 flex: 1;
314 }
315
316 .mxch-nav-link-badge {
317 font-size: 10px;
318 padding: 2px 6px;
319 border-radius: 10px;
320 background: var(--mxch-primary);
321 color: white;
322 font-weight: 600;
323 }
324
325 .mxch-nav-link-badge.mxch-active-badge {
326 font-size: 9px;
327 padding: 2px 6px;
328 border-radius: 4px;
329 background: var(--mxch-success, #10b981);
330 color: white;
331 font-weight: 600;
332 text-transform: uppercase;
333 letter-spacing: 0.3px;
334 }
335
336 .mxch-nav-link-arrow {
337 width: 16px;
338 height: 16px;
339 transition: transform var(--mxch-transition-fast);
340 opacity: 0.5;
341 }
342
343 .mxch-nav-item.expanded .mxch-nav-link-arrow {
344 transform: rotate(90deg);
345 }
346
347 /* Sub Navigation */
348 .mxch-nav-sub {
349 display: none;
350 background: rgba(0, 0, 0, 0.15);
351 }
352
353 .mxch-nav-item.expanded .mxch-nav-sub {
354 display: block;
355 }
356
357 .mxch-nav-sub-link {
358 display: flex;
359 align-items: center;
360 gap: var(--mxch-spacing-sm);
361 padding: 8px var(--mxch-spacing-lg) 8px 52px;
362 color: var(--mxch-sidebar-text);
363 text-decoration: none;
364 font-size: 13px;
365 transition: all var(--mxch-transition-fast);
366 cursor: pointer;
367 border: none;
368 background: none;
369 width: 100%;
370 text-align: left;
371 }
372
373 .mxch-nav-sub-link:hover {
374 color: var(--mxch-sidebar-text-hover);
375 background: rgba(255, 255, 255, 0.03);
376 }
377
378 .mxch-nav-sub-link.active {
379 color: var(--mxch-primary);
380 background: rgba(120, 115, 245, 0.1);
381 }
382
383 .mxch-nav-sub-link::before {
384 content: '';
385 width: 6px;
386 height: 6px;
387 border-radius: 50%;
388 background: currentColor;
389 opacity: 0.4;
390 }
391
392 .mxch-nav-sub-link.active::before {
393 opacity: 1;
394 background: var(--mxch-primary);
395 }
396
397 /* Sidebar Footer - Pro Upgrade CTA */
398 .mxch-sidebar-footer {
399 padding: var(--mxch-spacing-md) var(--mxch-spacing-lg);
400 position: relative;
401 z-index: 1;
402 }
403
404 .mxch-sidebar-upgrade {
405 display: flex;
406 align-items: center;
407 justify-content: center;
408 gap: 10px;
409 padding: 12px 16px;
410 background: transparent;
411 border: 1px solid rgba(120, 115, 245, 0.4);
412 border-radius: var(--mxch-radius-md);
413 color: var(--mxch-sidebar-text);
414 text-decoration: none;
415 font-size: 13px;
416 font-weight: 500;
417 transition: all 0.3s ease;
418 position: relative;
419 overflow: hidden;
420 }
421
422 .mxch-sidebar-upgrade::before {
423 content: '';
424 position: absolute;
425 inset: -1px;
426 border-radius: inherit;
427 padding: 1px;
428 background: linear-gradient(135deg, #7873f5 0%, #a78bfa 50%, #f472b6 100%);
429 -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
430 mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
431 -webkit-mask-composite: xor;
432 mask-composite: exclude;
433 opacity: 0;
434 transition: opacity 0.3s ease;
435 }
436
437 .mxch-sidebar-upgrade:hover::before {
438 opacity: 1;
439 }
440
441 .mxch-sidebar-upgrade:hover {
442 color: white;
443 background: linear-gradient(135deg, rgba(120, 115, 245, 0.15) 0%, rgba(167, 139, 250, 0.15) 50%, rgba(244, 114, 182, 0.1) 100%);
444 border-color: transparent;
445 box-shadow: 0 0 20px rgba(120, 115, 245, 0.3), 0 0 40px rgba(167, 139, 250, 0.15);
446 }
447
448 .mxch-sidebar-upgrade svg {
449 width: 16px;
450 height: 16px;
451 opacity: 0.7;
452 transition: opacity 0.3s ease;
453 }
454
455 .mxch-sidebar-upgrade:hover svg {
456 opacity: 1;
457 }
458
459 .mxch-sidebar-upgrade-text {
460 display: flex;
461 flex-direction: column;
462 align-items: flex-start;
463 line-height: 1.2;
464 }
465
466 .mxch-sidebar-upgrade-label {
467 font-size: 10px;
468 text-transform: uppercase;
469 letter-spacing: 0.5px;
470 opacity: 0.6;
471 }
472
473 .mxch-sidebar-upgrade-title {
474 font-weight: 600;
475 }
476
477 /* ==========================================================================
478 Main Content Area
479 ========================================================================== */
480 .mxch-content {
481 flex: 1;
482 padding: var(--mxch-spacing-xl);
483 overflow-y: auto;
484 overflow-x: hidden;
485 min-height: 0; /* Important for flex child scrolling */
486 }
487
488 .mxch-content::after {
489 content: '';
490 display: block;
491 height: 120px; /* Extra space at bottom for scrolling */
492 }
493
494 /* Content Header */
495 .mxch-content-header {
496 margin-bottom: var(--mxch-spacing-xl);
497 }
498
499 .mxch-content-title {
500 font-size: 24px;
501 font-weight: 700;
502 color: var(--mxch-text-primary);
503 margin: 0 0 var(--mxch-spacing-xs) 0;
504 }
505
506 .mxch-content-subtitle {
507 font-size: 14px;
508 color: var(--mxch-text-secondary);
509 margin: 0;
510 }
511
512 /* Pro Banner - Clean, Professional Design */
513 .mxch-pro-banner {
514 display: flex;
515 align-items: center;
516 justify-content: space-between;
517 gap: var(--mxch-spacing-lg);
518 padding: 16px 24px;
519 background: var(--mxch-card-bg);
520 border: 1px solid var(--mxch-card-border);
521 border-radius: var(--mxch-radius-lg);
522 margin-bottom: var(--mxch-spacing-xl);
523 position: relative;
524 overflow: hidden;
525 }
526
527 /* Subtle gradient accent on left edge */
528 .mxch-pro-banner::before {
529 content: '';
530 position: absolute;
531 left: 0;
532 top: 0;
533 bottom: 0;
534 width: 3px;
535 background: linear-gradient(180deg, #7873f5 0%, #a78bfa 50%, #f472b6 100%);
536 }
537
538 .mxch-pro-banner-content {
539 flex: 1;
540 min-width: 0;
541 }
542
543 .mxch-pro-banner-title {
544 font-size: 14px;
545 font-weight: 600;
546 color: var(--mxch-text-primary);
547 margin: 0 0 4px 0;
548 display: flex;
549 align-items: center;
550 gap: 8px;
551 }
552
553 .mxch-pro-banner-title::before {
554 content: '';
555 font-size: 12px;
556 }
557
558 .mxch-pro-banner-text {
559 font-size: 13px;
560 color: var(--mxch-text-secondary);
561 margin: 0;
562 line-height: 1.5;
563 }
564
565 .mxch-pro-banner-btn {
566 display: inline-flex;
567 align-items: center;
568 gap: 6px;
569 padding: 10px 20px;
570 background: transparent;
571 color: var(--mxch-primary);
572 border: 1px solid var(--mxch-primary);
573 border-radius: var(--mxch-radius-md);
574 text-decoration: none;
575 font-weight: 600;
576 font-size: 13px;
577 transition: all 0.25s ease;
578 white-space: nowrap;
579 position: relative;
580 overflow: hidden;
581 }
582
583 .mxch-pro-banner-btn::before {
584 content: '';
585 position: absolute;
586 inset: 0;
587 background: linear-gradient(135deg, #7873f5 0%, #a78bfa 50%, #f472b6 100%);
588 opacity: 0;
589 transition: opacity 0.25s ease;
590 }
591
592 .mxch-pro-banner-btn span {
593 position: relative;
594 z-index: 1;
595 }
596
597 .mxch-pro-banner-btn:hover {
598 color: white;
599 border-color: transparent;
600 box-shadow: 0 4px 15px rgba(120, 115, 245, 0.35);
601 transform: translateY(-1px);
602 }
603
604 .mxch-pro-banner-btn:hover::before {
605 opacity: 1;
606 }
607
608 /* Dismissible banner close button */
609 .mxch-pro-banner-close {
610 position: absolute;
611 top: 8px;
612 right: 8px;
613 width: 24px;
614 height: 24px;
615 display: flex;
616 align-items: center;
617 justify-content: center;
618 background: transparent;
619 border: none;
620 color: var(--mxch-text-muted);
621 cursor: pointer;
622 border-radius: 4px;
623 transition: all 0.2s ease;
624 opacity: 0;
625 }
626
627 .mxch-pro-banner:hover .mxch-pro-banner-close {
628 opacity: 1;
629 }
630
631 .mxch-pro-banner-close:hover {
632 background: rgba(0, 0, 0, 0.05);
633 color: var(--mxch-text-primary);
634 }
635
636 /* ==========================================================================
637 Settings Cards
638 ========================================================================== */
639 .mxch-card {
640 background: var(--mxch-card-bg);
641 border: 1px solid var(--mxch-card-border);
642 border-radius: var(--mxch-radius-lg);
643 box-shadow: var(--mxch-card-shadow);
644 margin-bottom: var(--mxch-spacing-lg);
645 overflow: hidden;
646 }
647
648 .mxch-card-header {
649 display: flex;
650 align-items: center;
651 justify-content: space-between;
652 padding: var(--mxch-spacing-md) var(--mxch-spacing-lg);
653 border-bottom: 1px solid var(--mxch-card-border);
654 background: var(--mxch-primary-lighter);
655 }
656
657 .mxch-card-title {
658 font-size: 15px;
659 font-weight: 600;
660 color: var(--mxch-text-primary);
661 margin: 0;
662 display: flex;
663 align-items: center;
664 gap: var(--mxch-spacing-sm);
665 }
666
667 .mxch-card-title-icon {
668 width: 20px;
669 height: 20px;
670 color: var(--mxch-primary);
671 }
672
673 .mxch-card-body {
674 padding: var(--mxch-spacing-lg);
675 }
676
677 .mxch-card-footer {
678 padding: var(--mxch-spacing-md) var(--mxch-spacing-lg);
679 border-top: 1px solid var(--mxch-card-border);
680 background: #fafbfc;
681 }
682
683 /* ==========================================================================
684 Form Fields
685 ========================================================================== */
686 .mxch-field {
687 margin-bottom: var(--mxch-spacing-lg);
688 }
689
690 .mxch-field:last-child {
691 margin-bottom: 0;
692 }
693
694 .mxch-field-row {
695 display: flex;
696 align-items: flex-start;
697 gap: var(--mxch-spacing-lg);
698 }
699
700 .mxch-field-label {
701 display: flex;
702 align-items: center;
703 gap: var(--mxch-spacing-sm);
704 font-size: 14px;
705 font-weight: 600;
706 color: var(--mxch-text-primary);
707 margin-bottom: var(--mxch-spacing-sm);
708 }
709
710 .mxch-field-label-required {
711 color: var(--mxch-error);
712 }
713
714 .mxch-field-description {
715 font-size: 13px;
716 color: var(--mxch-text-secondary);
717 margin-top: var(--mxch-spacing-xs);
718 line-height: 1.5;
719 }
720
721 .mxch-field-hint {
722 font-size: 12px;
723 color: var(--mxch-text-muted);
724 margin-top: var(--mxch-spacing-xs);
725 }
726
727 /* Input Fields */
728 .mxch-input {
729 width: 100%;
730 padding: 10px 14px;
731 font-size: 14px;
732 border: 1px solid var(--mxch-input-border);
733 border-radius: var(--mxch-radius-md);
734 background: var(--mxch-input-bg);
735 color: var(--mxch-text-primary);
736 transition: all var(--mxch-transition-fast);
737 }
738
739 .mxch-input:focus {
740 outline: none;
741 border-color: var(--mxch-input-focus);
742 box-shadow: 0 0 0 3px var(--mxch-primary-light);
743 }
744
745 .mxch-input::placeholder {
746 color: var(--mxch-text-muted);
747 }
748
749 .mxch-input-sm {
750 padding: 6px 10px;
751 font-size: 13px;
752 }
753
754 .mxch-input-lg {
755 padding: 12px 16px;
756 font-size: 15px;
757 }
758
759 /* Textarea */
760 .mxch-textarea {
761 width: 100%;
762 padding: 10px 14px;
763 font-size: 14px;
764 border: 1px solid var(--mxch-input-border);
765 border-radius: var(--mxch-radius-md);
766 background: var(--mxch-input-bg);
767 color: var(--mxch-text-primary);
768 transition: all var(--mxch-transition-fast);
769 resize: vertical;
770 min-height: 100px;
771 font-family: inherit;
772 }
773
774 .mxch-textarea:focus {
775 outline: none;
776 border-color: var(--mxch-input-focus);
777 box-shadow: 0 0 0 3px var(--mxch-primary-light);
778 }
779
780 /* Select */
781 .mxch-select {
782 width: 100%;
783 padding: 10px 36px 10px 14px;
784 font-size: 14px;
785 border: 1px solid var(--mxch-input-border);
786 border-radius: var(--mxch-radius-md);
787 background: var(--mxch-input-bg) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") no-repeat right 12px center;
788 color: var(--mxch-text-primary);
789 cursor: pointer;
790 appearance: none;
791 transition: all var(--mxch-transition-fast);
792 }
793
794 .mxch-select:focus {
795 outline: none;
796 border-color: var(--mxch-input-focus);
797 box-shadow: 0 0 0 3px var(--mxch-primary-light);
798 }
799
800 /* Toggle Switch */
801 .mxch-toggle {
802 position: relative;
803 display: inline-flex;
804 align-items: center;
805 gap: var(--mxch-spacing-sm);
806 cursor: pointer;
807 }
808
809 .mxch-toggle-input {
810 position: absolute;
811 opacity: 0;
812 width: 0;
813 height: 0;
814 }
815
816 .mxch-toggle-switch {
817 position: relative;
818 width: 44px;
819 height: 24px;
820 background: #cbd5e1;
821 border-radius: 12px;
822 transition: all var(--mxch-transition-fast);
823 }
824
825 .mxch-toggle-switch::before {
826 content: '';
827 position: absolute;
828 top: 2px;
829 left: 2px;
830 width: 20px;
831 height: 20px;
832 background: white;
833 border-radius: 50%;
834 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
835 transition: all var(--mxch-transition-fast);
836 }
837
838 .mxch-toggle-input:checked + .mxch-toggle-switch {
839 background: var(--mxch-primary);
840 }
841
842 .mxch-toggle-input:checked + .mxch-toggle-switch::before {
843 transform: translateX(20px);
844 }
845
846 .mxch-toggle-input:focus + .mxch-toggle-switch {
847 box-shadow: 0 0 0 3px var(--mxch-primary-light);
848 }
849
850 .mxch-toggle-label {
851 font-size: 14px;
852 color: var(--mxch-text-primary);
853 }
854
855 /* API Key Input */
856 .mxch-api-key-wrapper {
857 display: flex;
858 gap: var(--mxch-spacing-sm);
859 }
860
861 .mxch-api-key-wrapper .mxch-input {
862 flex: 1;
863 font-family: monospace;
864 }
865
866 .mxch-api-key-toggle {
867 padding: 10px 14px;
868 background: #f1f5f9;
869 border: 1px solid var(--mxch-input-border);
870 border-radius: var(--mxch-radius-md);
871 color: var(--mxch-text-secondary);
872 cursor: pointer;
873 font-size: 13px;
874 transition: all var(--mxch-transition-fast);
875 }
876
877 .mxch-api-key-toggle:hover {
878 background: #e2e8f0;
879 color: var(--mxch-text-primary);
880 }
881
882 .mxch-api-key-status {
883 display: flex;
884 align-items: center;
885 gap: var(--mxch-spacing-xs);
886 font-size: 12px;
887 margin-top: var(--mxch-spacing-xs);
888 }
889
890 .mxch-api-key-status.detected {
891 color: var(--mxch-success);
892 }
893
894 .mxch-api-key-status.missing {
895 color: var(--mxch-text-muted);
896 }
897
898 /* ==========================================================================
899 WordPress Form Table Styling (for do_settings_fields output)
900 ========================================================================== */
901 .mxch-card-body .form-table {
902 margin: 0;
903 border-collapse: collapse;
904 width: 100%;
905 }
906
907 .mxch-card-body .form-table th,
908 .mxch-card-body .form-table td {
909 padding: 0;
910 vertical-align: top;
911 border: none;
912 }
913
914 .mxch-card-body .form-table tr {
915 display: flex;
916 flex-direction: column;
917 margin-bottom: var(--mxch-spacing-lg);
918 }
919
920 .mxch-card-body .form-table tr:last-child {
921 margin-bottom: 0;
922 }
923
924 .mxch-card-body .form-table th {
925 display: block;
926 width: 100%;
927 font-size: 14px;
928 font-weight: 600;
929 color: var(--mxch-text-primary);
930 padding-bottom: var(--mxch-spacing-sm);
931 text-align: left;
932 }
933
934 .mxch-card-body .form-table th label {
935 font-weight: 600;
936 }
937
938 .mxch-card-body .form-table td {
939 display: block;
940 width: 100%;
941 }
942
943 /* Style WordPress default inputs inside form-table */
944 .mxch-card-body .form-table input[type="text"],
945 .mxch-card-body .form-table input[type="password"],
946 .mxch-card-body .form-table input[type="email"],
947 .mxch-card-body .form-table input[type="url"],
948 .mxch-card-body .form-table input[type="number"] {
949 width: 100%;
950 max-width: 100%;
951 padding: 10px 14px;
952 font-size: 14px;
953 border: 1px solid var(--mxch-input-border);
954 border-radius: var(--mxch-radius-md);
955 background: var(--mxch-input-bg);
956 color: var(--mxch-text-primary);
957 transition: all var(--mxch-transition-fast);
958 box-sizing: border-box;
959 }
960
961 .mxch-card-body .form-table input[type="text"]:focus,
962 .mxch-card-body .form-table input[type="password"]:focus,
963 .mxch-card-body .form-table input[type="email"]:focus,
964 .mxch-card-body .form-table input[type="url"]:focus,
965 .mxch-card-body .form-table input[type="number"]:focus {
966 outline: none;
967 border-color: var(--mxch-input-focus);
968 box-shadow: 0 0 0 3px var(--mxch-primary-light);
969 }
970
971 .mxch-card-body .form-table .regular-text {
972 width: 100%;
973 max-width: 100%;
974 }
975
976 .mxch-card-body .form-table select {
977 width: 100%;
978 max-width: 100%;
979 padding: 10px 36px 10px 14px;
980 font-size: 14px;
981 border: 1px solid var(--mxch-input-border);
982 border-radius: var(--mxch-radius-md);
983 background: var(--mxch-input-bg) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") no-repeat right 12px center;
984 color: var(--mxch-text-primary);
985 cursor: pointer;
986 appearance: none;
987 -webkit-appearance: none;
988 transition: all var(--mxch-transition-fast);
989 }
990
991 .mxch-card-body .form-table select:focus {
992 outline: none;
993 border-color: var(--mxch-input-focus);
994 box-shadow: 0 0 0 3px var(--mxch-primary-light);
995 }
996
997 .mxch-card-body .form-table textarea {
998 width: 100%;
999 max-width: 100%;
1000 padding: 10px 14px;
1001 font-size: 14px;
1002 border: 1px solid var(--mxch-input-border);
1003 border-radius: var(--mxch-radius-md);
1004 background: var(--mxch-input-bg);
1005 color: var(--mxch-text-primary);
1006 transition: all var(--mxch-transition-fast);
1007 resize: vertical;
1008 min-height: 100px;
1009 font-family: inherit;
1010 box-sizing: border-box;
1011 }
1012
1013 .mxch-card-body .form-table textarea:focus {
1014 outline: none;
1015 border-color: var(--mxch-input-focus);
1016 box-shadow: 0 0 0 3px var(--mxch-primary-light);
1017 }
1018
1019 /* Style descriptions in form-table */
1020 .mxch-card-body .form-table p.description,
1021 .mxch-card-body .form-table .description {
1022 font-size: 13px;
1023 color: var(--mxch-text-secondary);
1024 margin-top: var(--mxch-spacing-xs);
1025 line-height: 1.5;
1026 }
1027
1028 /* API Key wrappers inside form-table */
1029 .mxch-card-body .form-table .api-key-wrapper {
1030 display: grid;
1031 grid-template-columns: 1fr auto;
1032 grid-template-rows: auto auto;
1033 gap: var(--mxch-spacing-sm);
1034 align-items: center;
1035 }
1036
1037 .mxch-card-body .form-table .api-key-wrapper input {
1038 grid-column: 1;
1039 grid-row: 1;
1040 font-family: monospace;
1041 width: 100%;
1042 }
1043
1044 .mxch-admin-wrapper .mxch-card-body .form-table .api-key-wrapper button,
1045 .mxch-admin-wrapper .mxch-card-body .api-key-wrapper button,
1046 .mxch-admin-wrapper .mxch-section .api-key-wrapper button {
1047 grid-column: 2;
1048 grid-row: 1;
1049 padding: 10px 16px;
1050 background: #f1f5f9;
1051 border: 1px solid var(--mxch-input-border);
1052 border-radius: var(--mxch-radius-md);
1053 color: var(--mxch-text-secondary);
1054 cursor: pointer;
1055 font-size: 13px;
1056 font-weight: 500;
1057 transition: all var(--mxch-transition-fast);
1058 white-space: nowrap;
1059 min-width: 70px;
1060 text-align: center;
1061 height: auto;
1062 line-height: 1.4;
1063 }
1064
1065 .mxch-admin-wrapper .mxch-card-body .form-table .api-key-wrapper button:hover,
1066 .mxch-admin-wrapper .mxch-card-body .api-key-wrapper button:hover,
1067 .mxch-admin-wrapper .mxch-section .api-key-wrapper button:hover {
1068 background: var(--mxch-primary);
1069 border-color: var(--mxch-primary);
1070 color: white;
1071 }
1072
1073 /* Description inside api-key-wrapper needs to be on its own line */
1074 .mxch-card-body .form-table .api-key-wrapper p.description,
1075 .mxch-card-body .form-table .api-key-wrapper .description {
1076 grid-column: 1 / -1;
1077 grid-row: 2;
1078 margin: 0;
1079 }
1080
1081 /* Checkbox styling */
1082 .mxch-card-body .form-table input[type="checkbox"] {
1083 width: 18px;
1084 height: 18px;
1085 margin: 0;
1086 cursor: pointer;
1087 accent-color: var(--mxch-primary);
1088 }
1089
1090 /* Toggle switches (if using class-based toggles) */
1091 .mxch-card-body .form-table .mxchat-toggle-wrapper {
1092 display: flex;
1093 align-items: center;
1094 gap: var(--mxch-spacing-sm);
1095 }
1096
1097 /* Button styling inside form-table */
1098 .mxch-card-body .form-table .button {
1099 padding: 8px 16px;
1100 font-size: 13px;
1101 border-radius: var(--mxch-radius-md);
1102 transition: all var(--mxch-transition-fast);
1103 }
1104
1105 .mxch-card-body .form-table .button-primary {
1106 background: var(--mxch-primary);
1107 border-color: var(--mxch-primary);
1108 color: white;
1109 }
1110
1111 .mxch-card-body .form-table .button-primary:hover {
1112 background: var(--mxch-primary-hover);
1113 border-color: var(--mxch-primary-hover);
1114 }
1115
1116 /* ==========================================================================
1117 Rate Limits - Collapsible Accordion
1118 ========================================================================== */
1119 .mxch-rate-limits {
1120 border: 1px solid var(--mxch-card-border);
1121 border-radius: var(--mxch-radius-lg);
1122 overflow: hidden;
1123 }
1124
1125 .mxch-rate-limit-item {
1126 border-bottom: 1px solid var(--mxch-card-border);
1127 }
1128
1129 .mxch-rate-limit-item:last-child {
1130 border-bottom: none;
1131 }
1132
1133 .mxch-rate-limit-header {
1134 display: flex;
1135 align-items: center;
1136 justify-content: space-between;
1137 padding: var(--mxch-spacing-md) var(--mxch-spacing-lg);
1138 background: #fafbfc;
1139 cursor: pointer;
1140 transition: all var(--mxch-transition-fast);
1141 }
1142
1143 .mxch-rate-limit-header:hover {
1144 background: #f1f5f9;
1145 }
1146
1147 .mxch-rate-limit-role {
1148 font-weight: 600;
1149 color: var(--mxch-text-primary);
1150 font-size: 14px;
1151 }
1152
1153 .mxch-rate-limit-summary {
1154 display: flex;
1155 align-items: center;
1156 gap: var(--mxch-spacing-md);
1157 }
1158
1159 .mxch-rate-limit-badge {
1160 padding: 4px 10px;
1161 background: var(--mxch-primary-light);
1162 color: var(--mxch-primary);
1163 border-radius: 20px;
1164 font-size: 12px;
1165 font-weight: 600;
1166 }
1167
1168 .mxch-rate-limit-arrow {
1169 width: 20px;
1170 height: 20px;
1171 color: var(--mxch-text-muted);
1172 transition: transform var(--mxch-transition-fast);
1173 }
1174
1175 .mxch-rate-limit-item.expanded .mxch-rate-limit-arrow {
1176 transform: rotate(180deg);
1177 }
1178
1179 .mxch-rate-limit-body {
1180 display: none;
1181 padding: var(--mxch-spacing-lg);
1182 background: white;
1183 border-top: 1px solid var(--mxch-card-border);
1184 }
1185
1186 .mxch-rate-limit-item.expanded .mxch-rate-limit-body {
1187 display: block;
1188 }
1189
1190 .mxch-rate-limit-controls {
1191 display: flex;
1192 gap: var(--mxch-spacing-lg);
1193 margin-bottom: var(--mxch-spacing-md);
1194 }
1195
1196 .mxch-rate-limit-controls .mxch-field {
1197 flex: 1;
1198 margin-bottom: 0;
1199 }
1200
1201 /* Global cap "Current usage" readout (plan-mxchat-20260603-e9b3f9) */
1202 .mxch-rate-limit-usage {
1203 margin-top: var(--mxch-spacing-md);
1204 padding-top: var(--mxch-spacing-md);
1205 border-top: 1px solid var(--mxch-card-border);
1206 }
1207
1208 .mxch-rate-limit-usage-head {
1209 display: flex;
1210 align-items: center;
1211 justify-content: space-between;
1212 gap: var(--mxch-spacing-md);
1213 margin-bottom: var(--mxch-spacing-xs);
1214 }
1215
1216 /* ==========================================================================
1217 Buttons
1218 ========================================================================== */
1219 .mxch-btn {
1220 display: inline-flex;
1221 align-items: center;
1222 justify-content: center;
1223 gap: var(--mxch-spacing-sm);
1224 padding: 10px 18px;
1225 font-size: 14px;
1226 font-weight: 600;
1227 border-radius: var(--mxch-radius-md);
1228 cursor: pointer;
1229 transition: all var(--mxch-transition-fast);
1230 text-decoration: none;
1231 border: none;
1232 }
1233
1234 .mxch-btn-primary {
1235 background: var(--mxch-primary);
1236 color: white;
1237 }
1238
1239 .mxch-btn-primary:hover {
1240 background: var(--mxch-primary-hover);
1241 color: white;
1242 transform: translateY(-1px);
1243 box-shadow: 0 4px 12px rgba(120, 115, 245, 0.3);
1244 }
1245
1246 .mxch-btn-secondary {
1247 background: white;
1248 color: var(--mxch-text-primary);
1249 border: 1px solid var(--mxch-input-border);
1250 }
1251
1252 .mxch-btn-secondary:hover {
1253 background: #f8fafc;
1254 border-color: #c7c7c7;
1255 }
1256
1257 .mxch-btn-ghost {
1258 background: transparent;
1259 color: var(--mxch-text-secondary);
1260 }
1261
1262 .mxch-btn-ghost:hover {
1263 background: #f1f5f9;
1264 color: var(--mxch-text-primary);
1265 }
1266
1267 .mxch-btn-sm {
1268 padding: 6px 12px;
1269 font-size: 13px;
1270 }
1271
1272 .mxch-btn-lg {
1273 padding: 12px 24px;
1274 font-size: 15px;
1275 }
1276
1277 .mxch-btn-icon {
1278 width: 18px;
1279 height: 18px;
1280 }
1281
1282 /* ==========================================================================
1283 Content Sections (hidden by default, shown when active)
1284 ========================================================================== */
1285 .mxch-section {
1286 display: none;
1287 }
1288
1289 .mxch-section.active {
1290 display: block;
1291 animation: mxcFadeIn 0.2s ease;
1292 }
1293
1294 @keyframes mxcFadeIn {
1295 from {
1296 opacity: 0;
1297 transform: translateY(8px);
1298 }
1299 to {
1300 opacity: 1;
1301 transform: translateY(0);
1302 }
1303 }
1304
1305 /* ==========================================================================
1306 Info Notices
1307 ========================================================================== */
1308 .mxch-notice {
1309 display: flex;
1310 align-items: flex-start;
1311 gap: var(--mxch-spacing-sm);
1312 padding: var(--mxch-spacing-md);
1313 border-radius: var(--mxch-radius-md);
1314 font-size: 13px;
1315 line-height: 1.5;
1316 }
1317
1318 .mxch-notice-icon {
1319 width: 18px;
1320 height: 18px;
1321 flex-shrink: 0;
1322 margin-top: 1px;
1323 }
1324
1325 .mxch-notice-info {
1326 background: #eff6ff;
1327 color: #1e40af;
1328 border: 1px solid #bfdbfe;
1329 }
1330
1331 .mxch-notice-warning {
1332 background: #fffbeb;
1333 color: #92400e;
1334 border: 1px solid #fde68a;
1335 }
1336
1337 .mxch-notice-success {
1338 background: #ecfdf5;
1339 color: #065f46;
1340 border: 1px solid #a7f3d0;
1341 }
1342
1343 .mxch-notice-error {
1344 background: #fef2f2;
1345 color: #991b1b;
1346 border: 1px solid #fecaca;
1347 }
1348
1349 /* Standalone notice sitting between a content header and the first card.
1350 Token-based replacement for the inline margin declarations this component
1351 has been carrying at its call sites (b65e8d). */
1352 .mxch-notice-block {
1353 margin-bottom: var(--mxch-spacing-lg);
1354 }
1355
1356 /* ==========================================================================
1357 Disclosure (collapsible <details>)
1358 Generic Advanced/opt-in surface — used for static-bearer fallback on
1359 mxchat-mcp's Connected Apps tab, and any add-on that needs the same
1360 "advanced/show more" pattern. Originally lived in plugins/mxchat-mcp/css/
1361 admin-mcp.css; elevated here so every add-on inherits via the standard
1362 admin-sidebar.css enqueue.
1363 ========================================================================== */
1364 .mxch-disclosure {
1365 margin-top: 16px;
1366 border: 1px solid var(--mxch-card-border, #e2e4e9);
1367 border-radius: var(--mxch-radius-md, 6px);
1368 background: #fbfcfd;
1369 }
1370 .mxch-disclosure[open] {
1371 background: #fff;
1372 }
1373 .mxch-disclosure-summary {
1374 display: flex;
1375 align-items: center;
1376 gap: 10px;
1377 padding: 10px 14px;
1378 cursor: pointer;
1379 list-style: none;
1380 user-select: none;
1381 color: var(--mxch-text-secondary, #57606a);
1382 font-size: 13px;
1383 font-weight: 600;
1384 }
1385 .mxch-disclosure-summary::-webkit-details-marker { display: none; }
1386 .mxch-disclosure-summary::before {
1387 content: "";
1388 display: inline-block;
1389 width: 8px;
1390 height: 8px;
1391 border-right: 2px solid currentColor;
1392 border-bottom: 2px solid currentColor;
1393 transform: rotate(-45deg);
1394 transition: transform 0.18s ease;
1395 margin-right: 2px;
1396 }
1397 .mxch-disclosure[open] > .mxch-disclosure-summary::before {
1398 transform: rotate(45deg);
1399 }
1400 .mxch-disclosure-summary svg {
1401 flex-shrink: 0;
1402 opacity: 0.7;
1403 }
1404 .mxch-disclosure-summary-text {
1405 color: var(--mxch-text-primary, #1d2327);
1406 font-weight: 600;
1407 }
1408 .mxch-disclosure-summary-hint {
1409 color: var(--mxch-text-secondary, #57606a);
1410 font-weight: 400;
1411 font-size: 12px;
1412 }
1413 .mxch-disclosure-summary:hover .mxch-disclosure-summary-text {
1414 color: var(--mxch-primary, #7873f5);
1415 }
1416 .mxch-disclosure-summary:focus-visible {
1417 outline: 2px solid var(--mxch-primary, #7873f5);
1418 outline-offset: 2px;
1419 border-radius: var(--mxch-radius-md, 6px);
1420 }
1421 .mxch-disclosure-body {
1422 padding: 8px 14px 14px 14px;
1423 border-top: 1px solid var(--mxch-card-border, #e2e4e9);
1424 }
1425 @media (max-width: 600px) {
1426 .mxch-disclosure-summary {
1427 flex-wrap: wrap;
1428 }
1429 .mxch-disclosure-summary-hint {
1430 flex-basis: 100%;
1431 margin-left: 18px;
1432 }
1433 }
1434
1435 /* ==========================================================================
1436 Quick Questions List
1437 ========================================================================== */
1438 .mxch-quick-questions {
1439 display: flex;
1440 flex-direction: column;
1441 gap: var(--mxch-spacing-sm);
1442 }
1443
1444 .mxch-quick-question-item {
1445 display: flex;
1446 align-items: center;
1447 gap: var(--mxch-spacing-sm);
1448 padding: var(--mxch-spacing-sm);
1449 background: #f8fafc;
1450 border: 1px solid var(--mxch-card-border);
1451 border-radius: var(--mxch-radius-md);
1452 }
1453
1454 .mxch-quick-question-item .mxch-input {
1455 flex: 1;
1456 background: white;
1457 }
1458
1459 .mxch-quick-question-remove {
1460 padding: 6px;
1461 background: none;
1462 border: none;
1463 color: var(--mxch-text-muted);
1464 cursor: pointer;
1465 border-radius: var(--mxch-radius-sm);
1466 transition: all var(--mxch-transition-fast);
1467 }
1468
1469 .mxch-quick-question-remove:hover {
1470 background: #fee2e2;
1471 color: var(--mxch-error);
1472 }
1473
1474 .mxch-quick-question-add {
1475 display: flex;
1476 align-items: center;
1477 justify-content: center;
1478 gap: var(--mxch-spacing-xs);
1479 padding: var(--mxch-spacing-sm);
1480 border: 2px dashed var(--mxch-card-border);
1481 border-radius: var(--mxch-radius-md);
1482 color: var(--mxch-text-muted);
1483 background: none;
1484 cursor: pointer;
1485 font-size: 13px;
1486 transition: all var(--mxch-transition-fast);
1487 }
1488
1489 .mxch-quick-question-add:hover {
1490 border-color: var(--mxch-primary);
1491 color: var(--mxch-primary);
1492 background: var(--mxch-primary-lighter);
1493 }
1494
1495 /* ==========================================================================
1496 Tutorials Grid (for YouTube Tutorials section)
1497 ========================================================================== */
1498 .mxch-tutorials-grid {
1499 display: grid;
1500 grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
1501 gap: var(--mxch-spacing-lg);
1502 }
1503
1504 .mxch-tutorial-card {
1505 background: white;
1506 border: 1px solid var(--mxch-card-border);
1507 border-radius: var(--mxch-radius-lg);
1508 overflow: hidden;
1509 transition: all var(--mxch-transition);
1510 }
1511
1512 .mxch-tutorial-card:hover {
1513 box-shadow: var(--mxch-card-shadow-hover);
1514 transform: translateY(-2px);
1515 }
1516
1517 .mxch-tutorial-content {
1518 padding: var(--mxch-spacing-md);
1519 }
1520
1521 .mxch-tutorial-title {
1522 font-size: 15px;
1523 font-weight: 600;
1524 color: var(--mxch-text-primary);
1525 margin: 0 0 var(--mxch-spacing-sm) 0;
1526 }
1527
1528 .mxch-tutorial-description {
1529 font-size: 13px;
1530 color: var(--mxch-text-secondary);
1531 margin: 0 0 var(--mxch-spacing-md) 0;
1532 line-height: 1.5;
1533 }
1534
1535 .mxch-tutorial-link {
1536 display: inline-flex;
1537 align-items: center;
1538 gap: var(--mxch-spacing-xs);
1539 color: var(--mxch-primary);
1540 font-size: 13px;
1541 font-weight: 600;
1542 text-decoration: none;
1543 }
1544
1545 .mxch-tutorial-link:hover {
1546 text-decoration: underline;
1547 }
1548
1549 /* ==========================================================================
1550 Autosave Indicator
1551 ========================================================================== */
1552 .mxch-autosave-indicator {
1553 display: flex;
1554 align-items: center;
1555 gap: var(--mxch-spacing-xs);
1556 font-size: 12px;
1557 color: var(--mxch-text-muted);
1558 padding: var(--mxch-spacing-xs) var(--mxch-spacing-sm);
1559 background: #f1f5f9;
1560 border-radius: 20px;
1561 }
1562
1563 .mxch-autosave-indicator.saving {
1564 color: var(--mxch-warning);
1565 }
1566
1567 .mxch-autosave-indicator.saved {
1568 color: var(--mxch-success);
1569 }
1570
1571 .mxch-autosave-dot {
1572 width: 6px;
1573 height: 6px;
1574 border-radius: 50%;
1575 background: currentColor;
1576 }
1577
1578 /* ==========================================================================
1579 Mobile Header (Hidden on Desktop)
1580 ========================================================================== */
1581 .mxch-mobile-header {
1582 display: none;
1583 }
1584
1585 /* ==========================================================================
1586 Mobile Menu Overlay
1587 ========================================================================== */
1588 .mxch-mobile-overlay {
1589 display: none;
1590 }
1591
1592 /* ==========================================================================
1593 Mobile Menu Modal
1594 ========================================================================== */
1595 .mxch-mobile-menu {
1596 display: none;
1597 }
1598
1599 /* ==========================================================================
1600 Responsive Design
1601 ========================================================================== */
1602 @media screen and (max-width: 1200px) {
1603 .mxch-sidebar {
1604 width: 220px;
1605 min-width: 220px;
1606 }
1607
1608 .mxch-content {
1609 padding: var(--mxch-spacing-lg);
1610 }
1611 }
1612
1613 @media screen and (max-width: 960px) {
1614 /* Hide desktop sidebar on mobile */
1615 .mxch-sidebar {
1616 display: none;
1617 }
1618
1619 /* Show mobile header */
1620 .mxch-mobile-header {
1621 display: flex;
1622 align-items: center;
1623 justify-content: space-between;
1624 padding: 12px 16px;
1625 background: var(--mxch-sidebar-bg);
1626 position: sticky;
1627 top: 0;
1628 z-index: 100;
1629 flex-shrink: 0;
1630 border-bottom: 4px solid transparent;
1631 border-image: linear-gradient(135deg, #fa73e6, #7873f5, #3ac9d1);
1632 border-image-slice: 1;
1633 }
1634
1635 .mxch-mobile-header::before {
1636 content: '';
1637 position: absolute;
1638 top: 0;
1639 left: 0;
1640 width: 100%;
1641 height: 100%;
1642 background: radial-gradient(circle at center, rgba(250, 115, 230, 0.08) 0%, rgba(120, 115, 245, 0.08) 50%, rgba(58, 201, 209, 0.08) 100%);
1643 z-index: -1;
1644 }
1645
1646 .mxch-mobile-logo {
1647 display: flex;
1648 align-items: center;
1649 gap: 8px;
1650 text-decoration: none;
1651 }
1652
1653 .mxch-mobile-logo-icon {
1654 width: 28px;
1655 height: 28px;
1656 flex-shrink: 0;
1657 }
1658
1659 .mxch-mobile-logo-icon img {
1660 width: 100%;
1661 height: 100%;
1662 object-fit: contain;
1663 }
1664
1665 .mxch-mobile-logo-text {
1666 font-size: 18px;
1667 font-weight: 700;
1668 color: #ffffff;
1669 letter-spacing: -0.5px;
1670 }
1671
1672 .mxch-mobile-menu-btn {
1673 display: flex;
1674 align-items: center;
1675 justify-content: center;
1676 width: 40px;
1677 height: 40px;
1678 background: rgba(255, 255, 255, 0.1);
1679 border: none;
1680 border-radius: 8px;
1681 color: #ffffff;
1682 cursor: pointer;
1683 transition: background 0.15s ease;
1684 }
1685
1686 .mxch-mobile-menu-btn:hover {
1687 background: rgba(255, 255, 255, 0.15);
1688 }
1689
1690 /* Mobile Overlay */
1691 .mxch-mobile-overlay {
1692 display: block;
1693 position: fixed;
1694 top: 46px; /* Account for WordPress admin bar on mobile (46px on smaller screens) */
1695 left: 0;
1696 right: 0;
1697 bottom: 0;
1698 background: rgba(0, 0, 0, 0.5);
1699 z-index: 998;
1700 opacity: 0;
1701 visibility: hidden;
1702 transition: opacity 0.3s ease, visibility 0.3s ease;
1703 }
1704
1705 .mxch-mobile-overlay.open {
1706 opacity: 1;
1707 visibility: visible;
1708 }
1709
1710 /* Mobile Menu Modal */
1711 .mxch-mobile-menu {
1712 display: flex;
1713 flex-direction: column;
1714 position: fixed;
1715 top: 46px; /* Account for WordPress admin bar on mobile (46px on smaller screens) */
1716 right: 0;
1717 bottom: 0;
1718 width: 300px;
1719 max-width: 85vw;
1720 background: var(--mxch-sidebar-bg);
1721 z-index: 999;
1722 transform: translateX(100%);
1723 transition: transform 0.3s ease;
1724 overflow: hidden;
1725 overflow-x: hidden;
1726 box-sizing: border-box;
1727 }
1728
1729 .mxch-mobile-menu::before {
1730 content: '';
1731 position: absolute;
1732 top: 0;
1733 left: 0;
1734 width: 100%;
1735 height: 100%;
1736 background: radial-gradient(circle at center, rgba(250, 115, 230, 0.08) 0%, rgba(120, 115, 245, 0.08) 50%, rgba(58, 201, 209, 0.08) 100%);
1737 z-index: 0;
1738 pointer-events: none;
1739 }
1740
1741 .mxch-mobile-menu.open {
1742 transform: translateX(0);
1743 }
1744
1745 .mxch-mobile-menu-header {
1746 display: flex;
1747 align-items: center;
1748 justify-content: space-between;
1749 padding: 16px 20px;
1750 border-bottom: 4px solid transparent;
1751 border-image: linear-gradient(135deg, #fa73e6, #7873f5, #3ac9d1);
1752 border-image-slice: 1;
1753 position: relative;
1754 z-index: 1;
1755 }
1756
1757 .mxch-mobile-menu-title {
1758 font-size: 16px;
1759 font-weight: 600;
1760 color: #ffffff;
1761 }
1762
1763 .mxch-mobile-menu-close {
1764 display: flex;
1765 align-items: center;
1766 justify-content: center;
1767 width: 36px;
1768 height: 36px;
1769 background: rgba(255, 255, 255, 0.1);
1770 border: none;
1771 border-radius: 8px;
1772 color: #ffffff;
1773 cursor: pointer;
1774 transition: background 0.15s ease;
1775 }
1776
1777 .mxch-mobile-menu-close:hover {
1778 background: rgba(255, 255, 255, 0.15);
1779 }
1780
1781 .mxch-mobile-menu-nav {
1782 flex: 1;
1783 overflow-y: auto;
1784 padding: 16px 0;
1785 position: relative;
1786 z-index: 1;
1787 }
1788
1789 .mxch-mobile-nav-section {
1790 margin-bottom: 8px;
1791 }
1792
1793 .mxch-mobile-nav-section-title {
1794 font-size: 11px;
1795 font-weight: 600;
1796 text-transform: uppercase;
1797 letter-spacing: 0.5px;
1798 color: var(--mxch-sidebar-text);
1799 padding: 12px 20px 8px;
1800 opacity: 0.7;
1801 }
1802
1803 .mxch-mobile-nav-link {
1804 display: flex;
1805 align-items: center;
1806 gap: 10px;
1807 width: 100%;
1808 padding: 12px 20px;
1809 background: none;
1810 border: none;
1811 color: var(--mxch-sidebar-text);
1812 font-size: 14px;
1813 font-weight: 500;
1814 text-align: left;
1815 cursor: pointer;
1816 transition: all 0.15s ease;
1817 }
1818
1819 .mxch-mobile-nav-link:hover {
1820 background: rgba(255, 255, 255, 0.05);
1821 color: #ffffff;
1822 }
1823
1824 .mxch-mobile-nav-link.active {
1825 background: var(--mxch-sidebar-active-bg);
1826 color: #ffffff;
1827 }
1828
1829 .mxch-mobile-nav-link.expanded {
1830 background: rgba(255, 255, 255, 0.05);
1831 color: #ffffff;
1832 }
1833
1834 .mxch-mobile-nav-link span {
1835 flex: 1;
1836 }
1837
1838 /* Prevent addon status dot from expanding - override flex: 1 from above */
1839 .mxch-mobile-nav-link .mxch-addon-status-dot {
1840 flex: 0 0 8px;
1841 width: 8px;
1842 height: 8px;
1843 }
1844
1845 .mxch-mobile-nav-arrow {
1846 opacity: 0.5;
1847 transition: transform 0.2s ease;
1848 }
1849
1850 .mxch-mobile-nav-link.expanded .mxch-mobile-nav-arrow {
1851 transform: rotate(90deg);
1852 opacity: 1;
1853 }
1854
1855 /* Mobile Sub Navigation */
1856 .mxch-mobile-nav-sub {
1857 display: none;
1858 background: rgba(0, 0, 0, 0.2);
1859 }
1860
1861 .mxch-mobile-nav-sub.expanded {
1862 display: block;
1863 }
1864
1865 .mxch-mobile-nav-sub-link {
1866 display: flex;
1867 align-items: center;
1868 gap: 8px;
1869 width: 100%;
1870 padding: 10px 20px 10px 52px;
1871 background: none;
1872 border: none;
1873 color: var(--mxch-sidebar-text);
1874 font-size: 13px;
1875 text-align: left;
1876 cursor: pointer;
1877 transition: all 0.15s ease;
1878 }
1879
1880 .mxch-mobile-nav-sub-link::before {
1881 content: '';
1882 width: 6px;
1883 height: 6px;
1884 border-radius: 50%;
1885 background: currentColor;
1886 opacity: 0.4;
1887 }
1888
1889 .mxch-mobile-nav-sub-link:hover {
1890 background: rgba(255, 255, 255, 0.03);
1891 color: #ffffff;
1892 }
1893
1894 .mxch-mobile-nav-sub-link.active {
1895 color: var(--mxch-primary);
1896 background: rgba(120, 115, 245, 0.1);
1897 }
1898
1899 .mxch-mobile-nav-sub-link.active::before {
1900 opacity: 1;
1901 background: var(--mxch-primary);
1902 }
1903
1904 /* Mobile Menu Footer */
1905 .mxch-mobile-menu-footer {
1906 padding: 16px 20px;
1907 border-top: 1px solid rgba(255, 255, 255, 0.1);
1908 position: relative;
1909 z-index: 1;
1910 box-sizing: border-box;
1911 max-width: 100%;
1912 overflow: hidden;
1913 }
1914
1915 .mxch-mobile-upgrade-btn {
1916 display: flex;
1917 align-items: center;
1918 justify-content: center;
1919 gap: 8px;
1920 width: 100%;
1921 padding: 12px 16px;
1922 background: linear-gradient(135deg, var(--mxch-primary), #a78bfa);
1923 border-radius: 8px;
1924 color: white;
1925 text-decoration: none;
1926 font-size: 14px;
1927 font-weight: 600;
1928 transition: all 0.15s ease;
1929 box-sizing: border-box;
1930 max-width: 100%;
1931 }
1932
1933 .mxch-mobile-upgrade-btn:hover {
1934 transform: translateY(-1px);
1935 box-shadow: 0 4px 12px rgba(120, 115, 245, 0.4);
1936 color: white;
1937 }
1938
1939 /* Adjust main layout for mobile */
1940 .mxch-admin-wrapper {
1941 flex-direction: column;
1942 position: fixed;
1943 left: 0;
1944 right: 0;
1945 overflow: auto;
1946 }
1947
1948 .mxch-content {
1949 height: auto;
1950 overflow: visible;
1951 padding: var(--mxch-spacing-lg);
1952 width: 100%;
1953 box-sizing: border-box;
1954 }
1955
1956 /* Center content sections on mobile */
1957 .mxch-content-section {
1958 max-width: 100%;
1959 margin-left: auto;
1960 margin-right: auto;
1961 }
1962
1963 .mxch-rate-limit-controls {
1964 flex-direction: column;
1965 }
1966
1967 /* Card headers stack on mobile */
1968 .mxch-card-header {
1969 flex-direction: column;
1970 align-items: stretch;
1971 gap: 12px;
1972 }
1973
1974 /* Content header adjustments */
1975 .mxch-content-header {
1976 margin-bottom: var(--mxch-spacing-md);
1977 }
1978
1979 .mxch-content-title {
1980 font-size: 20px;
1981 }
1982 }
1983
1984 @media screen and (max-width: 600px) {
1985 .mxch-content {
1986 padding: var(--mxch-spacing-md);
1987 }
1988
1989 .mxch-card-body {
1990 padding: var(--mxch-spacing-md);
1991 }
1992
1993 .mxch-card {
1994 margin-left: 0;
1995 margin-right: 0;
1996 }
1997
1998 .mxch-pro-banner {
1999 flex-direction: column;
2000 text-align: center;
2001 padding: 16px;
2002 margin-left: 0;
2003 margin-right: 0;
2004 max-width: 100%;
2005 box-sizing: border-box;
2006 }
2007
2008 .mxch-pro-banner-content {
2009 max-width: 100%;
2010 }
2011
2012 .mxch-pro-banner-title {
2013 justify-content: center;
2014 font-size: 13px;
2015 }
2016
2017 .mxch-pro-banner-text {
2018 font-size: 12px;
2019 }
2020
2021 .mxch-pro-banner-btn {
2022 width: auto;
2023 max-width: 100%;
2024 padding: 10px 16px;
2025 font-size: 12px;
2026 justify-content: center;
2027 box-sizing: border-box;
2028 }
2029
2030 .mxch-field-row {
2031 flex-direction: column;
2032 }
2033
2034 .mxch-api-key-wrapper {
2035 flex-direction: column;
2036 }
2037
2038 .mxch-mobile-menu {
2039 width: 100%;
2040 max-width: 100%;
2041 }
2042 }
2043
2044 /* ==========================================================================
2045 WordPress Admin Overrides
2046 ========================================================================== */
2047 .mxch-admin-wrapper .form-table {
2048 margin: 0;
2049 }
2050
2051 .mxch-admin-wrapper .form-table th {
2052 padding: 0;
2053 width: auto;
2054 }
2055
2056 .mxch-admin-wrapper .form-table td {
2057 padding: 0;
2058 }
2059
2060 .mxch-admin-wrapper .form-table tr {
2061 display: block;
2062 margin-bottom: var(--mxch-spacing-lg);
2063 }
2064
2065 .mxch-admin-wrapper .form-table tr:last-child {
2066 margin-bottom: 0;
2067 }
2068
2069 /* ==========================================================================
2070 Autosave Feedback Indicators
2071 ========================================================================== */
2072 .mxch-admin-wrapper .feedback-container {
2073 display: inline-flex;
2074 align-items: center;
2075 margin-left: 10px;
2076 position: relative;
2077 z-index: 10;
2078 vertical-align: middle;
2079 }
2080
2081 .mxch-admin-wrapper .saving-spinner {
2082 width: 16px;
2083 height: 16px;
2084 border: 2px solid #e2e8f0;
2085 border-top-color: var(--mxch-primary);
2086 border-radius: 50%;
2087 animation: mxcSpin 0.6s linear infinite;
2088 }
2089
2090 .mxch-admin-wrapper .success-icon {
2091 display: none;
2092 color: var(--mxch-success);
2093 font-size: 16px;
2094 font-weight: bold;
2095 margin-left: 5px;
2096 }
2097
2098 @keyframes mxcSpin {
2099 to {
2100 transform: rotate(360deg);
2101 }
2102 }
2103
2104 /* Ensure feedback container appears inline with toggles */
2105 .mxch-admin-wrapper .toggle-switch + .feedback-container,
2106 .mxch-admin-wrapper .mxchat-toggle-switch + .feedback-container,
2107 .mxch-admin-wrapper label.toggle-switch ~ .feedback-container {
2108 display: inline-flex;
2109 vertical-align: middle;
2110 }
2111
2112 /* Position feedback near inputs - use inline for form-table context */
2113 .mxch-admin-wrapper .form-table input + .feedback-container,
2114 .mxch-admin-wrapper .form-table select + .feedback-container,
2115 .mxch-admin-wrapper .form-table textarea + .feedback-container {
2116 position: relative;
2117 display: inline-flex;
2118 vertical-align: middle;
2119 margin-left: 10px;
2120 right: auto;
2121 top: auto;
2122 transform: none;
2123 }
2124
2125 /* Position feedback near inputs - absolute for card layouts with field-control */
2126 .mxch-admin-wrapper .mxch-field-control input + .feedback-container,
2127 .mxch-admin-wrapper .mxch-field-control select + .feedback-container,
2128 .mxch-admin-wrapper .mxch-field-control textarea + .feedback-container {
2129 position: absolute;
2130 right: -30px;
2131 top: 50%;
2132 transform: translateY(-50%);
2133 }
2134
2135 /* Make input containers relative for absolute positioning */
2136 .mxch-admin-wrapper .mxch-field-control {
2137 position: relative;
2138 }
2139
2140 /* Feedback inside slider container */
2141 .mxch-admin-wrapper .slider-container + .feedback-container {
2142 margin-left: 15px;
2143 }
2144
2145 /* Persistent unsaved-state badge (plan 7787f8). Quiet warning, not an error:
2146 a field whose value differs from its last-saved state carries this on its
2147 label until the autosave round-trip confirms. */
2148 .mxch-admin-wrapper .mxchat-unsaved-badge {
2149 display: inline-flex;
2150 align-items: center;
2151 gap: 5px;
2152 margin-left: 8px;
2153 padding: 1px 8px 1px 6px;
2154 border-radius: 10px;
2155 background: var(--mxch-warning-light);
2156 color: var(--mxch-warning-text);
2157 font-size: 11px;
2158 font-weight: 600;
2159 line-height: 1.6;
2160 letter-spacing: 0.2px;
2161 vertical-align: middle;
2162 white-space: nowrap;
2163 animation: mxchUnsavedIn 0.15s ease-out;
2164 }
2165
2166 .mxch-admin-wrapper .mxchat-unsaved-badge::before {
2167 content: '';
2168 width: 6px;
2169 height: 6px;
2170 border-radius: 50%;
2171 background: var(--mxch-warning);
2172 flex: none;
2173 }
2174
2175 @keyframes mxchUnsavedIn {
2176 from { opacity: 0; transform: translateY(1px); }
2177 to { opacity: 1; transform: none; }
2178 }
2179
2180 /* ==========================================================================
2181 Real-time Entry Updates
2182 ========================================================================== */
2183
2184 /* New entry highlight animation */
2185 .mxchat-new-entry {
2186 background-color: rgba(120, 115, 245, 0.15);
2187 animation: mxchatNewEntryFade 2s ease-out forwards;
2188 }
2189
2190 @keyframes mxchatNewEntryFade {
2191 0% {
2192 background-color: rgba(120, 115, 245, 0.25);
2193 }
2194 100% {
2195 background-color: transparent;
2196 }
2197 }
2198
2199 /* Count update flash */
2200 #mxchat-entry-count.mxchat-count-updated,
2201 #mxchat-sidebar-count.mxchat-count-updated {
2202 animation: mxchatCountPulse 0.5s ease-out;
2203 }
2204
2205 @keyframes mxchatCountPulse {
2206 0% {
2207 color: var(--mxch-primary);
2208 transform: scale(1.2);
2209 }
2210 100% {
2211 color: var(--mxch-text-secondary);
2212 transform: scale(1);
2213 }
2214 }
2215
2216 /* Sidebar badge specific pulse - keep white text on purple background */
2217 #mxchat-sidebar-count.mxchat-count-updated {
2218 animation: mxchatSidebarCountPulse 0.5s ease-out;
2219 }
2220
2221 @keyframes mxchatSidebarCountPulse {
2222 0% {
2223 transform: scale(1.3);
2224 background: var(--mxch-success);
2225 }
2226 100% {
2227 transform: scale(1);
2228 background: var(--mxch-primary);
2229 }
2230 }
2231
2232 /* ==========================================================================
2233 Pro Upgrade v2 - Cleaner, More Professional Design
2234 ========================================================================== */
2235
2236 /* Sidebar Upgrade Button - v2 (Concise) */
2237 .mxch-sidebar-upgrade-v2 {
2238 display: flex;
2239 align-items: center;
2240 justify-content: center;
2241 gap: 8px;
2242 padding: 10px 16px;
2243 background: rgba(120, 115, 245, 0.1);
2244 border: 1px solid rgba(120, 115, 245, 0.25);
2245 border-radius: var(--mxch-radius-md);
2246 color: #c4c1ff;
2247 text-decoration: none;
2248 font-size: 13px;
2249 font-weight: 500;
2250 transition: all 0.2s ease;
2251 position: relative;
2252 }
2253
2254 .mxch-sidebar-upgrade-v2:hover {
2255 background: rgba(120, 115, 245, 0.2);
2256 border-color: rgba(120, 115, 245, 0.5);
2257 color: #ffffff;
2258 text-decoration: none;
2259 }
2260
2261 .mxch-sidebar-upgrade-v2:focus {
2262 outline: none;
2263 box-shadow: 0 0 0 2px rgba(120, 115, 245, 0.4);
2264 }
2265
2266 .mxch-sidebar-upgrade-v2 svg {
2267 width: 14px;
2268 height: 14px;
2269 opacity: 0.8;
2270 flex-shrink: 0;
2271 }
2272
2273 .mxch-sidebar-upgrade-v2:hover svg {
2274 opacity: 1;
2275 }
2276
2277 /* Pro Banner - v2 (Clean & Minimal) */
2278 .mxch-pro-banner-v2 {
2279 display: flex;
2280 align-items: center;
2281 justify-content: space-between;
2282 gap: 20px;
2283 padding: 14px 20px;
2284 background: linear-gradient(135deg, rgba(120, 115, 245, 0.08) 0%, rgba(167, 139, 250, 0.06) 100%);
2285 border: 1px solid rgba(120, 115, 245, 0.15);
2286 border-radius: var(--mxch-radius-md);
2287 margin-bottom: var(--mxch-spacing-lg);
2288 }
2289
2290 .mxch-pro-banner-v2-content {
2291 display: flex;
2292 align-items: center;
2293 gap: 12px;
2294 flex: 1;
2295 min-width: 0;
2296 }
2297
2298 .mxch-pro-banner-v2-icon {
2299 width: 32px;
2300 height: 32px;
2301 display: flex;
2302 align-items: center;
2303 justify-content: center;
2304 background: linear-gradient(135deg, var(--mxch-primary) 0%, #a78bfa 100%);
2305 border-radius: 8px;
2306 flex-shrink: 0;
2307 }
2308
2309 .mxch-pro-banner-v2-icon svg {
2310 width: 16px;
2311 height: 16px;
2312 color: white;
2313 }
2314
2315 .mxch-pro-banner-v2-text {
2316 flex: 1;
2317 min-width: 0;
2318 }
2319
2320 .mxch-pro-banner-v2-title {
2321 font-size: 14px;
2322 font-weight: 600;
2323 color: var(--mxch-text-primary);
2324 margin: 0 0 2px 0;
2325 }
2326
2327 .mxch-pro-banner-v2-desc {
2328 font-size: 12px;
2329 color: var(--mxch-text-secondary);
2330 margin: 0;
2331 line-height: 1.4;
2332 }
2333
2334 .mxch-pro-banner-v2-btn {
2335 display: inline-flex;
2336 align-items: center;
2337 gap: 6px;
2338 padding: 8px 16px;
2339 background: var(--mxch-primary);
2340 color: white;
2341 font-size: 13px;
2342 font-weight: 500;
2343 border-radius: 6px;
2344 text-decoration: none;
2345 transition: all 0.2s ease;
2346 white-space: nowrap;
2347 flex-shrink: 0;
2348 }
2349
2350 .mxch-pro-banner-v2-btn:hover {
2351 background: var(--mxch-primary-hover);
2352 color: white;
2353 text-decoration: none;
2354 transform: translateY(-1px);
2355 box-shadow: 0 4px 12px rgba(120, 115, 245, 0.3);
2356 }
2357
2358 .mxch-pro-banner-v2-btn:focus {
2359 outline: none;
2360 box-shadow: 0 0 0 3px rgba(120, 115, 245, 0.3);
2361 }
2362
2363 .mxch-pro-banner-v2-btn svg {
2364 width: 14px;
2365 height: 14px;
2366 }
2367
2368 /* Mobile responsive for v2 banner */
2369 @media screen and (max-width: 600px) {
2370 .mxch-pro-banner-v2 {
2371 flex-direction: column;
2372 text-align: center;
2373 padding: 16px;
2374 gap: 12px;
2375 }
2376
2377 .mxch-pro-banner-v2-content {
2378 flex-direction: column;
2379 }
2380
2381 .mxch-pro-banner-v2-btn {
2382 width: 100%;
2383 justify-content: center;
2384 }
2385 }
2386
2387 /* ==========================================================================
2388 API Key Fields - Prevent Browser Autofill
2389 ========================================================================== */
2390
2391 /* Mask API key fields like password fields but avoid browser password autofill */
2392 .mxchat-api-key-field {
2393 -webkit-text-security: disc;
2394 text-security: disc;
2395 font-family: monospace;
2396 }
2397
2398 /* Show actual text when focused or when show button toggled */
2399 .mxchat-api-key-field.mxchat-show-key {
2400 -webkit-text-security: none;
2401 text-security: none;
2402 }
2403
2404 /* ==========================================================================
2405 Debug & Optimization Tools
2406 ========================================================================== */
2407
2408 /* Debug Log Viewer */
2409 .mxchat-debug-log-viewer {
2410 max-height: 400px;
2411 overflow-y: auto;
2412 background: #f8fafc;
2413 border: 1px solid var(--mxch-card-border, #e2e4e9);
2414 border-radius: 8px;
2415 padding: 0;
2416 }
2417
2418 .mxchat-debug-log-empty {
2419 display: flex;
2420 flex-direction: column;
2421 align-items: center;
2422 justify-content: center;
2423 padding: 48px 24px;
2424 text-align: center;
2425 color: #64748b;
2426 }
2427
2428 .mxchat-debug-log-empty p {
2429 margin: 16px 0 0;
2430 font-size: 14px;
2431 }
2432
2433 .mxchat-debug-log-entries {
2434 padding: 12px;
2435 }
2436
2437 .mxchat-debug-log-entry {
2438 background: #ffffff;
2439 border: 1px solid #e2e8f0;
2440 border-radius: 8px;
2441 padding: 12px;
2442 margin-bottom: 8px;
2443 font-size: 13px;
2444 }
2445
2446 .mxchat-debug-log-entry:last-child {
2447 margin-bottom: 0;
2448 }
2449
2450 .mxchat-log-header {
2451 display: flex;
2452 justify-content: space-between;
2453 align-items: center;
2454 margin-bottom: 8px;
2455 }
2456
2457 .mxchat-log-type {
2458 display: inline-block;
2459 padding: 2px 8px;
2460 border-radius: 4px;
2461 font-size: 10px;
2462 font-weight: 600;
2463 text-transform: uppercase;
2464 letter-spacing: 0.5px;
2465 background: #e2e8f0;
2466 color: #475569;
2467 }
2468
2469 .mxchat-log-type-settings_save .mxchat-log-type {
2470 background: #dbeafe;
2471 color: #1e40af;
2472 }
2473
2474 .mxchat-log-type-debug_mode .mxchat-log-type {
2475 background: #fef3c7;
2476 color: #92400e;
2477 }
2478
2479 .mxchat-log-type-api_error .mxchat-log-type {
2480 background: #fee2e2;
2481 color: #991b1b;
2482 }
2483
2484 .mxchat-log-type-reset .mxchat-log-type {
2485 background: #fce7f3;
2486 color: #9d174d;
2487 }
2488
2489 .mxchat-log-type-settings_export .mxchat-log-type {
2490 background: #d1fae5;
2491 color: #065f46;
2492 }
2493
2494 .mxchat-log-time {
2495 font-size: 11px;
2496 color: #94a3b8;
2497 }
2498
2499 .mxchat-log-message {
2500 color: #334155;
2501 line-height: 1.5;
2502 }
2503
2504 .mxchat-log-data {
2505 margin-top: 8px;
2506 padding: 8px;
2507 background: #f1f5f9;
2508 border-radius: 4px;
2509 font-family: monospace;
2510 font-size: 11px;
2511 color: #64748b;
2512 white-space: pre-wrap;
2513 word-break: break-all;
2514 }
2515
2516 /* Settings Tools Grid */
2517 .mxch-tools-grid {
2518 display: grid;
2519 grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
2520 gap: 24px;
2521 }
2522
2523 .mxch-tool-item {
2524 display: flex;
2525 gap: 16px;
2526 padding: 20px;
2527 background: #f8fafc;
2528 border: 1px solid #e2e8f0;
2529 border-radius: 12px;
2530 transition: all 0.2s ease;
2531 }
2532
2533 .mxch-tool-item:hover {
2534 border-color: var(--mxch-primary, #7873f5);
2535 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
2536 }
2537
2538 .mxch-tool-item-danger {
2539 border-color: #fecaca;
2540 background: #fef2f2;
2541 }
2542
2543 .mxch-tool-item-danger:hover {
2544 border-color: #ef4444;
2545 }
2546
2547 .mxch-tool-icon {
2548 flex-shrink: 0;
2549 width: 48px;
2550 height: 48px;
2551 display: flex;
2552 align-items: center;
2553 justify-content: center;
2554 background: #ffffff;
2555 border-radius: 10px;
2556 color: var(--mxch-primary, #7873f5);
2557 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
2558 }
2559
2560 .mxch-tool-item-danger .mxch-tool-icon {
2561 color: #ef4444;
2562 }
2563
2564 .mxch-tool-content h4 {
2565 margin: 0 0 6px;
2566 font-size: 15px;
2567 font-weight: 600;
2568 color: #1e293b;
2569 }
2570
2571 .mxch-tool-content p {
2572 margin: 0 0 12px;
2573 font-size: 13px;
2574 color: #64748b;
2575 line-height: 1.5;
2576 }
2577
2578 /* Danger Button */
2579 .mxch-btn-danger {
2580 background: #ef4444 !important;
2581 color: #ffffff !important;
2582 border-color: #ef4444 !important;
2583 }
2584
2585 .mxch-btn-danger:hover {
2586 background: #dc2626 !important;
2587 border-color: #dc2626 !important;
2588 }
2589
2590 /* Badge Styles */
2591 .mxch-badge {
2592 display: inline-flex;
2593 align-items: center;
2594 padding: 4px 10px;
2595 font-size: 12px;
2596 font-weight: 500;
2597 border-radius: 20px;
2598 background: #e2e8f0;
2599 color: #475569;
2600 }
2601
2602 .mxch-badge-warning {
2603 background: #fef3c7;
2604 color: #92400e;
2605 }
2606
2607 .mxch-badge-success {
2608 background: #d1fae5;
2609 color: #065f46;
2610 }
2611
2612 .mxch-badge-error {
2613 background: #fee2e2;
2614 color: #991b1b;
2615 }
2616
2617 /* Modal Styles */
2618 .mxch-modal {
2619 position: fixed;
2620 top: 0;
2621 left: 0;
2622 right: 0;
2623 bottom: 0;
2624 z-index: 100000;
2625 display: flex;
2626 align-items: center;
2627 justify-content: center;
2628 }
2629
2630 .mxch-modal-backdrop {
2631 position: absolute;
2632 top: 0;
2633 left: 0;
2634 right: 0;
2635 bottom: 0;
2636 background: rgba(0, 0, 0, 0.5);
2637 }
2638
2639 .mxch-modal-content {
2640 position: relative;
2641 width: 100%;
2642 max-width: 480px;
2643 background: #ffffff;
2644 border-radius: 16px;
2645 box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
2646 margin: 20px;
2647 }
2648
2649 .mxch-modal-header {
2650 display: flex;
2651 justify-content: space-between;
2652 align-items: center;
2653 padding: 20px 24px;
2654 border-bottom: 1px solid #e2e8f0;
2655 }
2656
2657 .mxch-modal-header h3 {
2658 margin: 0;
2659 font-size: 18px;
2660 font-weight: 600;
2661 color: #1e293b;
2662 }
2663
2664 .mxch-modal-close {
2665 width: 32px;
2666 height: 32px;
2667 display: flex;
2668 align-items: center;
2669 justify-content: center;
2670 background: none;
2671 border: none;
2672 font-size: 24px;
2673 color: #64748b;
2674 cursor: pointer;
2675 border-radius: 8px;
2676 transition: all 0.2s ease;
2677 }
2678
2679 .mxch-modal-close:hover {
2680 background: #f1f5f9;
2681 color: #1e293b;
2682 }
2683
2684 .mxch-modal-body {
2685 padding: 24px;
2686 }
2687
2688 .mxch-modal-footer {
2689 display: flex;
2690 justify-content: flex-end;
2691 gap: 12px;
2692 padding: 16px 24px;
2693 border-top: 1px solid #e2e8f0;
2694 background: #f8fafc;
2695 border-radius: 0 0 16px 16px;
2696 }
2697
2698 /* Input in modal */
2699 .mxch-input {
2700 width: 100%;
2701 padding: 10px 14px;
2702 font-size: 14px;
2703 border: 1px solid #d1d5db;
2704 border-radius: 8px;
2705 transition: all 0.2s ease;
2706 }
2707
2708 .mxch-input:focus {
2709 outline: none;
2710 border-color: var(--mxch-primary, #7873f5);
2711 box-shadow: 0 0 0 3px rgba(120, 115, 245, 0.1);
2712 }
2713
2714 /* Responsive adjustments for tools */
2715 @media screen and (max-width: 768px) {
2716 .mxch-tools-grid {
2717 grid-template-columns: 1fr;
2718 }
2719
2720 .mxch-tool-item {
2721 flex-direction: column;
2722 text-align: center;
2723 }
2724
2725 .mxch-tool-icon {
2726 margin: 0 auto;
2727 }
2728
2729 .mxchat-debug-log-viewer {
2730 max-height: 300px;
2731 }
2732
2733 .mxch-modal-content {
2734 margin: 10px;
2735 }
2736 }
2737
2738 /* ============================================================
2739 Dashboard page (Setup Assistant + dashboard cards)
2740 Added with plan-mxchat-20260526-704e25.
2741 ============================================================ */
2742
2743 .mxch-setup-card .mxch-card-body {
2744 padding-top: var(--mxch-spacing-md);
2745 }
2746
2747 .mxch-progress-bar {
2748 height: 6px;
2749 background: var(--mxch-card-border, #e5e7eb);
2750 border-radius: 999px;
2751 overflow: hidden;
2752 margin: var(--mxch-spacing-sm) 0 var(--mxch-spacing-xs);
2753 }
2754
2755 .mxch-progress-bar-fill {
2756 height: 100%;
2757 background: linear-gradient(90deg, var(--mxch-primary) 0%, #9b96ff 100%);
2758 border-radius: 999px;
2759 transition: width 400ms cubic-bezier(0.22, 1, 0.36, 1);
2760 }
2761
2762 .mxch-progress-label {
2763 font-size: 12px;
2764 color: var(--mxch-text-secondary);
2765 margin: 0 0 var(--mxch-spacing-md);
2766 font-weight: 500;
2767 }
2768
2769 .mxch-step-list {
2770 list-style: none;
2771 margin: 0;
2772 padding: 0;
2773 display: flex;
2774 flex-direction: column;
2775 gap: var(--mxch-spacing-sm);
2776 }
2777
2778 .mxch-step {
2779 display: grid;
2780 grid-template-columns: 32px 1fr auto;
2781 align-items: center;
2782 gap: var(--mxch-spacing-md);
2783 padding: var(--mxch-spacing-md);
2784 background: var(--mxch-content-bg, #f7f8fa);
2785 border: 1px solid transparent;
2786 border-radius: var(--mxch-radius-md);
2787 transition: background 160ms ease, border-color 160ms ease;
2788 }
2789
2790 .mxch-step.mxch-step-in-progress {
2791 background: var(--mxch-primary-lighter, rgba(120, 115, 245, 0.05));
2792 border-color: var(--mxch-primary-light, rgba(120, 115, 245, 0.1));
2793 }
2794
2795 .mxch-step.mxch-step-done {
2796 background: rgba(16, 185, 129, 0.06);
2797 }
2798
2799 .mxch-step-indicator {
2800 width: 28px;
2801 height: 28px;
2802 border-radius: 50%;
2803 display: flex;
2804 align-items: center;
2805 justify-content: center;
2806 font-size: 13px;
2807 font-weight: 600;
2808 background: #fff;
2809 color: var(--mxch-text-secondary, #64748b);
2810 border: 1.5px solid var(--mxch-card-border, #e5e7eb);
2811 flex-shrink: 0;
2812 }
2813
2814 .mxch-step-in-progress .mxch-step-indicator {
2815 color: var(--mxch-primary);
2816 border-color: var(--mxch-primary);
2817 background: #fff;
2818 box-shadow: 0 0 0 4px var(--mxch-primary-lighter, rgba(120, 115, 245, 0.06));
2819 }
2820
2821 .mxch-step-done .mxch-step-indicator {
2822 background: var(--mxch-success, #10b981);
2823 border-color: var(--mxch-success, #10b981);
2824 color: #fff;
2825 }
2826
2827 .mxch-step-number {
2828 line-height: 1;
2829 }
2830
2831 .mxch-step-body {
2832 min-width: 0;
2833 }
2834
2835 .mxch-step-title {
2836 font-size: 14px;
2837 font-weight: 600;
2838 color: var(--mxch-text-primary, #1a1a2e);
2839 margin-bottom: 2px;
2840 }
2841
2842 .mxch-step-done .mxch-step-title {
2843 color: var(--mxch-text-secondary, #64748b);
2844 }
2845
2846 .mxch-step-description {
2847 font-size: 12.5px;
2848 color: var(--mxch-text-secondary, #64748b);
2849 line-height: 1.45;
2850 }
2851
2852 .mxch-step-action {
2853 align-self: center;
2854 }
2855
2856 .mxch-setup-dismiss-row {
2857 margin-top: var(--mxch-spacing-md);
2858 text-align: right;
2859 }
2860
2861 .mxch-setup-dismiss,
2862 .mxch-setup-resume {
2863 font-size: 12.5px;
2864 color: var(--mxch-text-secondary, #64748b);
2865 text-decoration: none;
2866 border-bottom: 1px dotted currentColor;
2867 }
2868
2869 .mxch-setup-dismiss:hover,
2870 .mxch-setup-resume:hover {
2871 color: var(--mxch-primary);
2872 }
2873
2874 .mxch-resume-setup-row {
2875 margin: 0 0 var(--mxch-spacing-md);
2876 text-align: right;
2877 }
2878
2879 .mxch-dashboard-grid {
2880 display: grid;
2881 grid-template-columns: repeat(3, minmax(0, 1fr));
2882 gap: var(--mxch-spacing-md);
2883 margin-top: var(--mxch-spacing-lg);
2884 }
2885
2886 .mxch-dashboard-card .mxch-card-body {
2887 display: flex;
2888 flex-direction: column;
2889 gap: var(--mxch-spacing-sm);
2890 }
2891
2892 .mxch-dashboard-big-number {
2893 font-size: 36px;
2894 font-weight: 700;
2895 color: var(--mxch-text-primary, #1a1a2e);
2896 line-height: 1.1;
2897 letter-spacing: -0.02em;
2898 }
2899
2900 .mxch-dashboard-provider-name {
2901 font-size: 16px;
2902 font-weight: 600;
2903 color: var(--mxch-text-primary, #1a1a2e);
2904 word-break: break-word;
2905 }
2906
2907 .mxch-dashboard-card-meta {
2908 font-size: 13px;
2909 color: var(--mxch-text-secondary, #64748b);
2910 margin: 0;
2911 }
2912
2913 @media (max-width: 1024px) {
2914 .mxch-dashboard-grid {
2915 grid-template-columns: 1fr 1fr;
2916 }
2917 }
2918
2919 @media (max-width: 782px) {
2920 .mxch-step {
2921 grid-template-columns: 32px 1fr;
2922 grid-template-rows: auto auto;
2923 gap: var(--mxch-spacing-sm) var(--mxch-spacing-md);
2924 }
2925 .mxch-step-action {
2926 grid-column: 1 / -1;
2927 text-align: right;
2928 }
2929 .mxch-dashboard-grid {
2930 grid-template-columns: 1fr;
2931 }
2932 }
2933
2934 /* ------------------------------------------------------------------
2935 * Test Streaming Compatibility button (AI Models page)
2936 * Branded .mxch-btn replacing the legacy WP button + dashicon wrench.
2937 * ------------------------------------------------------------------ */
2938 .mxch-streaming-test-row {
2939 margin-top: var(--mxch-spacing-md, 16px);
2940 }
2941 .mxch-streaming-test-row .mxch-streaming-test-icon {
2942 vertical-align: middle;
2943 margin-right: 8px;
2944 }
2945 .mxch-streaming-test-result {
2946 margin-top: var(--mxch-spacing-sm, 12px);
2947 font-weight: 600;
2948 color: var(--mxch-text-primary, #1a1a2e);
2949 }
2950
2951 /* ------------------------------------------------------------------
2952 * Status pill — documented shell component (CLAUDE.md design table).
2953 * Moved here from admin-api-page.php's inline <style> (plan b6e4d4) so
2954 * every admin page renders it, not just the API page. Rules are
2955 * byte-identical to the inline originals.
2956 * ------------------------------------------------------------------ */
2957 .mxch-status-pill {
2958 display: inline-flex;
2959 align-items: center;
2960 gap: 6px;
2961 padding: 4px 10px;
2962 border-radius: 999px;
2963 font-size: 12px;
2964 font-weight: 600;
2965 }
2966 .mxch-status-pill .mxch-status-dot {
2967 width: 8px;
2968 height: 8px;
2969 border-radius: 50%;
2970 }
2971 .mxch-status-pill-active { background: #e6f4ea; color: #1d7a3a; }
2972 .mxch-status-pill-active .mxch-status-dot { background: #1d7a3a; }
2973 .mxch-status-pill-disabled { background: #fef3e2; color: #a04a00; }
2974 .mxch-status-pill-disabled .mxch-status-dot { background: #a04a00; }
2975