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