PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 0.8.8
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v0.8.8
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
desktop-mode / assets / css / ai-assistant.css

ai-assistant.css in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 0.8.8, at assets/css/ai-assistant.css

883 lines 22.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * Desktop Mode — AI Assistant spotlight overlay.
3 *
4 * A system-level command palette that floats above the entire shell,
5 * including the WP admin bar. Visually modeled on macOS Spotlight and
6 * Linear's command menu — frosted-glass backdrop, spring-physics panel
7 * entrance, large search input, accent-tinted header.
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.
12 *
13 * @since 0.14.0
14 */
15
16 /* ---------------------------------------------------------------------------
17 * Root overlay — full viewport, fades in/out
18 * ------------------------------------------------------------------------- */
19
20 .desktop-mode-ai {
21 position: fixed;
22 inset: 0;
23 z-index: 10000;
24
25 display: flex;
26 align-items: flex-start;
27 justify-content: center;
28
29 /* Land the panel at ~16-18% from the top — feels like Spotlight.
30 clamp keeps it 60px from the top on very short screens and caps
31 at 180px on tall displays so it never feels too low. */
32 padding-top: clamp( 60px, 16vh, 180px );
33 padding-inline: 16px;
34 padding-bottom: 40px;
35
36 opacity: 0;
37 pointer-events: none;
38 transition: opacity 0.18s ease;
39 }
40
41 /* [hidden] keeps the element out of the a11y tree between sessions.
42 Only removed while the overlay is visually visible (open or animating). */
43 .desktop-mode-ai[hidden] {
44 display: none;
45 }
46
47 .desktop-mode-ai.is-open {
48 opacity: 1;
49 pointer-events: auto;
50 }
51
52 /* ---------------------------------------------------------------------------
53 * Backdrop — frosted glass
54 * ------------------------------------------------------------------------- */
55
56 .desktop-mode-ai__backdrop {
57 position: absolute;
58 inset: 0;
59 background: rgba( 0, 0, 0, 0.36 );
60 backdrop-filter: blur( 8px ) saturate( 0.75 );
61 -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. */
64 pointer-events: none;
65 }
66
67 /* ---------------------------------------------------------------------------
68 * Panel — the visible card
69 * ------------------------------------------------------------------------- */
70
71 .desktop-mode-ai__panel {
72 position: relative; /* sits above the backdrop */
73 width: 100%;
74 max-width: 600px;
75
76 background: rgba( 255, 255, 255, 0.97 );
77 border-radius: 16px;
78 overflow: hidden;
79
80 /* Tight under-shadow + wide atmospheric shadow */
81 box-shadow:
82 0 0 0 1px rgba( 0, 0, 0, 0.07 ),
83 0 4px 16px rgba( 0, 0, 0, 0.12 ),
84 0 24px 64px rgba( 0, 0, 0, 0.22 );
85
86 /* Spring-physics entrance: starts slightly small + shifted up,
87 overshoots minimally, then settles at 1.0. */
88 transform: scale( 0.96 ) translateY( -8px );
89 transition: transform 0.28s cubic-bezier( 0.34, 1.56, 0.64, 1 );
90 will-change: transform;
91 }
92
93 .desktop-mode-ai.is-open .desktop-mode-ai__panel {
94 transform: scale( 1 ) translateY( 0 );
95 }
96
97 /* ---------------------------------------------------------------------------
98 * Header — accent-tinted identity strip
99 * ------------------------------------------------------------------------- */
100
101 .desktop-mode-ai__header {
102 display: flex;
103 align-items: center;
104 gap: 8px;
105 padding: 10px 14px;
106 /* Gradient fades from a very faint accent tint to white — visible
107 on fresh/blue schemes, subtle on light schemes. */
108 background: linear-gradient(
109 to bottom,
110 color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, #fff ),
111 #fff
112 );
113 border-bottom: 1px solid rgba( 0, 0, 0, 0.06 );
114 }
115
116 .desktop-mode-ai__header-icon {
117 display: flex;
118 align-items: center;
119 color: var( --wp-admin-theme-color, #2271b1 );
120 /* Glow so the sparkle feels alive on dark or saturated themes */
121 filter: drop-shadow(
122 0 0 5px color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 55%, transparent )
123 );
124 }
125
126 .desktop-mode-ai__header-label {
127 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 );
133 }
134
135 /* .desktop-mode-ai__close styles moved to the bottom results section */
136
137 /* ---------------------------------------------------------------------------
138 * Input row — the main interaction surface
139 * ------------------------------------------------------------------------- */
140
141 .desktop-mode-ai__input-wrap {
142 display: flex;
143 align-items: center;
144 gap: 10px;
145 padding: 14px 16px;
146 /* Thin highlight at the bottom of the input area, visible when focused */
147 border-bottom: 1px solid transparent;
148 transition: border-color 0.15s ease;
149 }
150
151 .desktop-mode-ai__input-wrap:has( .desktop-mode-ai__input:focus ) {
152 border-bottom-color: rgba( 0, 0, 0, 0.06 );
153 }
154
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 {
158 flex-shrink: 0;
159 display: flex;
160 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;
164 }
165
166 .desktop-mode-ai__input-wrap:has( .desktop-mode-ai__input:focus ) .desktop-mode-ai__input-icon {
167 opacity: 1;
168 transform: scale( 1.08 );
169 }
170
171 .desktop-mode-ai__input {
172 flex: 1;
173 min-width: 0;
174 appearance: none;
175 border: none;
176 outline: none;
177 background: transparent;
178 font: inherit;
179 font-size: 17px;
180 font-weight: 400;
181 line-height: 1.4;
182 color: #1d2327;
183 }
184
185 .desktop-mode-ai__input::placeholder {
186 color: #c3c4c7;
187 font-weight: 400;
188 }
189
190 /* Submit button — hidden until the user types something, then
191 springs in via opacity + scale transition. */
192 .desktop-mode-ai__submit {
193 flex-shrink: 0;
194 display: flex;
195 align-items: center;
196 justify-content: center;
197 width: 30px;
198 height: 30px;
199 border: none;
200 border-radius: 8px;
201 background: var( --wp-admin-theme-color, #2271b1 );
202 color: #fff;
203 cursor: pointer;
204 padding: 0;
205 opacity: 0;
206 transform: scale( 0.7 );
207 pointer-events: none;
208 transition:
209 opacity 0.2s ease,
210 transform 0.2s cubic-bezier( 0.34, 1.56, 0.64, 1 );
211 }
212
213 .desktop-mode-ai__submit.has-value {
214 opacity: 1;
215 transform: scale( 1 );
216 pointer-events: auto;
217 }
218
219 .desktop-mode-ai__submit:hover {
220 filter: brightness( 1.1 );
221 }
222
223 .desktop-mode-ai__submit:active {
224 transform: scale( 0.92 );
225 }
226
227 .desktop-mode-ai__submit:focus-visible {
228 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
229 outline-offset: 2px;
230 }
231
232 /* ---------------------------------------------------------------------------
233 * Footer — hints and keyboard shortcut legend
234 * ------------------------------------------------------------------------- */
235
236 .desktop-mode-ai__footer {
237 display: flex;
238 align-items: center;
239 justify-content: space-between;
240 gap: 8px;
241 padding: 8px 16px 10px;
242 background: rgba( 0, 0, 0, 0.018 );
243 border-top: 1px solid rgba( 0, 0, 0, 0.05 );
244 }
245
246 .desktop-mode-ai__footer-hint {
247 font-size: 11px;
248 color: #a7aaad;
249 }
250
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 /* ---------------------------------------------------------------------------
272 * Admin bar AI button — ⌘K badge + sparkle icon
273 * Styles applied via wp_add_inline_style( 'admin-bar', ... ) in PHP.
274 * The styles here are for reference; the actual output lives in
275 * includes/admin-bar.php :: desktop_mode_enqueue_toggle_assets().
276 * ------------------------------------------------------------------------- */
277
278 /* (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.) */
280
281 /* ---------------------------------------------------------------------------
282 * Close button — × icon, top-right of header
283 * ------------------------------------------------------------------------- */
284
285 .desktop-mode-ai__close {
286 display: inline-flex;
287 align-items: center;
288 justify-content: center;
289 width: 28px;
290 height: 28px;
291 appearance: none;
292 background: rgba( 0, 0, 0, 0.05 );
293 border: 1px solid rgba( 0, 0, 0, 0.1 );
294 border-radius: 6px;
295 cursor: pointer;
296 color: #646970;
297 padding: 0;
298 flex-shrink: 0;
299 transition: background 0.1s, color 0.1s, border-color 0.1s;
300 }
301
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;
306 }
307
308 .desktop-mode-ai__close:focus-visible {
309 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
310 outline-offset: 2px;
311 }
312
313 /* ---------------------------------------------------------------------------
314 * Results / conversation area — three render modes:
315 * • Suggestions (empty state, example prompts)
316 * • Thinking (spinner + "Thinking…")
317 * • Response (assistant bubble + entity card | admin links | nothing)
318 * ------------------------------------------------------------------------- */
319
320 .desktop-mode-ai__results {
321 border-top: 1px solid rgba( 0, 0, 0, 0.06 );
322 max-height: 420px;
323 overflow-y: auto;
324 overflow-x: hidden;
325 padding: 14px 16px;
326 display: flex;
327 flex-direction: column;
328 gap: 12px;
329 }
330
331 /* -----------------------------------------------------------------
332 * Suggestion chips (empty state)
333 * ---------------------------------------------------------------- */
334
335 .desktop-mode-ai__suggestions-label {
336 margin: 0 0 4px;
337 font-size: 11px;
338 font-weight: 600;
339 text-transform: uppercase;
340 letter-spacing: 0.08em;
341 color: #8c8f94;
342 }
343
344 .desktop-mode-ai__suggestions-list {
345 display: flex;
346 flex-wrap: wrap;
347 gap: 6px;
348 }
349
350 .desktop-mode-ai__suggestion {
351 appearance: none;
352 border: 1px solid rgba( 0, 0, 0, 0.1 );
353 background: rgba( 0, 0, 0, 0.02 );
354 border-radius: 999px;
355 padding: 5px 12px;
356 font: inherit;
357 font-size: 12px;
358 color: #50575e;
359 cursor: pointer;
360 transition: background 0.12s, border-color 0.12s, color 0.12s;
361 }
362
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 ) );
366 color: var( --wp-admin-theme-color, #2271b1 );
367 }
368
369 /* -----------------------------------------------------------------
370 * Thinking / error state
371 * ---------------------------------------------------------------- */
372
373 .desktop-mode-ai__state {
374 display: flex;
375 align-items: center;
376 gap: 10px;
377 font-size: 13px;
378 color: #646970;
379 }
380
381 .desktop-mode-ai__state--error {
382 color: #d63638;
383 align-items: flex-start;
384 }
385
386 @keyframes desktop-mode-spin {
387 to { transform: rotate( 360deg ); }
388 }
389
390 .desktop-mode-ai__spinner-icon {
391 animation: desktop-mode-spin 0.9s linear infinite;
392 flex-shrink: 0;
393 color: var( --wp-admin-theme-color, #2271b1 );
394 }
395
396 /* -----------------------------------------------------------------
397 * Assistant message bubble — prefix for every response
398 * ---------------------------------------------------------------- */
399
400 .desktop-mode-ai__bubble {
401 display: flex;
402 align-items: flex-start;
403 gap: 10px;
404 }
405
406 .desktop-mode-ai__bubble-icon {
407 flex-shrink: 0;
408 display: flex;
409 align-items: center;
410 justify-content: center;
411 width: 24px;
412 height: 24px;
413 border-radius: 50%;
414 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 12%, #fff );
415 color: var( --wp-admin-theme-color, #2271b1 );
416 }
417
418 .desktop-mode-ai__bubble-text {
419 padding-top: 3px;
420 font-size: 13px;
421 line-height: 1.5;
422 color: #1d2327;
423 flex: 1;
424 min-width: 0;
425 }
426
427 /* Markdown output inside the assistant bubble — the renderer emits
428 <p>, <ul>/<ol>/<li>, <strong>, <em>, <code>, <a>. Reset margins on
429 outer paragraphs so single-paragraph replies (the common case)
430 don't get top/bottom spacing; list items get the usual disc/decimal
431 markers inside a compact indent. */
432 .desktop-mode-ai__bubble-text > p,
433 .desktop-mode-ai__bubble-text > ul,
434 .desktop-mode-ai__bubble-text > ol {
435 margin: 0 0 6px;
436 }
437 .desktop-mode-ai__bubble-text > :last-child {
438 margin-bottom: 0;
439 }
440 .desktop-mode-ai__bubble-text ul,
441 .desktop-mode-ai__bubble-text ol {
442 padding-inline-start: 20px;
443 }
444 .desktop-mode-ai__bubble-text li {
445 margin-bottom: 2px;
446 }
447 .desktop-mode-ai__bubble-text code {
448 background: rgba( 0, 0, 0, 0.05 );
449 padding: 1px 5px;
450 border-radius: 4px;
451 font-family: Menlo, Consolas, monospace;
452 font-size: 11.5px;
453 }
454 .desktop-mode-ai__bubble-text a {
455 color: var( --wp-admin-theme-color, #2271b1 );
456 text-decoration: underline;
457 text-underline-offset: 2px;
458 }
459 .desktop-mode-ai__bubble-text a:hover {
460 text-decoration: none;
461 }
462 .desktop-mode-ai__bubble-text strong {
463 font-weight: 600;
464 color: #1d2327;
465 }
466
467 /* -----------------------------------------------------------------
468 * Entity card — shown under the bubble when answer_type=entity
469 * ---------------------------------------------------------------- */
470
471 .desktop-mode-ai__entity {
472 display: flex;
473 flex-direction: column;
474 gap: 8px;
475 padding: 12px 14px;
476 background: rgba( 0, 0, 0, 0.02 );
477 border: 1px solid rgba( 0, 0, 0, 0.08 );
478 border-radius: 10px;
479 }
480
481 .desktop-mode-ai__entity-header {
482 display: flex;
483 align-items: center;
484 gap: 8px;
485 flex-wrap: wrap;
486 }
487
488 .desktop-mode-ai__entity-topic {
489 display: inline-block;
490 font-size: 10px;
491 font-weight: 600;
492 text-transform: uppercase;
493 letter-spacing: 0.07em;
494 color: var( --wp-admin-theme-color, #2271b1 );
495 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, transparent );
496 padding: 2px 7px;
497 border-radius: 999px;
498 }
499
500 .desktop-mode-ai__entity-type {
501 font-size: 10px;
502 font-weight: 600;
503 text-transform: uppercase;
504 letter-spacing: 0.07em;
505 color: #8c8f94;
506 }
507
508 .desktop-mode-ai__entity-title {
509 margin: 0;
510 font-size: 14px;
511 font-weight: 600;
512 color: #1d2327;
513 line-height: 1.35;
514 }
515
516 .desktop-mode-ai__entity-summary {
517 margin: 0;
518 font-size: 12px;
519 line-height: 1.5;
520 color: #50575e;
521 }
522
523 /* Primary action — opens the entity in a legacy iframe window inside
524 the desktop (wp-admin edit URL). */
525 .desktop-mode-ai__entity-open {
526 appearance: none;
527 display: inline-flex;
528 align-items: center;
529 gap: 6px;
530 align-self: flex-start;
531 padding: 6px 14px;
532 border: none;
533 border-radius: 8px;
534 background: var( --wp-admin-theme-color, #2271b1 );
535 color: #fff;
536 font: inherit;
537 font-size: 12px;
538 font-weight: 500;
539 cursor: pointer;
540 transition: filter 0.1s, transform 0.1s;
541 }
542
543 .desktop-mode-ai__entity-open:hover {
544 filter: brightness( 1.1 );
545 }
546
547 .desktop-mode-ai__entity-open:active {
548 transform: scale( 0.97 );
549 }
550
551 .desktop-mode-ai__entity-open:focus-visible {
552 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
553 outline-offset: 2px;
554 }
555
556 .desktop-mode-ai__entity-open svg {
557 margin-inline-start: 2px;
558 }
559
560 /* -----------------------------------------------------------------
561 * Admin-links list — shown when answer_type=navigation
562 * ---------------------------------------------------------------- */
563
564 .desktop-mode-ai__admin-links {
565 display: flex;
566 flex-direction: column;
567 gap: 6px;
568 }
569
570 .desktop-mode-ai__admin-link {
571 appearance: none;
572 display: flex;
573 align-items: center;
574 gap: 12px;
575 padding: 10px 12px;
576 background: rgba( 0, 0, 0, 0.02 );
577 border: 1px solid rgba( 0, 0, 0, 0.08 );
578 border-radius: 10px;
579 cursor: pointer;
580 text-align: start;
581 font: inherit;
582 color: inherit;
583 transition: background 0.12s, border-color 0.12s, transform 0.08s;
584 }
585
586 .desktop-mode-ai__admin-link:hover {
587 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 6%, #fff );
588 border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, rgba( 0, 0, 0, 0.08 ) );
589 }
590
591 .desktop-mode-ai__admin-link:active {
592 transform: scale( 0.99 );
593 }
594
595 .desktop-mode-ai__admin-link:focus-visible {
596 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
597 outline-offset: 2px;
598 }
599
600 .desktop-mode-ai__admin-link-icon {
601 flex-shrink: 0;
602 display: flex;
603 align-items: center;
604 justify-content: center;
605 width: 32px;
606 height: 32px;
607 font-size: 18px;
608 color: var( --wp-admin-theme-color, #2271b1 );
609 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, #fff );
610 border-radius: 8px;
611 }
612
613 .desktop-mode-ai__admin-link-body {
614 flex: 1;
615 display: flex;
616 flex-direction: column;
617 gap: 2px;
618 min-width: 0;
619 }
620
621 .desktop-mode-ai__admin-link-title {
622 font-size: 13px;
623 font-weight: 600;
624 color: #1d2327;
625 }
626
627 .desktop-mode-ai__admin-link-desc {
628 font-size: 11px;
629 color: #646970;
630 line-height: 1.4;
631 overflow: hidden;
632 text-overflow: ellipsis;
633 white-space: nowrap;
634 }
635
636 .desktop-mode-ai__admin-link-arrow {
637 flex-shrink: 0;
638 color: #c3c4c7;
639 transition: color 0.12s, transform 0.12s;
640 }
641
642 .desktop-mode-ai__admin-link:hover .desktop-mode-ai__admin-link-arrow {
643 color: var( --wp-admin-theme-color, #2271b1 );
644 transform: translateX( 2px );
645 }
646
647 /* -----------------------------------------------------------------
648 * Command palette — shown when the user types "/" in the input.
649 * Filtered list of plugin-registered slash-commands. Mirrors the
650 * admin-link list's visual shape (icon + title + description) but
651 * uses a dedicated set of classes so each can evolve independently.
652 * ---------------------------------------------------------------- */
653
654 .desktop-mode-ai__cmd-list {
655 display: flex;
656 flex-direction: column;
657 gap: 4px;
658 }
659
660 .desktop-mode-ai__cmd-item {
661 appearance: none;
662 display: flex;
663 align-items: flex-start;
664 gap: 10px;
665 padding: 8px 10px;
666 background: transparent;
667 border: 1px solid transparent;
668 border-radius: 8px;
669 cursor: pointer;
670 text-align: start;
671 font: inherit;
672 color: inherit;
673 transition: background 0.1s, border-color 0.1s;
674 }
675
676 /*
677 * Single-line rows (no `.desktop-mode-ai__cmd-desc` child) need the
678 * icon + label baseline-centered instead of top-aligned, otherwise
679 * the label floats to the top of the taller icon tile and reads as
680 * misaligned. `:has()` is widely supported in evergreen browsers the
681 * desktop shell already targets.
682 */
683 .desktop-mode-ai__cmd-item:not(:has(.desktop-mode-ai__cmd-desc)) {
684 align-items: center;
685 }
686
687 .desktop-mode-ai__cmd-item:hover,
688 .desktop-mode-ai__cmd-item.is-selected {
689 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, #fff );
690 border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, rgba( 0, 0, 0, 0.08 ) );
691 }
692
693 /*
694 * When keyboard navigation is driving selection, suppress the :hover
695 * style on rows. Without this, arrowing the cursor past the row that
696 * happens to sit under the mouse pointer paints BOTH rows as active
697 * — the keyboard target from `.is-selected` and the pointer target
698 * from `:hover`. The JS toggles this class on the list container on
699 * ArrowUp/Down and clears it on the next real `mousemove`.
700 */
701 .desktop-mode-ai__cmd-list--kb-nav .desktop-mode-ai__cmd-item:hover {
702 background: transparent;
703 border-color: transparent;
704 }
705 .desktop-mode-ai__cmd-list--kb-nav .desktop-mode-ai__cmd-item.is-selected:hover {
706 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, #fff );
707 border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, rgba( 0, 0, 0, 0.08 ) );
708 }
709
710 .desktop-mode-ai__cmd-item:focus-visible {
711 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
712 outline-offset: 2px;
713 }
714
715 .desktop-mode-ai__cmd-icon {
716 flex-shrink: 0;
717 display: flex;
718 align-items: center;
719 justify-content: center;
720 width: 36px;
721 height: 36px;
722 font-size: 20px;
723 color: var( --wp-admin-theme-color, #2271b1 );
724 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, #fff );
725 border-radius: 7px;
726 }
727
728 /*
729 * Dashicons ship at a 20px baseline; the tile was scaled up but
730 * dashicons glyphs need explicit sizing to follow.
731 */
732 .desktop-mode-ai__cmd-icon.dashicons {
733 font-size: 22px;
734 width: 36px;
735 height: 36px;
736 line-height: 36px;
737 }
738
739 /*
740 * Raw-SVG icon slot (command bridge forwards rendered
741 * `@wordpress/icons` markup). Constrain the inline SVG so it sits
742 * centered inside the tile regardless of the viewBox the source icon
743 * shipped with.
744 */
745 .desktop-mode-ai__cmd-icon--svg svg {
746 width: 24px;
747 height: 24px;
748 fill: currentColor;
749 }
750
751 .desktop-mode-ai__cmd-body {
752 flex: 1;
753 display: flex;
754 flex-direction: column;
755 gap: 2px;
756 min-width: 0;
757 }
758
759 .desktop-mode-ai__cmd-title {
760 font-size: 13px;
761 font-weight: 600;
762 color: #1d2327;
763 font-family: Menlo, Consolas, monospace;
764 letter-spacing: -0.01em;
765 }
766
767 .desktop-mode-ai__cmd-hint {
768 font-weight: 400;
769 color: #8c8f94;
770 font-size: 12px;
771 margin-inline-start: 6px;
772 }
773
774 .desktop-mode-ai__cmd-desc {
775 font-size: 11.5px;
776 color: #646970;
777 line-height: 1.4;
778 font-family: inherit;
779 letter-spacing: 0;
780 }
781
782 /* Args mode — a single row showing the locked-in command. Same
783 visual language as the list item but with an "Enter to run" hint. */
784 .desktop-mode-ai__cmd-active {
785 display: flex;
786 align-items: flex-start;
787 gap: 10px;
788 padding: 10px 12px;
789 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, #fff );
790 border: 1px solid color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 30%, rgba( 0, 0, 0, 0.08 ) );
791 border-radius: 8px;
792 }
793
794 .desktop-mode-ai__cmd-enter-hint {
795 font-size: 11px;
796 color: #646970;
797 margin-top: 2px;
798 font-family: inherit;
799 }
800
801 .desktop-mode-ai__cmd-enter-hint kbd {
802 font-family: inherit;
803 font-size: 10px;
804 padding: 1px 4px;
805 border: 1px solid rgba( 0, 0, 0, 0.12 );
806 border-radius: 3px;
807 background: rgba( 0, 0, 0, 0.03 );
808 color: #646970;
809 }
810
811 /* Suggestion list shown under the locked-in command in args mode.
812 Visually identical to the command picker rows but without the
813 border-highlight — the "active" glow already lives on the command
814 header directly above. */
815 .desktop-mode-ai__cmd-suggest-list {
816 display: flex;
817 flex-direction: column;
818 gap: 2px;
819 margin-top: 6px;
820 }
821
822 .desktop-mode-ai__cmd-suggest-item {
823 appearance: none;
824 display: flex;
825 align-items: flex-start;
826 gap: 10px;
827 padding: 6px 10px;
828 background: transparent;
829 border: 1px solid transparent;
830 border-radius: 6px;
831 cursor: pointer;
832 text-align: start;
833 font: inherit;
834 color: inherit;
835 transition: background 0.1s, border-color 0.1s;
836 }
837
838 .desktop-mode-ai__cmd-suggest-item:hover,
839 .desktop-mode-ai__cmd-suggest-item.is-selected {
840 background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 8%, #fff );
841 border-color: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, rgba( 0, 0, 0, 0.08 ) );
842 }
843
844 .desktop-mode-ai__cmd-suggest-label {
845 font-size: 13px;
846 font-weight: 500;
847 color: #1d2327;
848 }
849
850 /* Empty / "no matches" state for the palette */
851 .desktop-mode-ai__state--empty {
852 color: #8c8f94;
853 font-size: 13px;
854 }
855
856 /* -----------------------------------------------------------------
857 * Continue button (budget-exhausted state)
858 * ---------------------------------------------------------------- */
859
860 .desktop-mode-ai__continue-btn {
861 appearance: none;
862 display: inline-flex;
863 align-items: center;
864 align-self: flex-start;
865 gap: 6px;
866 font: inherit;
867 font-size: 12px;
868 font-weight: 500;
869 padding: 6px 12px;
870 border: 1px dashed rgba( 0, 0, 0, 0.2 );
871 border-radius: 6px;
872 background: transparent;
873 color: #50575e;
874 cursor: pointer;
875 transition: background 0.1s, border-color 0.1s, color 0.1s;
876 }
877
878 .desktop-mode-ai__continue-btn:hover {
879 background: rgba( 0, 0, 0, 0.04 );
880 border-color: rgba( 0, 0, 0, 0.3 );
881 color: #1d2327;
882 }
883