PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.11
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.11
1.1.11 1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 All 35 releases
← All changes | assets/css/chromeless.css +220 -22 1.1.1 → 1.1.11 View file →
@@ -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
@@ -380,15 +511,35 @@
380 511 background: transparent;
381 512 }
382 513
383 514 /*
384 - * `boot-layout__surfaces` is the white card the React app draws its
385 - * content onto. In classic admin it sits on the dark #wpwrap with
515 + * The surfaces wrapper is the white card the React app draws its
516 + * content onto. In classic admin it sits on the dark layout with
386 517 * rounded corners and a margin that makes it read as a "card." Inside
387 - * a desktop window the surface IS the content — rounded corners and
388 - * side margins leave ugly bleed at the edges. Collapse it to a plain
518 + * a desktop window the surface IS the content, so that frame is just
519 + * bleed at the right and bottom edges. Collapse it to a plain
389 520 * edge-to-edge surface.
521 + *
522 + * Core builds these class names with CSS modules, so only the
523 + * `__<local-name>` suffix is stable; the hash in front of it changes
524 + * with every Core build. Match on the suffix, scoped to the boot
525 + * container. The bare `boot-layout__*` names are the pre-CSS-modules
526 + * spelling, kept for Core builds that still ship it.
527 + *
528 + * The container is not a tight enough scope on its own. The page a
529 + * boot screen routes to mounts INSIDE the layout, and a plugin page
530 + * built with CSS modules gives its own elements the same
531 + * `<hash>__<name>` shape: Jetpack's Stats v2 dashboard lays its
532 + * widgets out in a `…__layout` grid, and the `min-height: 100vh` meant
533 + * for Core's layout element stretched that grid to the window and
534 + * spread the dashboard's rows across it, with the widgets pushed
535 + * out of sight. Everything a page renders lives inside admin-ui's
536 + * navigable region, so exclude that subtree: these rules only ever
537 + * touch Core's own frame around the page, never the page.
390 538 */
539 +.os-chromeless .boot-layout-container [class*='__surfaces']:not( .admin-ui-navigable-region * ),
540 +.os-chromeless .boot-layout-container [class*='__stage']:not( .admin-ui-navigable-region * ),
541 +.os-chromeless .boot-layout-container [class*='__canvas']:not( .admin-ui-navigable-region * ),
391 542 .os-chromeless .boot-layout__surfaces,
392 543 .os-chromeless .boot-layout__stage,
393 544 .os-chromeless .boot-layout__canvas {
394 545 border-radius: 0 !important;
@@ -395,8 +546,22 @@
395 546 margin: 0 !important;
396 547 }
397 548
398 549 /*
550 + * The layout element is absolutely positioned inside a zero-height
551 + * `#wpbody`, so `top: 0; bottom: 0` resolve to nothing and its
552 + * `min-height: calc( 100vh - <admin bar> )` is what it actually gets.
553 + * A chromeless iframe has no admin bar, so that reservation shows up
554 + * as a dark band along the bottom of the window. Take the full
555 + * viewport back. Same navigable-region guard as above: the page's
556 + * own `…__layout` elements keep their height.
557 + */
558 +.os-chromeless .boot-layout-container [class*='__layout']:not( .admin-ui-navigable-region * ),
559 +.os-chromeless .boot-layout {
560 + min-height: 100vh !important;
561 +}
562 +
563 +/*
399 564 * The boot screens render their own H1 (`.boot-navigation-screen__title`,
400 565 * e.g., "Fonts") at the top of the surface. The desktop window already
401 566 * shows the page title in its title bar, so the in-page title is
402 567 * redundant. Visually hide it but keep it in the DOM for screen readers
@@ -492,8 +657,27 @@
492 657 display: none !important;
493 658 }
494 659
495 660 /* ---------------------------------------------------------------
661 + * A file drag over a native upload box.
662 + *
663 + * The chromeless bridge hands an OS-file drop to Core's own
664 + * `<input type="file">` when it lands on one, or anywhere on the
665 + * `form.wp-upload-form` box around it (Upload Plugin, Upload
666 + * Theme), and stamps `data-os-file-drop-active` on that box while
667 + * the drag is over it. Outside the shell the box gives no sign it
668 + * will take a drop; inside, the shell used to take the file
669 + * instead, so people learned it would not. Say so while it can.
670 + *
671 + * Core's own admin colour, read the way common.css reads it, not
672 + * the station's: this is a wp-admin control on a wp-admin page.
673 + * --------------------------------------------------------------- */
674 +.os-chromeless [data-os-file-drop-active] {
675 + outline: 2px dashed var( --wp-admin-theme-color, #3858e9 );
676 + outline-offset: -2px;
677 +}
678 +
679 +/* ---------------------------------------------------------------
496 680 * Appearance → Themes workspace
497 681 *
498 682 * Core's one-theme state renders the Theme Details dialog inline and
499 683 * removes its header. Inside a short desktop window that leaves a large,
@@ -506,9 +690,9 @@
506 690 * scoped to the chromeless Themes screen; the classic wp-admin page keeps
507 691 * Core's own presentation and the shell's palette cannot leak in here.
508 692 * --------------------------------------------------------------- */
509 693 .os-chromeless.themes-php #wpbody-content {
510 - padding: 16px;
694 + padding: 10px 16px;
511 695 background: #f6f7f7;
512 696 }
513 697
514 698 .os-chromeless.themes-php .openstation-themes-intro {
@@ -514,11 +698,11 @@
514 698 .os-chromeless.themes-php .openstation-themes-intro {
515 699 display: flex;
516 700 align-items: center;
517 701 justify-content: space-between;
518 - gap: 32px;
519 - margin: 0 0 16px;
520 - padding: 20px 24px;
702 + gap: 24px;
703 + margin: 0 0 8px;
704 + padding: 14px 18px;
521 705 background: #fff;
522 706 border: 1px solid #dcdcde;
523 707 border-radius: 12px;
524 708 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
@@ -549,9 +733,9 @@
549 733 }
550 734
551 735 .os-chromeless.themes-php .openstation-themes-intro__copy > p:last-child {
552 736 max-width: 650px;
553 - margin: 8px 0 0;
737 + margin: 6px 0 0;
554 738 color: #50575e;
555 739 font-size: 13px;
556 740 line-height: 1.45;
557 741 }
@@ -560,9 +744,9 @@
560 744 display: grid;
561 745 flex: 0 0 auto;
562 746 min-width: 104px;
563 747 margin: 0;
564 - padding: 12px 16px;
748 + padding: 10px 14px;
565 749 background: #f6f7f7;
566 750 border: 1px solid #dcdcde;
567 751 border-radius: 9px;
568 752 box-sizing: border-box;
@@ -570,9 +754,9 @@
570 754 }
571 755
572 756 .os-chromeless.themes-php .openstation-themes-intro__count strong {
573 757 color: #1d2327;
574 - font-size: 24px;
758 + font-size: 22px;
575 759 font-weight: 650;
576 760 letter-spacing: -0.03em;
577 761 line-height: 1;
578 762 }
@@ -805,14 +989,10 @@
805 989 .theme-overlay.active
806 990 .theme-wrap {
807 991 display: grid;
808 992 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;
993 + grid-template-areas: "screenshot details";
994 + column-gap: 24px;
815 995 align-items: start;
816 996 position: relative;
817 997 top: auto;
818 998 right: auto;
@@ -818,9 +998,9 @@
818 998 right: auto;
819 999 bottom: auto;
820 1000 left: auto;
821 1001 min-height: 0;
822 - padding: 20px;
1002 + padding: 12px 16px;
823 1003 background: #fff;
824 1004 border: 1px solid #c3c4c7;
825 1005 border-radius: 12px;
826 1006 box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
@@ -860,12 +1040,13 @@
860 1040 .os-chromeless.themes-php
861 1041 .themes.single-theme
862 1042 .theme-overlay.active
863 1043 .theme-info {
864 - grid-area: info;
1044 + grid-area: details;
1045 + align-self: start;
865 1046 float: none;
866 1047 width: auto;
867 - max-height: 300px;
1048 + max-height: 240px;
868 1049 padding: 2px 10px 2px 0;
869 1050 overflow: auto;
870 1051 scrollbar-gutter: stable;
871 1052 }
@@ -961,10 +1142,11 @@
961 1142 .themes.single-theme
962 1143 .theme-overlay.active
963 1144 .theme-actions {
964 1145 display: flex;
965 - grid-area: actions;
1146 + grid-area: details;
966 1147 align-items: center;
1148 + align-self: end;
967 1149 justify-content: flex-start;
968 1150 position: static;
969 1151 padding: 14px 0 0;
970 1152 background: transparent;
@@ -975,9 +1157,9 @@
975 1157 .os-chromeless.themes-php
976 1158 .themes.single-theme
977 1159 .theme-overlay.active
978 1160 .theme-actions
979 - > div {
1161 + .active-theme {
980 1162 display: flex;
981 1163 flex-wrap: wrap;
982 1164 gap: 7px;
983 1165 }
@@ -985,8 +1167,16 @@
985 1167 .os-chromeless.themes-php
986 1168 .themes.single-theme
987 1169 .theme-overlay.active
988 1170 .theme-actions
1171 + .inactive-theme {
1172 + display: none;
1173 +}
1174 +
1175 +.os-chromeless.themes-php
1176 + .themes.single-theme
1177 + .theme-overlay.active
1178 + .theme-actions
989 1179 .button {
990 1180 margin: 0;
991 1181 }
992 1182
@@ -1020,11 +1210,19 @@
1020 1210 .os-chromeless.themes-php
1021 1211 .themes.single-theme
1022 1212 .theme-overlay.active
1023 1213 .theme-info {
1214 + grid-area: info;
1024 1215 max-height: none;
1025 1216 padding-right: 0;
1026 1217 overflow: visible;
1218 + }
1219 +
1220 + .os-chromeless.themes-php
1221 + .themes.single-theme
1222 + .theme-overlay.active
1223 + .theme-actions {
1224 + grid-area: actions;
1027 1225 }
1028 1226
1029 1227 .os-chromeless.themes-php .theme-overlay.active .theme-wrap {
1030 1228 top: 10px;