PluginProbe
MxChat – AI Chatbot & Content Generation for WordPress / 3.2.25
MxChat – AI Chatbot & Content Generation for WordPress v3.2.25
3.2.25 3.2.24 3.2.23 3.2.22 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 All 156 releases
← All changes | css/chat-style.css +529 -161 3.2.5 → 3.2.25 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;
@@ -685,9 +783,13 @@
685 783
686 784 /* ========================================
687 785 CORE CHATBOT UI
688 786 ======================================== */
689 -.invisible {
787 +/* This stylesheet loads on every page where the widget shows, so generic class names must
788 + stay inside MxChat's own containers: a bare .invisible hit the site's own elements (and
789 + Bootstrap / Tailwind give that class the opposite meaning, visibility hidden with the layout
790 + kept). :where() keeps the specificity of the bare class. */
791 +:where(.floating-chatbot, .mxchat-chatbot-wrapper) .invisible {
690 792 display: none;
691 793 opacity: 0;
692 794 pointer-events: none;
693 795 }
@@ -886,8 +988,72 @@
886 988 scrollbar-width: thin;
887 989 scrollbar-color: linear-gradient(135deg, #fa73e6, #7873f5, #3ac9d1) #f1f1f1;
888 990 }
889 991
992 +/* Chat input character counter + soft limit feedback (plan 7091a2).
993 + Language-neutral: numbers + color only. Hidden until ~80% of the cap, then
994 + fades in and ramps neutral -> amber -> red. The input border mirrors the same
995 + cue, and an over-limit keystroke/paste triggers a brief shake so the hard
996 + maxlength cap (plan a3fae2) is never a silent "input jumps back". */
997 +.mxchat-chatbot .chat-container .input-container .mxchat-char-counter {
998 + position: absolute;
999 + bottom: 3px;
1000 + right: 44px; /* clear the absolutely-positioned send button */
1001 + font-size: 11px;
1002 + line-height: 1;
1003 + font-variant-numeric: tabular-nums;
1004 + color: #9aa0a6;
1005 + background: rgba(255, 255, 255, 0.85);
1006 + padding: 1px 5px;
1007 + border-radius: 8px;
1008 + pointer-events: none;
1009 + opacity: 0;
1010 + visibility: hidden;
1011 + transition: opacity 0.18s ease, color 0.18s ease;
1012 + z-index: 2;
1013 +}
1014 +.mxchat-chatbot .chat-container .input-container .mxchat-char-counter.is-visible {
1015 + opacity: 1;
1016 + visibility: visible;
1017 +}
1018 +.mxchat-chatbot .chat-container .input-container .mxchat-char-counter.is-warn {
1019 + color: #d98300; /* amber: approaching the cap */
1020 +}
1021 +.mxchat-chatbot .chat-container .input-container .mxchat-char-counter.is-full {
1022 + color: #d93025; /* red: at the cap */
1023 + font-weight: 600;
1024 +}
1025 +/* RTL widgets: counter on the opposite side. */
1026 +.mxchat-chatbot[dir="rtl"] .chat-container .input-container .mxchat-char-counter,
1027 +[dir="rtl"] .mxchat-chatbot .chat-container .input-container .mxchat-char-counter {
1028 + right: auto;
1029 + left: 44px;
1030 +}
1031 +/* Input border affordance mirrors the counter color. */
1032 +.mxchat-chatbot .chat-container .input-container.mxchat-input-near-limit {
1033 + border-color: #f0b048;
1034 +}
1035 +.mxchat-chatbot .chat-container .input-container.mxchat-input-at-limit {
1036 + border-color: #e5675c;
1037 +}
1038 +/* Soft "you hit the edge" bump when an over-limit keystroke/paste is rejected. */
1039 +.mxchat-chatbot .chat-container .input-container.mxchat-input-bump {
1040 + animation: mxchat-input-bump 0.2s ease;
1041 +}
1042 +@keyframes mxchat-input-bump {
1043 + 0% { transform: translateX(0); }
1044 + 25% { transform: translateX(-3px); }
1045 + 50% { transform: translateX(3px); }
1046 + 75% { transform: translateX(-2px); }
1047 + 100% { transform: translateX(0); }
1048 +}
1049 +/* Respect reduced-motion: drop the shake; the red border/counter still signals the cap. */
1050 +@media (prefers-reduced-motion: reduce) {
1051 + .mxchat-chatbot .chat-container .input-container.mxchat-input-bump {
1052 + animation: none;
1053 + }
1054 +}
1055 +
890 1056 .mxchat-chatbot .chat-container .input-container .send-button {
891 1057 position: absolute;
892 1058 right: 10px;
893 1059 top: 50%;
@@ -918,8 +1084,15 @@
918 1084 .send-button:hover {
919 1085 opacity: 0.8;
920 1086 }
921 1087
1088 +/* Stop state while a response is streaming: the send button becomes a Stop
1089 + control in place — same chrome and position, swapped glyph. Themeable hook;
1090 + the glyph's size/color are mirrored from the send icon at runtime. */
1091 +.mxchat-chatbot .chat-container .input-container .send-button.mxchat-stop-mode {
1092 + cursor: pointer;
1093 +}
1094 +
922 1095 .mxchat-chatbot .spinner {
923 1096 animation: rotate 2s linear infinite;
924 1097 width: 20px;
925 1098 height: 20px;
@@ -1035,9 +1208,12 @@
1035 1208
1036 1209 .chatbot-top-bar button.exit-chat:hover {
1037 1210 background: rgba(255, 255, 255, 0.12);
1038 1211 }
1039 -.visible {
1212 +/* The floating window is the only element MxChat toggles .visible on (core, the Trigger
1213 + and Multi-Bot add-ons and MxChat Anywhere all use .floating-chatbot). Unscoped, this turned
1214 + any site element with class "visible" into a flex container. */
1215 +:where(.floating-chatbot).visible {
1040 1216 display: flex;
1041 1217 }
1042 1218
1043 1219 .floating-chatbot-button {
@@ -1059,8 +1235,13 @@
1059 1235 z-index: 100000;
1060 1236 display: flex;
1061 1237 }
1062 1238
1239 +.floating-chatbot-button:focus-visible {
1240 + outline: 3px solid #7873f5;
1241 + outline-offset: 3px;
1242 +}
1243 +
1063 1244 .floating-chatbot-button img {
1064 1245 max-width: 100%;
1065 1246 max-height: 100%;
1066 1247 width: auto;
@@ -1072,8 +1253,11 @@
1072 1253 }
1073 1254
1074 1255 .mxchat-chatbot-wrapper .chatbot-top-bar button.exit-chat {
1075 1256 background: transparent;
1257 + /* v3.2.15 (plan-52fd4c): explicit guards against host-theme button rules.
1258 + Margin deliberately untouched — .exit-chat relies on margin-left:auto. */
1259 + background-image: none;
1076 1260 border: none;
1077 1261 opacity: 0.8;
1078 1262 padding: 0;
1079 1263 width: 32px;
@@ -1078,10 +1262,17 @@
1078 1262 padding: 0;
1079 1263 width: 32px;
1080 1264 height: 32px;
1081 1265 min-width: 32px;
1266 + min-height: 32px;
1267 + max-width: none;
1082 1268 flex: 0 0 auto;
1083 1269 border-radius: 6px;
1270 + font-family: inherit;
1271 + text-transform: none;
1272 + text-shadow: none;
1273 + appearance: none;
1274 + -webkit-appearance: none;
1084 1275 transition: opacity 0.15s ease, background 0.15s ease;
1085 1276 }
1086 1277
1087 1278 .mxchat-chatbot-wrapper .chatbot-top-bar {
@@ -1419,9 +1610,12 @@
1419 1610 }
1420 1611
1421 1612
1422 1613
1423 -pre {
1614 +/* Code blocks inside the chat only (a bare pre turned every code sample on the site black with
1615 + white text). :where() keeps the specificity of the bare element selector, so .mxchat-code-block
1616 + still wins where it sets a property and the look inside the chat is unchanged. */
1617 +:where(.mxchat-chatbot-wrapper) pre {
1424 1618 background-color: #000;
1425 1619 border: 1px solid #ddd;
1426 1620 border-radius: 20px;
1427 1621 border-left: 3px solid #9e7aff;
@@ -1437,25 +1631,8 @@
1437 1631 display: block;
1438 1632 word-wrap: break-word;
1439 1633 }
1440 1634
1441 -.copy-btn {
1442 - padding: 10px 20px;
1443 - border: none;
1444 - border-radius: 4px;
1445 - background-color: #9e7aff;
1446 - transition: background-color 0.3s;
1447 - color: #fff;
1448 - font-size: 1rem;
1449 - cursor: pointer;
1450 - font-weight: 700;
1451 - margin-bottom: 10px;
1452 -}
1453 -
1454 -.copy-btn:hover {
1455 - opacity: 0.8;
1456 -}
1457 -
1458 1635 .mxchat-product-card {
1459 1636 display: flex;
1460 1637 flex-direction: column;
1461 1638 align-items: center;
@@ -1550,8 +1727,106 @@
1550 1727 height: auto;
1551 1728 border-radius: 0 0 8px 8px;
1552 1729 }
1553 1730
1731 +/* Consent-safe YouTube embed (click-to-load facade → nocookie iframe).
1732 + Caption colors INHERIT from the message bubble (same idiom as
1733 + .mxchat-product-card) so the embed reads correctly on any widget theme —
1734 + bot bubbles commonly force their own text color. */
1735 +.mxchat-youtube-embed {
1736 + max-width: 340px;
1737 + margin-top: 8px;
1738 +}
1739 +
1740 +.mxchat-youtube-facade {
1741 + position: relative;
1742 + display: block;
1743 + width: 100%;
1744 + padding: 0;
1745 + margin: 0;
1746 + border: none;
1747 + background: #000;
1748 + cursor: pointer;
1749 + aspect-ratio: 16 / 9;
1750 + border-radius: 10px;
1751 + overflow: hidden;
1752 + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
1753 +}
1754 +
1755 +.mxchat-youtube-thumb {
1756 + width: 100%;
1757 + height: 100%;
1758 + object-fit: cover;
1759 + display: block;
1760 + opacity: 0.92;
1761 + transition: opacity 0.2s;
1762 +}
1763 +
1764 +.mxchat-youtube-facade:hover .mxchat-youtube-thumb {
1765 + opacity: 1;
1766 +}
1767 +
1768 +.mxchat-youtube-play {
1769 + position: absolute;
1770 + top: 50%;
1771 + left: 50%;
1772 + transform: translate(-50%, -50%);
1773 + display: flex;
1774 + align-items: center;
1775 + justify-content: center;
1776 + width: 52px;
1777 + height: 52px;
1778 + border-radius: 50%;
1779 + background: rgba(0, 0, 0, 0.72);
1780 + color: #fff;
1781 + transition: transform 0.2s, background 0.2s;
1782 +}
1783 +
1784 +.mxchat-youtube-play svg {
1785 + margin-left: 3px;
1786 +}
1787 +
1788 +.mxchat-youtube-facade:hover .mxchat-youtube-play {
1789 + transform: translate(-50%, -50%) scale(1.08);
1790 + background: rgba(0, 0, 0, 0.85);
1791 +}
1792 +
1793 +.mxchat-youtube-iframe {
1794 + width: 100%;
1795 + aspect-ratio: 16 / 9;
1796 + border: none;
1797 + display: block;
1798 + border-radius: 10px;
1799 + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
1800 +}
1801 +
1802 +.mxchat-youtube-caption {
1803 + display: flex;
1804 + align-items: baseline;
1805 + justify-content: space-between;
1806 + gap: 10px;
1807 + padding: 8px 2px 0;
1808 + background: transparent;
1809 + color: inherit;
1810 +}
1811 +
1812 +.mxchat-youtube-title {
1813 + font-size: 13px;
1814 + font-weight: 600;
1815 + color: inherit;
1816 + overflow: hidden;
1817 + white-space: nowrap;
1818 + text-overflow: ellipsis;
1819 +}
1820 +
1821 +.mxchat-youtube-link {
1822 + font-size: 12px;
1823 + white-space: nowrap;
1824 + color: inherit;
1825 + opacity: 0.85;
1826 + text-decoration: underline;
1827 +}
1828 +
1554 1829 #widget_icon, #widget_icon_2, #widget_icon_3, #widget_icon_5, #widget_icon_4, #widget_icon_6, #widget_icon_7 {
1555 1830 padding: 10px;
1556 1831 }
1557 1832
@@ -1651,18 +1926,29 @@
1651 1926 background: rgba(255, 255, 255, 0.12);
1652 1927 opacity: 1;
1653 1928 outline: none;
1654 1929 }
1655 -.mxchat-header-btn {
1930 +/* v3.2.15 (plan-52fd4c): kebab rules scoped under the wrapper + explicit
1931 + guards on every property a theme's button/link rules commonly set
1932 + (font-family, margin, appearance, text-transform, background-image),
1933 + after a customer site's theme visibly mangled the dropdown. */
1934 +.mxchat-chatbot-wrapper .mxchat-header-btn {
1656 1935 border: none;
1657 1936 background: transparent;
1937 + background-image: none;
1658 1938 cursor: pointer;
1659 1939 display: inline-flex;
1660 1940 align-items: center;
1661 1941 justify-content: center;
1662 1942 padding: 0;
1943 + margin: 0;
1663 1944 opacity: 0.8;
1664 1945 color: #fff;
1946 + font-family: inherit;
1947 + text-transform: none;
1948 + text-shadow: none;
1949 + appearance: none;
1950 + -webkit-appearance: none;
1665 1951 transition: opacity 0.15s ease, background 0.15s ease;
1666 1952 border-radius: 6px;
1667 1953 line-height: 0;
1668 1954 width: 32px;
@@ -1667,30 +1953,33 @@
1667 1953 line-height: 0;
1668 1954 width: 32px;
1669 1955 height: 32px;
1670 1956 min-width: 32px;
1957 + min-height: 32px;
1958 + max-width: none;
1671 1959 flex: 0 0 auto;
1672 1960 }
1673 -.mxchat-header-btn:hover,
1674 -.mxchat-header-btn:focus {
1961 +.mxchat-chatbot-wrapper .mxchat-header-btn:hover,
1962 +.mxchat-chatbot-wrapper .mxchat-header-btn:focus {
1675 1963 opacity: 1;
1676 1964 background: rgba(255, 255, 255, 0.12);
1677 1965 outline: none;
1678 1966 }
1679 -.mxchat-header-btn[aria-expanded="true"] {
1967 +.mxchat-chatbot-wrapper .mxchat-header-btn[aria-expanded="true"] {
1680 1968 opacity: 1;
1681 1969 background: rgba(255, 255, 255, 0.12);
1682 1970 }
1683 -.mxchat-menu-trigger svg {
1971 +.mxchat-chatbot-wrapper .mxchat-menu-trigger svg {
1684 1972 width: 18px;
1685 1973 height: 18px;
1686 1974 }
1687 1975
1688 -.mxchat-header-menu {
1976 +.mxchat-chatbot-wrapper .mxchat-header-menu {
1689 1977 position: absolute;
1690 1978 top: calc(100% + 6px);
1691 1979 right: 0;
1692 1980 min-width: 220px;
1981 + margin: 0;
1693 1982 background: var(--mxchat-menu-bg, #ffffff);
1694 1983 color: var(--mxchat-menu-fg, #1a1a1a);
1695 1984 border: 1px solid rgba(127, 127, 127, 0.20);
1696 1985 border-radius: 10px;
@@ -1695,35 +1984,45 @@
1695 1984 border: 1px solid rgba(127, 127, 127, 0.20);
1696 1985 border-radius: 10px;
1697 1986 box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18), 0 2px 6px rgba(0, 0, 0, 0.10);
1698 1987 padding: 4px;
1699 - z-index: 5;
1988 + font-family: inherit;
1989 + z-index: 99;
1700 1990 opacity: 0;
1701 1991 transform: translateY(-4px);
1702 1992 pointer-events: none;
1703 1993 transition: opacity 0.12s ease, transform 0.12s ease;
1704 1994 }
1705 -.mxchat-header-menu.is-open {
1995 +.mxchat-chatbot-wrapper .mxchat-header-menu.is-open {
1706 1996 opacity: 1;
1707 1997 transform: translateY(0);
1708 1998 pointer-events: auto;
1709 1999 }
1710 -.mxchat-header-menu[hidden] {
2000 +.mxchat-chatbot-wrapper .mxchat-header-menu[hidden] {
1711 2001 display: none;
1712 2002 }
1713 -.mxchat-menu-item {
2003 +.mxchat-chatbot-wrapper .mxchat-menu-item {
1714 2004 display: flex;
1715 2005 align-items: center;
1716 2006 gap: 10px;
1717 2007 width: 100%;
1718 2008 padding: 8px 12px;
2009 + margin: 0;
1719 2010 min-height: 40px;
1720 2011 border: none;
1721 2012 background: transparent;
2013 + background-image: none;
1722 2014 color: inherit;
2015 + font-family: inherit;
1723 2016 font-size: 14px;
1724 2017 line-height: 1.3;
2018 + letter-spacing: normal;
1725 2019 text-align: left;
2020 + text-transform: none;
2021 + text-shadow: none;
2022 + white-space: nowrap;
2023 + appearance: none;
2024 + -webkit-appearance: none;
1726 2025 cursor: pointer;
1727 2026 border-radius: 6px;
1728 2027 transition: background 0.12s ease;
1729 2028 text-decoration: none;
@@ -1728,10 +2027,10 @@
1728 2027 transition: background 0.12s ease;
1729 2028 text-decoration: none;
1730 2029 box-sizing: border-box;
1731 2030 }
1732 -.mxchat-menu-item:hover,
1733 -.mxchat-menu-item:focus {
2031 +.mxchat-chatbot-wrapper .mxchat-menu-item:hover,
2032 +.mxchat-chatbot-wrapper .mxchat-menu-item:focus {
1734 2033 background: rgba(127, 127, 127, 0.18);
1735 2034 outline: none;
1736 2035 }
1737 2036 .mxchat-menu-item-icon {
@@ -1760,132 +2059,201 @@
1760 2059 right: auto;
1761 2060 left: 0;
1762 2061 }
1763 2062
1764 -/* ============================================================
1765 - Print stylesheet — clean conversation export (v3.2.9 rebuild)
1766 - Goal: full-page-width transcript, no right-edge clipping, all chrome hidden.
1767 - ============================================================ */
1768 -@media print {
1769 - body * {
1770 - visibility: hidden !important;
1771 - }
1772 - .mxchat-conversation-print-root,
1773 - .mxchat-conversation-print-root * {
1774 - visibility: visible !important;
1775 - }
1776 - .mxchat-conversation-print-root {
1777 - position: absolute !important;
1778 - left: 0 !important;
1779 - top: 0 !important;
1780 - right: 0 !important;
1781 - width: 100% !important;
1782 - max-width: 100% !important;
1783 - height: auto !important;
1784 - min-height: 0 !important;
1785 - max-height: none !important;
1786 - overflow: visible !important;
1787 - background: #fff !important;
1788 - color: #000 !important;
1789 - padding: 24px 32px !important;
1790 - margin: 0 !important;
1791 - box-shadow: none !important;
1792 - border: none !important;
1793 - transform: none !important;
1794 - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important;
1795 - direction: inherit;
1796 - box-sizing: border-box !important;
1797 - }
1798 - .mxchat-conversation-print-root::before {
1799 - content: attr(data-print-title);
1800 - display: block;
1801 - font-size: 16px;
1802 - font-weight: 600;
1803 - color: #000;
1804 - border-bottom: 1px solid #000;
1805 - padding-bottom: 8px;
1806 - margin-bottom: 16px;
1807 - }
1808 - .mxchat-conversation-print-root .user-message,
1809 - .mxchat-conversation-print-root .bot-message,
1810 - .mxchat-conversation-print-root .agent-message {
1811 - display: block !important;
1812 - position: static !important;
1813 - float: none !important;
1814 - width: 100% !important;
1815 - max-width: 100% !important;
1816 - min-width: 0 !important;
1817 - background: transparent !important;
1818 - color: #000 !important;
1819 - border: none !important;
1820 - border-radius: 0 !important;
1821 - box-shadow: none !important;
1822 - padding: 8px 0 !important;
1823 - margin: 0 0 12px 0 !important;
1824 - page-break-inside: avoid;
1825 - overflow-wrap: anywhere;
1826 - word-break: break-word;
1827 - box-sizing: border-box !important;
1828 - }
1829 - .mxchat-conversation-print-root .user-message *,
1830 - .mxchat-conversation-print-root .bot-message *,
1831 - .mxchat-conversation-print-root .agent-message * {
1832 - max-width: 100% !important;
1833 - box-sizing: border-box !important;
1834 - color: #000 !important;
1835 - }
1836 - .mxchat-conversation-print-root .user-message::before {
1837 - content: "You: ";
1838 - font-weight: 600;
1839 - color: #000;
1840 - }
1841 - .mxchat-conversation-print-root .bot-message::before {
1842 - content: "Bot: ";
1843 - font-weight: 600;
1844 - color: #000;
1845 - }
1846 - .mxchat-conversation-print-root .agent-message::before {
1847 - content: "Agent: ";
1848 - font-weight: 600;
1849 - color: #000;
1850 - }
1851 - .mxchat-conversation-print-root pre,
1852 - .mxchat-conversation-print-root code {
1853 - background: #f4f4f4 !important;
1854 - color: #000 !important;
1855 - border: 1px solid #ddd !important;
1856 - white-space: pre-wrap !important;
1857 - word-wrap: break-word !important;
1858 - overflow-wrap: anywhere !important;
1859 - max-width: 100% !important;
1860 - box-sizing: border-box !important;
1861 - }
1862 - .mxchat-conversation-print-root img,
1863 - .mxchat-conversation-print-root .image-gallery img {
1864 - max-width: 100% !important;
1865 - height: auto !important;
1866 - }
1867 - .mxchat-conversation-print-root a {
1868 - color: #000 !important;
1869 - text-decoration: underline;
1870 - word-break: break-all;
1871 - }
1872 - /* Hide widget chrome inside the transcript */
1873 - .mxchat-conversation-print-root .mxchat-copy-button,
1874 - .mxchat-conversation-print-root .thinking-dots,
1875 - .mxchat-conversation-print-root .temporary-message,
1876 - .mxchat-conversation-print-root .mxchat-product-card button,
1877 - .mxchat-conversation-print-root .mxchat-popular-questions,
1878 - .mxchat-conversation-print-root .mxchat-input-container,
1879 - .mxchat-conversation-print-root .mxchat-top-bar,
1880 - .mxchat-conversation-print-root .mxchat-toolbar,
1881 - .mxchat-conversation-print-root .mxchat-header-menu-wrap,
1882 - .mxchat-conversation-print-root .mxchat-header-menu,
1883 - .mxchat-conversation-print-root .mxchat-menu-trigger {
1884 - display: none !important;
1885 - }
1886 - /* Page setup */
1887 - @page {
1888 - margin: 0.5in;
1889 - size: auto;
1890 - }
2063 +/* ============================================================================
2064 + Satisfaction rating (v3.2.6 — polished per plan-141a12)
2065 + Theme-adaptive via currentColor + inherit. Clean slate — old rules removed.
2066 + ========================================================================= */
2067 +.mxchat-chatbot .chat-container .chat-box .mxchat-rating-prompt,
2068 +.mxchat-chatbot .chat-container .chat-box .mxchat-rating-feedback,
2069 +.mxchat-chatbot .chat-container .chat-box .mxchat-rating-saved {
2070 + clear: both;
2071 + float: left;
2072 + max-width: 92%;
2073 + box-sizing: border-box;
2074 +}
2075 +
2076 +/* Theme-adaptive wrapper — .bot-message carries the user's custom bg/color via
2077 + inline style; the inner rating component supplies its own padding + layout. */
2078 +.mxchat-rating-bot-bubble {
2079 + padding: 0;
2080 + overflow: visible;
2081 +}
2082 +
2083 +.mxchat-rating-prompt {
2084 + display: flex;
2085 + flex-direction: column;
2086 + align-items: stretch;
2087 + gap: 10px;
2088 + padding: 10px 14px;
2089 + margin: 10px 0;
2090 + font-size: 14px;
2091 + color: inherit;
2092 +}
2093 +
2094 +.mxchat-rating-question {
2095 + color: inherit;
2096 + opacity: 0.85;
2097 + font-weight: 500;
2098 +}
2099 +
2100 +.mxchat-rating-actions {
2101 + display: flex;
2102 + align-items: center;
2103 + gap: 8px;
2104 +}
2105 +
2106 +.mxchat-rating-buttons {
2107 + display: inline-flex;
2108 + gap: 6px;
2109 +}
2110 +
2111 +.mxchat-rating-btn {
2112 + display: inline-flex;
2113 + align-items: center;
2114 + justify-content: center;
2115 + width: 32px;
2116 + height: 32px;
2117 + border-radius: 8px;
2118 + background: transparent;
2119 + border: none;
2120 + color: inherit;
2121 + opacity: 0.6;
2122 + cursor: pointer;
2123 + transition: opacity 0.18s ease, transform 0.18s ease, background-color 0.18s ease, color 0.18s ease;
2124 + padding: 0;
2125 +}
2126 +
2127 +.mxchat-rating-btn:hover {
2128 + opacity: 1;
2129 + transform: scale(1.12);
2130 + background: rgba(255, 255, 255, 0.08);
2131 +}
2132 +
2133 +.mxchat-rating-btn:focus-visible {
2134 + opacity: 1;
2135 + outline: 2px solid currentColor;
2136 + outline-offset: 2px;
2137 +}
2138 +
2139 +.mxchat-rating-btn svg {
2140 + pointer-events: none;
2141 +}
2142 +
2143 +.mxchat-rating-dismiss {
2144 + width: 24px;
2145 + height: 24px;
2146 + border-radius: 6px;
2147 + background: transparent;
2148 + border: none;
2149 + color: inherit;
2150 + opacity: 0.45;
2151 + cursor: pointer;
2152 + font-size: 18px;
2153 + line-height: 1;
2154 + transition: opacity 0.18s ease, background-color 0.18s ease;
2155 +}
2156 +
2157 +.mxchat-rating-dismiss:hover {
2158 + opacity: 0.9;
2159 + background: rgba(255, 255, 255, 0.08);
2160 +}
2161 +
2162 +/* Feedback panel that replaces the prompt after a rating is clicked */
2163 +.mxchat-rating-feedback {
2164 + padding: 12px 14px;
2165 + margin: 10px 0;
2166 + display: flex;
2167 + flex-direction: column;
2168 + gap: 10px;
2169 + color: inherit;
2170 + animation: mxchat-rating-fade-in 0.22s ease;
2171 +}
2172 +
2173 +.mxchat-rating-feedback-label {
2174 + font-size: 13px;
2175 + opacity: 0.85;
2176 + font-weight: 500;
2177 +}
2178 +
2179 +.mxchat-rating-feedback-input {
2180 + width: 100%;
2181 + box-sizing: border-box;
2182 + padding: 8px 10px;
2183 + border: 1px solid rgba(255, 255, 255, 0.25);
2184 + border-radius: 8px;
2185 + font-size: 14px;
2186 + font-family: inherit;
2187 + resize: vertical;
2188 + background: rgba(255, 255, 255, 0.08);
2189 + color: inherit;
2190 +}
2191 +
2192 +.mxchat-rating-feedback-input:focus {
2193 + outline: none;
2194 + border-color: rgba(255, 255, 255, 0.45);
2195 + background: rgba(255, 255, 255, 0.15);
2196 +}
2197 +
2198 +.mxchat-rating-feedback-actions {
2199 + display: flex;
2200 + justify-content: flex-end;
2201 + gap: 8px;
2202 +}
2203 +
2204 +.mxchat-rating-skip,
2205 +.mxchat-rating-submit {
2206 + padding: 6px 14px;
2207 + border-radius: 8px;
2208 + font-size: 13px;
2209 + font-weight: 500;
2210 + cursor: pointer;
2211 + border: none;
2212 + transition: opacity 0.18s ease, transform 0.18s ease, background-color 0.18s ease;
2213 +}
2214 +
2215 +.mxchat-rating-skip {
2216 + background: transparent;
2217 + color: inherit;
2218 + opacity: 0.6;
2219 +}
2220 +
2221 +.mxchat-rating-skip:hover {
2222 + opacity: 1;
2223 + background: rgba(255, 255, 255, 0.08);
2224 +}
2225 +
2226 +.mxchat-rating-submit {
2227 + /* Filled "primary" pill: fill = the bot font color, label = the bubble bg.
2228 + syncRatingBubbleColors() in chat-script.js paints the real bot colors
2229 + straight onto this button (inline) from the bubble's COMPUTED style, so
2230 + it adapts to both the inline color pickers AND the mxchat-theme AI
2231 + customizer. These var()/literal values are the no-JS safety net — the
2232 + literal fallbacks (#212121 fill / #ffffff label) stay legible on their
2233 + own (no white-on-white). Longhand background-color (not the `background`
2234 + shorthand) because Chromium resolves inherited custom properties
2235 + unreliably inside the shorthand. Do NOT use currentColor here — setting
2236 + `color` would re-poison the background to the same value. */
2237 + background-color: var(--mxchat-bot-fg, #212121);
2238 + color: var(--mxchat-bot-bg, #ffffff);
2239 +}
2240 +
2241 +.mxchat-rating-submit:hover {
2242 + transform: translateY(-1px);
2243 + opacity: 0.9;
2244 +}
2245 +
2246 +.mxchat-rating-saved {
2247 + padding: 10px 14px;
2248 + margin: 10px 0;
2249 + font-size: 13px;
2250 + font-weight: 500;
2251 + text-align: center;
2252 + color: inherit;
2253 + animation: mxchat-rating-fade-in 0.22s ease;
2254 +}
2255 +
2256 +@keyframes mxchat-rating-fade-in {
2257 + from { opacity: 0; transform: translateY(4px); }
2258 + to { opacity: 1; transform: translateY(0); }
1891 2259 }