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
← All changes | css/admin-sidebar.css +417 -0 3.2.2trunk View file →
@@ -1,4 +1,4 @@
1 1 /* ==========================================================================
2 2 MxChat Admin Sidebar Navigation - v2.0
3 3 Clean, modern CSS for the redesigned settings page
4 4 ========================================================================== */
@@ -40,8 +40,10 @@
40 40
41 41 /* Status Colors */
42 42 --mxch-success: #10b981;
43 43 --mxch-warning: #f59e0b;
44 + --mxch-warning-light: rgba(245, 158, 11, 0.12);
45 + --mxch-warning-text: #92400e;
44 46 --mxch-error: #ef4444;
45 47 --mxch-info: #3b82f6;
46 48
47 49 /* Spacing */
@@ -92,8 +94,49 @@
92 94 }
93 95 }
94 96
95 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 +/* ==========================================================================
96 139 Sidebar Navigation
97 140 ========================================================================== */
98 141 .mxch-sidebar {
99 142 width: var(--mxch-sidebar-width);
@@ -1154,8 +1197,23 @@
1154 1197 flex: 1;
1155 1198 margin-bottom: 0;
1156 1199 }
1157 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 +
1158 1216 /* ==========================================================================
1159 1217 Buttons
1160 1218 ========================================================================== */
1161 1219 .mxch-btn {
@@ -1287,9 +1345,95 @@
1287 1345 color: #991b1b;
1288 1346 border: 1px solid #fecaca;
1289 1347 }
1290 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 +
1291 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 +/* ==========================================================================
1292 1436 Quick Questions List
1293 1437 ========================================================================== */
1294 1438 .mxch-quick-questions {
1295 1439 display: flex;
@@ -1997,8 +2141,43 @@
1997 2141 .mxch-admin-wrapper .slider-container + .feedback-container {
1998 2142 margin-left: 15px;
1999 2143 }
2000 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 +
2001 2180 /* ==========================================================================
2002 2181 Real-time Entry Updates
2003 2182 ========================================================================== */
2004 2183
@@ -2554,4 +2733,242 @@
2554 2733 .mxch-modal-content {
2555 2734 margin: 10px;
2556 2735 }
2557 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; }