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