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 +247 -9 1.1.01.1.10 View file →
@@ -327,8 +327,12 @@
327 327 top: 16px;
328 328 left: 50%;
329 329 transform: translateX( -50% );
330 330 z-index: 2;
331 + display: flex;
332 + flex-direction: column;
333 + align-items: center;
334 + gap: 10px;
331 335 opacity: 0;
332 336 pointer-events: none;
333 337 transition:
334 338 opacity 0.22s ease 0.06s,
@@ -334,8 +338,52 @@
334 338 opacity 0.22s ease 0.06s,
335 339 transform 0.28s cubic-bezier( 0.2, 0, 0.2, 1 ) 0.06s;
336 340 }
337 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 +
338 386 .os-area--overview .os-overview-top-bar {
339 387 opacity: 1;
340 388 pointer-events: auto;
341 389 }
@@ -383,10 +431,17 @@
383 431 font: inherit;
384 432 }
385 433
386 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 ) {
387 443 border-color: rgba( 255, 255, 255, 0.4 );
388 - background: rgba( 255, 255, 255, 0.08 );
389 444 }
390 445
391 446 .os-overview-top-bar__tile:focus-visible {
392 447 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
@@ -417,8 +472,41 @@
417 472 color: rgba( 255, 255, 255, 0.7 );
418 473 letter-spacing: 0.02em;
419 474 }
420 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 +
421 509 .os-overview-top-bar__tile-label {
422 510 display: block;
423 511 padding: 6px 10px 8px;
424 512 text-align: center;
@@ -429,17 +517,35 @@
429 517 overflow: hidden;
430 518 text-overflow: ellipsis;
431 519 }
432 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 + */
433 535 .os-overview-top-bar__tile-wrapper {
434 536 position: relative;
435 - display: inline-block;
537 + display: inline-flex;
538 + flex-direction: column;
539 + gap: 6px;
436 540 }
437 541
438 -.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 {
439 546 position: absolute;
440 547 top: 4px;
441 - inset-inline-end: 4px;
442 548 width: 18px;
443 549 height: 18px;
444 550 display: flex;
445 551 align-items: center;
@@ -456,13 +562,23 @@
456 562 border: none;
457 563 padding: 0;
458 564 }
459 565
460 -.os-overview-top-bar__tile-wrapper:hover
461 - .os-overview-top-bar__tile-close,
462 -.os-overview-top-bar__tile-wrapper:focus-within
463 - .os-overview-top-bar__tile-close,
464 -.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 {
465 581 opacity: 1;
466 582 }
467 583
468 584 .os-overview-top-bar__tile-close:hover {
@@ -470,8 +586,100 @@
470 586 color: var( --os-ui-fg-on-accent, #fff );
471 587 }
472 588
473 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 +/*
474 682 * Hide the close X when there's only one tile left — the tile
475 683 * list contains both desktop wrappers AND the trailing "+".
476 684 * So "only one desktop" means exactly one wrapper in the list.
477 685 */
@@ -481,12 +689,42 @@
481 689 .os-overview-top-bar__tile-close {
482 690 display: none;
483 691 }
484 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 + */
485 699 .os-overview-top-bar__tile--add {
486 700 width: 60px;
487 701 background: transparent;
488 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;
489 727 }
490 728
491 729 .os-overview-top-bar__tile--add:hover {
492 730 background: rgba( 255, 255, 255, 0.08 );