PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.12
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.12
1.1.12 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 All 36 releases
← All changes | assets/css/ai-assistant.css +277 -277 0.9.8 → 1.1.12 View file →
@@ -1,26 +1,36 @@
1 1 /**
2 - * Desktop Mode — AI Assistant spotlight overlay.
2 + * OpenStation — AI Assistant spotlight overlay.
3 3 *
4 4 * A system-level command palette that floats above the entire shell,
5 5 * including the WP admin bar. Visually modeled on macOS Spotlight and
6 6 * Linear's command menu — frosted-glass backdrop, spring-physics panel
7 - * entrance, large search input, accent-tinted header.
7 + * entrance, large search input.
8 8 *
9 - * z-index 10000 puts this above --desktop-mode-z-adminbar (9991) so the
9 + * ## How much accent the chrome shows
10 + *
11 + * Every accent-derived surface below (the header tint and its mark, the
12 + * search icon, a selected or hovered row, the icon tiles) mixes the
13 + * accent by --os-ai-accent towards a neutral. Unset that is 100%, the
14 + * accent-tinted panel this has always been; the OpenStation palette
15 + * answers 0% and lifts rows and tiles with --os-ai-row-fill and
16 + * --os-ai-tile-fill instead. The command icons themselves are not part
17 + * of it: they read the accent directly, in every palette.
18 + *
19 + * z-index 10000 puts this above --os-z-adminbar (9991) so the
10 20 * overlay truly covers the full viewport.
11 21 *
12 22 * ## Desktop-theme awareness
13 23 *
14 24 * The overlay mounts on `document.body`, so it sits inside the
15 - * `body.desktop-mode-desktop-theme-<slug>` half of a compiled theme's
16 - * doubled selector and every `--wpd-*` token below resolves against the
17 - * active theme. Each site reads `var( --wpd-x, <the literal that was
25 + * `body.os-desktop-theme-<slug>` half of a compiled theme's
26 + * doubled selector and every `--os-ui-*` token below resolves against the
27 + * active theme. Each site reads `var( --os-ui-x, <the literal that was
18 28 * always there> )`, so an unthemed shell paints exactly as before.
19 29 *
20 30 * Getting this half-right is worse than not doing it at all: when the
21 31 * text tones followed the theme but the panel stayed hardcoded white,
22 - * a dark theme's light `--wpd-fg` landed on white and the results were
32 + * a dark theme's light `--os-ui-fg` landed on white and the results were
23 33 * unreadable. Any new surface added here MUST take its background,
24 34 * border and text from the palette — not from a literal.
25 35 */
26 36
@@ -27,9 +37,9 @@
27 37 /* ---------------------------------------------------------------------------
28 38 * Root overlay — full viewport, fades in/out
29 39 * ------------------------------------------------------------------------- */
30 40
31 -.desktop-mode-ai {
41 +.os-ai {
32 42 position: fixed;
33 43 inset: 0;
34 44 z-index: 10000;
35 45
@@ -50,13 +60,13 @@
50 60 }
51 61
52 62 /* [hidden] keeps the element out of the a11y tree between sessions.
53 63 Only removed while the overlay is visually visible (open or animating). */
54 -.desktop-mode-ai[hidden] {
64 +.os-ai[hidden] {
55 65 display: none;
56 66 }
57 67
58 -.desktop-mode-ai.is-open {
68 +.os-ai.is-open {
59 69 opacity: 1;
60 70 pointer-events: auto;
61 71 }
62 72
@@ -63,17 +73,17 @@
63 73 /* ---------------------------------------------------------------------------
64 74 * Backdrop — frosted glass
65 75 * ------------------------------------------------------------------------- */
66 76
67 -.desktop-mode-ai__backdrop {
77 +.os-ai__backdrop {
68 78 position: absolute;
69 79 inset: 0;
70 - background-color: var( --wpd-scrim, rgba( 0, 0, 0, 0.36 ) );
80 + background-color: var( --os-ui-scrim, rgba( 0, 0, 0, 0.36 ) );
71 81 /* Desktop-theme SCRIM texture slot: unset resolves to none. */
72 - background-image: var( --wpd-scrim-image, none );
73 - background-repeat: var( --wpd-scrim-image-repeat, repeat );
74 - background-size: var( --wpd-scrim-image-size, auto );
75 - background-position: var( --wpd-scrim-image-position, center );
82 + background-image: var( --os-ui-scrim-image, none );
83 + background-repeat: var( --os-ui-scrim-image-repeat, repeat );
84 + background-size: var( --os-ui-scrim-image-size, auto );
85 + background-position: var( --os-ui-scrim-image-position, center );
76 86 backdrop-filter: blur( 8px ) saturate( 0.75 );
77 87 -webkit-backdrop-filter: blur( 8px ) saturate( 0.75 );
78 88 /* Non-interactive: clicks in the dimmed area fall through to the overlay
79 89 container, which closes the assistant (click-outside-to-dismiss). */
@@ -83,9 +93,9 @@
83 93 /* ---------------------------------------------------------------------------
84 94 * Panel — the visible card
85 95 * ------------------------------------------------------------------------- */
86 96
87 -.desktop-mode-ai__panel {
97 +.os-ai__panel {
88 98 position: relative; /* sits above the backdrop */
89 99 width: 100%;
90 100 max-width: 600px;
91 101
@@ -91,17 +101,18 @@
91 101
92 102 /* Longhand on purpose: the DIALOG texture slot below owns
93 103 background-image, and the shorthand would reset it. */
94 104 background-color: var(
95 - --desktop-mode-ai-panel-bg,
96 - var( --wpd-surface, rgba( 255, 255, 255, 0.97 ) )
105 + --os-ai-panel-bg,
106 + var( --os-ui-surface, rgba( 255, 255, 255, 0.97 ) )
97 107 );
98 108 /* Desktop-theme DIALOG texture slot: unset resolves to none. */
99 - background-image: var( --wpd-dialog-bg-image, none );
100 - background-repeat: var( --wpd-dialog-bg-image-repeat, repeat );
101 - background-size: var( --wpd-dialog-bg-image-size, auto );
102 - background-position: var( --wpd-dialog-bg-image-position, center );
103 - color: var( --wpd-fg, #1d2327 );
109 + background-image: var( --os-ui-dialog-bg-image, none );
110 + background-repeat: var( --os-ui-dialog-bg-image-repeat, repeat );
111 + background-size: var( --os-ui-dialog-bg-image-size, auto );
112 + background-position: var( --os-ui-dialog-bg-image-position, center );
113 + color: var( --os-ui-fg, #1d2327 );
114 + font-family: var( --os-ui-font, inherit );
104 115 border-radius: 16px;
105 116 overflow: hidden;
106 117
107 118 /* Tight under-shadow + wide atmospheric shadow. The hairline ring
@@ -108,9 +119,9 @@
108 119 is the panel's only edge, so it follows the palette; the two
109 120 atmospheric shadows stay black because they read as depth
110 121 against the wallpaper, not as part of the surface. */
111 122 box-shadow:
112 - 0 0 0 1px var( --wpd-border, rgba( 0, 0, 0, 0.07 ) ),
123 + 0 0 0 1px var( --os-ui-border, rgba( 0, 0, 0, 0.07 ) ),
113 124 0 4px 16px rgba( 0, 0, 0, 0.12 ),
114 125 0 24px 64px rgba( 0, 0, 0, 0.22 );
115 126
116 127 /* Spring-physics entrance: starts slightly small + shifted up,
@@ -119,65 +130,24 @@
119 130 transition: transform 0.28s cubic-bezier( 0.34, 1.56, 0.64, 1 );
120 131 will-change: transform;
121 132 }
122 133
123 -.desktop-mode-ai.is-open .desktop-mode-ai__panel {
134 +.os-ai.is-open .os-ai__panel {
124 135 transform: scale( 1 ) translateY( 0 );
125 136 }
126 137
127 -/* ---------------------------------------------------------------------------
128 - * Header — accent-tinted identity strip
129 - * ------------------------------------------------------------------------- */
130 -
131 -.desktop-mode-ai__header {
132 - display: flex;
133 - align-items: center;
134 - gap: 8px;
135 - padding: 10px 14px;
136 - /* Gradient fades from a very faint accent tint to white — visible
137 - on fresh/blue schemes, subtle on light schemes. */
138 - background: linear-gradient(
139 - to bottom,
140 - color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, var( --wpd-surface, #fff ) ),
141 - var( --wpd-surface, #fff )
142 - );
143 - border-bottom: 1px solid var( --wpd-border, rgba( 0, 0, 0, 0.06 ) );
144 -}
145 -
146 -.desktop-mode-ai__header-icon {
147 - display: flex;
148 - align-items: center;
149 - color: var( --wp-admin-theme-color, #2271b1 );
150 - /* Glow so the sparkle feels alive on dark or saturated themes */
151 - filter: drop-shadow(
152 - 0 0 5px color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 55%, transparent )
153 - );
154 -}
155 -
156 -.desktop-mode-ai__header-label {
157 - flex: 1;
158 - font-size: 11px;
159 - font-weight: 700;
160 - letter-spacing: 0.09em;
161 - text-transform: uppercase;
162 - color: var( --wp-admin-theme-color, #2271b1 );
163 -}
164 -
165 -/* Mode switch (Commands ↔ AI) — a small segmented pill in the header.
166 - Shown only when AI is available; replaces the `/` shortcut. */
167 -.desktop-mode-ai__modes {
138 +/* Mode switch (Commands ↔ AI) — a small segmented pill at the end of
139 + the input row. Always shown; replaces the `/` shortcut. */
140 +.os-ai__modes {
141 + flex-shrink: 0;
168 142 display: inline-flex;
169 143 gap: 2px;
170 144 padding: 2px;
171 145 border-radius: 999px;
172 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.05 ) );
146 + background: var( --os-ui-hover, rgba( 0, 0, 0, 0.05 ) );
173 147 }
174 148
175 -.desktop-mode-ai__modes[hidden] {
176 - display: none;
177 -}
178 -
179 -.desktop-mode-ai__mode {
149 +.os-ai__mode {
180 150 appearance: none;
181 151 border: 0;
182 152 cursor: pointer;
183 153 padding: 3px 12px;
@@ -182,40 +152,38 @@
182 152 cursor: pointer;
183 153 padding: 3px 12px;
184 154 border-radius: 999px;
185 155 background: transparent;
186 - color: var( --wpd-fg-muted, #50575e );
156 + color: var( --os-ui-fg-muted, #50575e );
187 157 font-size: 11px;
188 158 font-weight: 600;
189 159 line-height: 1.6;
190 160 }
191 161
192 -.desktop-mode-ai__mode:hover {
193 - color: var( --wpd-fg, #1d2327 );
162 +.os-ai__mode:hover {
163 + color: var( --os-ui-fg, #1d2327 );
194 164 }
195 165
196 -.desktop-mode-ai__mode.is-active {
197 - /* Elevated first: the pill sits ON the header, which is already
198 - `--wpd-surface`, so a theme that distinguishes the two keeps the
166 +.os-ai__mode.is-active {
167 + /* Elevated first: the pill sits ON the panel, which is already
168 + `--os-ui-surface`, so a theme that distinguishes the two keeps the
199 169 active segment readable. Falls through to plain surface, which is
200 170 the default look. */
201 - background: var( --wpd-surface-elevated, var( --wpd-surface, #fff ) );
171 + background: var( --os-ui-surface-elevated, var( --os-ui-surface, #fff ) );
202 172 color: var( --wp-admin-theme-color, #2271b1 );
203 173 box-shadow: 0 1px 2px rgba( 0, 0, 0, 0.12 );
204 174 }
205 175
206 -.desktop-mode-ai__mode:focus-visible {
176 +.os-ai__mode:focus-visible {
207 177 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
208 178 outline-offset: 1px;
209 179 }
210 180
211 -/* .desktop-mode-ai__close styles moved to the bottom results section */
212 -
213 181 /* ---------------------------------------------------------------------------
214 182 * Input row — the main interaction surface
215 183 * ------------------------------------------------------------------------- */
216 184
217 -.desktop-mode-ai__input-wrap {
185 +.os-ai__input-wrap {
218 186 display: flex;
219 187 align-items: center;
220 188 gap: 10px;
221 189 padding: 14px 16px;
@@ -223,25 +191,33 @@
223 191 border-bottom: 1px solid transparent;
224 192 transition: border-color 0.15s ease;
225 193 }
226 194
227 -.desktop-mode-ai__input-wrap:has( .desktop-mode-ai__input:focus ) {
228 - border-bottom-color: var( --wpd-border, rgba( 0, 0, 0, 0.06 ) );
195 +.os-ai__input-wrap:has( .os-ai__input:focus ) {
196 + border-bottom-color: var( --os-ui-border, rgba( 0, 0, 0, 0.06 ) );
229 197 }
230 198
231 -/* Input-row sparkle — visible always, tints toward the accent on focus
232 - so the panel reads as "AI assistant" rather than "search box". */
233 -.desktop-mode-ai__input-icon {
199 +/* Input-row icon: dim at rest, full strength on focus. At rest it is
200 + the accent at 55% alpha, mixed by --os-ai-accent towards the faint
201 + text colour; focused, the accent mixed towards the text colour. */
202 +.os-ai__input-icon {
234 203 flex-shrink: 0;
235 204 display: flex;
236 205 align-items: center;
237 - color: var( --wp-admin-theme-color, #2271b1 );
238 - opacity: 0.55;
239 - transition: opacity 0.18s ease, transform 0.18s ease;
206 + color: color-mix(
207 + in srgb,
208 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 55%, transparent ) var( --os-ai-accent, 100% ),
209 + var( --os-ui-fg-faint, #c3c4c7 )
210 + );
211 + transition: color 0.18s ease, transform 0.18s ease;
240 212 }
241 213
242 -.desktop-mode-ai__input-wrap:has( .desktop-mode-ai__input:focus ) .desktop-mode-ai__input-icon {
243 - opacity: 1;
214 +.os-ai__input-wrap:has( .os-ai__input:focus ) .os-ai__input-icon {
215 + color: color-mix(
216 + in srgb,
217 + var( --wp-admin-theme-color, #2271b1 ) var( --os-ai-accent, 100% ),
218 + var( --os-ui-fg, #1d2327 )
219 + );
244 220 transform: scale( 1.08 );
245 221 }
246 222
247 223 /*
@@ -255,9 +231,9 @@
255 231 * input[type="text"]:focus { border-color: #2271b1;
256 232 * box-shadow: 0 0 0 1px #2271b1 }
257 233 *
258 234 * That weighs (0,1,1) — one type selector plus one attribute selector —
259 - * which beats a bare `.desktop-mode-ai__input` at (0,1,0). The result
235 + * which beats a bare `.os-ai__input` at (0,1,0). The result
260 236 * was a bordered white box floating inside the panel: core's chrome,
261 237 * core's text colour, ignoring both the design intent (a chromeless
262 238 * Spotlight-style field) and any active desktop theme.
263 239 *
@@ -263,9 +239,9 @@
263 239 *
264 240 * Scoping to the overlay root takes the selector to (0,2,0) and wins.
265 241 * Same fix as the native-window form-control rule in window-chrome.css.
266 242 */
267 -.desktop-mode-ai .desktop-mode-ai__input {
243 +.os-ai .os-ai__input {
268 244 flex: 1;
269 245 min-width: 0;
270 246 appearance: none;
271 247 border: none;
@@ -280,27 +256,27 @@
280 256 font: inherit;
281 257 font-size: 17px;
282 258 font-weight: 400;
283 259 line-height: 1.4;
284 - color: var( --wpd-fg, #1d2327 );
260 + color: var( --os-ui-fg, #1d2327 );
285 261 }
286 262
287 263 /* Core paints a focus border + ring on the element itself; the focus
288 264 affordance here is the input row's bottom hairline instead. */
289 -.desktop-mode-ai .desktop-mode-ai__input:focus {
265 +.os-ai .os-ai__input:focus {
290 266 border-color: transparent;
291 267 box-shadow: none;
292 268 outline: none;
293 269 }
294 270
295 -.desktop-mode-ai .desktop-mode-ai__input::placeholder {
296 - color: var( --wpd-fg-faint, #c3c4c7 );
271 +.os-ai .os-ai__input::placeholder {
272 + color: var( --os-ui-fg-faint, #c3c4c7 );
297 273 font-weight: 400;
298 274 }
299 275
300 276 /* Submit button — hidden until the user types something, then
301 277 springs in via opacity + scale transition. */
302 -.desktop-mode-ai__submit {
278 +.os-ai__submit {
303 279 flex-shrink: 0;
304 280 display: flex;
305 281 align-items: center;
306 282 justify-content: center;
@@ -307,10 +283,25 @@
307 283 width: 30px;
308 284 height: 30px;
309 285 border: none;
310 286 border-radius: 8px;
311 - background: var( --wp-admin-theme-color, #2271b1 );
312 - color: var( --wpd-fg-on-accent, #fff );
287 + /* An accent key at --os-ai-accent's strength. At 0 it is an icon tile
288 + like the command rows' (the neutral fill, the glyph in the accent);
289 + at 100% the filled accent button with its ink. */
290 + background-color: color-mix(
291 + in srgb,
292 + var( --wp-admin-theme-color, #2271b1 ) var( --os-ai-accent, 100% ),
293 + transparent
294 + );
295 + background-image: linear-gradient(
296 + var( --os-ai-tile-fill, transparent ),
297 + var( --os-ai-tile-fill, transparent )
298 + );
299 + color: color-mix(
300 + in srgb,
301 + var( --os-ui-accent-ink, var( --os-ui-fg-on-accent, #fff ) ) var( --os-ai-accent, 100% ),
302 + var( --wp-admin-theme-color, #2271b1 )
303 + );
313 304 cursor: pointer;
314 305 padding: 0;
315 306 opacity: 0;
316 307 transform: scale( 0.7 );
@@ -319,23 +310,23 @@
319 310 opacity 0.2s ease,
320 311 transform 0.2s cubic-bezier( 0.34, 1.56, 0.64, 1 );
321 312 }
322 313
323 -.desktop-mode-ai__submit.has-value {
314 +.os-ai__submit.has-value {
324 315 opacity: 1;
325 316 transform: scale( 1 );
326 317 pointer-events: auto;
327 318 }
328 319
329 -.desktop-mode-ai__submit:hover {
320 +.os-ai__submit:hover {
330 321 filter: brightness( 1.1 );
331 322 }
332 323
333 -.desktop-mode-ai__submit:active {
324 +.os-ai__submit:active {
334 325 transform: scale( 0.92 );
335 326 }
336 327
337 -.desktop-mode-ai__submit:focus-visible {
328 +.os-ai__submit:focus-visible {
338 329 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
339 330 outline-offset: 2px;
340 331 }
341 332
@@ -342,21 +333,21 @@
342 333 /* ---------------------------------------------------------------------------
343 334 * Footer — hints and keyboard shortcut legend
344 335 * ------------------------------------------------------------------------- */
345 336
346 -.desktop-mode-ai__footer {
337 +.os-ai__footer {
347 338 display: flex;
348 339 align-items: center;
349 340 justify-content: space-between;
350 341 gap: 8px;
351 342 padding: 8px 16px 10px;
352 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.018 ) );
353 - border-top: 1px solid var( --wpd-border, rgba( 0, 0, 0, 0.05 ) );
343 + background: var( --os-ui-hover, rgba( 0, 0, 0, 0.018 ) );
344 + border-top: 1px solid var( --os-ui-border, rgba( 0, 0, 0, 0.05 ) );
354 345 }
355 346
356 -.desktop-mode-ai__footer-hint {
347 +.os-ai__footer-hint {
357 348 font-size: 11px;
358 - color: var( --wpd-fg-muted, #a7aaad );
349 + color: var( --os-ui-fg-muted, #a7aaad );
359 350 }
360 351
361 352 /* ---------------------------------------------------------------------------
362 353 * Admin bar AI button — ⌘K badge + sparkle icon
@@ -361,47 +352,15 @@
361 352 /* ---------------------------------------------------------------------------
362 353 * Admin bar AI button — ⌘K badge + sparkle icon
363 354 * Styles applied via wp_add_inline_style( 'admin-bar', ... ) in PHP.
364 355 * The styles here are for reference; the actual output lives in
365 - * includes/admin-bar.php :: desktop_mode_enqueue_toggle_assets().
356 + * includes/admin-bar.php :: openstation_enqueue_toggle_assets().
366 357 * ------------------------------------------------------------------------- */
367 358
368 359 /* (The admin-bar button styles are added inline in PHP to keep them
369 - on the admin-bar handle so they load even before desktop-mode.js.) */
360 + on the admin-bar handle so they load even before os.js.) */
370 361
371 362 /* ---------------------------------------------------------------------------
372 - * Close button — × icon, top-right of header
373 - * ------------------------------------------------------------------------- */
374 -
375 -.desktop-mode-ai__close {
376 - display: inline-flex;
377 - align-items: center;
378 - justify-content: center;
379 - width: 28px;
380 - height: 28px;
381 - appearance: none;
382 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.05 ) );
383 - border: 1px solid var( --wpd-border, rgba( 0, 0, 0, 0.1 ) );
384 - border-radius: 6px;
385 - cursor: pointer;
386 - color: var( --wpd-fg-muted, #646970 );
387 - padding: 0;
388 - flex-shrink: 0;
389 - transition: background 0.1s, color 0.1s, border-color 0.1s;
390 -}
391 -
392 -.desktop-mode-ai__close:hover {
393 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.09 ) );
394 - border-color: var( --wpd-border-strong, rgba( 0, 0, 0, 0.2 ) );
395 - color: var( --wpd-fg, #1d2327 );
396 -}
397 -
398 -.desktop-mode-ai__close:focus-visible {
399 - outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
400 - outline-offset: 2px;
401 -}
402 -
403 -/* ---------------------------------------------------------------------------
404 363 * Results / conversation area — three render modes:
405 364 * • Suggestions (empty state, example prompts)
406 365 * • Thinking (spinner + "Thinking…")
407 366 * • Response (assistant bubble + entity card | admin links | nothing)
@@ -406,10 +365,10 @@
406 365 * • Thinking (spinner + "Thinking…")
407 366 * • Response (assistant bubble + entity card | admin links | nothing)
408 367 * ------------------------------------------------------------------------- */
409 368
410 -.desktop-mode-ai__results {
411 - border-top: 1px solid var( --wpd-border, rgba( 0, 0, 0, 0.06 ) );
369 +.os-ai__results {
370 + border-top: 1px solid var( --os-ui-border, rgba( 0, 0, 0, 0.06 ) );
412 371 max-height: 420px;
413 372 overflow-y: auto;
414 373 overflow-x: hidden;
415 374 padding: 14px 16px;
@@ -421,39 +380,39 @@
421 380 /* -----------------------------------------------------------------
422 381 * Suggestion chips (empty state)
423 382 * ---------------------------------------------------------------- */
424 383
425 -.desktop-mode-ai__suggestions-label {
384 +.os-ai__suggestions-label {
426 385 margin: 0 0 4px;
427 386 font-size: 11px;
428 387 font-weight: 600;
429 388 text-transform: uppercase;
430 389 letter-spacing: 0.08em;
431 - color: var( --wpd-fg-muted, #8c8f94 );
390 + color: var( --os-ui-fg-muted, #8c8f94 );
432 391 }
433 392
434 -.desktop-mode-ai__suggestions-list {
393 +.os-ai__suggestions-list {
435 394 display: flex;
436 395 flex-wrap: wrap;
437 396 gap: 6px;
438 397 }
439 398
440 -.desktop-mode-ai__suggestion {
399 +.os-ai__suggestion {
441 400 appearance: none;
442 - border: 1px solid var( --wpd-border, rgba( 0, 0, 0, 0.1 ) );
443 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.02 ) );
401 + border: 1px solid var( --os-ui-border, rgba( 0, 0, 0, 0.1 ) );
402 + background: var( --os-ui-hover, rgba( 0, 0, 0, 0.02 ) );
444 403 border-radius: 999px;
445 404 padding: 5px 12px;
446 405 font: inherit;
447 406 font-size: 12px;
448 - color: var( --wpd-fg-muted, #50575e );
407 + color: var( --os-ui-fg-muted, #50575e );
449 408 cursor: pointer;
450 409 transition: background 0.12s, border-color 0.12s, color 0.12s;
451 410 }
452 411
453 -.desktop-mode-ai__suggestion:hover {
454 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, var( --wpd-surface, #fff ) );
455 - border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 30%, var( --wpd-border, rgba( 0, 0, 0, 0.1 ) ) );
412 +.os-ai__suggestion:hover {
413 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, var( --os-ui-surface, #fff ) );
414 + border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 30%, var( --os-ui-border, rgba( 0, 0, 0, 0.1 ) ) );
456 415 color: var( --wp-admin-theme-color, #2271b1 );
457 416 }
458 417
459 418 /* -----------------------------------------------------------------
@@ -459,18 +418,18 @@
459 418 /* -----------------------------------------------------------------
460 419 * Thinking / error state
461 420 * ---------------------------------------------------------------- */
462 421
463 -.desktop-mode-ai__state {
422 +.os-ai__state {
464 423 display: flex;
465 424 align-items: center;
466 425 gap: 10px;
467 426 font-size: 13px;
468 - color: var( --wpd-fg-muted, #646970 );
427 + color: var( --os-ui-fg-muted, #646970 );
469 428 }
470 429
471 -.desktop-mode-ai__state--error {
472 - color: var( --wpd-danger, #d63638 );
430 +.os-ai__state--error {
431 + color: var( --os-ui-danger, #d63638 );
473 432 align-items: flex-start;
474 433 }
475 434
476 435 /* Inline "AI Settings" link inside the "AI not enabled" error — opens
@@ -476,9 +435,9 @@
476 435 /* Inline "AI Settings" link inside the "AI not enabled" error — opens
477 436 * OS Settings on the AI tab. Styled as a link within the surrounding
478 437 * error text, not a standalone button: inherits the error color and
479 438 * flows with the sentence. */
480 -.desktop-mode-ai__settings-link {
439 +.os-ai__settings-link {
481 440 appearance: none;
482 441 border: 0;
483 442 margin: 0;
484 443 padding: 0;
@@ -489,10 +448,12 @@
489 448 text-decoration: underline;
490 449 text-underline-offset: 2px;
491 450 }
492 451
493 -.desktop-mode-ai__settings-link:hover {
494 - text-decoration: none;
452 +/* Keeps the underline and nudges the colour toward the foreground, so
453 + hovering reads as a response rather than the link going away. */
454 +.os-ai__settings-link:hover {
455 + color: color-mix( in srgb, currentColor 65%, var( --os-ui-fg, #1d2327 ) );
495 456 }
496 457
497 458 /* The shell forces `cursor: default !important` on every clickable
498 459 * surface (see the cursor policy at the top of desktop.css). This
@@ -497,20 +458,20 @@
497 458 /* The shell forces `cursor: default !important` on every clickable
498 459 * surface (see the cursor policy at the top of desktop.css). This
499 460 * recovery link is an explicit, user-approved exception: it keeps a
500 461 * pointer so it reads as the actionable link it is. Scoped under
501 - * `body.desktop-mode-active` so it out-specifies the policy's
462 + * `body.os-active` so it out-specifies the policy's
502 463 * `!important` rule, same trick the resize-handle exceptions use. */
503 -body.desktop-mode-active .desktop-mode-ai__settings-link {
464 +body.os-active .os-ai__settings-link {
504 465 cursor: pointer !important;
505 466 }
506 467
507 -@keyframes desktop-mode-spin {
468 +@keyframes os-spin {
508 469 to { transform: rotate( 360deg ); }
509 470 }
510 471
511 -.desktop-mode-ai__spinner-icon {
512 - animation: desktop-mode-spin 0.9s linear infinite;
472 +.os-ai__spinner-icon {
473 + animation: os-spin 0.9s linear infinite;
513 474 flex-shrink: 0;
514 475 color: var( --wp-admin-theme-color, #2271b1 );
515 476 }
516 477
@@ -517,15 +478,15 @@
517 478 /* -----------------------------------------------------------------
518 479 * Assistant message bubble — prefix for every response
519 480 * ---------------------------------------------------------------- */
520 481
521 -.desktop-mode-ai__bubble {
482 +.os-ai__bubble {
522 483 display: flex;
523 484 align-items: flex-start;
524 485 gap: 10px;
525 486 }
526 487
527 -.desktop-mode-ai__bubble-icon {
488 +.os-ai__bubble-icon {
528 489 flex-shrink: 0;
529 490 display: flex;
530 491 align-items: center;
531 492 justify-content: center;
@@ -531,17 +492,17 @@
531 492 justify-content: center;
532 493 width: 24px;
533 494 height: 24px;
534 495 border-radius: 50%;
535 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 12%, var( --wpd-surface, #fff ) );
496 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 12%, var( --os-ui-surface, #fff ) );
536 497 color: var( --wp-admin-theme-color, #2271b1 );
537 498 }
538 499
539 -.desktop-mode-ai__bubble-text {
500 +.os-ai__bubble-text {
540 501 padding-top: 3px;
541 502 font-size: 13px;
542 503 line-height: 1.5;
543 - color: var( --wpd-fg, #1d2327 );
504 + color: var( --os-ui-fg, #1d2327 );
544 505 flex: 1;
545 506 min-width: 0;
546 507 }
547 508
@@ -549,41 +510,41 @@
549 510 <p>, <ul>/<ol>/<li>, <strong>, <em>, <code>, <a>. Reset margins on
550 511 outer paragraphs so single-paragraph replies (the common case)
551 512 don't get top/bottom spacing; list items get the usual disc/decimal
552 513 markers inside a compact indent. */
553 -.desktop-mode-ai__bubble-text > p,
554 -.desktop-mode-ai__bubble-text > ul,
555 -.desktop-mode-ai__bubble-text > ol {
514 +.os-ai__bubble-text > p,
515 +.os-ai__bubble-text > ul,
516 +.os-ai__bubble-text > ol {
556 517 margin: 0 0 6px;
557 518 }
558 -.desktop-mode-ai__bubble-text > :last-child {
519 +.os-ai__bubble-text > :last-child {
559 520 margin-bottom: 0;
560 521 }
561 -.desktop-mode-ai__bubble-text ul,
562 -.desktop-mode-ai__bubble-text ol {
522 +.os-ai__bubble-text ul,
523 +.os-ai__bubble-text ol {
563 524 padding-inline-start: 20px;
564 525 }
565 -.desktop-mode-ai__bubble-text li {
526 +.os-ai__bubble-text li {
566 527 margin-bottom: 2px;
567 528 }
568 -.desktop-mode-ai__bubble-text code {
569 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.05 ) );
529 +.os-ai__bubble-text code {
530 + background: var( --os-ui-hover, rgba( 0, 0, 0, 0.05 ) );
570 531 padding: 1px 5px;
571 532 border-radius: 4px;
572 - font-family: var( --wpd-font-mono, Menlo, Consolas, monospace );
533 + font-family: var( --os-ui-font-mono, Menlo, Consolas, monospace );
573 534 font-size: 11.5px;
574 535 }
575 -.desktop-mode-ai__bubble-text a {
536 +.os-ai__bubble-text a {
576 537 color: var( --wp-admin-theme-color, #2271b1 );
577 538 text-decoration: underline;
578 539 text-underline-offset: 2px;
579 540 }
580 -.desktop-mode-ai__bubble-text a:hover {
541 +.os-ai__bubble-text a:hover {
581 542 text-decoration: none;
582 543 }
583 -.desktop-mode-ai__bubble-text strong {
544 +.os-ai__bubble-text strong {
584 545 font-weight: 600;
585 - color: var( --wpd-fg, #1d2327 );
546 + color: var( --os-ui-fg, #1d2327 );
586 547 }
587 548
588 549 /* -----------------------------------------------------------------
589 550 * Entity card — shown under the bubble when answer_type=entity
@@ -588,19 +549,19 @@
588 549 /* -----------------------------------------------------------------
589 550 * Entity card — shown under the bubble when answer_type=entity
590 551 * ---------------------------------------------------------------- */
591 552
592 -.desktop-mode-ai__entity {
553 +.os-ai__entity {
593 554 display: flex;
594 555 flex-direction: column;
595 556 gap: 8px;
596 557 padding: 12px 14px;
597 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.02 ) );
598 - border: 1px solid var( --wpd-border, rgba( 0, 0, 0, 0.08 ) );
558 + background: var( --os-ui-hover, rgba( 0, 0, 0, 0.02 ) );
559 + border: 1px solid var( --os-ui-border, rgba( 0, 0, 0, 0.08 ) );
599 560 border-radius: 10px;
600 561 }
601 562
602 -.desktop-mode-ai__entity-header {
563 +.os-ai__entity-header {
603 564 display: flex;
604 565 align-items: center;
605 566 gap: 8px;
606 567 flex-wrap: wrap;
@@ -605,9 +566,9 @@
605 566 gap: 8px;
606 567 flex-wrap: wrap;
607 568 }
608 569
609 -.desktop-mode-ai__entity-topic {
570 +.os-ai__entity-topic {
610 571 display: inline-block;
611 572 font-size: 10px;
612 573 font-weight: 600;
613 574 text-transform: uppercase;
@@ -617,34 +578,34 @@
617 578 padding: 2px 7px;
618 579 border-radius: 999px;
619 580 }
620 581
621 -.desktop-mode-ai__entity-type {
582 +.os-ai__entity-type {
622 583 font-size: 10px;
623 584 font-weight: 600;
624 585 text-transform: uppercase;
625 586 letter-spacing: 0.07em;
626 - color: var( --wpd-fg-muted, #8c8f94 );
587 + color: var( --os-ui-fg-muted, #8c8f94 );
627 588 }
628 589
629 -.desktop-mode-ai__entity-title {
590 +.os-ai__entity-title {
630 591 margin: 0;
631 592 font-size: 14px;
632 593 font-weight: 600;
633 - color: var( --wpd-fg, #1d2327 );
594 + color: var( --os-ui-fg, #1d2327 );
634 595 line-height: 1.35;
635 596 }
636 597
637 -.desktop-mode-ai__entity-summary {
598 +.os-ai__entity-summary {
638 599 margin: 0;
639 600 font-size: 12px;
640 601 line-height: 1.5;
641 - color: var( --wpd-fg-muted, #50575e );
602 + color: var( --os-ui-fg-muted, #50575e );
642 603 }
643 604
644 605 /* Primary action — opens the entity in a legacy iframe window inside
645 606 the desktop (wp-admin edit URL). */
646 -.desktop-mode-ai__entity-open {
607 +.os-ai__entity-open {
647 608 appearance: none;
648 609 display: inline-flex;
649 610 align-items: center;
650 611 gap: 6px;
@@ -652,9 +613,9 @@
652 613 padding: 6px 14px;
653 614 border: none;
654 615 border-radius: 8px;
655 616 background: var( --wp-admin-theme-color, #2271b1 );
656 - color: var( --wpd-fg-on-accent, #fff );
617 + color: var( --os-ui-accent-ink, var( --os-ui-fg-on-accent, #fff ) );
657 618 font: inherit;
658 619 font-size: 12px;
659 620 font-weight: 500;
660 621 cursor: pointer;
@@ -660,22 +621,22 @@
660 621 cursor: pointer;
661 622 transition: filter 0.1s, transform 0.1s;
662 623 }
663 624
664 -.desktop-mode-ai__entity-open:hover {
625 +.os-ai__entity-open:hover {
665 626 filter: brightness( 1.1 );
666 627 }
667 628
668 -.desktop-mode-ai__entity-open:active {
629 +.os-ai__entity-open:active {
669 630 transform: scale( 0.97 );
670 631 }
671 632
672 -.desktop-mode-ai__entity-open:focus-visible {
633 +.os-ai__entity-open:focus-visible {
673 634 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
674 635 outline-offset: 2px;
675 636 }
676 637
677 -.desktop-mode-ai__entity-open svg {
638 +.os-ai__entity-open svg {
678 639 margin-inline-start: 2px;
679 640 }
680 641
681 642 /* -----------------------------------------------------------------
@@ -681,22 +642,22 @@
681 642 /* -----------------------------------------------------------------
682 643 * Admin-links list — shown when answer_type=navigation
683 644 * ---------------------------------------------------------------- */
684 645
685 -.desktop-mode-ai__admin-links {
646 +.os-ai__admin-links {
686 647 display: flex;
687 648 flex-direction: column;
688 649 gap: 6px;
689 650 }
690 651
691 -.desktop-mode-ai__admin-link {
652 +.os-ai__admin-link {
692 653 appearance: none;
693 654 display: flex;
694 655 align-items: center;
695 656 gap: 12px;
696 657 padding: 10px 12px;
697 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.02 ) );
698 - border: 1px solid var( --wpd-border, rgba( 0, 0, 0, 0.08 ) );
658 + background: var( --os-ui-hover, rgba( 0, 0, 0, 0.02 ) );
659 + border: 1px solid var( --os-ui-border, rgba( 0, 0, 0, 0.08 ) );
699 660 border-radius: 10px;
700 661 cursor: pointer;
701 662 text-align: start;
702 663 font: inherit;
@@ -703,23 +664,23 @@
703 664 color: inherit;
704 665 transition: background 0.12s, border-color 0.12s, transform 0.08s;
705 666 }
706 667
707 -.desktop-mode-ai__admin-link:hover {
708 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 6%, var( --wpd-surface, #fff ) );
709 - border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, var( --wpd-border, rgba( 0, 0, 0, 0.08 ) ) );
668 +.os-ai__admin-link:hover {
669 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 6%, var( --os-ui-surface, #fff ) );
670 + border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, var( --os-ui-border, rgba( 0, 0, 0, 0.08 ) ) );
710 671 }
711 672
712 -.desktop-mode-ai__admin-link:active {
673 +.os-ai__admin-link:active {
713 674 transform: scale( 0.99 );
714 675 }
715 676
716 -.desktop-mode-ai__admin-link:focus-visible {
677 +.os-ai__admin-link:focus-visible {
717 678 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
718 679 outline-offset: 2px;
719 680 }
720 681
721 -.desktop-mode-ai__admin-link-icon {
682 +.os-ai__admin-link-icon {
722 683 flex-shrink: 0;
723 684 display: flex;
724 685 align-items: center;
725 686 justify-content: center;
@@ -726,13 +687,13 @@
726 687 width: 32px;
727 688 height: 32px;
728 689 font-size: 18px;
729 690 color: var( --wp-admin-theme-color, #2271b1 );
730 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, var( --wpd-surface, #fff ) );
691 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, var( --os-ui-surface, #fff ) );
731 692 border-radius: 8px;
732 693 }
733 694
734 -.desktop-mode-ai__admin-link-body {
695 +.os-ai__admin-link-body {
735 696 flex: 1;
736 697 display: flex;
737 698 flex-direction: column;
738 699 gap: 2px;
@@ -738,17 +699,17 @@
738 699 gap: 2px;
739 700 min-width: 0;
740 701 }
741 702
742 -.desktop-mode-ai__admin-link-title {
703 +.os-ai__admin-link-title {
743 704 font-size: 13px;
744 705 font-weight: 600;
745 - color: var( --wpd-fg, #1d2327 );
706 + color: var( --os-ui-fg, #1d2327 );
746 707 }
747 708
748 -.desktop-mode-ai__admin-link-desc {
709 +.os-ai__admin-link-desc {
749 710 font-size: 11px;
750 - color: var( --wpd-fg-muted, #646970 );
711 + color: var( --os-ui-fg-muted, #646970 );
751 712 line-height: 1.4;
752 713 overflow: hidden;
753 714 text-overflow: ellipsis;
754 715 white-space: nowrap;
@@ -753,15 +714,15 @@
753 714 text-overflow: ellipsis;
754 715 white-space: nowrap;
755 716 }
756 717
757 -.desktop-mode-ai__admin-link-arrow {
718 +.os-ai__admin-link-arrow {
758 719 flex-shrink: 0;
759 - color: var( --wpd-fg-faint, #c3c4c7 );
720 + color: var( --os-ui-fg-faint, #c3c4c7 );
760 721 transition: color 0.12s, transform 0.12s;
761 722 }
762 723
763 -.desktop-mode-ai__admin-link:hover .desktop-mode-ai__admin-link-arrow {
724 +.os-ai__admin-link:hover .os-ai__admin-link-arrow {
764 725 color: var( --wp-admin-theme-color, #2271b1 );
765 726 transform: translateX( 2px );
766 727 }
767 728
@@ -771,15 +732,15 @@
771 732 * admin-link list's visual shape (icon + title + description) but
772 733 * uses a dedicated set of classes so each can evolve independently.
773 734 * ---------------------------------------------------------------- */
774 735
775 -.desktop-mode-ai__cmd-list {
736 +.os-ai__cmd-list {
776 737 display: flex;
777 738 flex-direction: column;
778 739 gap: 4px;
779 740 }
780 741
781 -.desktop-mode-ai__cmd-item {
742 +.os-ai__cmd-item {
782 743 appearance: none;
783 744 display: flex;
784 745 align-items: flex-start;
785 746 gap: 10px;
@@ -794,24 +755,50 @@
794 755 transition: background 0.1s, border-color 0.1s;
795 756 }
796 757
797 758 /*
798 - * Single-line rows (no `.desktop-mode-ai__cmd-desc` child) need the
759 + * Single-line rows (no `.os-ai__cmd-desc` child) need the
799 760 * icon + label baseline-centered instead of top-aligned, otherwise
800 761 * the label floats to the top of the taller icon tile and reads as
801 762 * misaligned. `:has()` is widely supported in evergreen browsers the
802 763 * desktop shell already targets.
803 764 */
804 -.desktop-mode-ai__cmd-item:not(:has(.desktop-mode-ai__cmd-desc)) {
765 +.os-ai__cmd-item:not(:has(.os-ai__cmd-desc)) {
805 766 align-items: center;
806 767 }
807 768
808 -.desktop-mode-ai__cmd-item:hover,
809 -.desktop-mode-ai__cmd-item.is-selected {
810 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, var( --wpd-surface, #fff ) );
811 - border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, var( --wpd-border, rgba( 0, 0, 0, 0.08 ) ) );
769 +/* The lit row: an accent wash and edge at --os-ai-accent's strength,
770 + over the row fill the palette names. Shared with the args-mode rows
771 + below through the same two custom properties. */
772 +.os-ai {
773 + --_row-wash: color-mix(
774 + in srgb,
775 + var( --wp-admin-theme-color, #2271b1 ) calc( var( --os-ai-accent, 100% ) * 0.08 ),
776 + var( --os-ui-surface, #fff )
777 + );
778 + --_row-edge: color-mix(
779 + in srgb,
780 + color-mix(
781 + in srgb,
782 + var( --wp-admin-theme-color, #2271b1 ) 25%,
783 + var( --os-ui-border, rgba( 0, 0, 0, 0.08 ) )
784 + )
785 + var( --os-ai-accent, 100% ),
786 + transparent
787 + );
788 + --_row-fill: linear-gradient(
789 + var( --os-ai-row-fill, transparent ),
790 + var( --os-ai-row-fill, transparent )
791 + );
812 792 }
813 793
794 +.os-ai__cmd-item:hover,
795 +.os-ai__cmd-item.is-selected {
796 + background-color: var( --_row-wash );
797 + background-image: var( --_row-fill );
798 + border-color: var( --_row-edge );
799 +}
800 +
814 801 /*
815 802 * When keyboard navigation is driving selection, suppress the :hover
816 803 * style on rows. Without this, arrowing the cursor past the row that
817 804 * happens to sit under the mouse pointer paints BOTH rows as active
@@ -818,23 +805,24 @@
818 805 * — the keyboard target from `.is-selected` and the pointer target
819 806 * from `:hover`. The JS toggles this class on the list container on
820 807 * ArrowUp/Down and clears it on the next real `mousemove`.
821 808 */
822 -.desktop-mode-ai__cmd-list--kb-nav .desktop-mode-ai__cmd-item:hover {
809 +.os-ai__cmd-list--kb-nav .os-ai__cmd-item:hover {
823 810 background: transparent;
824 811 border-color: transparent;
825 812 }
826 -.desktop-mode-ai__cmd-list--kb-nav .desktop-mode-ai__cmd-item.is-selected:hover {
827 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, var( --wpd-surface, #fff ) );
828 - border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, var( --wpd-border, rgba( 0, 0, 0, 0.08 ) ) );
813 +.os-ai__cmd-list--kb-nav .os-ai__cmd-item.is-selected:hover {
814 + background-color: var( --_row-wash );
815 + background-image: var( --_row-fill );
816 + border-color: var( --_row-edge );
829 817 }
830 818
831 -.desktop-mode-ai__cmd-item:focus-visible {
819 +.os-ai__cmd-item:focus-visible {
832 820 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
833 821 outline-offset: 2px;
834 822 }
835 823
836 -.desktop-mode-ai__cmd-icon {
824 +.os-ai__cmd-icon {
837 825 flex-shrink: 0;
838 826 display: flex;
839 827 align-items: center;
840 828 justify-content: center;
@@ -840,10 +828,20 @@
840 828 justify-content: center;
841 829 width: 36px;
842 830 height: 36px;
843 831 font-size: 20px;
832 + /* The glyph is the accent in every palette; only its tile follows
833 + --os-ai-accent. */
844 834 color: var( --wp-admin-theme-color, #2271b1 );
845 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, var( --wpd-surface, #fff ) );
835 + background-color: color-mix(
836 + in srgb,
837 + var( --wp-admin-theme-color, #2271b1 ) calc( var( --os-ai-accent, 100% ) * 0.1 ),
838 + var( --os-ui-surface, #fff )
839 + );
840 + background-image: linear-gradient(
841 + var( --os-ai-tile-fill, transparent ),
842 + var( --os-ai-tile-fill, transparent )
843 + );
846 844 border-radius: 7px;
847 845 }
848 846
849 847 /*
@@ -849,9 +847,9 @@
849 847 /*
850 848 * Dashicons ship at a 20px baseline; the tile was scaled up but
851 849 * dashicons glyphs need explicit sizing to follow.
852 850 */
853 -.desktop-mode-ai__cmd-icon.dashicons {
851 +.os-ai__cmd-icon.dashicons {
854 852 font-size: 22px;
855 853 width: 36px;
856 854 height: 36px;
857 855 line-height: 36px;
@@ -862,15 +860,15 @@
862 860 * `@wordpress/icons` markup). Constrain the inline SVG so it sits
863 861 * centered inside the tile regardless of the viewBox the source icon
864 862 * shipped with.
865 863 */
866 -.desktop-mode-ai__cmd-icon--svg svg {
864 +.os-ai__cmd-icon--svg svg {
867 865 width: 24px;
868 866 height: 24px;
869 867 fill: currentColor;
870 868 }
871 869
872 -.desktop-mode-ai__cmd-body {
870 +.os-ai__cmd-body {
873 871 flex: 1;
874 872 display: flex;
875 873 flex-direction: column;
876 874 gap: 2px;
@@ -876,26 +874,26 @@
876 874 gap: 2px;
877 875 min-width: 0;
878 876 }
879 877
880 -.desktop-mode-ai__cmd-title {
878 +.os-ai__cmd-title {
881 879 font-size: 13px;
882 880 font-weight: 600;
883 - color: var( --wpd-fg, #1d2327 );
884 - font-family: var( --wpd-font-mono, Menlo, Consolas, monospace );
881 + color: var( --os-ui-fg, #1d2327 );
882 + font-family: var( --os-ui-font-mono, Menlo, Consolas, monospace );
885 883 letter-spacing: -0.01em;
886 884 }
887 885
888 -.desktop-mode-ai__cmd-hint {
886 +.os-ai__cmd-hint {
889 887 font-weight: 400;
890 - color: var( --wpd-fg-muted, #8c8f94 );
888 + color: var( --os-ui-fg-muted, #8c8f94 );
891 889 font-size: 12px;
892 890 margin-inline-start: 6px;
893 891 }
894 892
895 -.desktop-mode-ai__cmd-desc {
893 +.os-ai__cmd-desc {
896 894 font-size: 11.5px;
897 - color: var( --wpd-fg-muted, #646970 );
895 + color: var( --os-ui-fg-muted, #646970 );
898 896 line-height: 1.4;
899 897 font-family: inherit;
900 898 letter-spacing: 0;
901 899 }
@@ -903,9 +901,9 @@
903 901 /* Entity search results (posts, pages) — rendered in the same list as
904 902 commands but are navigable destinations, not actions. Use regular font
905 903 (not the monospace used for slash-commands) so they read as content
906 904 search results, matching the classic command palette UX. */
907 -.desktop-mode-ai__cmd-item.is-entity-result .desktop-mode-ai__cmd-title {
905 +.os-ai__cmd-item.is-entity-result .os-ai__cmd-title {
908 906 font-family: inherit;
909 907 letter-spacing: 0;
910 908 }
911 909
@@ -910,33 +908,34 @@
910 908 }
911 909
912 910 /* Args mode — a single row showing the locked-in command. Same
913 911 visual language as the list item but with an "Enter to run" hint. */
914 -.desktop-mode-ai__cmd-active {
912 +.os-ai__cmd-active {
915 913 display: flex;
916 914 align-items: flex-start;
917 915 gap: 10px;
918 916 padding: 10px 12px;
919 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, var( --wpd-surface, #fff ) );
920 - border: 1px solid color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 30%, var( --wpd-border, rgba( 0, 0, 0, 0.08 ) ) );
917 + background-color: var( --_row-wash );
918 + background-image: var( --_row-fill );
919 + border: 1px solid var( --_row-edge );
921 920 border-radius: 8px;
922 921 }
923 922
924 -.desktop-mode-ai__cmd-enter-hint {
923 +.os-ai__cmd-enter-hint {
925 924 font-size: 11px;
926 - color: var( --wpd-fg-muted, #646970 );
925 + color: var( --os-ui-fg-muted, #646970 );
927 926 margin-top: 2px;
928 927 font-family: inherit;
929 928 }
930 929
931 -.desktop-mode-ai__cmd-enter-hint kbd {
930 +.os-ai__cmd-enter-hint kbd {
932 931 font-family: inherit;
933 932 font-size: 10px;
934 933 padding: 1px 4px;
935 - border: 1px solid var( --wpd-border, rgba( 0, 0, 0, 0.12 ) );
934 + border: 1px solid var( --os-ui-border, rgba( 0, 0, 0, 0.12 ) );
936 935 border-radius: 3px;
937 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.03 ) );
938 - color: var( --wpd-fg-muted, #646970 );
936 + background: var( --os-ui-hover, rgba( 0, 0, 0, 0.03 ) );
937 + color: var( --os-ui-fg-muted, #646970 );
939 938 }
940 939
941 940 /* Suggestion list shown under the locked-in command in args mode.
942 941 Visually identical to the command picker rows but without the
@@ -941,9 +940,9 @@
941 940 /* Suggestion list shown under the locked-in command in args mode.
942 941 Visually identical to the command picker rows but without the
943 942 border-highlight — the "active" glow already lives on the command
944 943 header directly above. */
945 -.desktop-mode-ai__cmd-suggest-list {
944 +.os-ai__cmd-suggest-list {
946 945 display: flex;
947 946 flex-direction: column;
948 947 gap: 2px;
949 948 margin-top: 6px;
@@ -948,9 +947,9 @@
948 947 gap: 2px;
949 948 margin-top: 6px;
950 949 }
951 950
952 -.desktop-mode-ai__cmd-suggest-item {
951 +.os-ai__cmd-suggest-item {
953 952 appearance: none;
954 953 display: flex;
955 954 align-items: flex-start;
956 955 gap: 10px;
@@ -964,23 +963,24 @@
964 963 color: inherit;
965 964 transition: background 0.1s, border-color 0.1s;
966 965 }
967 966
968 -.desktop-mode-ai__cmd-suggest-item:hover,
969 -.desktop-mode-ai__cmd-suggest-item.is-selected {
970 - background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, var( --wpd-surface, #fff ) );
971 - border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, var( --wpd-border, rgba( 0, 0, 0, 0.08 ) ) );
967 +.os-ai__cmd-suggest-item:hover,
968 +.os-ai__cmd-suggest-item.is-selected {
969 + background-color: var( --_row-wash );
970 + background-image: var( --_row-fill );
971 + border-color: var( --_row-edge );
972 972 }
973 973
974 -.desktop-mode-ai__cmd-suggest-label {
974 +.os-ai__cmd-suggest-label {
975 975 font-size: 13px;
976 976 font-weight: 500;
977 - color: var( --wpd-fg, #1d2327 );
977 + color: var( --os-ui-fg, #1d2327 );
978 978 }
979 979
980 980 /* Empty / "no matches" state for the palette */
981 -.desktop-mode-ai__state--empty {
982 - color: var( --wpd-fg-muted, #8c8f94 );
981 +.os-ai__state--empty {
982 + color: var( --os-ui-fg-muted, #8c8f94 );
983 983 font-size: 13px;
984 984 }
985 985
986 986 /* -----------------------------------------------------------------
@@ -986,9 +986,9 @@
986 986 /* -----------------------------------------------------------------
987 987 * Continue button (budget-exhausted state)
988 988 * ---------------------------------------------------------------- */
989 989
990 -.desktop-mode-ai__continue-btn {
990 +.os-ai__continue-btn {
991 991 appearance: none;
992 992 display: inline-flex;
993 993 align-items: center;
994 994 align-self: flex-start;
@@ -996,17 +996,17 @@
996 996 font: inherit;
997 997 font-size: 12px;
998 998 font-weight: 500;
999 999 padding: 6px 12px;
1000 - border: 1px dashed var( --wpd-border-strong, rgba( 0, 0, 0, 0.2 ) );
1000 + border: 1px dashed var( --os-ui-border-strong, rgba( 0, 0, 0, 0.2 ) );
1001 1001 border-radius: 6px;
1002 1002 background: transparent;
1003 - color: var( --wpd-fg-muted, #50575e );
1003 + color: var( --os-ui-fg-muted, #50575e );
1004 1004 cursor: pointer;
1005 1005 transition: background 0.1s, border-color 0.1s, color 0.1s;
1006 1006 }
1007 1007
1008 -.desktop-mode-ai__continue-btn:hover {
1009 - background: var( --wpd-hover, rgba( 0, 0, 0, 0.04 ) );
1010 - border-color: var( --wpd-border-strong, rgba( 0, 0, 0, 0.3 ) );
1011 - color: var( --wpd-fg, #1d2327 );
1008 +.os-ai__continue-btn:hover {
1009 + background: var( --os-ui-hover, rgba( 0, 0, 0, 0.04 ) );
1010 + border-color: var( --os-ui-border-strong, rgba( 0, 0, 0, 0.3 ) );
1011 + color: var( --os-ui-fg, #1d2327 );
1012 1012 }