| @@ -1,4 +1,4 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * MxChat Knowledge Base Styles |
| 3 | 3 | * Consolidated stylesheet for the Knowledge Base Manager |
| 4 | 4 | */ |
| @@ -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; |
| @@ -1411,8 +1479,9 @@ | ||
| 1411 | 1479 | .mxchat-kb-selection-header { |
| 1412 | 1480 | display: flex; |
| 1413 | 1481 | justify-content: space-between; |
| 1414 | 1482 | align-items: center; |
| 1483 | + gap: var(--mxch-spacing-md, 16px); | |
| 1415 | 1484 | padding: 15px 20px; |
| 1416 | 1485 | background-color: #f8f9fa; |
| 1417 | 1486 | border-bottom: 1px solid #eee; |
| 1418 | 1487 | position: sticky; |
| @@ -1434,8 +1503,12 @@ | ||
| 1434 | 1503 | } |
| 1435 | 1504 | |
| 1436 | 1505 | .mxchat-kb-content-list { |
| 1437 | 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; | |
| 1438 | 1511 | } |
| 1439 | 1512 | |
| 1440 | 1513 | .mxchat-kb-content-item { |
| 1441 | 1514 | display: flex; |
| @@ -1464,19 +1537,23 @@ | ||
| 1464 | 1537 | align-items: flex-start; |
| 1465 | 1538 | padding-top: 3px; |
| 1466 | 1539 | } |
| 1467 | 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. */ | |
| 1468 | 1547 | .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 | 1548 | margin: 0; |
| 1549 | + cursor: pointer; | |
| 1550 | + accent-color: var(--mxch-primary, #7873f5); | |
| 1475 | 1551 | } |
| 1476 | 1552 | |
| 1477 | -.mxchat-kb-content-checkbox input[type="checkbox"]:checked { | |
| 1478 | - 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; | |
| 1479 | 1556 | } |
| 1480 | 1557 | |
| 1481 | 1558 | .mxchat-kb-content-details { |
| 1482 | 1559 | flex: 1; |
| @@ -1848,38 +1925,70 @@ | ||
| 1848 | 1925 | |
| 1849 | 1926 | /* Modal responsive adjustments */ |
| 1850 | 1927 | .mxchat-kb-modal-content { |
| 1851 | 1928 | width: 95%; |
| 1852 | - max-height: 90vh; | |
| 1853 | - 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; | |
| 1854 | 1938 | } |
| 1855 | - | |
| 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 | + | |
| 1856 | 1950 | .mxchat-kb-modal-filters { |
| 1857 | 1951 | flex-direction: column; |
| 1858 | 1952 | align-items: stretch; |
| 1953 | + padding: 10px 16px; | |
| 1954 | + gap: 8px; | |
| 1859 | 1955 | } |
| 1860 | - | |
| 1956 | + | |
| 1861 | 1957 | .mxchat-kb-search-group { |
| 1862 | 1958 | max-width: none; |
| 1863 | 1959 | } |
| 1864 | - | |
| 1960 | + | |
| 1865 | 1961 | .mxchat-kb-filter-group { |
| 1866 | 1962 | flex-direction: column; |
| 1963 | + gap: 8px; | |
| 1867 | 1964 | } |
| 1868 | - | |
| 1869 | - .mxchat-kb-content-selection { | |
| 1870 | - max-height: calc(90vh - 250px); | |
| 1965 | + | |
| 1966 | + .mxchat-kb-filter-group select { | |
| 1967 | + padding: 6px 30px 6px 10px; | |
| 1871 | 1968 | } |
| 1872 | - | |
| 1969 | + | |
| 1873 | 1970 | .mxchat-kb-selection-header { |
| 1874 | 1971 | flex-direction: column; |
| 1875 | 1972 | align-items: flex-start; |
| 1876 | - gap: 10px; | |
| 1973 | + gap: 6px; | |
| 1974 | + padding: 10px 16px; | |
| 1877 | 1975 | } |
| 1878 | - | |
| 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 | + | |
| 1879 | 1987 | .mxchat-kb-modal-footer { |
| 1880 | 1988 | flex-direction: column; |
| 1881 | - gap: 10px; | |
| 1989 | + gap: 8px; | |
| 1990 | + padding: 10px 16px; | |
| 1882 | 1991 | } |
| 1883 | 1992 | |
| 1884 | 1993 | .mxchat-kb-modal-footer .mxchat-kb-pagination { |
| 1885 | 1994 | width: 100%; |
| @@ -3749,13 +3858,18 @@ | ||
| 3749 | 3858 | } |
| 3750 | 3859 | |
| 3751 | 3860 | .mxchat-kb-edit-modal-content { |
| 3752 | 3861 | max-width: 760px; |
| 3862 | + /* Same viewport-safe cap as the content-selector modal (vh = fallback). */ | |
| 3753 | 3863 | max-height: 90vh; |
| 3864 | + max-height: min(90vh, calc(100dvh - 24px)); | |
| 3754 | 3865 | } |
| 3755 | 3866 | |
| 3756 | 3867 | .mxchat-kb-edit-body { |
| 3757 | - 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; | |
| 3758 | 3872 | display: flex; |
| 3759 | 3873 | flex-direction: column; |
| 3760 | 3874 | padding: 20px; |
| 3761 | 3875 | overflow: hidden; |
| @@ -3808,8 +3922,10 @@ | ||
| 3808 | 3922 | justify-content: space-between; |
| 3809 | 3923 | padding: 14px 20px; |
| 3810 | 3924 | border-top: 1px solid #e5e5e5; |
| 3811 | 3925 | gap: 12px; |
| 3926 | + /* Action row can never be squeezed out of the box. */ | |
| 3927 | + flex-shrink: 0; | |
| 3812 | 3928 | } |
| 3813 | 3929 | |
| 3814 | 3930 | .mxchat-kb-edit-notice { |
| 3815 | 3931 | flex: 1; |
| @@ -3829,9 +3945,11 @@ | ||
| 3829 | 3945 | match-card / chunk-detail components (admin-testing-tab.css, scoped under |
| 3830 | 3946 | .mxch-testing-results) so it looks native; this block only adds the modal |
| 3831 | 3947 | body scroll + the chunk-text container the Testing tab doesn't have. */ |
| 3832 | 3948 | .mxchat-kb-inspect-body { |
| 3833 | - flex: 1; | |
| 3949 | + flex: 1 1 auto; | |
| 3950 | + /* Same footer-pushout guard as the edit modal. */ | |
| 3951 | + min-height: 0; | |
| 3834 | 3952 | display: flex; |
| 3835 | 3953 | flex-direction: column; |
| 3836 | 3954 | padding: 20px; |
| 3837 | 3955 | overflow-y: auto; |
| @@ -3869,9 +3987,10 @@ | ||
| 3869 | 3987 | .mxchat-kb-edit-modal-content { |
| 3870 | 3988 | width: 96%; |
| 3871 | 3989 | max-width: 96%; |
| 3872 | 3990 | margin: 10px auto; |
| 3873 | - max-height: 95vh; | |
| 3991 | + max-height: calc(100vh - 20px); | |
| 3992 | + max-height: calc(100dvh - 20px); | |
| 3874 | 3993 | } |
| 3875 | 3994 | .mxchat-kb-edit-body { |
| 3876 | 3995 | padding: 14px; |
| 3877 | 3996 | } |
| @@ -3889,105 +4008,227 @@ | ||
| 3889 | 4008 | .mxchat-kb-edit-actions .mxch-btn { |
| 3890 | 4009 | flex: 1; |
| 3891 | 4010 | text-align: center; |
| 3892 | 4011 | } |
| 3893 | -} | |
| 3894 | -/* ========================================================================== | |
| 3895 | - Custom Meta-key discovery picker (plan-mxchat-20260709-fe8e4e) | |
| 3896 | - Canon-token chip picker mirroring the ACF discovery UX for non-ACF meta. | |
| 3897 | - ========================================================================== */ | |
| 3898 | -.mxchat-meta-scan-controls { | |
| 3899 | - display: flex; | |
| 3900 | - align-items: center; | |
| 3901 | - flex-wrap: wrap; | |
| 3902 | - gap: 12px; | |
| 3903 | - margin-bottom: 12px; | |
| 3904 | -} | |
| 3905 | -#mxchat-scan-meta-btn { | |
| 3906 | - display: inline-flex; | |
| 3907 | - align-items: center; | |
| 3908 | - gap: 8px; | |
| 3909 | -} | |
| 3910 | -.mxchat-meta-scan-internal { | |
| 3911 | - display: inline-flex; | |
| 3912 | - align-items: center; | |
| 3913 | - gap: 6px; | |
| 3914 | - font-size: 13px; | |
| 3915 | - color: var(--mxch-text-secondary, #64748b); | |
| 3916 | - cursor: pointer; | |
| 3917 | -} | |
| 3918 | -.mxchat-meta-scan-loading, | |
| 3919 | -.mxchat-meta-scan-empty { | |
| 3920 | - font-size: 13px; | |
| 3921 | - color: var(--mxch-text-secondary, #64748b); | |
| 3922 | - margin: 8px 0 0; | |
| 3923 | -} | |
| 3924 | -.mxchat-meta-chip-grid { | |
| 3925 | - display: grid; | |
| 3926 | - grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); | |
| 3927 | - gap: 10px; | |
| 3928 | - margin-top: 12px; | |
| 3929 | -} | |
| 3930 | -.mxchat-meta-chip { | |
| 3931 | - display: flex; | |
| 3932 | - flex-direction: column; | |
| 3933 | - align-items: flex-start; | |
| 3934 | - gap: 4px; | |
| 3935 | - text-align: left; | |
| 3936 | - width: 100%; | |
| 3937 | - padding: 10px 12px; | |
| 3938 | - background: var(--mxch-card-bg, #fff); | |
| 3939 | - border: 1px solid var(--mxch-card-border, #e2e8f0); | |
| 3940 | - border-radius: var(--mxch-radius-md, 8px); | |
| 3941 | - cursor: pointer; | |
| 3942 | - transition: border-color 0.15s ease, box-shadow 0.15s ease, background 0.15s ease; | |
| 3943 | -} | |
| 3944 | -.mxchat-meta-chip:hover { | |
| 3945 | - border-color: var(--mxch-primary, #7873f5); | |
| 3946 | - box-shadow: 0 1px 4px rgba(120, 115, 245, 0.15); | |
| 3947 | -} | |
| 3948 | -.mxchat-meta-chip-main { | |
| 3949 | - display: flex; | |
| 3950 | - align-items: baseline; | |
| 3951 | - flex-wrap: wrap; | |
| 3952 | - gap: 8px; | |
| 3953 | -} | |
| 3954 | -.mxchat-meta-chip-name { | |
| 3955 | - font-weight: 600; | |
| 3956 | - color: var(--mxch-text-primary, #1a1a2e); | |
| 3957 | - font-size: 13px; | |
| 3958 | -} | |
| 3959 | -.mxchat-meta-chip-key { | |
| 3960 | - font-family: monospace; | |
| 3961 | - font-size: 11px; | |
| 3962 | - color: var(--mxch-text-muted, #94a3b8); | |
| 3963 | - background: #f1f5f9; | |
| 3964 | - padding: 1px 6px; | |
| 3965 | - border-radius: 4px; | |
| 3966 | -} | |
| 3967 | -.mxchat-meta-chip-meta { | |
| 3968 | - font-size: 11px; | |
| 3969 | - color: var(--mxch-text-muted, #94a3b8); | |
| 3970 | - white-space: nowrap; | |
| 3971 | - overflow: hidden; | |
| 3972 | - text-overflow: ellipsis; | |
| 3973 | - max-width: 100%; | |
| 3974 | -} | |
| 3975 | -.mxchat-meta-chip-tick { | |
| 3976 | - font-size: 11px; | |
| 3977 | - font-weight: 600; | |
| 3978 | - color: var(--mxch-primary, #7873f5); | |
| 3979 | - margin-top: 2px; | |
| 3980 | -} | |
| 3981 | -.mxchat-meta-chip.is-added { | |
| 3982 | - border-color: var(--mxch-success, #10b981); | |
| 3983 | - background: rgba(16, 185, 129, 0.06); | |
| 3984 | - cursor: default; | |
| 3985 | -} | |
| 3986 | -.mxchat-meta-chip.is-added .mxchat-meta-chip-tick { | |
| 3987 | - color: var(--mxch-success, #10b981); | |
| 3988 | -} | |
| 3989 | -@media (max-width: 782px) { | |
| 3990 | - .mxchat-meta-chip-grid { | |
| 3991 | - grid-template-columns: 1fr; | |
| 3992 | - } | |
| 3993 | -} | |
| 4012 | +} | |
| 4013 | +/* ========================================================================== | |
| 4014 | + Custom Meta-key discovery picker (plan-mxchat-20260709-fe8e4e) | |
| 4015 | + Canon-token chip picker mirroring the ACF discovery UX for non-ACF meta. | |
| 4016 | + ========================================================================== */ | |
| 4017 | +.mxchat-meta-scan-controls { | |
| 4018 | + display: flex; | |
| 4019 | + align-items: center; | |
| 4020 | + flex-wrap: wrap; | |
| 4021 | + gap: 12px; | |
| 4022 | + margin-bottom: 12px; | |
| 4023 | +} | |
| 4024 | +#mxchat-scan-meta-btn { | |
| 4025 | + display: inline-flex; | |
| 4026 | + align-items: center; | |
| 4027 | + gap: 8px; | |
| 4028 | +} | |
| 4029 | +.mxchat-meta-scan-internal { | |
| 4030 | + display: inline-flex; | |
| 4031 | + align-items: center; | |
| 4032 | + gap: 6px; | |
| 4033 | + font-size: 13px; | |
| 4034 | + color: var(--mxch-text-secondary, #64748b); | |
| 4035 | + cursor: pointer; | |
| 4036 | +} | |
| 4037 | +.mxchat-meta-scan-loading, | |
| 4038 | +.mxchat-meta-scan-empty { | |
| 4039 | + font-size: 13px; | |
| 4040 | + color: var(--mxch-text-secondary, #64748b); | |
| 4041 | + margin: 8px 0 0; | |
| 4042 | +} | |
| 4043 | +.mxchat-meta-chip-grid { | |
| 4044 | + display: grid; | |
| 4045 | + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); | |
| 4046 | + gap: 10px; | |
| 4047 | + margin-top: 12px; | |
| 4048 | +} | |
| 4049 | +.mxchat-meta-chip { | |
| 4050 | + display: flex; | |
| 4051 | + flex-direction: column; | |
| 4052 | + align-items: flex-start; | |
| 4053 | + gap: 4px; | |
| 4054 | + text-align: left; | |
| 4055 | + width: 100%; | |
| 4056 | + padding: 10px 12px; | |
| 4057 | + background: var(--mxch-card-bg, #fff); | |
| 4058 | + border: 1px solid var(--mxch-card-border, #e2e8f0); | |
| 4059 | + border-radius: var(--mxch-radius-md, 8px); | |
| 4060 | + cursor: pointer; | |
| 4061 | + transition: border-color 0.15s ease, box-shadow 0.15s ease, background 0.15s ease; | |
| 4062 | +} | |
| 4063 | +.mxchat-meta-chip:hover { | |
| 4064 | + border-color: var(--mxch-primary, #7873f5); | |
| 4065 | + box-shadow: 0 1px 4px rgba(120, 115, 245, 0.15); | |
| 4066 | +} | |
| 4067 | +.mxchat-meta-chip-main { | |
| 4068 | + display: flex; | |
| 4069 | + align-items: baseline; | |
| 4070 | + flex-wrap: wrap; | |
| 4071 | + gap: 8px; | |
| 4072 | +} | |
| 4073 | +.mxchat-meta-chip-name { | |
| 4074 | + font-weight: 600; | |
| 4075 | + color: var(--mxch-text-primary, #1a1a2e); | |
| 4076 | + font-size: 13px; | |
| 4077 | +} | |
| 4078 | +.mxchat-meta-chip-key { | |
| 4079 | + font-family: monospace; | |
| 4080 | + font-size: 11px; | |
| 4081 | + color: var(--mxch-text-muted, #94a3b8); | |
| 4082 | + background: #f1f5f9; | |
| 4083 | + padding: 1px 6px; | |
| 4084 | + border-radius: 4px; | |
| 4085 | +} | |
| 4086 | +.mxchat-meta-chip-meta { | |
| 4087 | + font-size: 11px; | |
| 4088 | + color: var(--mxch-text-muted, #94a3b8); | |
| 4089 | + white-space: nowrap; | |
| 4090 | + overflow: hidden; | |
| 4091 | + text-overflow: ellipsis; | |
| 4092 | + max-width: 100%; | |
| 4093 | +} | |
| 4094 | +.mxchat-meta-chip-tick { | |
| 4095 | + font-size: 11px; | |
| 4096 | + font-weight: 600; | |
| 4097 | + color: var(--mxch-primary, #7873f5); | |
| 4098 | + margin-top: 2px; | |
| 4099 | +} | |
| 4100 | +.mxchat-meta-chip.is-added { | |
| 4101 | + border-color: var(--mxch-success, #10b981); | |
| 4102 | + background: rgba(16, 185, 129, 0.06); | |
| 4103 | + cursor: default; | |
| 4104 | +} | |
| 4105 | +.mxchat-meta-chip.is-added .mxchat-meta-chip-tick { | |
| 4106 | + color: var(--mxch-success, #10b981); | |
| 4107 | +} | |
| 4108 | +@media (max-width: 782px) { | |
| 4109 | + .mxchat-meta-chip-grid { | |
| 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 | +.mxch-kb-reimport-progress, | |
| 4138 | +.mxch-kb-reimport-error { | |
| 4139 | + margin-top: var(--mxch-spacing-lg); | |
| 4140 | +} | |
| 4141 | +.mxch-kb-reimport-progress .mxch-progress-label { | |
| 4142 | + margin-bottom: 0; | |
| 4143 | +} | |
| 4144 | +.mxch-kb-reimport-results { | |
| 4145 | + margin-top: var(--mxch-spacing-lg); | |
| 4146 | + padding-top: var(--mxch-spacing-lg); | |
| 4147 | + border-top: 1px solid var(--mxch-card-border); | |
| 4148 | +} | |
| 4149 | +.mxch-kb-reimport-done { | |
| 4150 | + margin-bottom: var(--mxch-spacing-md); | |
| 4151 | +} | |
| 4152 | +.mxch-kb-reimport-counts { | |
| 4153 | + display: flex; | |
| 4154 | + flex-wrap: wrap; | |
| 4155 | + gap: var(--mxch-spacing-sm); | |
| 4156 | +} | |
| 4157 | +.mxch-kb-reimport-list { | |
| 4158 | + list-style: none; | |
| 4159 | + margin: var(--mxch-spacing-md) 0 0; | |
| 4160 | + padding: 0; | |
| 4161 | + max-height: 336px; | |
| 4162 | + overflow-y: auto; | |
| 4163 | + border: 1px solid var(--mxch-card-border); | |
| 4164 | + border-radius: var(--mxch-radius-md); | |
| 4165 | +} | |
| 4166 | +.mxch-kb-reimport-list li { | |
| 4167 | + display: flex; | |
| 4168 | + align-items: center; | |
| 4169 | + justify-content: space-between; | |
| 4170 | + gap: var(--mxch-spacing-md); | |
| 4171 | + margin: 0; | |
| 4172 | + padding: var(--mxch-spacing-sm) var(--mxch-spacing-md); | |
| 4173 | + border-top: 1px solid var(--mxch-card-border); | |
| 4174 | + font-size: 13px; | |
| 4175 | + line-height: 1.5; | |
| 4176 | +} | |
| 4177 | +.mxch-kb-reimport-list li:first-child { | |
| 4178 | + border-top: 0; | |
| 4179 | +} | |
| 4180 | +.mxch-kb-reimport-source { | |
| 4181 | + min-width: 0; | |
| 4182 | + overflow-wrap: anywhere; | |
| 4183 | + color: var(--mxch-text-primary); | |
| 4184 | +} | |
| 4185 | +.mxch-kb-reimport-note { | |
| 4186 | + display: block; | |
| 4187 | + font-size: 12px; | |
| 4188 | + color: var(--mxch-text-secondary); | |
| 4189 | +} | |
| 4190 | +.mxch-kb-reimport-reasons { | |
| 4191 | + display: flex; | |
| 4192 | + flex-wrap: wrap; | |
| 4193 | + justify-content: flex-end; | |
| 4194 | + gap: var(--mxch-spacing-xs); | |
| 4195 | + flex-shrink: 0; | |
| 4196 | +} | |
| 4197 | +.mxch-kb-reimport-notes { | |
| 4198 | + margin-top: var(--mxch-spacing-sm); | |
| 4199 | + border: 0; | |
| 4200 | + border-radius: 0; | |
| 4201 | +} | |
| 4202 | +.mxch-kb-reimport-notes li { | |
| 4203 | + padding-left: 0; | |
| 4204 | + padding-right: 0; | |
| 4205 | +} | |
| 4206 | +.mxch-kb-reimport-footer { | |
| 4207 | + display: flex; | |
| 4208 | + align-items: center; | |
| 4209 | + flex-wrap: wrap; | |
| 4210 | + gap: var(--mxch-spacing-sm) var(--mxch-spacing-md); | |
| 4211 | +} | |
| 4212 | +.mxch-kb-reimport-footer .mxch-field-hint { | |
| 4213 | + margin-top: 0; | |
| 4214 | +} | |
| 4215 | +@media (max-width: 600px) { | |
| 4216 | + .mxch-kb-reimport-controls .mxch-field { | |
| 4217 | + flex-basis: 100%; | |
| 4218 | + } | |
| 4219 | + .mxch-kb-reimport-controls .mxch-btn { | |
| 4220 | + width: 100%; | |
| 4221 | + justify-content: center; | |
| 4222 | + } | |
| 4223 | + .mxch-kb-reimport-list li { | |
| 4224 | + flex-direction: column; | |
| 4225 | + align-items: flex-start; | |
| 4226 | + gap: var(--mxch-spacing-xs); | |
| 4227 | + } | |
| 4228 | + .mxch-kb-reimport-reasons { | |
| 4229 | + justify-content: flex-start; | |
| 4230 | + } | |
| 4231 | + .mxch-kb-reimport-list { | |
| 4232 | + max-height: 480px; | |
| 4233 | + } | |
| 4234 | +} | |