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/chat-style.css +682 -22 3.2.2trunk View file →
@@ -1,4 +1,45 @@
1 +/* ============================================================
2 + DEFENSIVE BASELINE (v3.2.15, plan-52fd4c)
3 + The widget renders in the host page DOM with no isolation layer,
4 + so host-theme CSS bleeds into it. This block is a scoped floor:
5 + (1) border-box everywhere inside the widget (themes that set
6 + *{box-sizing:content-box} otherwise break every fixed-size element);
7 + (2) a specificity-0 reset via :where() of exactly the properties
8 + themes commonly weaponize on form/button elements. :where() keeps
9 + specificity at zero, so every later widget rule AND any customer
10 + custom CSS still wins unchanged — the reset only fills gaps where
11 + we currently set nothing. Scoped: nothing here can leak onto the
12 + host page. Deliberately NOT Shadow DOM / @layer / !important.
13 + ============================================================ */
14 +.mxchat-chatbot-wrapper,
15 +.mxchat-chatbot-wrapper *,
16 +.mxchat-chatbot-wrapper *::before,
17 +.mxchat-chatbot-wrapper *::after,
18 +.floating-chatbot,
19 +.floating-chatbot *,
20 +.floating-chatbot *::before,
21 +.floating-chatbot *::after {
22 + box-sizing: border-box;
23 +}
24 +
25 +.mxchat-chatbot-wrapper :where(button, input, select, textarea) {
26 + font-family: inherit;
27 + font-size: inherit;
28 + line-height: inherit;
29 + margin: 0;
30 + text-transform: none;
31 + letter-spacing: normal;
32 + min-height: 0;
33 + max-width: none;
34 + background-image: none;
35 + text-shadow: none;
36 + float: none;
37 +}
38 +.mxchat-chatbot-wrapper :where(button) {
39 + width: auto;
40 +}
41 +
1 42 /* ========================================
2 43 NOTIFICATION SYSTEM
3 44 ======================================== */
4 45 .chat-notification-badge {
@@ -28,21 +69,41 @@
28 69 .email-blocker {
29 70 display: flex;
30 71 flex-direction: column;
31 72 align-items: center;
32 - justify-content: center;
73 + /* No justify-content: center here — on an overflowing flex container it
74 + pushes content past BOTH edges, making the top unreachable by scroll.
75 + The auto margins on the first/last children below center the content
76 + when there is room and collapse to flex-start when there is not. */
33 77 border-radius: 12px;
34 78 padding: 30px 20px;
35 79 max-width: 100%;
80 + max-height: 100%;
81 + overflow-y: auto;
82 + scrollbar-width: thin;
36 83 margin: auto;
37 84 text-align: center;
38 85 animation: fadeIn 0.5s ease-in-out;
39 86 }
40 87
88 +.email-blocker::-webkit-scrollbar {
89 + width: 5px;
90 +}
91 +
92 +.email-blocker::-webkit-scrollbar-thumb {
93 + background-color: #212121;
94 + border-radius: 20px;
95 +}
96 +
41 97 .email-blocker-header {
98 + margin-top: auto;
42 99 margin-bottom: 20px;
43 100 }
44 101
102 +.email-blocker .email-collection-form {
103 + margin-bottom: auto;
104 +}
105 +
45 106 .email-blocker-logo {
46 107 max-width: 80px;
47 108 margin-bottom: 10px;
48 109 }
@@ -79,8 +140,40 @@
79 140 box-shadow: 0 0 8px rgba(0, 115, 170, 0.3);
80 141 outline: none;
81 142 }
82 143
144 +/* Consent checkbox row (b062c4). Left-aligned inside the centered form so a
145 + multi-line label reads naturally; sized to stay compact on 320-390px. */
146 +.email-blocker .mxchat-consent-row {
147 + display: flex;
148 + align-items: flex-start;
149 + gap: 8px;
150 + width: 100%;
151 + margin-bottom: 15px;
152 + text-align: left;
153 +}
154 +
155 +.email-blocker .mxchat-consent-checkbox {
156 + flex-shrink: 0;
157 + width: 16px;
158 + height: 16px;
159 + margin: 2px 0 0;
160 + accent-color: #0073aa;
161 + cursor: pointer;
162 +}
163 +
164 +.email-blocker .mxchat-consent-label {
165 + font-size: 13px;
166 + line-height: 1.45;
167 + color: #555555;
168 + cursor: pointer;
169 +}
170 +
171 +.email-blocker .mxchat-consent-label a {
172 + color: #0073aa;
173 + text-decoration: underline;
174 +}
175 +
83 176 .email-blocker button {
84 177 background-color: #0073aa;
85 178 color: #ffffff;
86 179 padding: 12px 20px;
@@ -555,9 +648,8 @@
555 648 .mxchat-popular-questions.collapsed .questions-collapse-btn {
556 649 display: none;
557 650 }
558 651
559 -/* MISSING - These need to be inside the container context: */
560 652 .mxchat-popular-questions .mxchat-popular-questions-container .questions-toggle-btn {
561 653 background: none;
562 654 border: none;
563 655 padding: 0;
@@ -590,8 +682,9 @@
590 682 box-shadow: none;
591 683 outline: none;
592 684 align-self: center; /* Center in flex container */
593 685 order: -1; /* Make sure it appears first */
686 + flex-shrink: 0; /* same flex auto-minimum caveat as .mxchat-popular-question */
594 687 }
595 688
596 689 .questions-toggle-btn:hover,
597 690 .questions-collapse-btn:hover,
@@ -641,8 +734,13 @@
641 734 text-align: initial;
642 735 transition: all 0.3s ease;
643 736 margin-bottom: 0;
644 737 box-shadow: none;
738 + /* The defensive baseline's min-height:0 on :where(button) removes the
739 + flex automatic minimum size, so without this the column-flex scroll
740 + container compresses all questions to fit 200px and the scrollbox
741 + never appears (plan d51560). */
742 + flex-shrink: 0;
645 743 }
646 744
647 745 .mxchat-popular-question:hover {
648 746 background-color: #eaeaea;
@@ -886,8 +984,72 @@
886 984 scrollbar-width: thin;
887 985 scrollbar-color: linear-gradient(135deg, #fa73e6, #7873f5, #3ac9d1) #f1f1f1;
888 986 }
889 987
988 +/* Chat input character counter + soft limit feedback (plan 7091a2).
989 + Language-neutral: numbers + color only. Hidden until ~80% of the cap, then
990 + fades in and ramps neutral -> amber -> red. The input border mirrors the same
991 + cue, and an over-limit keystroke/paste triggers a brief shake so the hard
992 + maxlength cap (plan a3fae2) is never a silent "input jumps back". */
993 +.mxchat-chatbot .chat-container .input-container .mxchat-char-counter {
994 + position: absolute;
995 + bottom: 3px;
996 + right: 44px; /* clear the absolutely-positioned send button */
997 + font-size: 11px;
998 + line-height: 1;
999 + font-variant-numeric: tabular-nums;
1000 + color: #9aa0a6;
1001 + background: rgba(255, 255, 255, 0.85);
1002 + padding: 1px 5px;
1003 + border-radius: 8px;
1004 + pointer-events: none;
1005 + opacity: 0;
1006 + visibility: hidden;
1007 + transition: opacity 0.18s ease, color 0.18s ease;
1008 + z-index: 2;
1009 +}
1010 +.mxchat-chatbot .chat-container .input-container .mxchat-char-counter.is-visible {
1011 + opacity: 1;
1012 + visibility: visible;
1013 +}
1014 +.mxchat-chatbot .chat-container .input-container .mxchat-char-counter.is-warn {
1015 + color: #d98300; /* amber: approaching the cap */
1016 +}
1017 +.mxchat-chatbot .chat-container .input-container .mxchat-char-counter.is-full {
1018 + color: #d93025; /* red: at the cap */
1019 + font-weight: 600;
1020 +}
1021 +/* RTL widgets: counter on the opposite side. */
1022 +.mxchat-chatbot[dir="rtl"] .chat-container .input-container .mxchat-char-counter,
1023 +[dir="rtl"] .mxchat-chatbot .chat-container .input-container .mxchat-char-counter {
1024 + right: auto;
1025 + left: 44px;
1026 +}
1027 +/* Input border affordance mirrors the counter color. */
1028 +.mxchat-chatbot .chat-container .input-container.mxchat-input-near-limit {
1029 + border-color: #f0b048;
1030 +}
1031 +.mxchat-chatbot .chat-container .input-container.mxchat-input-at-limit {
1032 + border-color: #e5675c;
1033 +}
1034 +/* Soft "you hit the edge" bump when an over-limit keystroke/paste is rejected. */
1035 +.mxchat-chatbot .chat-container .input-container.mxchat-input-bump {
1036 + animation: mxchat-input-bump 0.2s ease;
1037 +}
1038 +@keyframes mxchat-input-bump {
1039 + 0% { transform: translateX(0); }
1040 + 25% { transform: translateX(-3px); }
1041 + 50% { transform: translateX(3px); }
1042 + 75% { transform: translateX(-2px); }
1043 + 100% { transform: translateX(0); }
1044 +}
1045 +/* Respect reduced-motion: drop the shake; the red border/counter still signals the cap. */
1046 +@media (prefers-reduced-motion: reduce) {
1047 + .mxchat-chatbot .chat-container .input-container.mxchat-input-bump {
1048 + animation: none;
1049 + }
1050 +}
1051 +
890 1052 .mxchat-chatbot .chat-container .input-container .send-button {
891 1053 position: absolute;
892 1054 right: 10px;
893 1055 top: 50%;
@@ -918,8 +1080,15 @@
918 1080 .send-button:hover {
919 1081 opacity: 0.8;
920 1082 }
921 1083
1084 +/* Stop state while a response is streaming: the send button becomes a Stop
1085 + control in place — same chrome and position, swapped glyph. Themeable hook;
1086 + the glyph's size/color are mirrored from the send icon at runtime. */
1087 +.mxchat-chatbot .chat-container .input-container .send-button.mxchat-stop-mode {
1088 + cursor: pointer;
1089 +}
1090 +
922 1091 .mxchat-chatbot .spinner {
923 1092 animation: rotate 2s linear infinite;
924 1093 width: 20px;
925 1094 height: 20px;
@@ -958,9 +1127,11 @@
958 1127 .chatbot-title-container {
959 1128 display: flex;
960 1129 align-items: center;
961 1130 justify-content: space-between;
962 - width: 100%;
1131 + gap: 10px;
1132 + flex: 1 1 auto;
1133 + min-width: 0;
963 1134 }
964 1135
965 1136 .chatbot-title-group {
966 1137 display: flex;
@@ -969,13 +1140,19 @@
969 1140 }
970 1141
971 1142 .chat-mode-indicator {
972 1143 font-size: 12px;
973 - margin-right: 8px;
974 - padding: 4px 8px;
975 - border-radius: 12px;
976 - background: rgba(255, 255, 255, 0.2);
1144 + line-height: 1;
1145 + margin-right: 0;
1146 + padding: 4px 9px;
1147 + border-radius: 999px;
1148 + background: rgba(255, 255, 255, 0.18);
977 1149 color: #ffffff;
1150 + display: inline-flex;
1151 + align-items: center;
1152 + height: 22px;
1153 + white-space: nowrap;
1154 + flex: 0 0 auto;
978 1155 }
979 1156
980 1157 .floating-chatbot {
981 1158 position: fixed;
@@ -1025,9 +1202,9 @@
1025 1202 display: none !important;
1026 1203 }
1027 1204
1028 1205 .chatbot-top-bar button.exit-chat:hover {
1029 - background: none;
1206 + background: rgba(255, 255, 255, 0.12);
1030 1207 }
1031 1208 .visible {
1032 1209 display: flex;
1033 1210 }
@@ -1051,8 +1228,13 @@
1051 1228 z-index: 100000;
1052 1229 display: flex;
1053 1230 }
1054 1231
1232 +.floating-chatbot-button:focus-visible {
1233 + outline: 3px solid #7873f5;
1234 + outline-offset: 3px;
1235 +}
1236 +
1055 1237 .floating-chatbot-button img {
1056 1238 max-width: 100%;
1057 1239 max-height: 100%;
1058 1240 width: auto;
@@ -1064,32 +1246,49 @@
1064 1246 }
1065 1247
1066 1248 .mxchat-chatbot-wrapper .chatbot-top-bar button.exit-chat {
1067 1249 background: transparent;
1250 + /* v3.2.15 (plan-52fd4c): explicit guards against host-theme button rules.
1251 + Margin deliberately untouched — .exit-chat relies on margin-left:auto. */
1252 + background-image: none;
1068 1253 border: none;
1069 1254 opacity: 0.8;
1070 1255 padding: 0;
1071 - min-width: 20px;
1256 + width: 32px;
1257 + height: 32px;
1258 + min-width: 32px;
1259 + min-height: 32px;
1260 + max-width: none;
1261 + flex: 0 0 auto;
1262 + border-radius: 6px;
1263 + font-family: inherit;
1264 + text-transform: none;
1265 + text-shadow: none;
1266 + appearance: none;
1267 + -webkit-appearance: none;
1268 + transition: opacity 0.15s ease, background 0.15s ease;
1072 1269 }
1073 1270
1074 1271 .mxchat-chatbot-wrapper .chatbot-top-bar {
1075 1272 cursor: pointer;
1076 1273 color: #fff;
1077 - padding: 10px;
1274 + padding: 8px 12px;
1275 + min-height: 48px;
1276 + gap: 8px;
1078 1277 border-top-left-radius: 10px;
1079 1278 border-top-right-radius: 10px;
1080 1279 display: flex;
1081 1280 justify-content: space-between;
1082 - align-items: start;
1281 + align-items: center;
1083 1282 }
1084 1283
1085 1284 .mxchat-chatbot-wrapper .chatbot-top-bar .chatbot-title {
1086 - font-size: 16px;
1087 - line-height: 25px;
1088 - padding: 10px;
1285 + font-size: 15px;
1286 + line-height: 1.2;
1287 + padding: 0;
1089 1288 margin: 0;
1090 1289 font-family: 'Plus Jakarta Sans', sans-serif;
1091 - font-weight: bold;
1290 + font-weight: 600;
1092 1291 }
1093 1292
1094 1293 .exit-chat {
1095 1294 border: none;
@@ -1094,22 +1293,25 @@
1094 1293 .exit-chat {
1095 1294 border: none;
1096 1295 background: transparent;
1097 1296 cursor: pointer;
1098 - display: flex;
1297 + display: inline-flex;
1099 1298 align-items: center;
1100 1299 justify-content: center;
1101 - padding: 5px;
1300 + padding: 0;
1102 1301 margin-left: auto;
1103 1302 opacity: 0.8;
1104 - min-width: 20px;
1303 + width: 32px;
1304 + height: 32px;
1305 + min-width: 32px;
1306 + flex: 0 0 auto;
1105 1307 }
1106 1308
1107 1309 .exit-chat svg {
1108 - fill: white;
1109 - width: 24px;
1110 - height: 24px;
1111 - transform: rotate(270deg);
1310 + width: 18px;
1311 + height: 18px;
1312 + fill: none;
1313 + stroke: currentColor;
1112 1314 }
1113 1315
1114 1316 .mxchat-chatbot-wrapper .chatbot-footer {
1115 1317 text-align: center;
@@ -1532,8 +1734,106 @@
1532 1734 height: auto;
1533 1735 border-radius: 0 0 8px 8px;
1534 1736 }
1535 1737
1738 +/* Consent-safe YouTube embed (click-to-load facade → nocookie iframe).
1739 + Caption colors INHERIT from the message bubble (same idiom as
1740 + .mxchat-product-card) so the embed reads correctly on any widget theme —
1741 + bot bubbles commonly force their own text color. */
1742 +.mxchat-youtube-embed {
1743 + max-width: 340px;
1744 + margin-top: 8px;
1745 +}
1746 +
1747 +.mxchat-youtube-facade {
1748 + position: relative;
1749 + display: block;
1750 + width: 100%;
1751 + padding: 0;
1752 + margin: 0;
1753 + border: none;
1754 + background: #000;
1755 + cursor: pointer;
1756 + aspect-ratio: 16 / 9;
1757 + border-radius: 10px;
1758 + overflow: hidden;
1759 + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
1760 +}
1761 +
1762 +.mxchat-youtube-thumb {
1763 + width: 100%;
1764 + height: 100%;
1765 + object-fit: cover;
1766 + display: block;
1767 + opacity: 0.92;
1768 + transition: opacity 0.2s;
1769 +}
1770 +
1771 +.mxchat-youtube-facade:hover .mxchat-youtube-thumb {
1772 + opacity: 1;
1773 +}
1774 +
1775 +.mxchat-youtube-play {
1776 + position: absolute;
1777 + top: 50%;
1778 + left: 50%;
1779 + transform: translate(-50%, -50%);
1780 + display: flex;
1781 + align-items: center;
1782 + justify-content: center;
1783 + width: 52px;
1784 + height: 52px;
1785 + border-radius: 50%;
1786 + background: rgba(0, 0, 0, 0.72);
1787 + color: #fff;
1788 + transition: transform 0.2s, background 0.2s;
1789 +}
1790 +
1791 +.mxchat-youtube-play svg {
1792 + margin-left: 3px;
1793 +}
1794 +
1795 +.mxchat-youtube-facade:hover .mxchat-youtube-play {
1796 + transform: translate(-50%, -50%) scale(1.08);
1797 + background: rgba(0, 0, 0, 0.85);
1798 +}
1799 +
1800 +.mxchat-youtube-iframe {
1801 + width: 100%;
1802 + aspect-ratio: 16 / 9;
1803 + border: none;
1804 + display: block;
1805 + border-radius: 10px;
1806 + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
1807 +}
1808 +
1809 +.mxchat-youtube-caption {
1810 + display: flex;
1811 + align-items: baseline;
1812 + justify-content: space-between;
1813 + gap: 10px;
1814 + padding: 8px 2px 0;
1815 + background: transparent;
1816 + color: inherit;
1817 +}
1818 +
1819 +.mxchat-youtube-title {
1820 + font-size: 13px;
1821 + font-weight: 600;
1822 + color: inherit;
1823 + overflow: hidden;
1824 + white-space: nowrap;
1825 + text-overflow: ellipsis;
1826 +}
1827 +
1828 +.mxchat-youtube-link {
1829 + font-size: 12px;
1830 + white-space: nowrap;
1831 + color: inherit;
1832 + opacity: 0.85;
1833 + text-decoration: underline;
1834 +}
1835 +
1536 1836 #widget_icon, #widget_icon_2, #widget_icon_3, #widget_icon_5, #widget_icon_4, #widget_icon_6, #widget_icon_7 {
1537 1837 padding: 10px;
1538 1838 }
1539 1839
@@ -1602,5 +1902,365 @@
1602 1902
1603 1903 /* Hide when actually collapsed */
1604 1904 .mxchat-popular-questions.collapsed .mxchat-popular-questions-container .questions-collapse-btn {
1605 1905 display: none;
1906 +}
1907 +
1908 +/* ============================================================
1909 + Header overflow menu — 3-dot kebab + dropdown (v3.2.9 / v3.2.10)
1910 + Lives in .chatbot-top-bar to the LEFT of .exit-chat. Visual treatment
1911 + mirrors .exit-chat: transparent, white-on-dark, 0.8 opacity, 5px pad.
1912 +
1913 + v3.2.10: explicit `order` rules pin the visual order
1914 + title (0) | kebab (1) | down-arrow (2)
1915 + so the down-arrow is always the rightmost icon regardless of source
1916 + order or which sibling has margin-left:auto.
1917 + ============================================================ */
1918 +.mxchat-chatbot-wrapper .chatbot-top-bar > .chatbot-title-container { order: 0; }
1919 +.mxchat-chatbot-wrapper .chatbot-top-bar > .mxchat-header-menu-wrap { order: 1; }
1920 +.mxchat-chatbot-wrapper .chatbot-top-bar > .exit-chat { order: 2; }
1921 +
1922 +.mxchat-header-menu-wrap {
1923 + position: relative;
1924 + display: inline-flex;
1925 + align-items: center;
1926 + margin-left: auto; /* push kebab + arrow group to the right edge */
1927 +}
1928 +.mxchat-chatbot-wrapper .chatbot-top-bar .mxchat-header-menu-wrap ~ .exit-chat,
1929 +.mxchat-chatbot-wrapper .chatbot-top-bar .mxchat-header-menu-wrap + .exit-chat {
1930 + margin-left: 4px; /* even, snug gap between kebab and close */
1931 +}
1932 +.mxchat-chatbot-wrapper .chatbot-top-bar > .exit-chat:focus {
1933 + background: rgba(255, 255, 255, 0.12);
1934 + opacity: 1;
1935 + outline: none;
1936 +}
1937 +/* v3.2.15 (plan-52fd4c): kebab rules scoped under the wrapper + explicit
1938 + guards on every property a theme's button/link rules commonly set
1939 + (font-family, margin, appearance, text-transform, background-image),
1940 + after a customer site's theme visibly mangled the dropdown. */
1941 +.mxchat-chatbot-wrapper .mxchat-header-btn {
1942 + border: none;
1943 + background: transparent;
1944 + background-image: none;
1945 + cursor: pointer;
1946 + display: inline-flex;
1947 + align-items: center;
1948 + justify-content: center;
1949 + padding: 0;
1950 + margin: 0;
1951 + opacity: 0.8;
1952 + color: #fff;
1953 + font-family: inherit;
1954 + text-transform: none;
1955 + text-shadow: none;
1956 + appearance: none;
1957 + -webkit-appearance: none;
1958 + transition: opacity 0.15s ease, background 0.15s ease;
1959 + border-radius: 6px;
1960 + line-height: 0;
1961 + width: 32px;
1962 + height: 32px;
1963 + min-width: 32px;
1964 + min-height: 32px;
1965 + max-width: none;
1966 + flex: 0 0 auto;
1967 +}
1968 +.mxchat-chatbot-wrapper .mxchat-header-btn:hover,
1969 +.mxchat-chatbot-wrapper .mxchat-header-btn:focus {
1970 + opacity: 1;
1971 + background: rgba(255, 255, 255, 0.12);
1972 + outline: none;
1973 +}
1974 +.mxchat-chatbot-wrapper .mxchat-header-btn[aria-expanded="true"] {
1975 + opacity: 1;
1976 + background: rgba(255, 255, 255, 0.12);
1977 +}
1978 +.mxchat-chatbot-wrapper .mxchat-menu-trigger svg {
1979 + width: 18px;
1980 + height: 18px;
1981 +}
1982 +
1983 +.mxchat-chatbot-wrapper .mxchat-header-menu {
1984 + position: absolute;
1985 + top: calc(100% + 6px);
1986 + right: 0;
1987 + min-width: 220px;
1988 + margin: 0;
1989 + background: var(--mxchat-menu-bg, #ffffff);
1990 + color: var(--mxchat-menu-fg, #1a1a1a);
1991 + border: 1px solid rgba(127, 127, 127, 0.20);
1992 + border-radius: 10px;
1993 + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18), 0 2px 6px rgba(0, 0, 0, 0.10);
1994 + padding: 4px;
1995 + font-family: inherit;
1996 + z-index: 99;
1997 + opacity: 0;
1998 + transform: translateY(-4px);
1999 + pointer-events: none;
2000 + transition: opacity 0.12s ease, transform 0.12s ease;
2001 +}
2002 +.mxchat-chatbot-wrapper .mxchat-header-menu.is-open {
2003 + opacity: 1;
2004 + transform: translateY(0);
2005 + pointer-events: auto;
2006 +}
2007 +.mxchat-chatbot-wrapper .mxchat-header-menu[hidden] {
2008 + display: none;
2009 +}
2010 +.mxchat-chatbot-wrapper .mxchat-menu-item {
2011 + display: flex;
2012 + align-items: center;
2013 + gap: 10px;
2014 + width: 100%;
2015 + padding: 8px 12px;
2016 + margin: 0;
2017 + min-height: 40px;
2018 + border: none;
2019 + background: transparent;
2020 + background-image: none;
2021 + color: inherit;
2022 + font-family: inherit;
2023 + font-size: 14px;
2024 + line-height: 1.3;
2025 + letter-spacing: normal;
2026 + text-align: left;
2027 + text-transform: none;
2028 + text-shadow: none;
2029 + white-space: nowrap;
2030 + appearance: none;
2031 + -webkit-appearance: none;
2032 + cursor: pointer;
2033 + border-radius: 6px;
2034 + transition: background 0.12s ease;
2035 + text-decoration: none;
2036 + box-sizing: border-box;
2037 +}
2038 +.mxchat-chatbot-wrapper .mxchat-menu-item:hover,
2039 +.mxchat-chatbot-wrapper .mxchat-menu-item:focus {
2040 + background: rgba(127, 127, 127, 0.18);
2041 + outline: none;
2042 +}
2043 +.mxchat-menu-item-icon {
2044 + display: inline-flex;
2045 + align-items: center;
2046 + justify-content: center;
2047 + width: 16px;
2048 + height: 16px;
2049 + color: inherit;
2050 + opacity: 0.85;
2051 + flex-shrink: 0;
2052 +}
2053 +.mxchat-menu-item-icon svg {
2054 + width: 16px;
2055 + height: 16px;
2056 + display: block;
2057 +}
2058 +.mxchat-menu-item-label {
2059 + flex: 1;
2060 + color: inherit;
2061 +}
2062 +
2063 +/* RTL — flip the dropdown anchor edge */
2064 +[dir="rtl"] .mxchat-header-menu,
2065 +.mxchat-chatbot-wrapper[dir="rtl"] .mxchat-header-menu {
2066 + right: auto;
2067 + left: 0;
2068 +}
2069 +
2070 +/* ============================================================================
2071 + Satisfaction rating (v3.2.6 — polished per plan-141a12)
2072 + Theme-adaptive via currentColor + inherit. Clean slate — old rules removed.
2073 + ========================================================================= */
2074 +.mxchat-chatbot .chat-container .chat-box .mxchat-rating-prompt,
2075 +.mxchat-chatbot .chat-container .chat-box .mxchat-rating-feedback,
2076 +.mxchat-chatbot .chat-container .chat-box .mxchat-rating-saved {
2077 + clear: both;
2078 + float: left;
2079 + max-width: 92%;
2080 + box-sizing: border-box;
2081 +}
2082 +
2083 +/* Theme-adaptive wrapper — .bot-message carries the user's custom bg/color via
2084 + inline style; the inner rating component supplies its own padding + layout. */
2085 +.mxchat-rating-bot-bubble {
2086 + padding: 0;
2087 + overflow: visible;
2088 +}
2089 +
2090 +.mxchat-rating-prompt {
2091 + display: flex;
2092 + flex-direction: column;
2093 + align-items: stretch;
2094 + gap: 10px;
2095 + padding: 10px 14px;
2096 + margin: 10px 0;
2097 + font-size: 14px;
2098 + color: inherit;
2099 +}
2100 +
2101 +.mxchat-rating-question {
2102 + color: inherit;
2103 + opacity: 0.85;
2104 + font-weight: 500;
2105 +}
2106 +
2107 +.mxchat-rating-actions {
2108 + display: flex;
2109 + align-items: center;
2110 + gap: 8px;
2111 +}
2112 +
2113 +.mxchat-rating-buttons {
2114 + display: inline-flex;
2115 + gap: 6px;
2116 +}
2117 +
2118 +.mxchat-rating-btn {
2119 + display: inline-flex;
2120 + align-items: center;
2121 + justify-content: center;
2122 + width: 32px;
2123 + height: 32px;
2124 + border-radius: 8px;
2125 + background: transparent;
2126 + border: none;
2127 + color: inherit;
2128 + opacity: 0.6;
2129 + cursor: pointer;
2130 + transition: opacity 0.18s ease, transform 0.18s ease, background-color 0.18s ease, color 0.18s ease;
2131 + padding: 0;
2132 +}
2133 +
2134 +.mxchat-rating-btn:hover {
2135 + opacity: 1;
2136 + transform: scale(1.12);
2137 + background: rgba(255, 255, 255, 0.08);
2138 +}
2139 +
2140 +.mxchat-rating-btn:focus-visible {
2141 + opacity: 1;
2142 + outline: 2px solid currentColor;
2143 + outline-offset: 2px;
2144 +}
2145 +
2146 +.mxchat-rating-btn svg {
2147 + pointer-events: none;
2148 +}
2149 +
2150 +.mxchat-rating-dismiss {
2151 + width: 24px;
2152 + height: 24px;
2153 + border-radius: 6px;
2154 + background: transparent;
2155 + border: none;
2156 + color: inherit;
2157 + opacity: 0.45;
2158 + cursor: pointer;
2159 + font-size: 18px;
2160 + line-height: 1;
2161 + transition: opacity 0.18s ease, background-color 0.18s ease;
2162 +}
2163 +
2164 +.mxchat-rating-dismiss:hover {
2165 + opacity: 0.9;
2166 + background: rgba(255, 255, 255, 0.08);
2167 +}
2168 +
2169 +/* Feedback panel that replaces the prompt after a rating is clicked */
2170 +.mxchat-rating-feedback {
2171 + padding: 12px 14px;
2172 + margin: 10px 0;
2173 + display: flex;
2174 + flex-direction: column;
2175 + gap: 10px;
2176 + color: inherit;
2177 + animation: mxchat-rating-fade-in 0.22s ease;
2178 +}
2179 +
2180 +.mxchat-rating-feedback-label {
2181 + font-size: 13px;
2182 + opacity: 0.85;
2183 + font-weight: 500;
2184 +}
2185 +
2186 +.mxchat-rating-feedback-input {
2187 + width: 100%;
2188 + box-sizing: border-box;
2189 + padding: 8px 10px;
2190 + border: 1px solid rgba(255, 255, 255, 0.25);
2191 + border-radius: 8px;
2192 + font-size: 14px;
2193 + font-family: inherit;
2194 + resize: vertical;
2195 + background: rgba(255, 255, 255, 0.08);
2196 + color: inherit;
2197 +}
2198 +
2199 +.mxchat-rating-feedback-input:focus {
2200 + outline: none;
2201 + border-color: rgba(255, 255, 255, 0.45);
2202 + background: rgba(255, 255, 255, 0.15);
2203 +}
2204 +
2205 +.mxchat-rating-feedback-actions {
2206 + display: flex;
2207 + justify-content: flex-end;
2208 + gap: 8px;
2209 +}
2210 +
2211 +.mxchat-rating-skip,
2212 +.mxchat-rating-submit {
2213 + padding: 6px 14px;
2214 + border-radius: 8px;
2215 + font-size: 13px;
2216 + font-weight: 500;
2217 + cursor: pointer;
2218 + border: none;
2219 + transition: opacity 0.18s ease, transform 0.18s ease, background-color 0.18s ease;
2220 +}
2221 +
2222 +.mxchat-rating-skip {
2223 + background: transparent;
2224 + color: inherit;
2225 + opacity: 0.6;
2226 +}
2227 +
2228 +.mxchat-rating-skip:hover {
2229 + opacity: 1;
2230 + background: rgba(255, 255, 255, 0.08);
2231 +}
2232 +
2233 +.mxchat-rating-submit {
2234 + /* Filled "primary" pill: fill = the bot font color, label = the bubble bg.
2235 + syncRatingBubbleColors() in chat-script.js paints the real bot colors
2236 + straight onto this button (inline) from the bubble's COMPUTED style, so
2237 + it adapts to both the inline color pickers AND the mxchat-theme AI
2238 + customizer. These var()/literal values are the no-JS safety net — the
2239 + literal fallbacks (#212121 fill / #ffffff label) stay legible on their
2240 + own (no white-on-white). Longhand background-color (not the `background`
2241 + shorthand) because Chromium resolves inherited custom properties
2242 + unreliably inside the shorthand. Do NOT use currentColor here — setting
2243 + `color` would re-poison the background to the same value. */
2244 + background-color: var(--mxchat-bot-fg, #212121);
2245 + color: var(--mxchat-bot-bg, #ffffff);
2246 +}
2247 +
2248 +.mxchat-rating-submit:hover {
2249 + transform: translateY(-1px);
2250 + opacity: 0.9;
2251 +}
2252 +
2253 +.mxchat-rating-saved {
2254 + padding: 10px 14px;
2255 + margin: 10px 0;
2256 + font-size: 13px;
2257 + font-weight: 500;
2258 + text-align: center;
2259 + color: inherit;
2260 + animation: mxchat-rating-fade-in 0.22s ease;
2261 +}
2262 +
2263 +@keyframes mxchat-rating-fade-in {
2264 + from { opacity: 0; transform: translateY(4px); }
2265 + to { opacity: 1; transform: translateY(0); }
1606 2266 }