# desktop-mode/1.1.7/assets/css/workspaces.css

OpenStation: Desktop Windows, Dock &amp; Virtual Desktops for WP Admin, version 1.1.7. 337 lines.

- Page: https://pluginprobe.com/plugins/desktop-mode/1.1.7/code/assets/css/workspaces.css
- Raw: https://pluginprobe.com/plugins/desktop-mode/1.1.7/raw/assets/css/workspaces.css
- Modified: 2026-09-04T15:30:56+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/desktop-mode/1.1.7/code/assets/css/workspaces.css#L10-L20`.

```css
/*
 * Workspaces — the wizard.
 *
 * The workspace ACTIONS are not here: Restore and Edit are controls
 * under the overview tiles and are styled with the rest of that bar in
 * `window-overview.css`. That is deliberate and worth stating, because
 * the obvious alternative — a picker floating at the corner of the
 * desk — is the wrong shape. Overview is already the Spaces surface,
 * and the desk belongs to the user's windows, not to shell chrome
 * hovering over them.
 *
 * `<os-modal>` draws the dialog surface and owns the scrim, the focus
 * trap and Escape; `<os-steps>`, `<os-card>`, `<os-swatch-grid>` and
 * the fields draw themselves. Everything here is the body's own
 * stacking — where the trail sits, how the pane scrolls, how the
 * footer splits its buttons.
 */

.os-workspace-wizard__body {
	display: flex;
	flex-direction: column;
	gap: 16px;
}

/*
 * The trail reads left-to-right across the top and never wraps: a
 * wizard whose header reflows between steps looks like a different
 * dialog every time. Six steps at the modal's `lg` width fit with
 * room; a plugin that adds none can never make it seven.
 */
.os-workspace-wizard__trail {
	--os-ui-steps-gap: 10px;
	--os-ui-step-gap: 7px;
	--os-ui-step-chip-size: 22px;
	--os-ui-step-chip-font-size: 11px;
	--os-ui-step-chip-family: var( --os-ui-font-mono, ui-monospace, monospace );
	--os-ui-step-title-size: 11px;
	--os-ui-step-title-family: var( --os-ui-font-mono, ui-monospace, monospace );
	--os-ui-step-title-transform: uppercase;
	--os-ui-step-title-spacing: 0.08em;
	padding-bottom: 12px;
	border-bottom: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.14 ) );
	white-space: nowrap;
	overflow-x: auto;
}

/*
 * A step you have not reached is an outline, not a filled dot. Six
 * filled chips in a row made the trail the loudest thing in a dialog
 * whose whole point is that step one and Enter is enough, and they
 * carried no state either: current, done and not-yet all looked the
 * same, so only the label weight said where you were. The lit chip has
 * to be the only one lit for it to mean anything.
 *
 * Same treatment as the agent wizard's trail, through the component's
 * own theming hooks. The host elements are in this light DOM, so the
 * per-state overrides can select them directly.
 */
.os-workspace-wizard__trail os-step:not( [ done ] ):not( [ current ] ) {
	--os-ui-step-chip-bg: transparent;
	--os-ui-step-chip-border: 1px solid var( --os-ui-border-strong, #8c8f94 );
	--os-ui-step-chip-fg: var( --os-ui-fg-muted, #646970 );
}

/* Done is quiet: a filled tick, muted like its label. History, not a
   second highlight. */
.os-workspace-wizard__trail os-step[ done ] {
	--os-ui-step-chip-done-bg: var( --os-ui-surface-elevated, #f0f0f1 );
	--os-ui-step-chip-fg: var( --os-ui-fg-muted, #646970 );
}

/*
 * The pane has ONE height and keeps it. A wizard that grew and shrank
 * with each step moved its own footer under the user's pointer between
 * clicks — Next in one place, then Next somewhere else. The tallest
 * step (Apps on a site with forty plugins) scrolls inside it.
 *
 * Sized to the steps that have something in them, not to the tallest
 * one. Three of the six are a heading and a single switch until that
 * switch is turned on, and at the old height they were about 45%
 * empty: far enough past "roomy" that the dialog read as one that
 * had failed to load. Room is cheaper than a jumping button; this much
 * room was not buying anything.
 *
 * The remaining gap on those three steps is a content problem rather
 * than a height one. The fix worth having is a preview of the desk
 * being described, which would fill the space and answer "what am I
 * actually choosing" on Look and Windows at the same time.
 *
 * The pane scrolls, the dialog does not. A Save button below the fold
 * is a Save button the user cannot find.
 */
.os-workspace-wizard__pane {
	display: flex;
	flex-direction: column;
	gap: 14px;
	height: min( 52vh, 320px );
	overflow-y: auto;
	/* The pane scrolls DOWN and only down. A child that wants to be
	   wider than the dialog is a bug in the child, and a horizontal
	   scrollbar under a wizard is a worse symptom than a clipped
	   edge — it reads as the whole dialog being broken. */
	overflow-x: hidden;
	/*
	 * Room for the rings. A selected chip's ring sits 4px OUTSIDE its
	 * box, and a focused field's bloom further still; a clipping pane
	 * with 2px of padding cut the leading edge off both. The inline
	 * padding pays for the ring and the matching negative margin gives
	 * the width back, so the pane's content still lines up with the
	 * dialog's own edges — the room is inside the clip, not inside the
	 * layout.
	 */
	padding: 6px 8px 8px;
	margin-inline: -8px;
}

/*
 * Every child is boxed to the pane. `min-width: 0` is the part that
 * matters: a flex item's minimum is its content width by default, so
 * a grid or a long label could push past the dialog edge instead of
 * wrapping or shrinking.
 */
.os-workspace-wizard__pane > * {
	min-width: 0;
	max-width: 100%;
	box-sizing: border-box;
}

.os-workspace-wizard__pane > os-swatch-grid,
.os-workspace-wizard__pickers > os-swatch-grid {
	width: 100%;
}

.os-workspace-wizard__heading {
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.os-workspace-wizard__title {
	margin: 0;
	font-size: 16px;
	font-weight: 600;
	line-height: 1.3;
	color: var( --os-ui-fg, #fffbff );
}

/*
 * A label and the control it names. The pane's gap is the step
 * between fields; inside one, label and control are a pair.
 */
.os-workspace-wizard__field {
	display: flex;
	flex-direction: column;
	gap: 6px;
}

.os-workspace-wizard__label {
	font-size: 12px;
	font-weight: 500;
	color: var( --os-ui-fg-muted, rgba( 255, 251, 255, 0.66 ) );
}

.os-workspace-wizard__hint {
	margin: 0;
	color: var( --os-ui-fg-muted, rgba( 255, 251, 255, 0.66 ) );
	font-size: 12px;
	line-height: 1.5;
}

/* --- Start: the cards ---------------------------------------- */

.os-workspace-wizard__card {
	--os-ui-card-gap: 6px;
	min-height: 96px;
	cursor: pointer;
}

.os-workspace-wizard__card-header {
	display: flex;
	align-items: center;
	gap: 10px;
	font-size: 14px;
}

/*
 * One tone for every card's glyph. These used to wear the preset's own
 * colour, which is the product's hex rather than ours, so the step
 * opened on a purple cart, a green cap and a red pen: three brands and
 * none of them the station's. The desk's colour still shows where it
 * is useful, on its overview tile.
 */
.os-workspace-wizard__card-icon {
	flex: 0 0 auto;
	color: var( --os-ui-fg-muted, rgba( 255, 251, 255, 0.66 ) );
}

/* The chosen card lights its glyph, so the eye lands on the answer. */
.os-workspace-wizard__card[ selected ] .os-workspace-wizard__card-icon {
	color: var( --os-ui-accent, #f252fc );
}

.os-workspace-wizard__card-desc {
	color: var( --os-ui-fg-muted, rgba( 255, 251, 255, 0.66 ) );
	font-size: 12px;
	line-height: 1.45;
}

/* --- Name: glyph and colour ---------------------------------- */

/*
 * Glyph swatches are the kit's 28px accent chips (`size="small"
 * variant="accent"`, in a `mode="row"` grid) painted transparent, with
 * a slotted icon; the swatch's own selected ring is what marks the
 * choice. The slot is anchored for overlays, so the icon only has to
 * fill and centre.
 */
.os-workspace-wizard__icon-swatch os-icon {
	position: absolute;
	inset: 0;
	/* The component sizes its host to the glyph (16px), and `inset: 0`
	   on a 16px box pins it to the top-left corner rather than
	   stretching it. Own the box, then let the component's own flex
	   centring put the glyph in the middle of it. */
	width: 100%;
	height: 100%;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var( --os-ui-fg, #fffbff );
	pointer-events: none;
}

/* --- Apps / Widgets: the checklist ---------------------------- */

/*
 * The list scrolls inside the pane's own scroll, capped so the mode
 * switch above it stays in view while the user ticks boxes below.
 */
.os-workspace-wizard__list {
	display: flex;
	flex-direction: column;
	gap: 2px;
	max-height: 260px;
	overflow-y: auto;
	padding: 4px;
	border: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.14 ) );
	border-radius: 8px;
}

/* --- Look: the pickers ----------------------------------------- */

.os-workspace-wizard__pickers {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

/*
 * The wallpaper's name, on its tile. The swatch's wallpaper variant
 * slots content at the bottom-left; this is the same caption the
 * Preferences grid paints, at the same weight, so the same wallpaper
 * looks the same in both places. Above the live-preview overlay
 * (z-index 0) so it stays readable over a moving canvas.
 */
.os-workspace-wizard__swatch-label {
	display: inline-block;
	position: relative;
	z-index: 1;
	max-width: 100%;
	padding: 2px 7px;
	font-size: 11px;
	font-weight: 500;
	line-height: 1.4;
	color: var( --os-ui-fg-on-accent, #fff );
	background: var( --os-ui-scrim, rgba( 0, 0, 0, 0.45 ) );
	border-radius: 6px;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	pointer-events: none;
}

/*
 * A canvas wallpaper's live preview, mounted into the tile by the
 * same manager Preferences uses. Declared here rather than borrowed
 * from `os-settings.css`, which is a deferred sheet the wizard cannot
 * assume is loaded.
 */
.os-workspace-wizard .os-settings__wallpaper-live-preview {
	position: absolute;
	inset: 0;
	z-index: 0;
	overflow: hidden;
	pointer-events: none;
	border-radius: 10px;
}

.os-workspace-wizard .os-settings__wallpaper-live-preview canvas {
	display: block;
	width: 100%;
	height: 100%;
}

/* --- Windows: chips and actions -------------------------------- */

.os-workspace-wizard__chips {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
}

.os-workspace-wizard__actions {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

/* --- Footer ---------------------------------------------------- */

/*
 * Delete leads and everything else is pushed to the trailing edge —
 * the destructive action sits apart from the pair the user is
 * actually choosing between. The spacer is what does the pushing, so
 * a footer with no Delete still lays out the same.
 */
.os-workspace-wizard__footer {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
}

.os-workspace-wizard__spacer {
	flex: 1 1 auto;
}

```
