| @@ -118,8 +118,36 @@ | ||
| 118 | 118 | .os-chromeless .woocommerce-layout__header { |
| 119 | 119 | width: 100% !important; |
| 120 | 120 | } |
| 121 | 121 | |
| 122 | +/* | |
| 123 | + * MailPoet top-bar overlap fix. | |
| 124 | + * | |
| 125 | + * MailPoet mounts a 64px-tall brand bar on its screens as | |
| 126 | + * `.wrap .mailpoet-top-bar { position: absolute; top: 0 }` — | |
| 127 | + * anchored to `#wpbody` (core's `position: relative`), overlaying | |
| 128 | + * whatever the page's first 64px contain. In classic admin nothing | |
| 129 | + * is visibly covered only by accident of geometry: the in-flow | |
| 130 | + * space above `.wrap` — the `#screen-meta-links` row plus `.wrap`'s | |
| 131 | + * own top margin — happens to add up to more than the bar's height, | |
| 132 | + * so the content starts below it (measured: `.wrap` at y=114 vs | |
| 133 | + * bar bottom at y=96). | |
| 134 | + * | |
| 135 | + * Chromeless collapses exactly that space on purpose — screen-meta | |
| 136 | + * links are hidden (the window title bar owns those buttons) and | |
| 137 | + * `.wrap` margins are trimmed — which slides MailPoet's content up | |
| 138 | + * underneath the overlaid bar. Symptom: the page's heading sits | |
| 139 | + * half-hidden behind the white logo bar inside the window. | |
| 140 | + * | |
| 141 | + * Reserve the bar's height in flow instead. `:has()` scopes the | |
| 142 | + * rule to precisely the pages that render the in-wrap bar — | |
| 143 | + * whatever MailPoet screen shape it is, present or future — and to | |
| 144 | + * nothing else. | |
| 145 | + */ | |
| 146 | +.os-chromeless .wrap:has( .mailpoet-top-bar ) { | |
| 147 | + padding-top: 64px; | |
| 148 | +} | |
| 149 | + | |
| 122 | 150 | /* --------------------------------------------------------------- |
| 123 | 151 | * Screen Meta (Screen Options / Help panels) |
| 124 | 152 | * The toggle buttons (#screen-meta-links) are hidden because |
| 125 | 153 | * the parent desktop shell adds its own buttons to the window |
| @@ -215,8 +243,34 @@ | ||
| 215 | 243 | .os-chromeless.themes-php .wrap > .page-title-action { |
| 216 | 244 | display: none; |
| 217 | 245 | } |
| 218 | 246 | |
| 247 | +/* | |
| 248 | + * Core offsets every title action by `top: -3px` (common.css) so it | |
| 249 | + * sits on the H1's baseline. Chromeless hides the H1, and the first | |
| 250 | + * thing in the frame has nothing above it to overlap: the offset | |
| 251 | + * pulls the button's top border under the window's content edge and | |
| 252 | + * it renders cropped. The offset has no baseline left to meet here, | |
| 253 | + * so drop it. | |
| 254 | + * | |
| 255 | + * The margins are the same 12px the rule above gives a lone button, | |
| 256 | + * applied to whatever element a plugin grouped its buttons in. On a | |
| 257 | + * Jetpack site that is `div.wpcom-media-library-action-buttons` | |
| 258 | + * (external-media moves core's "Add Media File" into it so it can | |
| 259 | + * append "Import Media"; Big Sky adds "Generate Image" beside them), | |
| 260 | + * and a group is not a `.page-title-action`, so it picks up neither | |
| 261 | + * the margin nor the block layout and lands flush against the top. | |
| 262 | + * `:has()` reaches the group whatever a plugin decided to call it. | |
| 263 | + */ | |
| 264 | +.os-chromeless .wrap .page-title-action { | |
| 265 | + top: 0; | |
| 266 | +} | |
| 267 | + | |
| 268 | +.os-chromeless .wrap :has( > .page-title-action ) { | |
| 269 | + margin-top: 12px; | |
| 270 | + margin-bottom: 12px; | |
| 271 | +} | |
| 272 | + | |
| 219 | 273 | /* --------------------------------------------------------------- |
| 220 | 274 | * WooCommerce "embed page" header overlay — page-scoped. |
| 221 | 275 | * |
| 222 | 276 | * Background: WC renders TWO layouts simultaneously on "connected" |
| @@ -314,8 +368,85 @@ | ||
| 314 | 368 | width: auto; |
| 315 | 369 | } |
| 316 | 370 | |
| 317 | 371 | /* --------------------------------------------------------------- |
| 372 | + * Metabox screens — the one-column breakpoint is 160px too early. | |
| 373 | + * | |
| 374 | + * Core collapses every `#poststuff` two-column screen (the classic | |
| 375 | + * post editor, any CPT editor, a WooCommerce order) to one column | |
| 376 | + * at `max-width: 850px`. That number is a VIEWPORT width, and it is | |
| 377 | + * sized for a viewport that still has the 160px admin menu in it: | |
| 378 | + * at 851px core leaves roughly 650px of usable content — less than | |
| 379 | + * the 763px the two columns actually need (`#post-body-content`'s | |
| 380 | + * 463px floor plus the 300px sidebar reservation), which is why | |
| 381 | + * core's own two-column layout scrolls sideways just above the | |
| 382 | + * breakpoint. | |
| 383 | + * | |
| 384 | + * A chromeless iframe hides the admin menu, so the same 851px gives | |
| 385 | + * 835px of content — comfortably two columns — and core stacks it | |
| 386 | + * anyway. The sidebar then lands BELOW the editor, and since the | |
| 387 | + * classic editor grows to fit its text, a long post pushes Publish, | |
| 388 | + * Categories, Tags and Featured image thousands of pixels down the | |
| 389 | + * page. The user's word for that is "vanished". | |
| 390 | + * | |
| 391 | + * Same shape as the WooCommerce header fix at the top of this file: | |
| 392 | + * the page reserved space for a sidebar we removed, so reclaim the | |
| 393 | + * reservation. Two columns stay until the content really stops | |
| 394 | + * fitting: 763px of content, plus the 16px `#wpbody-content` gutter | |
| 395 | + * above, plus up to 17px for a classic vertical scrollbar — which a | |
| 396 | + * media query does NOT subtract from the width it matches on, the | |
| 397 | + * same reason `100vw` overflows a scrolling page. That is 796px. | |
| 398 | + * Below it, core's one-column layout is correct and stays. | |
| 399 | + * | |
| 400 | + * The reservation is written flow-relative rather than as core's | |
| 401 | + * `margin-right` / `float: right`, because core ships the mirrored | |
| 402 | + * values in a separate `edit-rtl.css` and this file has no RTL | |
| 403 | + * build — one logical declaration lands on the correct side in | |
| 404 | + * both directions. `float: right` stays ahead of `float: | |
| 405 | + * inline-end` as the fallback. | |
| 406 | + * | |
| 407 | + * Attachments keep core's own, wider, 1200px breakpoint: the media | |
| 408 | + * editor's sidebar carries the whole attachment form and needs the | |
| 409 | + * room. `.post-type-attachment` is excluded rather than re-stacked | |
| 410 | + * so that rule keeps working untouched. | |
| 411 | + * | |
| 412 | + * Verifying: open a post with a few thousand words in a window | |
| 413 | + * ~800px wide. Publish/Categories/Tags sit beside the editor, not | |
| 414 | + * under it, and the page has no horizontal scrollbar. | |
| 415 | + * --------------------------------------------------------------- */ | |
| 416 | +@media only screen and ( min-width: 796px ) and ( max-width: 850px ) { | |
| 417 | + .os-chromeless:not( .post-type-attachment ) #wpbody-content #poststuff #post-body.columns-2 { | |
| 418 | + margin-inline-end: 300px; | |
| 419 | + } | |
| 420 | + | |
| 421 | + .os-chromeless:not( .post-type-attachment ) #wpbody-content #post-body.columns-2 #postbox-container-1 { | |
| 422 | + float: right; | |
| 423 | + float: inline-end; | |
| 424 | + margin-inline-end: -300px; | |
| 425 | + width: 280px; | |
| 426 | + } | |
| 427 | + | |
| 428 | + .os-chromeless:not( .post-type-attachment ) #poststuff #post-body.columns-2 #side-sortables { | |
| 429 | + min-height: 250px; | |
| 430 | + width: 280px; | |
| 431 | + } | |
| 432 | + | |
| 433 | + /* | |
| 434 | + * Core hides the Layout radios with the two-column layout. They | |
| 435 | + * are the way back to one column, so they come back with it. | |
| 436 | + * | |
| 437 | + * `edit.css` is part of the `wp-admin` bundle and loads on every | |
| 438 | + * screen, so that hide reaches the Dashboard's own 1-4 column | |
| 439 | + * radios too. Only un-hide them where this block actually gave a | |
| 440 | + * layout back. | |
| 441 | + */ | |
| 442 | + .os-chromeless:not( .post-type-attachment ):has( #post-body.columns-2 ) .screen-layout, | |
| 443 | + .os-chromeless:not( .post-type-attachment ):has( #post-body.columns-2 ) .columns-prefs { | |
| 444 | + display: block; | |
| 445 | + } | |
| 446 | +} | |
| 447 | + | |
| 448 | +/* --------------------------------------------------------------- | |
| 318 | 449 | * Block Editor — hide Gutenberg chrome that would break the window. |
| 319 | 450 | * |
| 320 | 451 | * The fullscreen-mode close button (the "W" logo top-left of the editor) |
| 321 | 452 | * is an <a href="/wp-admin/edit.php"> that navigates the iframe to a |
| @@ -492,8 +623,27 @@ | ||
| 492 | 623 | display: none !important; |
| 493 | 624 | } |
| 494 | 625 | |
| 495 | 626 | /* --------------------------------------------------------------- |
| 627 | + * A file drag over a native upload box. | |
| 628 | + * | |
| 629 | + * The chromeless bridge hands an OS-file drop to Core's own | |
| 630 | + * `<input type="file">` when it lands on one, or anywhere on the | |
| 631 | + * `form.wp-upload-form` box around it (Upload Plugin, Upload | |
| 632 | + * Theme), and stamps `data-os-file-drop-active` on that box while | |
| 633 | + * the drag is over it. Outside the shell the box gives no sign it | |
| 634 | + * will take a drop; inside, the shell used to take the file | |
| 635 | + * instead, so people learned it would not. Say so while it can. | |
| 636 | + * | |
| 637 | + * Core's own admin colour, read the way common.css reads it, not | |
| 638 | + * the station's: this is a wp-admin control on a wp-admin page. | |
| 639 | + * --------------------------------------------------------------- */ | |
| 640 | +.os-chromeless [data-os-file-drop-active] { | |
| 641 | + outline: 2px dashed var( --wp-admin-theme-color, #3858e9 ); | |
| 642 | + outline-offset: -2px; | |
| 643 | +} | |
| 644 | + | |
| 645 | +/* --------------------------------------------------------------- | |
| 496 | 646 | * Appearance → Themes workspace |
| 497 | 647 | * |
| 498 | 648 | * Core's one-theme state renders the Theme Details dialog inline and |
| 499 | 649 | * removes its header. Inside a short desktop window that leaves a large, |
| @@ -506,9 +656,9 @@ | ||
| 506 | 656 | * scoped to the chromeless Themes screen; the classic wp-admin page keeps |
| 507 | 657 | * Core's own presentation and the shell's palette cannot leak in here. |
| 508 | 658 | * --------------------------------------------------------------- */ |
| 509 | 659 | .os-chromeless.themes-php #wpbody-content { |
| 510 | - padding: 16px; | |
| 660 | + padding: 10px 16px; | |
| 511 | 661 | background: #f6f7f7; |
| 512 | 662 | } |
| 513 | 663 | |
| 514 | 664 | .os-chromeless.themes-php .openstation-themes-intro { |
| @@ -514,11 +664,11 @@ | ||
| 514 | 664 | .os-chromeless.themes-php .openstation-themes-intro { |
| 515 | 665 | display: flex; |
| 516 | 666 | align-items: center; |
| 517 | 667 | justify-content: space-between; |
| 518 | - gap: 32px; | |
| 519 | - margin: 0 0 16px; | |
| 520 | - padding: 20px 24px; | |
| 668 | + gap: 24px; | |
| 669 | + margin: 0 0 8px; | |
| 670 | + padding: 14px 18px; | |
| 521 | 671 | background: #fff; |
| 522 | 672 | border: 1px solid #dcdcde; |
| 523 | 673 | border-radius: 12px; |
| 524 | 674 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); |
| @@ -549,9 +699,9 @@ | ||
| 549 | 699 | } |
| 550 | 700 | |
| 551 | 701 | .os-chromeless.themes-php .openstation-themes-intro__copy > p:last-child { |
| 552 | 702 | max-width: 650px; |
| 553 | - margin: 8px 0 0; | |
| 703 | + margin: 6px 0 0; | |
| 554 | 704 | color: #50575e; |
| 555 | 705 | font-size: 13px; |
| 556 | 706 | line-height: 1.45; |
| 557 | 707 | } |
| @@ -560,9 +710,9 @@ | ||
| 560 | 710 | display: grid; |
| 561 | 711 | flex: 0 0 auto; |
| 562 | 712 | min-width: 104px; |
| 563 | 713 | margin: 0; |
| 564 | - padding: 12px 16px; | |
| 714 | + padding: 10px 14px; | |
| 565 | 715 | background: #f6f7f7; |
| 566 | 716 | border: 1px solid #dcdcde; |
| 567 | 717 | border-radius: 9px; |
| 568 | 718 | box-sizing: border-box; |
| @@ -570,9 +720,9 @@ | ||
| 570 | 720 | } |
| 571 | 721 | |
| 572 | 722 | .os-chromeless.themes-php .openstation-themes-intro__count strong { |
| 573 | 723 | color: #1d2327; |
| 574 | - font-size: 24px; | |
| 724 | + font-size: 22px; | |
| 575 | 725 | font-weight: 650; |
| 576 | 726 | letter-spacing: -0.03em; |
| 577 | 727 | line-height: 1; |
| 578 | 728 | } |
| @@ -805,14 +955,10 @@ | ||
| 805 | 955 | .theme-overlay.active |
| 806 | 956 | .theme-wrap { |
| 807 | 957 | display: grid; |
| 808 | 958 | grid-template-columns: minmax(320px, 0.95fr) minmax(300px, 1.05fr); |
| 809 | - grid-template-rows: minmax(0, auto) auto; | |
| 810 | - grid-template-areas: | |
| 811 | - "screenshot info" | |
| 812 | - "screenshot actions"; | |
| 813 | - column-gap: 28px; | |
| 814 | - row-gap: 14px; | |
| 959 | + grid-template-areas: "screenshot details"; | |
| 960 | + column-gap: 24px; | |
| 815 | 961 | align-items: start; |
| 816 | 962 | position: relative; |
| 817 | 963 | top: auto; |
| 818 | 964 | right: auto; |
| @@ -818,9 +964,9 @@ | ||
| 818 | 964 | right: auto; |
| 819 | 965 | bottom: auto; |
| 820 | 966 | left: auto; |
| 821 | 967 | min-height: 0; |
| 822 | - padding: 20px; | |
| 968 | + padding: 12px 16px; | |
| 823 | 969 | background: #fff; |
| 824 | 970 | border: 1px solid #c3c4c7; |
| 825 | 971 | border-radius: 12px; |
| 826 | 972 | box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); |
| @@ -860,12 +1006,13 @@ | ||
| 860 | 1006 | .os-chromeless.themes-php |
| 861 | 1007 | .themes.single-theme |
| 862 | 1008 | .theme-overlay.active |
| 863 | 1009 | .theme-info { |
| 864 | - grid-area: info; | |
| 1010 | + grid-area: details; | |
| 1011 | + align-self: start; | |
| 865 | 1012 | float: none; |
| 866 | 1013 | width: auto; |
| 867 | - max-height: 300px; | |
| 1014 | + max-height: 240px; | |
| 868 | 1015 | padding: 2px 10px 2px 0; |
| 869 | 1016 | overflow: auto; |
| 870 | 1017 | scrollbar-gutter: stable; |
| 871 | 1018 | } |
| @@ -961,10 +1108,11 @@ | ||
| 961 | 1108 | .themes.single-theme |
| 962 | 1109 | .theme-overlay.active |
| 963 | 1110 | .theme-actions { |
| 964 | 1111 | display: flex; |
| 965 | - grid-area: actions; | |
| 1112 | + grid-area: details; | |
| 966 | 1113 | align-items: center; |
| 1114 | + align-self: end; | |
| 967 | 1115 | justify-content: flex-start; |
| 968 | 1116 | position: static; |
| 969 | 1117 | padding: 14px 0 0; |
| 970 | 1118 | background: transparent; |
| @@ -975,9 +1123,9 @@ | ||
| 975 | 1123 | .os-chromeless.themes-php |
| 976 | 1124 | .themes.single-theme |
| 977 | 1125 | .theme-overlay.active |
| 978 | 1126 | .theme-actions |
| 979 | - > div { | |
| 1127 | + .active-theme { | |
| 980 | 1128 | display: flex; |
| 981 | 1129 | flex-wrap: wrap; |
| 982 | 1130 | gap: 7px; |
| 983 | 1131 | } |
| @@ -985,8 +1133,16 @@ | ||
| 985 | 1133 | .os-chromeless.themes-php |
| 986 | 1134 | .themes.single-theme |
| 987 | 1135 | .theme-overlay.active |
| 988 | 1136 | .theme-actions |
| 1137 | + .inactive-theme { | |
| 1138 | + display: none; | |
| 1139 | +} | |
| 1140 | + | |
| 1141 | +.os-chromeless.themes-php | |
| 1142 | + .themes.single-theme | |
| 1143 | + .theme-overlay.active | |
| 1144 | + .theme-actions | |
| 989 | 1145 | .button { |
| 990 | 1146 | margin: 0; |
| 991 | 1147 | } |
| 992 | 1148 | |
| @@ -1020,11 +1176,19 @@ | ||
| 1020 | 1176 | .os-chromeless.themes-php |
| 1021 | 1177 | .themes.single-theme |
| 1022 | 1178 | .theme-overlay.active |
| 1023 | 1179 | .theme-info { |
| 1180 | + grid-area: info; | |
| 1024 | 1181 | max-height: none; |
| 1025 | 1182 | padding-right: 0; |
| 1026 | 1183 | overflow: visible; |
| 1184 | + } | |
| 1185 | + | |
| 1186 | + .os-chromeless.themes-php | |
| 1187 | + .themes.single-theme | |
| 1188 | + .theme-overlay.active | |
| 1189 | + .theme-actions { | |
| 1190 | + grid-area: actions; | |
| 1027 | 1191 | } |
| 1028 | 1192 | |
| 1029 | 1193 | .os-chromeless.themes-php .theme-overlay.active .theme-wrap { |
| 1030 | 1194 | top: 10px; |