PluginProbe
MxChat – AI Chatbot & Content Generation for WordPress / 3.2.23
MxChat – AI Chatbot & Content Generation for WordPress v3.2.23
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 +246 -28 3.2.12 → 3.2.23 View file →
@@ -266,8 +266,14 @@
266 266 border: 1px solid #e5e5e5;
267 267 text-align: center;
268 268 }
269 269
270 +/* YouTube import: multi-line radio/description stack reads left-aligned,
271 + unlike the single-row URL forms the centered default was made for. */
272 +#mxchat-youtube-input-area {
273 + text-align: left;
274 +}
275 +
270 276 /* PDF Upload Area */
271 277 #mxchat-pdf-upload-area input[type="file"] {
272 278 margin-bottom: 12px;
273 279 }
@@ -604,8 +610,19 @@
604 610 input:checked + .mxchat-toggle-slider:before {
605 611 transform: translateX(26px);
606 612 }
607 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 +
608 625 .mxchat-toggle-label {
609 626 font-size: 14px;
610 627 color: #333;
611 628 }
@@ -1205,8 +1222,12 @@
1205 1222 .rtl input:checked + .mxchat-toggle-slider:before {
1206 1223 transform: translateX(-26px);
1207 1224 }
1208 1225
1226 +.rtl input:indeterminate + .mxchat-toggle-slider:before {
1227 + transform: translateX(-13px);
1228 +}
1229 +
1209 1230 .rtl .mxchat-error-notice {
1210 1231 border-left: none;
1211 1232 border-right: 3px solid #f44336;
1212 1233 }
@@ -1274,20 +1295,36 @@
1274 1295
1275 1296 .mxchat-kb-modal-content {
1276 1297 position: relative;
1277 1298 background-color: #fff;
1278 - margin: 50px auto;
1299 + margin: 24px auto;
1279 1300 padding: 0;
1280 1301 border-radius: 8px;
1281 1302 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
1282 1303 width: 90%;
1283 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). */
1284 1307 max-height: 85vh;
1308 + max-height: min(85vh, calc(100dvh - 48px));
1285 1309 display: flex;
1286 1310 flex-direction: column;
1287 1311 animation: mxchat-kb-modal-appear 0.3s ease-out;
1288 1312 }
1289 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 +
1290 1327 @keyframes mxchat-kb-modal-appear {
1291 1328 from {
1292 1329 opacity: 0;
1293 1330 transform: translateY(-30px);
@@ -1395,8 +1432,36 @@
1395 1432 outline: none;
1396 1433 box-shadow: 0 0 0 1px #7873f5;
1397 1434 }
1398 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 +
1399 1464 /* Special style for the "processed" filter */
1400 1465 #mxchat-kb-processed-filter {
1401 1466 border-left: 3px solid #1e88e5;
1402 1467 }
@@ -1401,12 +1466,15 @@
1401 1466 border-left: 3px solid #1e88e5;
1402 1467 }
1403 1468
1404 1469 .mxchat-kb-content-selection {
1405 - overflow-y: auto;
1406 - flex: 1;
1407 - min-height: 300px;
1408 - 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;
1409 1477 }
1410 1478
1411 1479 .mxchat-kb-selection-header {
1412 1480 display: flex;
@@ -1434,8 +1502,12 @@
1434 1502 }
1435 1503
1436 1504 .mxchat-kb-content-list {
1437 1505 padding: 0;
1506 + /* The one and only scroller inside the modal. */
1507 + flex: 1 1 auto;
1508 + min-height: 0;
1509 + overflow-y: auto;
1438 1510 }
1439 1511
1440 1512 .mxchat-kb-content-item {
1441 1513 display: flex;
@@ -1464,19 +1536,23 @@
1464 1536 align-items: flex-start;
1465 1537 padding-top: 3px;
1466 1538 }
1467 1539
1540 +/* Native control, brand-tinted — identical to the "select all" checkbox above the
1541 + list, which carries no custom styling at all and renders correctly.
1542 + Do NOT re-add width / height / border / border-radius / background here. WP admin
1543 + draws the tick as a 21px dashicon positioned with negative margins for its OWN
1544 + default box, so forcing a custom box makes the tick overflow it. That mismatch
1545 + shipped for a long time but was invisible while the tick was white-on-white. */
1468 1546 .mxchat-kb-content-checkbox input[type="checkbox"] {
1469 - width: 18px;
1470 - height: 18px;
1471 - border: 1px solid #8c8f94;
1472 - border-radius: 3px;
1473 - background: #fff;
1474 1547 margin: 0;
1548 + cursor: pointer;
1549 + accent-color: var(--mxch-primary, #7873f5);
1475 1550 }
1476 1551
1477 -.mxchat-kb-content-checkbox input[type="checkbox"]:checked {
1478 - border-color: #7873f5;
1552 +.mxchat-kb-content-checkbox input[type="checkbox"]:focus-visible {
1553 + outline: 2px solid var(--mxch-primary, #7873f5);
1554 + outline-offset: 2px;
1479 1555 }
1480 1556
1481 1557 .mxchat-kb-content-details {
1482 1558 flex: 1;
@@ -1848,38 +1924,70 @@
1848 1924
1849 1925 /* Modal responsive adjustments */
1850 1926 .mxchat-kb-modal-content {
1851 1927 width: 95%;
1852 - max-height: 90vh;
1853 - margin: 20px auto;
1928 + /* dvh = real visible viewport (mobile vh includes the URL-bar region);
1929 + vh line is the older-browser fallback. */
1930 + max-height: calc(100vh - 24px);
1931 + max-height: calc(100dvh - 24px);
1932 + margin: 12px auto;
1933 + /* Last-resort scroll: on extreme-short viewports (landscape phones)
1934 + the compacted chrome + the list's floor can still exceed the box —
1935 + scroll inside the box rather than clipping the footer. */
1936 + overflow-y: auto;
1854 1937 }
1855 -
1938 +
1939 + /* Compact the fixed chrome on mobile — stacked filters + a stacked footer
1940 + are tall, and every saved pixel goes to the content list. */
1941 + .mxchat-kb-modal-header {
1942 + padding: 12px 16px;
1943 + }
1944 +
1945 + .mxchat-kb-modal-header h3 {
1946 + font-size: 16px;
1947 + }
1948 +
1856 1949 .mxchat-kb-modal-filters {
1857 1950 flex-direction: column;
1858 1951 align-items: stretch;
1952 + padding: 10px 16px;
1953 + gap: 8px;
1859 1954 }
1860 -
1955 +
1861 1956 .mxchat-kb-search-group {
1862 1957 max-width: none;
1863 1958 }
1864 -
1959 +
1865 1960 .mxchat-kb-filter-group {
1866 1961 flex-direction: column;
1962 + gap: 8px;
1867 1963 }
1868 -
1869 - .mxchat-kb-content-selection {
1870 - max-height: calc(90vh - 250px);
1964 +
1965 + .mxchat-kb-filter-group select {
1966 + padding: 6px 30px 6px 10px;
1871 1967 }
1872 -
1968 +
1873 1969 .mxchat-kb-selection-header {
1874 1970 flex-direction: column;
1875 1971 align-items: flex-start;
1876 - gap: 10px;
1972 + gap: 6px;
1973 + padding: 10px 16px;
1877 1974 }
1878 -
1975 +
1976 + /* Guarantee a usable slice of visible rows — reachable buttons are no
1977 + help if there is nothing to select above them. */
1978 + .mxchat-kb-content-list {
1979 + min-height: 96px;
1980 + }
1981 +
1982 + .mxchat-kb-content-item {
1983 + padding: 10px 16px;
1984 + }
1985 +
1879 1986 .mxchat-kb-modal-footer {
1880 1987 flex-direction: column;
1881 - gap: 10px;
1988 + gap: 8px;
1989 + padding: 10px 16px;
1882 1990 }
1883 1991
1884 1992 .mxchat-kb-modal-footer .mxchat-kb-pagination {
1885 1993 width: 100%;
@@ -3749,13 +3857,18 @@
3749 3857 }
3750 3858
3751 3859 .mxchat-kb-edit-modal-content {
3752 3860 max-width: 760px;
3861 + /* Same viewport-safe cap as the content-selector modal (vh = fallback). */
3753 3862 max-height: 90vh;
3863 + max-height: min(90vh, calc(100dvh - 24px));
3754 3864 }
3755 3865
3756 3866 .mxchat-kb-edit-body {
3757 - flex: 1;
3867 + flex: 1 1 auto;
3868 + /* min-height: 0 lets the body shrink inside the capped modal box so the
3869 + footer (Save/Cancel) can never be pushed below the viewport. */
3870 + min-height: 0;
3758 3871 display: flex;
3759 3872 flex-direction: column;
3760 3873 padding: 20px;
3761 3874 overflow: hidden;
@@ -3808,8 +3921,10 @@
3808 3921 justify-content: space-between;
3809 3922 padding: 14px 20px;
3810 3923 border-top: 1px solid #e5e5e5;
3811 3924 gap: 12px;
3925 + /* Action row can never be squeezed out of the box. */
3926 + flex-shrink: 0;
3812 3927 }
3813 3928
3814 3929 .mxchat-kb-edit-notice {
3815 3930 flex: 1;
@@ -3829,9 +3944,11 @@
3829 3944 match-card / chunk-detail components (admin-testing-tab.css, scoped under
3830 3945 .mxch-testing-results) so it looks native; this block only adds the modal
3831 3946 body scroll + the chunk-text container the Testing tab doesn't have. */
3832 3947 .mxchat-kb-inspect-body {
3833 - flex: 1;
3948 + flex: 1 1 auto;
3949 + /* Same footer-pushout guard as the edit modal. */
3950 + min-height: 0;
3834 3951 display: flex;
3835 3952 flex-direction: column;
3836 3953 padding: 20px;
3837 3954 overflow-y: auto;
@@ -3869,9 +3986,10 @@
3869 3986 .mxchat-kb-edit-modal-content {
3870 3987 width: 96%;
3871 3988 max-width: 96%;
3872 3989 margin: 10px auto;
3873 - max-height: 95vh;
3990 + max-height: calc(100vh - 20px);
3991 + max-height: calc(100dvh - 20px);
3874 3992 }
3875 3993 .mxchat-kb-edit-body {
3876 3994 padding: 14px;
3877 3995 }
@@ -3889,5 +4007,105 @@
3889 4007 .mxchat-kb-edit-actions .mxch-btn {
3890 4008 flex: 1;
3891 4009 text-align: center;
3892 4010 }
3893 -}
4011 +}
4012 +/* ==========================================================================
4013 + Custom Meta-key discovery picker (plan-mxchat-20260709-fe8e4e)
4014 + Canon-token chip picker mirroring the ACF discovery UX for non-ACF meta.
4015 + ========================================================================== */
4016 +.mxchat-meta-scan-controls {
4017 + display: flex;
4018 + align-items: center;
4019 + flex-wrap: wrap;
4020 + gap: 12px;
4021 + margin-bottom: 12px;
4022 +}
4023 +#mxchat-scan-meta-btn {
4024 + display: inline-flex;
4025 + align-items: center;
4026 + gap: 8px;
4027 +}
4028 +.mxchat-meta-scan-internal {
4029 + display: inline-flex;
4030 + align-items: center;
4031 + gap: 6px;
4032 + font-size: 13px;
4033 + color: var(--mxch-text-secondary, #64748b);
4034 + cursor: pointer;
4035 +}
4036 +.mxchat-meta-scan-loading,
4037 +.mxchat-meta-scan-empty {
4038 + font-size: 13px;
4039 + color: var(--mxch-text-secondary, #64748b);
4040 + margin: 8px 0 0;
4041 +}
4042 +.mxchat-meta-chip-grid {
4043 + display: grid;
4044 + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
4045 + gap: 10px;
4046 + margin-top: 12px;
4047 +}
4048 +.mxchat-meta-chip {
4049 + display: flex;
4050 + flex-direction: column;
4051 + align-items: flex-start;
4052 + gap: 4px;
4053 + text-align: left;
4054 + width: 100%;
4055 + padding: 10px 12px;
4056 + background: var(--mxch-card-bg, #fff);
4057 + border: 1px solid var(--mxch-card-border, #e2e8f0);
4058 + border-radius: var(--mxch-radius-md, 8px);
4059 + cursor: pointer;
4060 + transition: border-color 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
4061 +}
4062 +.mxchat-meta-chip:hover {
4063 + border-color: var(--mxch-primary, #7873f5);
4064 + box-shadow: 0 1px 4px rgba(120, 115, 245, 0.15);
4065 +}
4066 +.mxchat-meta-chip-main {
4067 + display: flex;
4068 + align-items: baseline;
4069 + flex-wrap: wrap;
4070 + gap: 8px;
4071 +}
4072 +.mxchat-meta-chip-name {
4073 + font-weight: 600;
4074 + color: var(--mxch-text-primary, #1a1a2e);
4075 + font-size: 13px;
4076 +}
4077 +.mxchat-meta-chip-key {
4078 + font-family: monospace;
4079 + font-size: 11px;
4080 + color: var(--mxch-text-muted, #94a3b8);
4081 + background: #f1f5f9;
4082 + padding: 1px 6px;
4083 + border-radius: 4px;
4084 +}
4085 +.mxchat-meta-chip-meta {
4086 + font-size: 11px;
4087 + color: var(--mxch-text-muted, #94a3b8);
4088 + white-space: nowrap;
4089 + overflow: hidden;
4090 + text-overflow: ellipsis;
4091 + max-width: 100%;
4092 +}
4093 +.mxchat-meta-chip-tick {
4094 + font-size: 11px;
4095 + font-weight: 600;
4096 + color: var(--mxch-primary, #7873f5);
4097 + margin-top: 2px;
4098 +}
4099 +.mxchat-meta-chip.is-added {
4100 + border-color: var(--mxch-success, #10b981);
4101 + background: rgba(16, 185, 129, 0.06);
4102 + cursor: default;
4103 +}
4104 +.mxchat-meta-chip.is-added .mxchat-meta-chip-tick {
4105 + color: var(--mxch-success, #10b981);
4106 +}
4107 +@media (max-width: 782px) {
4108 + .mxchat-meta-chip-grid {
4109 + grid-template-columns: 1fr;
4110 + }
4111 +}