PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.10
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.10
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 0.8.7 All 34 releases
← All changes | assets/css/window-overview.css +267 -10 1.0.01.1.10 View file →
@@ -117,8 +117,27 @@
117 117 opacity 0.22s ease;
118 118 }
119 119
120 120 /*
121 + * The escape hatch for the rule above, and the reason it lives here
122 + * rather than in `dock.css`: this is the only place `.os-dock` is
123 + * given a transition, so it is the only place worth looking when one
124 + * fires where it should not.
125 + *
126 + * The properties above are geometry, and geometry also changes for a
127 + * reason that is not a state change: moving the dock to another edge
128 + * tears the rail down and builds a new one on the SAME element, which
129 + * still carries the previous placement's padding and width. Animated,
130 + * the new dock slides out of the old one's shape — it arrives a size
131 + * too big and settles. `Dock`'s constructor wears this class while it
132 + * commits the placement, so that change lands with nothing to tween
133 + * from.
134 + */
135 +.os-dock--no-transition {
136 + transition: none !important;
137 +}
138 +
139 +/*
121 140 * Collapse EVERY dock (bottom + side rails, Classic / Unified /
122 141 * Spatial layouts alike) when overview is active.
123 142 *
124 143 * The placement-specific width rules in dock.css —
@@ -164,9 +183,9 @@
164 183 * Desktop shortcut icons & files-layer tiles —
165 184 * hidden during overview so they don't compete with window
166 185 * thumbnails or overlap them (especially noticeable with few
167 186 * windows or Spatial layout). Matches the fade-out pattern
168 - * used by widgets and sticky notes. Scoped to DIRECT children
187 + * used by widgets and pinned notes. Scoped to DIRECT children
169 188 * of the desktop area only: folder windows mount their own
170 189 * files layer inside the window body, and that must stay
171 190 * visible in its thumbnail.
172 191 */
@@ -308,8 +327,12 @@
308 327 top: 16px;
309 328 left: 50%;
310 329 transform: translateX( -50% );
311 330 z-index: 2;
331 + display: flex;
332 + flex-direction: column;
333 + align-items: center;
334 + gap: 10px;
312 335 opacity: 0;
313 336 pointer-events: none;
314 337 transition:
315 338 opacity 0.22s ease 0.06s,
@@ -315,8 +338,52 @@
315 338 opacity 0.22s ease 0.06s,
316 339 transform 0.28s cubic-bezier( 0.2, 0, 0.2, 1 ) 0.06s;
317 340 }
318 341
342 +/* The row above the desktop tiles — the site switcher on a network,
343 + * where every site is its own OpenStation with its own desks. Its own
344 + * panel, so the switcher reads as the thing the tiles hang under, not
345 + * as one more tile. `OVERVIEW_TOP_BAR_HEADER_RESERVE` in
346 + * `overview-constants.ts` is this row's height plus the gap. */
347 +.os-overview-top-bar__header {
348 + display: flex;
349 + align-items: center;
350 + justify-content: center;
351 + padding: 6px 8px;
352 + border-radius: 14px;
353 + background-color: var( --os-ui-scrim, rgba( 0, 0, 0, 0.32 ) );
354 + backdrop-filter: blur( 18px ) saturate( 140% );
355 + -webkit-backdrop-filter: blur( 18px ) saturate( 140% );
356 + box-shadow:
357 + 0 8px 28px rgba( 0, 0, 0, 0.35 ),
358 + inset 0 0 0 1px rgba( 255, 255, 255, 0.08 );
359 + max-width: min( 92vw, 960px );
360 + overflow-x: auto;
361 +}
362 +
363 +/* An install that joined from elsewhere wears a mark before its name,
364 + * and one line stands before the first of them, so the row says which
365 + * sites are this network's own and which are external. Both are light
366 + * DOM the switcher writes into the segment; its button is out of
367 + * reach behind the shadow root. */
368 +.os-site-switcher__divider {
369 + flex: none;
370 + align-self: stretch;
371 + width: 1px;
372 + margin: 5px 3px;
373 + background-color: var( --os-ui-border-strong, #c3c4c7 );
374 +}
375 +
376 +.os-site-switcher__mark.dashicons {
377 + font-size: 14px;
378 + width: 14px;
379 + height: 14px;
380 + line-height: 14px;
381 + margin-right: 5px;
382 + vertical-align: -2px;
383 + opacity: 0.75;
384 +}
385 +
319 386 .os-area--overview .os-overview-top-bar {
320 387 opacity: 1;
321 388 pointer-events: auto;
322 389 }
@@ -364,10 +431,17 @@
364 431 font: inherit;
365 432 }
366 433
367 434 .os-overview-top-bar__tile:hover {
435 + background: rgba( 255, 255, 255, 0.08 );
436 +}
437 +
438 +/*
439 + * Excluded because `:hover` (0,2,0) outranks `--active` (0,1,0) — an
440 + * unguarded hover border replaces the active tile's accent ring.
441 + */
442 +.os-overview-top-bar__tile:hover:not( .os-overview-top-bar__tile--active ) {
368 443 border-color: rgba( 255, 255, 255, 0.4 );
369 - background: rgba( 255, 255, 255, 0.08 );
370 444 }
371 445
372 446 .os-overview-top-bar__tile:focus-visible {
373 447 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
@@ -398,8 +472,41 @@
398 472 color: rgba( 255, 255, 255, 0.7 );
399 473 letter-spacing: 0.02em;
400 474 }
401 475
476 +/*
477 + * A workspace's identity on its overview tile — the glyph and the
478 + * accent it wears on the switcher pill. Overview is where desks are
479 + * compared, and a row of identical grey tiles is exactly where "which
480 + * one was the shop?" gets asked. A plain Space carries neither, so
481 + * these rules simply never match for one.
482 + */
483 +.os-overview-top-bar__tile-glyph {
484 + width: 24px;
485 + height: 24px;
486 + margin-inline-end: 6px;
487 + font-size: 24px;
488 + line-height: 24px;
489 + color: var( --os-workspace-accent, rgba( 255, 255, 255, 0.7 ) );
490 +}
491 +
492 +.os-overview-top-bar__tile--tinted {
493 + border-color: color-mix(
494 + in srgb,
495 + var( --os-workspace-accent, #f252fc ) 60%,
496 + transparent
497 + );
498 +}
499 +
500 +/*
501 + * The active ring still wins: a tinted tile says which workspace it
502 + * is, the ring says which one you are on, and the second question is
503 + * the one overview is open to answer.
504 + */
505 +.os-overview-top-bar__tile--tinted.os-overview-top-bar__tile--active {
506 + border-color: var( --wp-admin-theme-color, #2271b1 );
507 +}
508 +
402 509 .os-overview-top-bar__tile-label {
403 510 display: block;
404 511 padding: 6px 10px 8px;
405 512 text-align: center;
@@ -410,17 +517,35 @@
410 517 overflow: hidden;
411 518 text-overflow: ellipsis;
412 519 }
413 520
521 +/*
522 + * The tile, plus whatever hangs off it.
523 + *
524 + * A column so the Restore button can sit BELOW the tile rather than
525 + * over its preview — the preview is the tile's picture of the desk,
526 + * and a control laid across it covers the one thing the tile is for.
527 + * `position: relative` stays for the rename / close corner buttons,
528 + * which are still positioned against the wrapper.
529 + *
530 + * The tile keeps its content height (no `flex` on it), so when the
531 + * list stretches every wrapper to the tallest, a desk with no Restore
532 + * simply has empty space under its tile instead of a taller tile —
533 + * every tile box stays the same size and on the same line.
534 + */
414 535 .os-overview-top-bar__tile-wrapper {
415 536 position: relative;
416 - display: inline-block;
537 + display: inline-flex;
538 + flex-direction: column;
539 + gap: 6px;
417 540 }
418 541
419 -.os-overview-top-bar__tile-close {
542 +/* Tile corner buttons: edit on the leading edge, close on the
543 + * trailing one, otherwise identical. */
544 +.os-overview-top-bar__tile-close,
545 +.os-overview-top-bar__tile-edit {
420 546 position: absolute;
421 547 top: 4px;
422 - inset-inline-end: 4px;
423 548 width: 18px;
424 549 height: 18px;
425 550 display: flex;
426 551 align-items: center;
@@ -437,13 +562,23 @@
437 562 border: none;
438 563 padding: 0;
439 564 }
440 565
441 -.os-overview-top-bar__tile-wrapper:hover
442 - .os-overview-top-bar__tile-close,
443 -.os-overview-top-bar__tile-wrapper:focus-within
444 - .os-overview-top-bar__tile-close,
445 -.os-overview-top-bar__tile-close:focus-visible {
566 +.os-overview-top-bar__tile-edit {
567 + inset-inline-start: 4px;
568 +}
569 +
570 +.os-overview-top-bar__tile-close {
571 + inset-inline-end: 4px;
572 +}
573 +
574 +.os-overview-top-bar__tile-wrapper:is( :hover, :focus-within )
575 + :is(
576 + .os-overview-top-bar__tile-close,
577 + .os-overview-top-bar__tile-edit
578 + ),
579 +.os-overview-top-bar__tile-close:focus-visible,
580 +.os-overview-top-bar__tile-edit:focus-visible {
446 581 opacity: 1;
447 582 }
448 583
449 584 .os-overview-top-bar__tile-close:hover {
@@ -451,8 +586,100 @@
451 586 color: var( --os-ui-fg-on-accent, #fff );
452 587 }
453 588
454 589 /*
590 + * The desk's actions — a column below the tile, separated by the
591 + * wrapper's gap. Not over the preview: the preview is the tile's
592 + * picture of the desk, and a bar laid across it covers the one thing
593 + * the tile is there to show. Not the corners either — edit and close
594 + * have those — and Restore needs a word, because no glyph says
595 + * "rebuild this desk".
596 + *
597 + * **Restore** is always visible, but only painted on a desk with
598 + * something to restore, so its absence is information. Once any desk
599 + * on the bar can restore, every column reserves the row, so every
600 + * tile box stays on the same line.
601 + */
602 +.os-overview-top-bar__tile-actions {
603 + display: flex;
604 + flex-direction: column;
605 + gap: 4px;
606 +}
607 +
608 +/* One 22px row, once some desk on the bar can restore. */
609 +.os-overview-top-bar__list--restorable .os-overview-top-bar__tile-actions {
610 + min-height: 22px;
611 +}
612 +
613 +.os-overview-top-bar__tile-action {
614 + display: flex;
615 + align-items: center;
616 + justify-content: center;
617 + gap: 5px;
618 + height: 22px;
619 + padding: 0 8px;
620 + border: 1px solid rgba( 255, 255, 255, 0.14 );
621 + border-radius: 8px;
622 + background: var( --os-ui-scrim, rgba( 0, 0, 0, 0.42 ) );
623 + color: rgba( 255, 255, 255, 0.78 );
624 + font: inherit;
625 + font-size: 10px;
626 + font-weight: 600;
627 + letter-spacing: 0.04em;
628 + text-transform: uppercase;
629 + cursor: pointer;
630 + transition:
631 + opacity 0.15s ease,
632 + background-color 0.15s ease,
633 + border-color 0.15s ease,
634 + color 0.15s ease;
635 +}
636 +
637 +.os-overview-top-bar__tile-action svg {
638 + width: 12px;
639 + height: 12px;
640 + flex: 0 0 auto;
641 +}
642 +
643 +.os-overview-top-bar__tile-action:hover {
644 + background: var( --os-ui-accent, #f252fc );
645 + border-color: var( --os-ui-accent, #f252fc );
646 + color: var( --os-ui-accent-ink, var( --os-ui-fg-on-accent, #fff ) );
647 +}
648 +
649 +.os-overview-top-bar__tile-action:focus-visible {
650 + outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
651 + outline-offset: 2px;
652 +}
653 +
654 +@media ( prefers-reduced-motion: reduce ) {
655 + .os-overview-top-bar__tile-action {
656 + transition: none;
657 + }
658 +}
659 +
660 +.os-overview-top-bar__tile-edit:hover {
661 + background: var( --os-ui-accent, #f252fc );
662 + color: var( --os-ui-accent-ink, var( --os-ui-fg-on-accent, #fff ) );
663 +}
664 +
665 +/*
666 + * The label while it is being edited. Neutral hairline, not the
667 + * accent: the active tile already wears an accent ring, and a second
668 + * one reads as a rendering fault. `outline: none` is safe — the
669 + * element is only editable while focused, so its treatment IS the
670 + * focus indicator.
671 + */
672 +.os-overview-top-bar__tile-label[contenteditable] {
673 + outline: none;
674 + cursor: text;
675 + background: rgba( 0, 0, 0, 0.55 );
676 + border-radius: 6px;
677 + box-shadow: inset 0 0 0 1px rgba( 255, 255, 255, 0.28 );
678 +}
679 +
680 +
681 +/*
455 682 * Hide the close X when there's only one tile left — the tile
456 683 * list contains both desktop wrappers AND the trailing "+".
457 684 * So "only one desktop" means exactly one wrapper in the list.
458 685 */
@@ -462,12 +689,42 @@
462 689 .os-overview-top-bar__tile-close {
463 690 display: none;
464 691 }
465 692
693 +/*
694 + * The "+" is the place another desk goes, so it is the size of one.
695 + * It sits in the same wrapper a desk does, above an empty actions
696 + * block, which is what keeps the dashed box level with the tiles
697 + * instead of stretching over the buttons underneath them.
698 + */
466 699 .os-overview-top-bar__tile--add {
467 700 width: 60px;
468 701 background: transparent;
469 702 border-style: dashed;
703 +}
704 +
705 +/*
706 + * The slot's own preview band: no gradient and no rule under it, since
707 + * there is nothing to preview. It keeps the band's height, which is
708 + * half of what makes the dashed box a tile tall.
709 + */
710 +.os-overview-top-bar__tile--add .os-overview-top-bar__tile-preview {
711 + background: none;
712 + /* Transparent, not removed. The rule is 1px of the tile's height,
713 + and dropping it left the slot a pixel short of its neighbours. */
714 + border-bottom-color: transparent;
715 +}
716 +
717 +/*
718 + * The glyph centres in the whole slot, not in the preview band it
719 + * happens to sit in. The two rows are there to make the box a tile
720 + * tall; a desk splits them into a picture and a name, and the slot has
721 + * neither, so its one mark belongs in the middle of the box. Taking it
722 + * out of flow is what lets the rows still do the measuring.
723 + */
724 +.os-overview-top-bar__tile--add .os-overview-top-bar__tile-plus {
725 + position: absolute;
726 + inset: 0;
470 727 }
471 728
472 729 .os-overview-top-bar__tile--add:hover {
473 730 background: rgba( 255, 255, 255, 0.08 );