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