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/knowledge-style.css +280 -27 3.2.14 → 3.2.25 View file →
@@ -610,8 +610,19 @@
610 610 input:checked + .mxchat-toggle-slider:before {
611 611 transform: translateX(26px);
612 612 }
613 613
614 +/* Group-level ACF toggle, mixed state: some fields in the group are excluded.
615 + Knob parks mid-track on a washed-out tint of the brand gradient until the
616 + owner picks a side (plan bf57e0). */
617 +input:indeterminate + .mxchat-toggle-slider {
618 + background: linear-gradient(135deg, #e3b8dd, #b9b6e8);
619 +}
620 +
621 +input:indeterminate + .mxchat-toggle-slider:before {
622 + transform: translateX(13px);
623 +}
624 +
614 625 .mxchat-toggle-label {
615 626 font-size: 14px;
616 627 color: #333;
617 628 }
@@ -1211,8 +1222,12 @@
1211 1222 .rtl input:checked + .mxchat-toggle-slider:before {
1212 1223 transform: translateX(-26px);
1213 1224 }
1214 1225
1226 +.rtl input:indeterminate + .mxchat-toggle-slider:before {
1227 + transform: translateX(-13px);
1228 +}
1229 +
1215 1230 .rtl .mxchat-error-notice {
1216 1231 border-left: none;
1217 1232 border-right: 3px solid #f44336;
1218 1233 }
@@ -1280,20 +1295,36 @@
1280 1295
1281 1296 .mxchat-kb-modal-content {
1282 1297 position: relative;
1283 1298 background-color: #fff;
1284 - margin: 50px auto;
1299 + margin: 24px auto;
1285 1300 padding: 0;
1286 1301 border-radius: 8px;
1287 1302 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
1288 1303 width: 90%;
1289 1304 max-width: 1000px;
1305 + /* The box is the ONLY place height is constrained; children flex within it.
1306 + dvh tracks the real visible viewport on mobile (vh line = older-browser fallback). */
1290 1307 max-height: 85vh;
1308 + max-height: min(85vh, calc(100dvh - 48px));
1291 1309 display: flex;
1292 1310 flex-direction: column;
1293 1311 animation: mxchat-kb-modal-appear 0.3s ease-out;
1294 1312 }
1295 1313
1314 +/* Fixed chrome rows never grow or shrink — the results list is the only scroller. */
1315 +.mxchat-kb-modal-header,
1316 +.mxchat-kb-modal-filters,
1317 +.mxchat-kb-selection-header,
1318 +.mxchat-kb-modal-footer {
1319 + flex: 0 0 auto;
1320 +}
1321 +
1322 +/* The footer holds the primary actions — it can never be squeezed out of the box. */
1323 +.mxchat-kb-modal-footer {
1324 + flex-shrink: 0;
1325 +}
1326 +
1296 1327 @keyframes mxchat-kb-modal-appear {
1297 1328 from {
1298 1329 opacity: 0;
1299 1330 transform: translateY(-30px);
@@ -1401,8 +1432,36 @@
1401 1432 outline: none;
1402 1433 box-shadow: 0 0 0 1px #7873f5;
1403 1434 }
1404 1435
1436 +/* Contextual note under the modal filter strip — only rendered for content types
1437 + that need one (currently Media). Continues the filter strip's own surface so it
1438 + reads as part of it rather than as a banner dropped on top. */
1439 +.mxchat-kb-filter-note {
1440 + display: flex;
1441 + align-items: center;
1442 + gap: 8px;
1443 + padding: 10px 20px;
1444 + background-color: #f8f9fa;
1445 + border-bottom: 1px solid #e5e5e5;
1446 + color: #555;
1447 + font-size: 13px;
1448 + line-height: 1.4;
1449 +}
1450 +
1451 +/* An author-level display value outranks the browser default for [hidden], so the
1452 + hidden state has to be restated here or the note would never hide. */
1453 +.mxchat-kb-filter-note[hidden] {
1454 + display: none;
1455 +}
1456 +
1457 +.mxchat-kb-filter-note-icon {
1458 + width: 16px;
1459 + height: 16px;
1460 + flex-shrink: 0;
1461 + color: #7873f5;
1462 +}
1463 +
1405 1464 /* Special style for the "processed" filter */
1406 1465 #mxchat-kb-processed-filter {
1407 1466 border-left: 3px solid #1e88e5;
1408 1467 }
@@ -1407,12 +1466,15 @@
1407 1466 border-left: 3px solid #1e88e5;
1408 1467 }
1409 1468
1410 1469 .mxchat-kb-content-selection {
1411 - overflow-y: auto;
1412 - flex: 1;
1413 - min-height: 300px;
1414 - max-height: calc(85vh - 200px);
1470 + /* Flexible middle region: header row stays put, the list below scrolls.
1471 + min-height: 0 is load-bearing — without it flex refuses to shrink this
1472 + column and the footer gets pushed out of the box (the mobile bug). */
1473 + flex: 1 1 auto;
1474 + min-height: 0;
1475 + display: flex;
1476 + flex-direction: column;
1415 1477 }
1416 1478
1417 1479 .mxchat-kb-selection-header {
1418 1480 display: flex;
@@ -1417,8 +1479,9 @@
1417 1479 .mxchat-kb-selection-header {
1418 1480 display: flex;
1419 1481 justify-content: space-between;
1420 1482 align-items: center;
1483 + gap: var(--mxch-spacing-md, 16px);
1421 1484 padding: 15px 20px;
1422 1485 background-color: #f8f9fa;
1423 1486 border-bottom: 1px solid #eee;
1424 1487 position: sticky;
@@ -1440,8 +1503,12 @@
1440 1503 }
1441 1504
1442 1505 .mxchat-kb-content-list {
1443 1506 padding: 0;
1507 + /* The one and only scroller inside the modal. */
1508 + flex: 1 1 auto;
1509 + min-height: 0;
1510 + overflow-y: auto;
1444 1511 }
1445 1512
1446 1513 .mxchat-kb-content-item {
1447 1514 display: flex;
@@ -1470,19 +1537,23 @@
1470 1537 align-items: flex-start;
1471 1538 padding-top: 3px;
1472 1539 }
1473 1540
1541 +/* Native control, brand-tinted — identical to the "select all" checkbox above the
1542 + list, which carries no custom styling at all and renders correctly.
1543 + Do NOT re-add width / height / border / border-radius / background here. WP admin
1544 + draws the tick as a 21px dashicon positioned with negative margins for its OWN
1545 + default box, so forcing a custom box makes the tick overflow it. That mismatch
1546 + shipped for a long time but was invisible while the tick was white-on-white. */
1474 1547 .mxchat-kb-content-checkbox input[type="checkbox"] {
1475 - width: 18px;
1476 - height: 18px;
1477 - border: 1px solid #8c8f94;
1478 - border-radius: 3px;
1479 - background: #fff;
1480 1548 margin: 0;
1549 + cursor: pointer;
1550 + accent-color: var(--mxch-primary, #7873f5);
1481 1551 }
1482 1552
1483 -.mxchat-kb-content-checkbox input[type="checkbox"]:checked {
1484 - border-color: #7873f5;
1553 +.mxchat-kb-content-checkbox input[type="checkbox"]:focus-visible {
1554 + outline: 2px solid var(--mxch-primary, #7873f5);
1555 + outline-offset: 2px;
1485 1556 }
1486 1557
1487 1558 .mxchat-kb-content-details {
1488 1559 flex: 1;
@@ -1854,38 +1925,70 @@
1854 1925
1855 1926 /* Modal responsive adjustments */
1856 1927 .mxchat-kb-modal-content {
1857 1928 width: 95%;
1858 - max-height: 90vh;
1859 - margin: 20px auto;
1929 + /* dvh = real visible viewport (mobile vh includes the URL-bar region);
1930 + vh line is the older-browser fallback. */
1931 + max-height: calc(100vh - 24px);
1932 + max-height: calc(100dvh - 24px);
1933 + margin: 12px auto;
1934 + /* Last-resort scroll: on extreme-short viewports (landscape phones)
1935 + the compacted chrome + the list's floor can still exceed the box —
1936 + scroll inside the box rather than clipping the footer. */
1937 + overflow-y: auto;
1860 1938 }
1861 -
1939 +
1940 + /* Compact the fixed chrome on mobile — stacked filters + a stacked footer
1941 + are tall, and every saved pixel goes to the content list. */
1942 + .mxchat-kb-modal-header {
1943 + padding: 12px 16px;
1944 + }
1945 +
1946 + .mxchat-kb-modal-header h3 {
1947 + font-size: 16px;
1948 + }
1949 +
1862 1950 .mxchat-kb-modal-filters {
1863 1951 flex-direction: column;
1864 1952 align-items: stretch;
1953 + padding: 10px 16px;
1954 + gap: 8px;
1865 1955 }
1866 -
1956 +
1867 1957 .mxchat-kb-search-group {
1868 1958 max-width: none;
1869 1959 }
1870 -
1960 +
1871 1961 .mxchat-kb-filter-group {
1872 1962 flex-direction: column;
1963 + gap: 8px;
1873 1964 }
1874 -
1875 - .mxchat-kb-content-selection {
1876 - max-height: calc(90vh - 250px);
1965 +
1966 + .mxchat-kb-filter-group select {
1967 + padding: 6px 30px 6px 10px;
1877 1968 }
1878 -
1969 +
1879 1970 .mxchat-kb-selection-header {
1880 1971 flex-direction: column;
1881 1972 align-items: flex-start;
1882 - gap: 10px;
1973 + gap: 6px;
1974 + padding: 10px 16px;
1883 1975 }
1884 -
1976 +
1977 + /* Guarantee a usable slice of visible rows — reachable buttons are no
1978 + help if there is nothing to select above them. */
1979 + .mxchat-kb-content-list {
1980 + min-height: 96px;
1981 + }
1982 +
1983 + .mxchat-kb-content-item {
1984 + padding: 10px 16px;
1985 + }
1986 +
1885 1987 .mxchat-kb-modal-footer {
1886 1988 flex-direction: column;
1887 - gap: 10px;
1989 + gap: 8px;
1990 + padding: 10px 16px;
1888 1991 }
1889 1992
1890 1993 .mxchat-kb-modal-footer .mxchat-kb-pagination {
1891 1994 width: 100%;
@@ -3755,13 +3858,18 @@
3755 3858 }
3756 3859
3757 3860 .mxchat-kb-edit-modal-content {
3758 3861 max-width: 760px;
3862 + /* Same viewport-safe cap as the content-selector modal (vh = fallback). */
3759 3863 max-height: 90vh;
3864 + max-height: min(90vh, calc(100dvh - 24px));
3760 3865 }
3761 3866
3762 3867 .mxchat-kb-edit-body {
3763 - flex: 1;
3868 + flex: 1 1 auto;
3869 + /* min-height: 0 lets the body shrink inside the capped modal box so the
3870 + footer (Save/Cancel) can never be pushed below the viewport. */
3871 + min-height: 0;
3764 3872 display: flex;
3765 3873 flex-direction: column;
3766 3874 padding: 20px;
3767 3875 overflow: hidden;
@@ -3814,8 +3922,10 @@
3814 3922 justify-content: space-between;
3815 3923 padding: 14px 20px;
3816 3924 border-top: 1px solid #e5e5e5;
3817 3925 gap: 12px;
3926 + /* Action row can never be squeezed out of the box. */
3927 + flex-shrink: 0;
3818 3928 }
3819 3929
3820 3930 .mxchat-kb-edit-notice {
3821 3931 flex: 1;
@@ -3835,9 +3945,11 @@
3835 3945 match-card / chunk-detail components (admin-testing-tab.css, scoped under
3836 3946 .mxch-testing-results) so it looks native; this block only adds the modal
3837 3947 body scroll + the chunk-text container the Testing tab doesn't have. */
3838 3948 .mxchat-kb-inspect-body {
3839 - flex: 1;
3949 + flex: 1 1 auto;
3950 + /* Same footer-pushout guard as the edit modal. */
3951 + min-height: 0;
3840 3952 display: flex;
3841 3953 flex-direction: column;
3842 3954 padding: 20px;
3843 3955 overflow-y: auto;
@@ -3875,9 +3987,10 @@
3875 3987 .mxchat-kb-edit-modal-content {
3876 3988 width: 96%;
3877 3989 max-width: 96%;
3878 3990 margin: 10px auto;
3879 - max-height: 95vh;
3991 + max-height: calc(100vh - 20px);
3992 + max-height: calc(100dvh - 20px);
3880 3993 }
3881 3994 .mxchat-kb-edit-body {
3882 3995 padding: 14px;
3883 3996 }
@@ -3994,6 +4107,146 @@
3994 4107 }
3995 4108 @media (max-width: 782px) {
3996 4109 .mxchat-meta-chip-grid {
3997 4110 grid-template-columns: 1fr;
4111 + }
4112 +}
4113 +
4114 +/* ==========================================================================
4115 + Re-import affected entries (plan 89739b)
4116 + Layout only. Every colour, radius and space is a shell token; the badges,
4117 + notices, progress bar and disclosure are the shell's own.
4118 + ========================================================================== */
4119 +.mxch-kb-reimport [hidden] {
4120 + display: none;
4121 +}
4122 +.mxch-kb-reimport-controls {
4123 + display: flex;
4124 + align-items: flex-end;
4125 + flex-wrap: wrap;
4126 + gap: var(--mxch-spacing-md);
4127 + margin-top: var(--mxch-spacing-lg);
4128 +}
4129 +.mxch-kb-reimport-controls .mxch-field {
4130 + flex: 0 0 220px;
4131 + margin-bottom: 0;
4132 +}
4133 +.mxch-kb-reimport .mxch-btn[disabled] {
4134 + opacity: 0.55;
4135 + cursor: default;
4136 +}
4137 +/* Also rewrite edited entries: the toggle beside its label (plan a00ef8) */
4138 +.mxch-kb-reimport-edited {
4139 + display: flex;
4140 + align-items: flex-start;
4141 + gap: var(--mxch-spacing-sm);
4142 + margin-top: var(--mxch-spacing-md);
4143 +}
4144 +.mxch-kb-reimport-edited .toggle-switch {
4145 + flex: 0 0 auto;
4146 + margin-top: 2px;
4147 +}
4148 +.mxch-kb-reimport-edited .mxch-field-label {
4149 + margin-bottom: 2px;
4150 + cursor: pointer;
4151 +}
4152 +.mxch-kb-reimport-edited .mxch-field-description {
4153 + margin: 0;
4154 +}
4155 +.mxch-kb-reimport-progress,
4156 +.mxch-kb-reimport-error {
4157 + margin-top: var(--mxch-spacing-lg);
4158 +}
4159 +.mxch-kb-reimport-progress .mxch-progress-label {
4160 + margin-bottom: 0;
4161 +}
4162 +.mxch-kb-reimport-results {
4163 + margin-top: var(--mxch-spacing-lg);
4164 + padding-top: var(--mxch-spacing-lg);
4165 + border-top: 1px solid var(--mxch-card-border);
4166 +}
4167 +.mxch-kb-reimport-done {
4168 + margin-bottom: var(--mxch-spacing-md);
4169 +}
4170 +.mxch-kb-reimport-counts {
4171 + display: flex;
4172 + flex-wrap: wrap;
4173 + gap: var(--mxch-spacing-sm);
4174 +}
4175 +.mxch-kb-reimport-list {
4176 + list-style: none;
4177 + margin: var(--mxch-spacing-md) 0 0;
4178 + padding: 0;
4179 + max-height: 336px;
4180 + overflow-y: auto;
4181 + border: 1px solid var(--mxch-card-border);
4182 + border-radius: var(--mxch-radius-md);
4183 +}
4184 +.mxch-kb-reimport-list li {
4185 + display: flex;
4186 + align-items: center;
4187 + justify-content: space-between;
4188 + gap: var(--mxch-spacing-md);
4189 + margin: 0;
4190 + padding: var(--mxch-spacing-sm) var(--mxch-spacing-md);
4191 + border-top: 1px solid var(--mxch-card-border);
4192 + font-size: 13px;
4193 + line-height: 1.5;
4194 +}
4195 +.mxch-kb-reimport-list li:first-child {
4196 + border-top: 0;
4197 +}
4198 +.mxch-kb-reimport-source {
4199 + min-width: 0;
4200 + overflow-wrap: anywhere;
4201 + color: var(--mxch-text-primary);
4202 +}
4203 +.mxch-kb-reimport-note {
4204 + display: block;
4205 + font-size: 12px;
4206 + color: var(--mxch-text-secondary);
4207 +}
4208 +.mxch-kb-reimport-reasons {
4209 + display: flex;
4210 + flex-wrap: wrap;
4211 + justify-content: flex-end;
4212 + gap: var(--mxch-spacing-xs);
4213 + flex-shrink: 0;
4214 +}
4215 +.mxch-kb-reimport-notes {
4216 + margin-top: var(--mxch-spacing-sm);
4217 + border: 0;
4218 + border-radius: 0;
4219 +}
4220 +.mxch-kb-reimport-notes li {
4221 + padding-left: 0;
4222 + padding-right: 0;
4223 +}
4224 +.mxch-kb-reimport-footer {
4225 + display: flex;
4226 + align-items: center;
4227 + flex-wrap: wrap;
4228 + gap: var(--mxch-spacing-sm) var(--mxch-spacing-md);
4229 +}
4230 +.mxch-kb-reimport-footer .mxch-field-hint {
4231 + margin-top: 0;
4232 +}
4233 +@media (max-width: 600px) {
4234 + .mxch-kb-reimport-controls .mxch-field {
4235 + flex-basis: 100%;
4236 + }
4237 + .mxch-kb-reimport-controls .mxch-btn {
4238 + width: 100%;
4239 + justify-content: center;
4240 + }
4241 + .mxch-kb-reimport-list li {
4242 + flex-direction: column;
4243 + align-items: flex-start;
4244 + gap: var(--mxch-spacing-xs);
4245 + }
4246 + .mxch-kb-reimport-reasons {
4247 + justify-content: flex-start;
4248 + }
4249 + .mxch-kb-reimport-list {
4250 + max-height: 480px;
3998 4251 }
3999 4252 }