PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 0.9.8
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v0.9.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 / my-wordpress.css

my-wordpress.css in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 0.9.8, at assets/css/my-wordpress.css

2,166 lines 54.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * My WordPress — window-local layout.
3 *
4 * Two-pane file-explorer for browsing WordPress entities. Mirrors the
5 * Recycle Bin and Posts window CSS conventions (`desktop-mode-*`
6 * BEM-ish prefix, container-relative geometry, theming via the
7 * desktop-mode-variables CSS custom properties).
8 *
9 */
10
11 .desktop-mode-my-wordpress {
12 display: flex;
13 flex-direction: column;
14 width: 100%;
15 height: 100%;
16 min-height: 0;
17 font-family: var(
18 --desktop-mode-font,
19 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif
20 );
21 color: var( --desktop-mode-my-wordpress-fg, var( --wpd-fg, #1d2327 ) );
22 /* Window background — separate from the wallpaper bg so the
23 * folder window reads as a real OS window even when the desktop
24 * gradient is dark. Themes / plugins can override
25 * `--desktop-mode-my-wordpress-bg` to repaint just this surface
26 * without touching every other window. */
27 background: var(
28 --desktop-mode-my-wordpress-bg,
29 var( --desktop-mode-window-bg, #fff )
30 );
31 /* Light-context tile color tokens — same recipe as the folder
32 * window. Tiles inside My WordPress paint dark-on-light. */
33 --desktop-mode-tile-fg: var( --desktop-mode-my-wordpress-fg, var( --wpd-fg, #1d2327 ) );
34 --desktop-mode-tile-fg-muted: rgba( 0, 0, 0, 0.55 );
35 --desktop-mode-tile-hover-bg: var(
36 --desktop-mode-hover,
37 rgba( 0, 0, 0, 0.06 )
38 );
39 /* Light-context label rendering — same recipe as the folder
40 * window. Defined as tokens in `variables.css`; the single
41 * `.desktop-mode-file-tile__label` rule reads them for every
42 * surface. */
43 --desktop-mode-tile-label-shadow: none;
44 --desktop-mode-tile-label-weight: 500;
45 --desktop-mode-tile-label-smoothing: antialiased;
46 --desktop-mode-tile-label-color: var( --desktop-mode-my-wordpress-fg, var( --wpd-fg, #1d2327 ) );
47 }
48
49 /* Pinned-icon visual cue — used by `desktop-mode-icon--pinned` (the
50 * generic flag added in 0.8.0). The icon-rail itself owns the
51 * non-draggable invariant; this rule just removes the grab affordance
52 * if the framework ever attaches one in a later phase.
53 */
54 .desktop-mode-icon--pinned {
55 cursor: pointer;
56 }
57
58 /* Breadcrumb header chrome — owned by the shared
59 * `.desktop-mode-breadcrumbs` rules in `desktop-files.css`. No
60 * per-surface duplication. */
61
62 /* ----- Body host ----- */
63
64 .desktop-mode-my-wordpress__body {
65 flex: 1 1 auto;
66 min-height: 0;
67 overflow: hidden;
68 position: relative;
69 display: flex;
70 flex-direction: column;
71 }
72
73 /* List-view toolbar — sits between the breadcrumb header and the
74 * split pane in every entity list view (Posts, Pages, Users, Media).
75 * Holds the server-side search input today; reserved for future
76 * filter / sort controls. Visual treatment mirrors the Content
77 * Graph toolbar's search row so the two surfaces read as the same
78 * control. */
79 .desktop-mode-my-wordpress__list-toolbar {
80 flex: 0 0 auto;
81 display: flex;
82 align-items: center;
83 gap: 8px;
84 padding: 8px 12px;
85 border-bottom: 1px solid var( --wpd-border, #dcdcde );
86 background: transparent;
87 }
88
89 .desktop-mode-my-wordpress__list-toolbar-search {
90 position: relative;
91 flex: 1 1 auto;
92 min-width: 0;
93 max-width: 360px;
94 }
95
96 .desktop-mode-my-wordpress__list-toolbar-search-input {
97 width: 100%;
98 padding: 6px 10px;
99 border: 1px solid var( --wpd-border, #d8dde4 );
100 border-radius: 6px;
101 background: var( --wpd-surface, #fff );
102 color: inherit;
103 font-size: 13px;
104 box-sizing: border-box;
105 }
106
107 .desktop-mode-my-wordpress__list-toolbar-search-input:focus {
108 outline: none;
109 border-color: var( --wpd-accent, #2c6be5 );
110 box-shadow: 0 0 0 3px var( --wpd-accent-soft, rgba( 44, 107, 229, 0.18 ) );
111 }
112
113 /* When the list-toolbar mounts, the split pane needs to claim the
114 * remaining vertical space inside the flex column body — without
115 * this rule it would size to its content (which, for an empty list,
116 * is zero) and the tile canvas would collapse. */
117 .desktop-mode-my-wordpress__body > .desktop-mode-my-wordpress__split {
118 flex: 1 1 auto;
119 min-height: 0;
120 }
121
122 /* Search-in-progress dimming. The previous result set stays in place
123 * (no skeleton flash, no empty intermediate page) but reads as
124 * "stale" until the new page lands and the renderer atomically swaps
125 * the tiles. `pointer-events: none` blocks the user from clicking
126 * a tile that's about to disappear. */
127 .desktop-mode-my-wordpress__tiles--searching,
128 .desktop-mode-my-wordpress__media-grid--searching {
129 opacity: 0.45;
130 pointer-events: none;
131 transition: opacity 0.12s ease-out;
132 }
133
134 /* Reuse the file-system folder window's status-bar element
135 * (`.desktop-mode-folder-status-bar`) so segments render with the
136 * exact same DOM the file-system uses — but retone it for the
137 * white window background. The dark default (white-on-dark) reads
138 * as invisible against `--desktop-mode-window-bg`. */
139 .desktop-mode-my-wordpress > .desktop-mode-folder-status-bar {
140 border-top: 1px solid var( --wpd-border, #dcdcde );
141 background: transparent;
142 color: var( --wpd-fg-muted, #50575e );
143 }
144
145 .desktop-mode-my-wordpress
146 > .desktop-mode-folder-status-bar
147 button.desktop-mode-folder-status-bar__segment:hover {
148 background: var( --desktop-mode-hover, var( --wpd-hover, rgba( 0, 0, 0, 0.06 ) ) );
149 }
150
151 /* ----- Tile canvas (root + entity list) -----
152 *
153 * Both views use the SAME tile element (`.desktop-mode-file-tile`)
154 * the wallpaper uses, so visuals stay 1:1 with the desktop. The
155 * canvas is `position: relative`; tiles are absolute-positioned and
156 * draggable — same interaction pattern as the wallpaper, just
157 * scoped to the window. Positions persist per-window in
158 * `localStorage` (see `createTileLayout` in src/my-wordpress).
159 */
160
161 .desktop-mode-my-wordpress__canvas {
162 position: relative;
163 min-height: 100%;
164 box-sizing: border-box;
165 /* Note — DO NOT add `overflow: auto` here. Scroll is owned by
166 * the surrounding pane (`__list` for entity views, `__body` for
167 * the root view via `__grid` below). A second scroller here
168 * would steal the wheel from the outer pane and break the
169 * IntersectionObserver-based infinite scroll. */
170 }
171
172 .desktop-mode-my-wordpress__grid {
173 height: 100%;
174 overflow-y: scroll;
175 }
176
177 /* Override the wallpaper file-tile palette for in-window context.
178 * On the wallpaper the file tile sits on a dark gradient and uses
179 * white text + a 12% white hover — both of which would be invisible
180 * on a white window background. Inside My WordPress we re-tone the
181 * same element to read on light surfaces. The dimensions / tile
182 * structure are inherited from `.desktop-mode-file-tile`.
183 */
184 .desktop-mode-my-wordpress .desktop-mode-file-tile {
185 /* Color + hover come from `--desktop-mode-tile-*` — see the
186 * scope-level variable overrides on `.desktop-mode-my-wordpress`
187 * above. We only override structural / animation bits here.
188 *
189 * Drop the wallpaper's `transition: transform` — it hints at
190 * GPU compositing in Chrome, and the moment the layer is
191 * composited the label rasterizes against fractional device
192 * pixels (sub-pixel blur on HiDPI). We don't animate transform
193 * here, so the transition is dead code anyway. */
194 transition: background-color 0.15s ease;
195 transform: none;
196 }
197
198 /* Selected state for every tile in My WordPress is rendered by
199 * the canonical `.desktop-mode-file-tile--selected` rule in
200 * `desktop-files.css` — same accent border + tinted background
201 * the folder windows + wallpaper tiles use. No section-specific
202 * override here — visual parity across the whole shell.
203 */
204
205 /* Lock state — another user is currently editing this post. We dim
206 * the tile a touch and overlay a small dashicon-lock badge on the
207 * top-right of the icon. The whole tile stays clickable; the lock
208 * is just a visual heads-up so the user knows the takeover dialog
209 * is coming if they double-click. */
210 .desktop-mode-my-wordpress__tile--locked {
211 opacity: 0.85;
212 }
213
214 .desktop-mode-my-wordpress__tile-lock {
215 position: absolute;
216 top: 4px;
217 inset-inline-end: 14px;
218 width: 18px;
219 height: 18px;
220 font-size: 12px;
221 line-height: 18px;
222 text-align: center;
223 border-radius: 50%;
224 background: var( --desktop-mode-danger, var( --wpd-danger, #b32d2e ) );
225 color: var( --wpd-fg-on-accent, #fff );
226 box-shadow:
227 0 0 0 1.5px rgba( 0, 0, 0, 0.4 ),
228 0 1px 3px rgba( 0, 0, 0, 0.35 );
229 pointer-events: none;
230 }
231
232 /* Tooltip lock banner — shown above the excerpt when present. */
233 .desktop-mode-my-wordpress__tooltip-lock {
234 display: flex;
235 align-items: center;
236 gap: 6px;
237 margin: 0 0 8px;
238 padding: 6px 8px;
239 border-radius: 4px;
240 background: rgba( 179, 45, 46, 0.08 );
241 color: var( --desktop-mode-danger, var( --wpd-danger, #b32d2e ) );
242 font-size: 12px;
243 font-weight: 600;
244 }
245
246 .desktop-mode-my-wordpress__tooltip-lock .dashicons {
247 font-size: 14px;
248 width: 14px;
249 height: 14px;
250 }
251
252 /* Plain two-line clamp without `-webkit-line-clamp`. The webkit
253 * variant promotes the label to its own composited layer, which on
254 * HiDPI screens snaps text to fractional device pixels and renders
255 * blurry. `max-height: 2 × line-height` + `overflow: hidden` looks
256 * the same and stays sharp.
257 */
258 .desktop-mode-my-wordpress__tile .desktop-mode-file-tile__label {
259 font-size: 12px;
260 line-height: 1.3;
261 max-height: calc( 1.3em * 2 );
262 text-align: center;
263 overflow: hidden;
264 max-width: 100%;
265 word-break: break-word;
266 }
267
268 /* ----- Entity list: two-pane split ----- */
269
270 .desktop-mode-my-wordpress__split {
271 display: grid;
272 grid-template-columns: minmax( 240px, 60% ) minmax( 0, 1fr );
273 height: 100%;
274 min-height: 0;
275 }
276
277 .desktop-mode-my-wordpress__list {
278 overflow-y: scroll;
279 border-inline-end: 1px solid var( --wpd-border, #dcdcde );
280 min-width: 0;
281 }
282
283 /* Always-visible scrollbar styling for the icon canvases. macOS
284 * defaults to overlay scrollbars that hide until a wheel/scroll
285 * event — fine for documents but actively confusing on a tile
286 * canvas where the user can't tell whether more icons live below
287 * or to the right. We force the scrollbar to render at all times
288 * via `::-webkit-scrollbar` (works in WebKit / Blink / Edge), and
289 * the explicit `scrollbar-width: thin` covers Firefox. */
290 .desktop-mode-my-wordpress__list,
291 .desktop-mode-my-wordpress__grid {
292 scrollbar-width: thin;
293 scrollbar-color: rgba( 0, 0, 0, 0.25 ) transparent;
294 }
295
296 .desktop-mode-my-wordpress__list::-webkit-scrollbar,
297 .desktop-mode-my-wordpress__grid::-webkit-scrollbar {
298 width: 12px;
299 height: 12px;
300 }
301
302 .desktop-mode-my-wordpress__list::-webkit-scrollbar-thumb,
303 .desktop-mode-my-wordpress__grid::-webkit-scrollbar-thumb {
304 background: var( --wpd-scrim, rgba( 0, 0, 0, 0.25 ) );
305 border-radius: 6px;
306 border: 3px solid transparent;
307 background-clip: padding-box;
308 }
309
310 .desktop-mode-my-wordpress__list::-webkit-scrollbar-thumb:hover,
311 .desktop-mode-my-wordpress__grid::-webkit-scrollbar-thumb:hover {
312 background: var( --wpd-scrim, rgba( 0, 0, 0, 0.4 ) );
313 background-clip: padding-box;
314 }
315
316 .desktop-mode-my-wordpress__list::-webkit-scrollbar-track,
317 .desktop-mode-my-wordpress__grid::-webkit-scrollbar-track {
318 background: transparent;
319 }
320
321 .desktop-mode-my-wordpress__sentinel {
322 height: 1px;
323 }
324
325 /* Tile-grid loading skeleton — placeholder tiles that mimic the
326 * icon + label shape of what's about to load. We dropped the
327 * spinning WordPress mark here because it read as an alien
328 * affordance inside the file-explorer surface; a skeleton signals
329 * "tiles are landing in these slots" instead of "the system is
330 * busy doing something opaque."
331 *
332 * Each placeholder is parented directly to the positioned canvas
333 * (`__canvas--positioned`) and `position: absolute` at the
334 * (left, top) the next real tile will occupy — see
335 * `layout.peekNextCells()` and `showLoadingSkeleton()` in
336 * `src/my-wordpress/index.ts`. Per-tile shimmer delay and label
337 * width are inlined so a row of placeholders reads as a cascade,
338 * not a uniform pulse.
339 *
340 * Tile dimensions mirror the real `.desktop-mode-file-tile` width
341 * so a placeholder sits cleanly in the cell its successor will
342 * inherit.
343 */
344 .desktop-mode-my-wordpress__skeleton-tile {
345 position: absolute;
346 display: flex;
347 flex-direction: column;
348 align-items: center;
349 gap: 6px;
350 width: 88px;
351 padding: 8px 4px;
352 box-sizing: border-box;
353 pointer-events: none;
354 }
355
356 .desktop-mode-my-wordpress__skeleton-icon,
357 .desktop-mode-my-wordpress__skeleton-label {
358 background: linear-gradient(
359 90deg,
360 var( --desktop-mode-skeleton-low, var( --wpd-hover, rgba( 0, 0, 0, 0.05 ) ) ) 0%,
361 var( --desktop-mode-skeleton-high, var( --wpd-hover, rgba( 0, 0, 0, 0.13 ) ) ) 50%,
362 var( --desktop-mode-skeleton-low, var( --wpd-hover, rgba( 0, 0, 0, 0.05 ) ) ) 100%
363 );
364 background-size: 200% 100%;
365 animation: desktop-mode-my-wordpress-skeleton-shimmer 1.4s ease-in-out
366 var( --desktop-mode-skeleton-delay, 0s ) infinite;
367 }
368
369 .desktop-mode-my-wordpress__skeleton-icon {
370 width: 44px;
371 height: 44px;
372 border-radius: 10px;
373 }
374
375 .desktop-mode-my-wordpress__skeleton-label {
376 width: 72%;
377 height: 10px;
378 border-radius: 4px;
379 }
380
381 @keyframes desktop-mode-my-wordpress-skeleton-shimmer {
382 from {
383 background-position: 200% 0;
384 }
385 to {
386 background-position: -200% 0;
387 }
388 }
389
390 @media ( prefers-reduced-motion: reduce ) {
391 .desktop-mode-my-wordpress__skeleton-icon,
392 .desktop-mode-my-wordpress__skeleton-label {
393 animation: none;
394 }
395 }
396
397 /* ----- Right pane: preview ----- */
398
399 .desktop-mode-my-wordpress__preview {
400 overflow: auto;
401 min-width: 0;
402 background: transparent;
403 }
404
405 .desktop-mode-my-wordpress__preview-empty {
406 display: flex;
407 align-items: center;
408 justify-content: center;
409 height: 100%;
410 color: var( --wpd-fg-muted, #787c82 );
411 font-size: 13px;
412 padding: 24px;
413 text-align: center;
414 }
415
416 .desktop-mode-my-wordpress__preview-loading {
417 display: flex;
418 align-items: center;
419 justify-content: center;
420 height: 100%;
421 min-height: 320px;
422 padding: 32px;
423 box-sizing: border-box;
424 }
425
426 /* Preview-pane loader — same scale curve as the tile-grid first
427 * spinner and the window-loading overlay. The JS used to hard-code
428 * `size="128"`, which set an inline `--wpd-spinner-size` that
429 * overrode any CSS knob; the size attribute is now omitted so this
430 * rule is the single source of truth for both the My WordPress
431 * preview and the wallpaper file-preview pane (which reuses this
432 * class deliberately).
433 */
434 .desktop-mode-my-wordpress__preview-loading wpd-spinner {
435 --wpd-spinner-size: clamp( 96px, 14vw, 192px );
436 }
437
438 .desktop-mode-my-wordpress__article {
439 padding: 24px 32px;
440 max-width: 720px;
441 margin: 0 auto;
442 }
443
444 .desktop-mode-my-wordpress__article-title {
445 font-size: 22px;
446 margin: 0 0 8px;
447 line-height: 1.3;
448 }
449
450 .desktop-mode-my-wordpress__article-meta {
451 margin: 0 0 16px;
452 color: var( --wpd-fg-muted, #50575e );
453 font-size: 12px;
454 }
455
456 .desktop-mode-my-wordpress__article-hero {
457 width: 100%;
458 height: auto;
459 border-radius: 6px;
460 margin-bottom: 16px;
461 display: block;
462 }
463
464 .desktop-mode-my-wordpress__article-content {
465 font-size: 14px;
466 line-height: 1.6;
467 }
468
469 .desktop-mode-my-wordpress__article-content img {
470 max-width: 100%;
471 height: auto;
472 }
473
474 .desktop-mode-my-wordpress__article-footer {
475 margin-top: 24px;
476 padding-top: 16px;
477 border-top: 1px solid var( --wpd-border, #dcdcde );
478 display: flex;
479 justify-content: flex-end;
480 align-items: center;
481 gap: 8px;
482 flex-wrap: wrap;
483 }
484
485 /* ----- Empty / error states ----- */
486
487 .desktop-mode-my-wordpress__empty,
488 .desktop-mode-my-wordpress__error {
489 padding: 32px 24px;
490 text-align: center;
491 color: var( --wpd-fg-muted, #787c82 );
492 font-size: 13px;
493 }
494
495 .desktop-mode-my-wordpress__error {
496 color: var( --desktop-mode-danger, var( --wpd-danger, #b32d2e ) );
497 }
498
499 /* ----- Hover tooltip (floats over body) ----- */
500
501 .desktop-mode-my-wordpress__tooltip {
502 position: fixed;
503 z-index: 100000;
504 max-width: 320px;
505 background: var(
506 --desktop-mode-tooltip-bg,
507 var( --desktop-mode-surface, var( --wpd-surface, #fff ) )
508 );
509 color: var(
510 --desktop-mode-tooltip-fg,
511 var( --desktop-mode-fg, #1d2327 )
512 );
513 border: 1px solid var( --wpd-border, #dcdcde );
514 border-radius: 6px;
515 padding: 12px;
516 box-shadow: 0 6px 24px rgba( 0, 0, 0, 0.18 );
517 font-size: 12px;
518 pointer-events: none;
519 }
520
521 .desktop-mode-my-wordpress__tooltip-title {
522 font-weight: 600;
523 margin-bottom: 6px;
524 font-size: 13px;
525 }
526
527 .desktop-mode-my-wordpress__tooltip-thumb {
528 display: block;
529 max-width: 100%;
530 height: auto;
531 border-radius: 4px;
532 margin: 6px 0;
533 }
534
535 .desktop-mode-my-wordpress__tooltip-excerpt {
536 margin: 0;
537 color: var( --wpd-fg-muted, #50575e );
538 line-height: 1.4;
539 }
540
541 /* ----- Context menu host ----- */
542
543 .desktop-mode-my-wordpress__menu {
544 position: fixed;
545 z-index: 100001;
546 }
547
548 /* ---------------------------------------------------------------
549 * User dossier — right-pane preview when a person is selected.
550 * Header (avatar + name + roles + links), bio, stat cards row,
551 * 12-month activity sparkline, milestones, recent posts, top
552 * categories. Designed to fit comfortably on a 360px-wide pane
553 * but to stretch nicely up to ~720px before the line-length stops
554 * helping readability.
555 * --------------------------------------------------------------- */
556
557 .desktop-mode-my-wordpress__user {
558 max-width: 720px;
559 }
560
561 .desktop-mode-my-wordpress__user-header {
562 display: flex;
563 gap: 16px;
564 align-items: center;
565 margin-bottom: 16px;
566 }
567
568 .desktop-mode-my-wordpress__user-avatar {
569 width: 96px;
570 height: 96px;
571 border-radius: 50%;
572 flex-shrink: 0;
573 box-shadow: 0 2px 8px rgba( 0, 0, 0, 0.12 );
574 }
575
576 .desktop-mode-my-wordpress__user-headline {
577 flex: 1 1 auto;
578 min-width: 0;
579 }
580
581 .desktop-mode-my-wordpress__user
582 .desktop-mode-my-wordpress__article-title {
583 margin: 0 0 4px;
584 }
585
586 .desktop-mode-my-wordpress__user-roles {
587 display: flex;
588 flex-wrap: wrap;
589 gap: 6px;
590 margin-bottom: 6px;
591 }
592
593 .desktop-mode-my-wordpress__user-role {
594 display: inline-flex;
595 align-items: center;
596 padding: 2px 8px;
597 border-radius: 10px;
598 font-size: 11px;
599 font-weight: 600;
600 text-transform: uppercase;
601 letter-spacing: 0.04em;
602 background: rgba( 34, 113, 177, 0.12 );
603 color: var( --wp-admin-theme-color, #2271b1 );
604 }
605
606 .desktop-mode-my-wordpress__user-links {
607 display: flex;
608 gap: 12px;
609 font-size: 12px;
610 }
611
612 .desktop-mode-my-wordpress__user-links a {
613 color: var( --desktop-mode-link, var( --wpd-accent, #2271b1 ) );
614 text-decoration: none;
615 }
616
617 .desktop-mode-my-wordpress__user-links a:hover {
618 text-decoration: underline;
619 }
620
621 .desktop-mode-my-wordpress__user-bio {
622 font-size: 14px;
623 line-height: 1.5;
624 color: var( --desktop-mode-fg, #1d2327 );
625 margin: 0 0 16px;
626 padding-left: 12px;
627 border-left: 3px solid var( --wpd-border, #dcdcde );
628 }
629
630 /* ----- Stat cards row ----- */
631
632 .desktop-mode-my-wordpress__user-stats {
633 display: grid;
634 grid-template-columns: repeat( auto-fit, minmax( 120px, 1fr ) );
635 gap: 8px;
636 margin-bottom: 20px;
637 }
638
639 .desktop-mode-my-wordpress__user-stat {
640 display: flex;
641 flex-direction: column;
642 gap: 2px;
643 padding: 12px 14px;
644 border-radius: 8px;
645 background: var( --desktop-mode-hover, var( --wpd-hover, rgba( 0, 0, 0, 0.04 ) ) );
646 border: 1px solid var( --wpd-border, #dcdcde );
647 }
648
649 .desktop-mode-my-wordpress__user-stat-value {
650 font-size: 26px;
651 font-weight: 700;
652 line-height: 1.1;
653 color: var( --wp-admin-theme-color, #2271b1 );
654 font-variant-numeric: tabular-nums;
655 }
656
657 .desktop-mode-my-wordpress__user-stat-label {
658 font-size: 12px;
659 color: var( --wpd-fg-muted, #50575e );
660 text-transform: uppercase;
661 letter-spacing: 0.04em;
662 }
663
664 .desktop-mode-my-wordpress__user-stat-caption {
665 font-size: 11px;
666 color: var( --wpd-fg-muted, #787c82 );
667 }
668
669 /* ----- 12-month activity sparkline ----- */
670
671 .desktop-mode-my-wordpress__user-section {
672 margin-bottom: 20px;
673 }
674
675 .desktop-mode-my-wordpress__user-section h3 {
676 font-size: 13px;
677 font-weight: 600;
678 color: var( --wpd-fg-muted, #50575e );
679 text-transform: uppercase;
680 letter-spacing: 0.04em;
681 margin: 0 0 8px;
682 }
683
684 .desktop-mode-my-wordpress__user-spark-chart {
685 display: grid;
686 grid-template-columns: repeat( 12, 1fr );
687 gap: 4px;
688 height: 80px;
689 align-items: end;
690 padding: 6px 0;
691 }
692
693 .desktop-mode-my-wordpress__user-spark-col {
694 display: flex;
695 flex-direction: column;
696 align-items: stretch;
697 justify-content: flex-end;
698 gap: 4px;
699 height: 100%;
700 min-height: 0;
701 }
702
703 .desktop-mode-my-wordpress__user-spark-bar {
704 background: linear-gradient(
705 180deg,
706 var( --wp-admin-theme-color, #2271b1 ) 0%,
707 rgba( 34, 113, 177, 0.55 ) 100%
708 );
709 border-radius: 3px 3px 0 0;
710 min-height: 2px;
711 transition: height 0.3s ease;
712 }
713
714 .desktop-mode-my-wordpress__user-spark-bar--empty {
715 background: var( --wpd-border, #dcdcde );
716 min-height: 2px;
717 height: 2px !important;
718 }
719
720 .desktop-mode-my-wordpress__user-spark-label {
721 font-size: 10px;
722 text-align: center;
723 color: var( --wpd-fg-muted, #787c82 );
724 }
725
726 /* ----- Milestones ----- */
727
728 .desktop-mode-my-wordpress__user-milestones {
729 display: grid;
730 grid-template-columns: repeat( auto-fit, minmax( 140px, 1fr ) );
731 gap: 12px;
732 margin: 0 0 20px;
733 }
734
735 .desktop-mode-my-wordpress__user-milestones dt {
736 font-size: 11px;
737 color: var( --wpd-fg-muted, #50575e );
738 text-transform: uppercase;
739 letter-spacing: 0.04em;
740 margin-bottom: 2px;
741 }
742
743 .desktop-mode-my-wordpress__user-milestones dd {
744 font-size: 14px;
745 font-weight: 600;
746 margin: 0;
747 }
748
749 /* ----- Recent posts list ----- */
750
751 .desktop-mode-my-wordpress__user-recent {
752 list-style: none;
753 margin: 0;
754 padding: 0;
755 display: flex;
756 flex-direction: column;
757 gap: 6px;
758 }
759
760 .desktop-mode-my-wordpress__user-recent li {
761 display: flex;
762 flex-direction: column;
763 gap: 2px;
764 padding: 8px 10px;
765 border-radius: 6px;
766 background: var( --wpd-hover, rgba( 0, 0, 0, 0.02 ) );
767 }
768
769 .desktop-mode-my-wordpress__user-recent a {
770 font-weight: 600;
771 color: var( --desktop-mode-link, var( --wpd-accent, #2271b1 ) );
772 text-decoration: none;
773 }
774
775 .desktop-mode-my-wordpress__user-recent a:hover {
776 text-decoration: underline;
777 }
778
779 .desktop-mode-my-wordpress__user-recent-meta {
780 font-size: 11px;
781 color: var( --wpd-fg-muted, #787c82 );
782 }
783
784 /* ----- Top categories chips ----- */
785
786 .desktop-mode-my-wordpress__user-chips {
787 display: flex;
788 flex-wrap: wrap;
789 gap: 6px;
790 }
791
792 .desktop-mode-my-wordpress__user-chip {
793 display: inline-flex;
794 align-items: center;
795 gap: 6px;
796 padding: 4px 10px;
797 border-radius: 999px;
798 font-size: 12px;
799 background: var( --wpd-hover, rgba( 0, 0, 0, 0.05 ) );
800 border: 1px solid var( --wpd-border, #dcdcde );
801 }
802
803 .desktop-mode-my-wordpress__user-chip--tag {
804 background: rgba( 124, 58, 237, 0.08 );
805 border-color: rgba( 124, 58, 237, 0.25 );
806 }
807
808 .desktop-mode-my-wordpress__user-chip-count {
809 font-weight: 700;
810 color: var( --wp-admin-theme-color, #2271b1 );
811 font-variant-numeric: tabular-nums;
812 }
813
814 /* ---------------------------------------------------------------
815 * Term dossier — same skeleton as the user dossier (header, stat
816 * cards, sparkline, milestones, recent list, chips) plus a few
817 * term-specific bits below: a colored taxonomy icon medallion in
818 * the header, role badge variants for category vs tag, and a
819 * "Top contributors" grid that pairs an author avatar with a
820 * post count.
821 * --------------------------------------------------------------- */
822
823 .desktop-mode-my-wordpress__term-header {
824 display: flex;
825 align-items: center;
826 gap: 16px;
827 margin-bottom: 16px;
828 }
829
830 .desktop-mode-my-wordpress__term-icon {
831 width: 64px;
832 height: 64px;
833 border-radius: 12px;
834 display: inline-flex;
835 align-items: center;
836 justify-content: center;
837 flex-shrink: 0;
838 color: var( --wpd-fg-on-accent, #fff );
839 }
840
841 .desktop-mode-my-wordpress__term-icon--category {
842 background: linear-gradient( 135deg, var( --wpd-accent, #2271b1 ) 0%, var( --wpd-accent-strong, #135e96 ) 100% );
843 box-shadow: 0 4px 12px rgba( 34, 113, 177, 0.32 );
844 }
845
846 .desktop-mode-my-wordpress__term-icon--tag {
847 background: linear-gradient( 135deg, #7c3aed 0%, #5b21b6 100% );
848 box-shadow: 0 4px 12px rgba( 124, 58, 237, 0.32 );
849 }
850
851 .desktop-mode-my-wordpress__user-role--category {
852 background: rgba( 34, 113, 177, 0.12 );
853 color: var( --wpd-accent-strong, #135e96 );
854 }
855
856 .desktop-mode-my-wordpress__user-role--tag {
857 background: rgba( 124, 58, 237, 0.12 );
858 color: #6d28d9;
859 }
860
861 /* Top contributors row — paired avatar + name + post count. */
862 .desktop-mode-my-wordpress__term-authors {
863 display: grid;
864 grid-template-columns: repeat( auto-fit, minmax( 180px, 1fr ) );
865 gap: 8px;
866 }
867
868 .desktop-mode-my-wordpress__term-author {
869 display: flex;
870 align-items: center;
871 gap: 10px;
872 padding: 8px 12px;
873 border-radius: 8px;
874 background: var( --wpd-hover, rgba( 0, 0, 0, 0.03 ) );
875 border: 1px solid var( --wpd-border, #dcdcde );
876 }
877
878 .desktop-mode-my-wordpress__term-author-avatar {
879 width: 36px;
880 height: 36px;
881 border-radius: 50%;
882 flex-shrink: 0;
883 }
884
885 .desktop-mode-my-wordpress__term-author-text {
886 display: flex;
887 flex-direction: column;
888 gap: 2px;
889 min-width: 0;
890 }
891
892 .desktop-mode-my-wordpress__term-author-name {
893 font-weight: 600;
894 font-size: 13px;
895 overflow: hidden;
896 text-overflow: ellipsis;
897 white-space: nowrap;
898 }
899
900 .desktop-mode-my-wordpress__term-author-count {
901 font-size: 11px;
902 color: var( --wpd-fg-muted, #50575e );
903 }
904
905 /* ---------------------------------------------------------------
906 * Comment dossier — header (avatar + name + status / date / count
907 * badges + author archive / website / moderate links), optional
908 * "in reply to" quote, the comment body, parent-post card,
909 * direct-reply thread, and a moderation strip (IP + user agent)
910 * for users with moderate_comments.
911 * --------------------------------------------------------------- */
912
913 .desktop-mode-my-wordpress__comment-status--approved {
914 background: rgba( 34, 113, 177, 0.12 );
915 color: var( --wpd-accent-strong, #135e96 );
916 }
917
918 .desktop-mode-my-wordpress__comment-status--pending {
919 background: rgba( 217, 119, 6, 0.16 );
920 color: #b45309;
921 }
922
923 .desktop-mode-my-wordpress__comment-status--spam {
924 background: rgba( 179, 45, 46, 0.14 );
925 color: var( --wpd-danger-hover, #b32d2e );
926 }
927
928 .desktop-mode-my-wordpress__comment-status--trash {
929 background: var( --wpd-hover, rgba( 0, 0, 0, 0.08 ) );
930 color: var( --wpd-fg-muted, #50575e );
931 }
932
933 .desktop-mode-my-wordpress__comment-date-badge {
934 background: transparent;
935 color: var( --wpd-fg-muted, #50575e );
936 border: 1px solid var( --wpd-border, #dcdcde );
937 text-transform: none;
938 letter-spacing: normal;
939 }
940
941 /* "In reply to ..." quote shown above the comment body when this
942 * is a thread reply. */
943 .desktop-mode-my-wordpress__comment-quote {
944 margin: 0 0 16px;
945 padding: 10px 14px;
946 border-left: 3px solid var( --wp-admin-theme-color, #2271b1 );
947 background: rgba( 34, 113, 177, 0.06 );
948 border-radius: 0 6px 6px 0;
949 font-size: 13px;
950 }
951
952 .desktop-mode-my-wordpress__comment-quote-lead {
953 font-size: 11px;
954 font-weight: 600;
955 color: var( --wpd-fg-muted, #50575e );
956 text-transform: uppercase;
957 letter-spacing: 0.04em;
958 margin-bottom: 4px;
959 }
960
961 .desktop-mode-my-wordpress__comment-quote p {
962 margin: 0;
963 color: var( --desktop-mode-fg, #1d2327 );
964 }
965
966 /* Comment body — same style as article-content but with a soft
967 * card background so it reads as the focal element. */
968 .desktop-mode-my-wordpress__comment-body {
969 padding: 14px 16px;
970 background: var( --wpd-hover, rgba( 0, 0, 0, 0.03 ) );
971 border-radius: 8px;
972 border: 1px solid var( --wpd-border, #dcdcde );
973 }
974
975 /* Parent-post card under the comment body. */
976 .desktop-mode-my-wordpress__comment-post {
977 display: flex;
978 flex-direction: column;
979 gap: 4px;
980 padding: 10px 14px;
981 border-radius: 8px;
982 background: var( --wpd-hover, rgba( 0, 0, 0, 0.04 ) );
983 border: 1px solid var( --wpd-border, #dcdcde );
984 }
985
986 .desktop-mode-my-wordpress__comment-post-title {
987 font-weight: 600;
988 color: var( --desktop-mode-link, var( --wpd-accent, #2271b1 ) );
989 text-decoration: none;
990 }
991
992 .desktop-mode-my-wordpress__comment-post-title:hover {
993 text-decoration: underline;
994 }
995
996 .desktop-mode-my-wordpress__comment-post-meta {
997 font-size: 11px;
998 color: var( --wpd-fg-muted, #787c82 );
999 }
1000
1001 /* Replies list. */
1002 .desktop-mode-my-wordpress__comment-replies {
1003 list-style: none;
1004 margin: 0;
1005 padding: 0;
1006 display: flex;
1007 flex-direction: column;
1008 gap: 10px;
1009 }
1010
1011 .desktop-mode-my-wordpress__comment-reply {
1012 display: flex;
1013 gap: 10px;
1014 align-items: flex-start;
1015 padding: 10px 12px;
1016 border-radius: 8px;
1017 background: var( --wpd-hover, rgba( 0, 0, 0, 0.02 ) );
1018 border: 1px solid var( --wpd-border, #dcdcde );
1019 }
1020
1021 .desktop-mode-my-wordpress__comment-reply-avatar {
1022 width: 32px;
1023 height: 32px;
1024 border-radius: 50%;
1025 flex-shrink: 0;
1026 }
1027
1028 .desktop-mode-my-wordpress__comment-reply-text {
1029 display: flex;
1030 flex-direction: column;
1031 gap: 2px;
1032 min-width: 0;
1033 }
1034
1035 .desktop-mode-my-wordpress__comment-reply-head {
1036 display: flex;
1037 align-items: baseline;
1038 gap: 8px;
1039 flex-wrap: wrap;
1040 }
1041
1042 .desktop-mode-my-wordpress__comment-reply-name {
1043 font-weight: 600;
1044 font-size: 13px;
1045 }
1046
1047 .desktop-mode-my-wordpress__comment-reply-when {
1048 font-size: 11px;
1049 color: var( --wpd-fg-muted, #787c82 );
1050 }
1051
1052 .desktop-mode-my-wordpress__comment-reply-excerpt {
1053 margin: 0;
1054 font-size: 13px;
1055 color: var( --desktop-mode-fg, #1d2327 );
1056 line-height: 1.45;
1057 }
1058
1059 /* =================================================================== *
1060 * USERS — list tiles + activity footprint surface.
1061 *
1062 * The Users folder reuses the same canvas + 96×92 tile grid the
1063 * post tiles use; the user-tile content (avatar circle + label +
1064 * small sub-line) fits inside the cell. The "View activity
1065 * footprint" surface is a full-width body view (no split pane)
1066 * with hero / stats / heatmap / rhythm / timeline.
1067 *
1068 * Since 0.20.0.
1069 * =================================================================== */
1070
1071 /* User tile — replaces the dashicon glyph with a real avatar */
1072 .desktop-mode-my-wordpress__tile--user {
1073 display: flex;
1074 flex-direction: column;
1075 align-items: center;
1076 justify-content: flex-start;
1077 gap: 4px;
1078 padding: 8px 4px 6px;
1079 box-sizing: border-box;
1080 }
1081
1082 .desktop-mode-my-wordpress__user-tile-avatar {
1083 display: inline-flex;
1084 align-items: center;
1085 justify-content: center;
1086 width: 44px;
1087 height: 44px;
1088 border-radius: 50%;
1089 overflow: hidden;
1090 background: linear-gradient(
1091 135deg,
1092 rgba( 34, 113, 177, 0.18 ),
1093 rgba( 34, 113, 177, 0.04 )
1094 );
1095 box-shadow:
1096 inset 0 0 0 1px rgba( 0, 0, 0, 0.08 ),
1097 0 2px 6px rgba( 0, 0, 0, 0.08 );
1098 flex: 0 0 auto;
1099 }
1100
1101 .desktop-mode-my-wordpress__user-tile-avatar img {
1102 width: 100%;
1103 height: 100%;
1104 object-fit: cover;
1105 display: block;
1106 }
1107
1108 .desktop-mode-my-wordpress__user-tile-initials {
1109 font-weight: 600;
1110 font-size: 14px;
1111 letter-spacing: 0.02em;
1112 color: var( --wp-admin-theme-color, #2271b1 );
1113 text-transform: uppercase;
1114 }
1115
1116 /* Single-line label for user tiles — we already have a generic
1117 * label clamp, but the user variant gets only ONE line so the
1118 * sub-line ("Editor · 12 posts") can fit beneath it. */
1119 .desktop-mode-my-wordpress__tile--user .desktop-mode-file-tile__label {
1120 font-size: 11px;
1121 font-weight: 500;
1122 line-height: 1.25;
1123 max-height: 1.25em;
1124 white-space: nowrap;
1125 overflow: hidden;
1126 text-overflow: ellipsis;
1127 width: 100%;
1128 padding: 0 4px;
1129 box-sizing: border-box;
1130 }
1131
1132 .desktop-mode-my-wordpress__user-tile-sub {
1133 font-size: 10px;
1134 line-height: 1.2;
1135 color: var( --desktop-mode-tile-fg-muted, rgba( 0, 0, 0, 0.55 ) );
1136 max-height: 1.2em;
1137 white-space: nowrap;
1138 overflow: hidden;
1139 text-overflow: ellipsis;
1140 width: 100%;
1141 text-align: center;
1142 padding: 0 4px;
1143 box-sizing: border-box;
1144 }
1145
1146 /* Selected/hover user tiles inherit the same chrome the post tiles
1147 * use — see `.desktop-mode-my-wordpress__tile--selected` above. */
1148
1149 /* ----- Activity footprint — full-width body surface -----
1150 *
1151 * Opens via the right-click context menu on a user tile (or the
1152 * dossier's "View activity footprint" button). Replaces the split
1153 * list/preview with a wide canvas so each section gets enough room
1154 * to read.
1155 */
1156
1157 .desktop-mode-my-wordpress__footprint {
1158 display: flex;
1159 flex-direction: column;
1160 gap: 20px;
1161 padding: 24px 28px 32px;
1162 box-sizing: border-box;
1163 overflow-y: auto;
1164 height: 100%;
1165 /* Scroll container spans the full window width so wheel + touch
1166 * scroll work no matter where the pointer is — including in the
1167 * empty margins to the left / right of the content. The 1080px
1168 * cap is applied to each immediate child instead (below). */
1169 align-items: center;
1170 }
1171
1172 .desktop-mode-my-wordpress__footprint > * {
1173 width: 100%;
1174 max-width: 1080px;
1175 }
1176
1177 .desktop-mode-my-wordpress__footprint-section {
1178 border: 1px solid var( --wpd-border, #dcdcde );
1179 border-radius: 12px;
1180 padding: 18px 20px;
1181 background: var(
1182 --desktop-mode-my-wordpress-surface,
1183 var( --desktop-mode-surface, var( --wpd-surface, rgba( 255, 255, 255, 0.6 ) ) )
1184 );
1185 box-shadow: 0 1px 2px rgba( 0, 0, 0, 0.04 );
1186 /* The parent `.__footprint` is a flex column with `overflow-y:
1187 * auto`. Flex items default to `flex-shrink: 1`, so each section
1188 * would compress along the column axis when the combined natural
1189 * height exceeds the container — clipping the calendar heatmap
1190 * (the calendar section also sets `overflow-x: auto`, which
1191 * doesn't surface a vertical scrollbar). Lock the intrinsic
1192 * height so the parent scroller, not the children, handles the
1193 * overflow. */
1194 flex: 0 0 auto;
1195 }
1196
1197 .desktop-mode-my-wordpress__footprint-section h3 {
1198 margin: 0 0 12px;
1199 font-size: 13px;
1200 font-weight: 600;
1201 letter-spacing: 0.04em;
1202 text-transform: uppercase;
1203 color: var( --wpd-fg-muted, #50575e );
1204 }
1205
1206 /* ----- Hero ----- */
1207
1208 .desktop-mode-my-wordpress__footprint-hero {
1209 display: flex;
1210 gap: 20px;
1211 align-items: center;
1212 padding: 24px;
1213 border-radius: 16px;
1214 background: linear-gradient(
1215 135deg,
1216 rgba( 34, 113, 177, 0.10 ) 0%,
1217 rgba( 34, 113, 177, 0.02 ) 60%,
1218 transparent 100%
1219 );
1220 border: 1px solid var( --wpd-border, #dcdcde );
1221 }
1222
1223 .desktop-mode-my-wordpress__footprint-avatar {
1224 width: 112px;
1225 height: 112px;
1226 border-radius: 50%;
1227 overflow: hidden;
1228 flex: 0 0 auto;
1229 box-shadow:
1230 inset 0 0 0 2px rgba( 255, 255, 255, 0.8 ),
1231 0 6px 24px rgba( 0, 0, 0, 0.14 );
1232 background: linear-gradient(
1233 135deg,
1234 rgba( 34, 113, 177, 0.18 ),
1235 rgba( 34, 113, 177, 0.04 )
1236 );
1237 display: inline-flex;
1238 align-items: center;
1239 justify-content: center;
1240 }
1241
1242 .desktop-mode-my-wordpress__footprint-avatar img {
1243 width: 100%;
1244 height: 100%;
1245 object-fit: cover;
1246 display: block;
1247 }
1248
1249 .desktop-mode-my-wordpress__footprint-avatar
1250 .desktop-mode-my-wordpress__user-tile-initials {
1251 font-size: 36px;
1252 }
1253
1254 .desktop-mode-my-wordpress__footprint-headline {
1255 min-width: 0;
1256 flex: 1 1 auto;
1257 display: flex;
1258 flex-direction: column;
1259 gap: 8px;
1260 }
1261
1262 .desktop-mode-my-wordpress__footprint-title {
1263 margin: 0;
1264 font-size: 28px;
1265 line-height: 1.15;
1266 font-weight: 700;
1267 color: var( --desktop-mode-fg, #1d2327 );
1268 }
1269
1270 .desktop-mode-my-wordpress__footprint-meta {
1271 display: flex;
1272 flex-wrap: wrap;
1273 gap: 6px;
1274 align-items: center;
1275 }
1276
1277 .desktop-mode-my-wordpress__footprint-since {
1278 background: var( --wpd-hover, rgba( 0, 0, 0, 0.06 ) );
1279 color: var( --wpd-fg-muted, #50575e );
1280 }
1281
1282 /* ----- Headline stats row (4 cards) ----- */
1283
1284 .desktop-mode-my-wordpress__footprint-stats-row {
1285 display: grid;
1286 grid-template-columns: repeat( auto-fit, minmax( 160px, 1fr ) );
1287 gap: 12px;
1288 padding: 16px 18px;
1289 }
1290
1291 .desktop-mode-my-wordpress__footprint-stats-row
1292 .desktop-mode-my-wordpress__user-stat {
1293 background: var( --desktop-mode-surface, var( --wpd-surface, rgba( 255, 255, 255, 0.9 ) ) );
1294 box-shadow: 0 1px 4px rgba( 0, 0, 0, 0.04 );
1295 }
1296
1297 /* ----- Calendar heatmap (GitHub-style) ----- */
1298
1299 .desktop-mode-my-wordpress__footprint-calendar-section {
1300 overflow-x: auto;
1301 }
1302
1303 .desktop-mode-my-wordpress__footprint-calendar {
1304 display: flex;
1305 flex-direction: column;
1306 gap: 8px;
1307 /* Size to the grid itself so the legend (justify-content: flex-end
1308 * inside this same column) anchors to the grid's right edge instead
1309 * of the section's. Centered within the wider section by
1310 * `margin-inline: auto`. */
1311 width: max-content;
1312 max-width: 100%;
1313 margin-inline: auto;
1314 }
1315
1316 .desktop-mode-my-wordpress__footprint-grid {
1317 display: grid;
1318 /* Row 1 holds month labels (auto height); rows 2–8 are the 7
1319 * weekdays at fixed 11px. Col 1 holds weekday labels (auto width);
1320 * subsequent cols are 11px-wide week tracks, set per-cell via
1321 * `grid-column` so the JS can place items explicitly. */
1322 grid-template-rows: auto repeat( 7, 11px );
1323 grid-template-columns: auto;
1324 grid-auto-columns: 11px;
1325 column-gap: 3px;
1326 row-gap: 3px;
1327 width: max-content;
1328 }
1329
1330 .desktop-mode-my-wordpress__footprint-month,
1331 .desktop-mode-my-wordpress__footprint-weekday {
1332 font-size: 10px;
1333 line-height: 11px;
1334 color: var( --wpd-fg-muted, #50575e );
1335 white-space: nowrap;
1336 }
1337
1338 .desktop-mode-my-wordpress__footprint-weekday {
1339 /* Sit flush to the right of the label gutter so each label reads
1340 * adjacent to its row. The 6px breathing room is in addition to
1341 * the grid's column-gap. */
1342 padding-inline-end: 6px;
1343 align-self: center;
1344 justify-self: end;
1345 }
1346
1347 .desktop-mode-my-wordpress__footprint-month {
1348 padding-bottom: 2px;
1349 }
1350
1351 .desktop-mode-my-wordpress__footprint-cell {
1352 width: 11px;
1353 height: 11px;
1354 border-radius: 2px;
1355 background: var( --wpd-border, #ebedf0 );
1356 display: inline-block;
1357 transition: transform 0.12s ease;
1358 }
1359
1360 .desktop-mode-my-wordpress__footprint-cell--pad {
1361 background: transparent;
1362 }
1363
1364 .desktop-mode-my-wordpress__footprint-cell--l0 {
1365 background: var( --wpd-hover, rgba( 0, 0, 0, 0.06 ) );
1366 }
1367
1368 .desktop-mode-my-wordpress__footprint-cell--l1 {
1369 background: rgba( 34, 113, 177, 0.25 );
1370 }
1371
1372 .desktop-mode-my-wordpress__footprint-cell--l2 {
1373 background: rgba( 34, 113, 177, 0.5 );
1374 }
1375
1376 .desktop-mode-my-wordpress__footprint-cell--l3 {
1377 background: rgba( 34, 113, 177, 0.75 );
1378 }
1379
1380 .desktop-mode-my-wordpress__footprint-cell--l4 {
1381 background: var( --wp-admin-theme-color, #2271b1 );
1382 }
1383
1384 .desktop-mode-my-wordpress__footprint-cell:hover {
1385 transform: scale( 1.4 );
1386 z-index: 1;
1387 }
1388
1389 .desktop-mode-my-wordpress__footprint-legend {
1390 display: flex;
1391 gap: 4px;
1392 align-items: center;
1393 justify-content: flex-end;
1394 font-size: 11px;
1395 color: var( --wpd-fg-muted, #50575e );
1396 }
1397
1398 .desktop-mode-my-wordpress__footprint-legend-label {
1399 font-size: 11px;
1400 color: var( --wpd-fg-muted, #50575e );
1401 padding: 0 4px;
1402 }
1403
1404 /* ----- Rhythm (weekday + hour bar charts) ----- */
1405
1406 .desktop-mode-my-wordpress__footprint-rhythm-grid {
1407 display: grid;
1408 grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1.7fr );
1409 gap: 24px;
1410 }
1411
1412 @container ( max-width: 720px ) {
1413 .desktop-mode-my-wordpress__footprint-rhythm-grid {
1414 grid-template-columns: 1fr;
1415 }
1416 }
1417
1418 .desktop-mode-my-wordpress__footprint-chart-caption {
1419 font-size: 12px;
1420 color: var( --wpd-fg-muted, #50575e );
1421 margin-bottom: 6px;
1422 }
1423
1424 .desktop-mode-my-wordpress__footprint-bars {
1425 display: flex;
1426 align-items: end;
1427 gap: 4px;
1428 height: 100px;
1429 padding-bottom: 18px;
1430 position: relative;
1431 }
1432
1433 .desktop-mode-my-wordpress__footprint-bar-col {
1434 flex: 1 1 0;
1435 min-width: 0;
1436 display: flex;
1437 flex-direction: column;
1438 align-items: stretch;
1439 justify-content: flex-end;
1440 gap: 4px;
1441 height: 100%;
1442 position: relative;
1443 }
1444
1445 .desktop-mode-my-wordpress__footprint-bar {
1446 background: linear-gradient(
1447 180deg,
1448 var( --wp-admin-theme-color, #2271b1 ) 0%,
1449 rgba( 34, 113, 177, 0.55 ) 100%
1450 );
1451 border-radius: 3px 3px 0 0;
1452 min-height: 2px;
1453 transition: opacity 0.2s ease;
1454 }
1455
1456 .desktop-mode-my-wordpress__footprint-bar--empty {
1457 background: var( --wpd-border, #dcdcde );
1458 height: 2px !important;
1459 min-height: 2px;
1460 }
1461
1462 .desktop-mode-my-wordpress__footprint-bar-label {
1463 position: absolute;
1464 bottom: -16px;
1465 left: 0;
1466 right: 0;
1467 text-align: center;
1468 font-size: 10px;
1469 color: var( --wpd-fg-muted, #787c82 );
1470 }
1471
1472 /* ----- Most-prolific-month callout ----- */
1473
1474 .desktop-mode-my-wordpress__footprint-callout {
1475 display: flex;
1476 flex-direction: column;
1477 gap: 4px;
1478 align-items: center;
1479 text-align: center;
1480 padding: 20px 24px;
1481 background: linear-gradient(
1482 135deg,
1483 rgba( 34, 113, 177, 0.10 ),
1484 rgba( 34, 113, 177, 0.02 )
1485 );
1486 }
1487
1488 .desktop-mode-my-wordpress__footprint-callout-label {
1489 font-size: 11px;
1490 text-transform: uppercase;
1491 letter-spacing: 0.08em;
1492 color: var( --wpd-fg-muted, #50575e );
1493 font-weight: 600;
1494 }
1495
1496 .desktop-mode-my-wordpress__footprint-callout-value {
1497 margin: 2px 0;
1498 font-size: 24px;
1499 font-weight: 700;
1500 color: var( --desktop-mode-fg, #1d2327 );
1501 }
1502
1503 .desktop-mode-my-wordpress__footprint-callout-detail {
1504 margin: 0;
1505 font-size: 13px;
1506 color: var( --wpd-fg-muted, #50575e );
1507 max-width: 480px;
1508 }
1509
1510 /* ----- Recent-activity timeline ----- */
1511
1512 .desktop-mode-my-wordpress__footprint-timeline {
1513 list-style: none;
1514 margin: 0;
1515 padding: 0;
1516 position: relative;
1517 display: flex;
1518 flex-direction: column;
1519 gap: 12px;
1520 }
1521
1522 .desktop-mode-my-wordpress__footprint-timeline::before {
1523 content: '';
1524 position: absolute;
1525 inset-inline-start: 13px;
1526 top: 4px;
1527 bottom: 4px;
1528 width: 2px;
1529 background: var( --wpd-border, #dcdcde );
1530 border-radius: 1px;
1531 }
1532
1533 .desktop-mode-my-wordpress__footprint-event {
1534 display: flex;
1535 gap: 12px;
1536 align-items: flex-start;
1537 position: relative;
1538 padding-inline-start: 36px;
1539 min-height: 28px;
1540 }
1541
1542 .desktop-mode-my-wordpress__footprint-dot {
1543 position: absolute;
1544 inset-inline-start: 0;
1545 top: 0;
1546 width: 28px;
1547 height: 28px;
1548 border-radius: 50%;
1549 display: inline-flex;
1550 align-items: center;
1551 justify-content: center;
1552 background: var( --desktop-mode-surface, var( --wpd-surface, #fff ) );
1553 border: 2px solid var( --wp-admin-theme-color, #2271b1 );
1554 color: var( --wp-admin-theme-color, #2271b1 );
1555 }
1556
1557 .desktop-mode-my-wordpress__footprint-event--comment
1558 .desktop-mode-my-wordpress__footprint-dot {
1559 border-color: var( --wpd-fg-muted, #787c82 );
1560 color: var( --wpd-fg-muted, #787c82 );
1561 }
1562
1563 .desktop-mode-my-wordpress__footprint-dot .dashicons {
1564 font-size: 14px;
1565 width: 14px;
1566 height: 14px;
1567 line-height: 1;
1568 }
1569
1570 .desktop-mode-my-wordpress__footprint-event-body {
1571 display: flex;
1572 flex-direction: column;
1573 gap: 2px;
1574 min-width: 0;
1575 flex: 1 1 auto;
1576 }
1577
1578 .desktop-mode-my-wordpress__footprint-event-title {
1579 font-weight: 600;
1580 font-size: 13px;
1581 color: var( --desktop-mode-link, var( --wpd-accent, #2271b1 ) );
1582 text-decoration: none;
1583 overflow: hidden;
1584 text-overflow: ellipsis;
1585 white-space: nowrap;
1586 }
1587
1588 a.desktop-mode-my-wordpress__footprint-event-title:hover {
1589 text-decoration: underline;
1590 }
1591
1592 .desktop-mode-my-wordpress__footprint-event-meta {
1593 font-size: 11px;
1594 color: var( --wpd-fg-muted, #787c82 );
1595 }
1596
1597 /* ----- Footer actions ----- */
1598
1599 .desktop-mode-my-wordpress__footprint-footer {
1600 display: flex;
1601 justify-content: flex-end;
1602 align-items: center;
1603 gap: 8px;
1604 flex-wrap: wrap;
1605 background: transparent;
1606 border-color: transparent;
1607 box-shadow: none;
1608 padding: 0;
1609 }
1610
1611 /* ============================================================ *
1612 * Status ribbon — diagonal corner banner for non-published tiles
1613 * (since 0.21.0)
1614 *
1615 * Classic 45° corner ribbon — same affordance as a stamp on a
1616 * document. Applied to every tile whose post status isn't
1617 * `publish` across every My WordPress section (Posts, Pages,
1618 * Media drill-in, plugin kinds).
1619 *
1620 * Implementation:
1621 * 1. Tiles with a status modifier get `overflow: hidden` so the
1622 * ribbon's overshoot clips to the tile bounds.
1623 * 2. Ribbon is a wide strip (`width: 110px`) anchored to the
1624 * top-right corner, rotated +45° so it forms a diagonal
1625 * banner across that corner. The strip extends past the
1626 * tile edges; `overflow: hidden` on the parent crops it
1627 * into a clean triangle.
1628 *
1629 * The status tiles need a positioning context. `.desktop-mode-
1630 * file-tile` is `position: absolute` (canvas layout) on the
1631 * Posts/Pages browse views — that satisfies the positioning-
1632 * context requirement. For the Media drill-in usage tiles we
1633 * swap from `static` to `relative` via the per-status rule
1634 * below so the ribbon stays anchored to its own tile.
1635 * ============================================================ */
1636
1637 /* Status ribbon — the diagonal corner banner — is now drawn by
1638 * the `<wpd-ribbon>` web component slotted inside `<wpd-tile>`.
1639 * The component's own shadow-DOM styles own placement, rotation,
1640 * background, lettering, and the WP admin-theme tint. The only
1641 * surface-specific rule left here is dimming the icon on non-
1642 * published tiles so the unpublished signal carries even when
1643 * the ribbon is hidden via the OS-settings toggle. */
1644
1645 .desktop-mode-my-wordpress__tile--draft,
1646 .desktop-mode-my-wordpress__tile--pending,
1647 .desktop-mode-my-wordpress__tile--private,
1648 .desktop-mode-my-wordpress__tile--future {
1649 overflow: hidden;
1650 }
1651
1652 wpd-tile[ status='draft' ] .desktop-mode-file-tile__icon,
1653 wpd-tile[ status='pending' ] .desktop-mode-file-tile__icon,
1654 wpd-tile[ status='private' ] .desktop-mode-file-tile__icon,
1655 wpd-tile[ status='future' ] .desktop-mode-file-tile__icon {
1656 opacity: 0.7;
1657 }
1658
1659 /* ============================================================ *
1660 * Media section (since 0.21.0)
1661 * ============================================================ */
1662
1663 .desktop-mode-my-wordpress__media-grid {
1664 display: grid;
1665 grid-template-columns: repeat( auto-fill, minmax( 120px, 1fr ) );
1666 gap: 12px;
1667 padding: 16px;
1668 overflow-y: auto;
1669 align-content: start;
1670 }
1671
1672 .desktop-mode-my-wordpress__media-tile {
1673 /* Override the base `.desktop-mode-file-tile` (position: absolute,
1674 * width: 88px) so media tiles flow inside the CSS Grid instead of
1675 * stacking at (0,0) like the absolute-positioned post/user tiles.
1676 *
1677 * `relative` (not `static`) so the tile remains a containing
1678 * block for absolutely-positioned descendants — the `::after`
1679 * shortcut-arrow badge on attachment tiles, and the
1680 * `<wpd-ribbon>` post-status corner ribbon — both of which
1681 * would otherwise escape to the nearest positioned ancestor
1682 * (the window, the desktop, the viewport) and render way off
1683 * the tile. */
1684 position: relative;
1685 width: auto;
1686 display: flex;
1687 flex-direction: column;
1688 align-items: stretch;
1689 gap: 6px;
1690 padding: 8px;
1691 background: transparent;
1692 border: 1px solid transparent;
1693 border-radius: 8px;
1694 cursor: pointer;
1695 text-align: center;
1696 min-width: 0;
1697 }
1698
1699 .desktop-mode-my-wordpress__media-tile:hover {
1700 background: var( --desktop-mode-hover, var( --wpd-hover, rgba( 0, 0, 0, 0.04 ) ) );
1701 }
1702
1703 /* Media tiles inherit the canonical `.desktop-mode-file-tile--selected`
1704 * rule from `desktop-files.css` — accent inset border + tinted
1705 * background — same as every other tile in the shell. */
1706
1707 /* Override the canonical 48×48 visual/preview sizing — media tiles
1708 * want the visual to fill the full grid-cell width as a square
1709 * thumbnail (or icon-fallback square). Photos browser look, not
1710 * folder-icon look. Applies to BOTH the `<img>` (real thumbnail)
1711 * and the dashicon fallback (non-image MIME), so the two tile
1712 * shapes are visually consistent in the grid. */
1713 .desktop-mode-my-wordpress__media-tile .desktop-mode-file-tile__visual {
1714 display: flex;
1715 align-items: center;
1716 justify-content: center;
1717 width: 100%;
1718 height: auto;
1719 aspect-ratio: 1 / 1;
1720 overflow: hidden;
1721 border-radius: 6px;
1722 background: var(
1723 --desktop-mode-media-tile-bg,
1724 rgba( 0, 0, 0, 0.05 )
1725 );
1726 /* Reset the base 32px font + 48px size since we're sizing the
1727 * inner img/icon explicitly below. */
1728 font-size: 0;
1729 line-height: 1;
1730 }
1731
1732 .desktop-mode-my-wordpress__media-tile .desktop-mode-file-tile__preview {
1733 width: 100%;
1734 height: 100%;
1735 object-fit: cover;
1736 border-radius: 0;
1737 }
1738
1739 .desktop-mode-my-wordpress__media-tile .desktop-mode-file-tile__icon {
1740 /* Centered dashicon fallback — proportional to the larger
1741 * thumbnail well so it doesn't look like a postage stamp. */
1742 width: auto;
1743 height: auto;
1744 font-size: 36px;
1745 color: var( --wpd-fg-muted, #787c82 );
1746 }
1747
1748 .desktop-mode-my-wordpress__media-tile .desktop-mode-file-tile__label {
1749 font-size: 12px;
1750 line-height: 1.3;
1751 overflow: hidden;
1752 text-overflow: ellipsis;
1753 display: -webkit-box;
1754 -webkit-line-clamp: 2;
1755 -webkit-box-orient: vertical;
1756 }
1757
1758 /* ----- Media preview pane ----- */
1759
1760 .desktop-mode-my-wordpress__media-pane {
1761 display: flex;
1762 flex-direction: column;
1763 gap: 16px;
1764 padding: 16px;
1765 }
1766
1767 .desktop-mode-my-wordpress__media-title {
1768 font-size: 16px;
1769 font-weight: 600;
1770 margin: 0;
1771 }
1772
1773 .desktop-mode-my-wordpress__media-visual {
1774 display: flex;
1775 align-items: center;
1776 justify-content: center;
1777 background: var( --desktop-mode-media-visual-bg, var( --wpd-hover, rgba( 0, 0, 0, 0.04 ) ) );
1778 border-radius: 8px;
1779 min-height: 200px;
1780 max-height: 480px;
1781 overflow: hidden;
1782 }
1783
1784 .desktop-mode-my-wordpress__media-image,
1785 .desktop-mode-my-wordpress__media-video {
1786 max-width: 100%;
1787 max-height: 480px;
1788 object-fit: contain;
1789 }
1790
1791 .desktop-mode-my-wordpress__media-fallback-icon {
1792 font-size: 96px;
1793 width: 96px;
1794 height: 96px;
1795 color: var( --wpd-fg-muted, #787c82 );
1796 }
1797
1798 .desktop-mode-my-wordpress__media-doc-link {
1799 margin-inline-start: 16px;
1800 align-self: center;
1801 }
1802
1803 .desktop-mode-my-wordpress__media-audio-stack {
1804 display: flex;
1805 flex-direction: column;
1806 align-items: center;
1807 gap: 12px;
1808 padding: 24px;
1809 }
1810
1811 .desktop-mode-my-wordpress__media-meta {
1812 display: grid;
1813 grid-template-columns: max-content 1fr;
1814 gap: 4px 16px;
1815 font-size: 13px;
1816 margin: 0;
1817 }
1818
1819 .desktop-mode-my-wordpress__media-meta-term {
1820 color: var( --wpd-fg-muted, #787c82 );
1821 margin: 0;
1822 }
1823
1824 .desktop-mode-my-wordpress__media-meta-value {
1825 color: var( --wpd-fg, #1d2327 );
1826 word-break: break-word;
1827 margin: 0;
1828 }
1829
1830 .desktop-mode-my-wordpress__media-actions {
1831 display: flex;
1832 flex-wrap: wrap;
1833 gap: 8px;
1834 padding-top: 8px;
1835 border-top: 1px solid var( --wpd-border, #dcdcde );
1836 }
1837
1838 /* ----- Media drill-in ----- */
1839
1840 /* Drill-in: referencing-posts list. Visually identical to the
1841 * Posts / Pages tiles — same `desktop-mode-file-tile` chrome (48px
1842 * dashicon + 88px-wide two-line label). We can't reuse the
1843 * absolute-positioning canvas layout from `renderEntityList` here
1844 * (those internals don't export), so this surface uses a flex-wrap
1845 * of fixed-width tiles to reproduce the look.
1846 *
1847 * NOTE: this rule INTENTIONALLY overrides the `__media-grid`
1848 * defaults (which target square thumbnails on 130px columns) so
1849 * usage tiles match the canvas-flowed post tiles instead.
1850 */
1851 .desktop-mode-my-wordpress__usage-grid {
1852 display: flex;
1853 flex-wrap: wrap;
1854 gap: 12px 8px;
1855 padding: 16px;
1856 align-content: flex-start;
1857 }
1858
1859 /* Reset the `__media-tile` overrides for usage tiles so they
1860 * inherit the unmodified `.desktop-mode-file-tile` chrome the
1861 * canvas-positioned post tiles use — except for `position: static`
1862 * so they participate in the flex layout. */
1863 .desktop-mode-my-wordpress__tile--usage {
1864 width: 88px;
1865 align-items: center;
1866 padding: 8px 4px;
1867 gap: 6px;
1868 }
1869
1870 /* Right-pane summary bar sits ABOVE the inline media preview. */
1871 .desktop-mode-my-wordpress__media-detail-summary-bar {
1872 padding: 12px 16px;
1873 border-bottom: 1px solid var( --wpd-border, #dcdcde );
1874 }
1875
1876 .desktop-mode-my-wordpress__media-detail-summary {
1877 margin: 0;
1878 color: var( --wpd-fg-muted, #787c82 );
1879 font-size: 13px;
1880 }
1881
1882 .desktop-mode-my-wordpress__media-detail-preview {
1883 /* Lets the embedded `__media-pane` keep its own padding without
1884 * fighting the summary bar's spacing. */
1885 display: block;
1886 }
1887
1888 /* ------------------------------------------------------------------ */
1889 /* Agents section (`agent` entity kind — src/my-wordpress/agents-renderer.ts) */
1890 /* ------------------------------------------------------------------ */
1891
1892 .dm-agents {
1893 display: flex;
1894 flex-direction: column;
1895 height: 100%;
1896 min-height: 0;
1897 padding: 12px;
1898 gap: 10px;
1899 overflow: hidden;
1900 box-sizing: border-box;
1901 }
1902
1903 /* Section-level loading — same scale curve as the My WordPress
1904 preview loader and the window-loading overlay, instead of the bare
1905 48px component default. */
1906 .dm-agents__loading {
1907 display: flex;
1908 align-items: center;
1909 justify-content: center;
1910 height: 100%;
1911 min-height: 320px;
1912 }
1913
1914 .dm-agents__loading wpd-spinner {
1915 --wpd-spinner-size: clamp( 96px, 14vw, 192px );
1916 }
1917
1918 .dm-agents__layout {
1919 display: flex;
1920 flex: 1;
1921 min-height: 0;
1922 gap: 12px;
1923 }
1924
1925 /* Sidebar column: a fixed "Create agent" header over the scrolling
1926 list. The button used to be the list's last child, which put it out
1927 of reach on any site with enough agents to need it. */
1928 .dm-agents__sidebar {
1929 display: flex;
1930 flex-direction: column;
1931 flex: 0 0 260px;
1932 /* `min-width: auto` on a flex item resolves to its min-content
1933 width, and the rows carry long `white-space: nowrap` descriptions
1934 — without this the column ignores its 260px basis and eats the
1935 detail pane. The scroll container used to be this item, whose
1936 non-visible overflow zeroed the minimum for free. */
1937 min-width: 0;
1938 min-height: 0;
1939 border-inline-end: 1px solid var( --desktop-mode-border, rgba( 0, 0, 0, 0.08 ) );
1940 }
1941
1942 .dm-agents__list-toolbar {
1943 flex: none;
1944 display: flex;
1945 padding-block-end: 8px;
1946 padding-inline-end: 8px;
1947 }
1948
1949 .dm-agents__list-toolbar .dm-agents__create {
1950 flex: 1;
1951 }
1952
1953 .dm-agents__list {
1954 display: flex;
1955 flex-direction: column;
1956 gap: 4px;
1957 flex: 1;
1958 min-height: 0;
1959 overflow-y: auto;
1960 padding-inline-end: 4px;
1961 }
1962
1963 .dm-agents__row {
1964 display: flex;
1965 align-items: center;
1966 gap: 8px;
1967 padding: 8px;
1968 border-radius: 8px;
1969 cursor: pointer;
1970 }
1971
1972 .dm-agents__row:hover {
1973 background: var( --desktop-mode-hover, rgba( 0, 0, 0, 0.06 ) );
1974 }
1975
1976 .dm-agents__row.is-selected {
1977 background: var( --desktop-mode-selected, rgba( 0, 0, 0, 0.1 ) );
1978 }
1979
1980 .dm-agents__row-avatar {
1981 width: 32px;
1982 height: 32px;
1983 border-radius: 50%;
1984 background: #fff;
1985 flex: none;
1986 }
1987
1988 .dm-agents__row-text {
1989 display: flex;
1990 flex-direction: column;
1991 min-width: 0;
1992 flex: 1;
1993 }
1994
1995 .dm-agents__row-name {
1996 font-weight: 600;
1997 white-space: nowrap;
1998 overflow: hidden;
1999 text-overflow: ellipsis;
2000 }
2001
2002 .dm-agents__row-desc {
2003 font-size: 12px;
2004 opacity: 0.65;
2005 white-space: nowrap;
2006 overflow: hidden;
2007 text-overflow: ellipsis;
2008 }
2009
2010
2011 .dm-agents__detail {
2012 flex: 1;
2013 min-width: 0;
2014 overflow-y: auto;
2015 display: flex;
2016 flex-direction: column;
2017 gap: 10px;
2018 }
2019
2020 .dm-agents__detail-head {
2021 display: flex;
2022 align-items: center;
2023 gap: 10px;
2024 }
2025
2026 .dm-agents__detail-avatar {
2027 width: 48px;
2028 height: 48px;
2029 border-radius: 50%;
2030 background: #fff;
2031 flex: none;
2032 }
2033
2034 .dm-agents__detail-title {
2035 flex: 1;
2036 min-width: 0;
2037 }
2038
2039 .dm-agents__detail-title h3 {
2040 margin: 0;
2041 font-size: 16px;
2042 }
2043
2044 .dm-agents__detail-slug {
2045 font-size: 12px;
2046 opacity: 0.6;
2047 }
2048
2049 /* Verbs get their own row under the identity block: the set grows
2050 (profile, contributions, desktop, chat, delete) and squeezing them
2051 beside the name truncated it first. */
2052 .dm-agents__detail-actions {
2053 display: flex;
2054 flex-wrap: wrap;
2055 gap: 8px;
2056 }
2057
2058 .dm-agents__tabs {
2059 display: flex;
2060 gap: 4px;
2061 border-bottom: 1px solid var( --desktop-mode-border, rgba( 0, 0, 0, 0.08 ) );
2062 }
2063
2064 .dm-agents__tab {
2065 appearance: none;
2066 background: none;
2067 border: none;
2068 border-bottom: 2px solid transparent;
2069 padding: 6px 10px;
2070 font: inherit;
2071 color: inherit;
2072 cursor: pointer;
2073 opacity: 0.7;
2074 }
2075
2076 .dm-agents__tab.is-active {
2077 border-bottom-color: var( --desktop-mode-accent, #2271b1 );
2078 opacity: 1;
2079 font-weight: 600;
2080 }
2081
2082 .dm-agents__pane {
2083 display: flex;
2084 flex-direction: column;
2085 gap: 10px;
2086 padding-bottom: 12px;
2087 }
2088
2089 /* Pane-level loading: same big, centered WordPress mark the section
2090 loader uses, instead of a bare 48px spinner pinned to the top-left
2091 of the pane. */
2092 .dm-agents__pane--loading {
2093 align-items: center;
2094 justify-content: center;
2095 flex: 1;
2096 min-height: 260px;
2097 }
2098
2099 .dm-agents__pane--loading wpd-spinner {
2100 --wpd-spinner-size: clamp( 96px, 12vw, 160px );
2101 }
2102
2103 .dm-agents__hint {
2104 margin: 0;
2105 font-size: 12px;
2106 opacity: 0.7;
2107 }
2108
2109 .dm-agents__category {
2110 margin: 8px 0 0;
2111 font-size: 12px;
2112 text-transform: uppercase;
2113 letter-spacing: 0.04em;
2114 opacity: 0.6;
2115 }
2116
2117 .dm-agents__ability {
2118 display: grid;
2119 grid-template-columns: 1fr auto;
2120 gap: 2px 8px;
2121 align-items: center;
2122 padding: 4px 0;
2123 }
2124
2125 .dm-agents__ability-desc {
2126 grid-column: 1 / -1;
2127 margin: 0;
2128 font-size: 12px;
2129 opacity: 0.6;
2130 }
2131
2132 .dm-agents__trigger {
2133 border: 1px solid var( --desktop-mode-border, rgba( 0, 0, 0, 0.08 ) );
2134 border-radius: 8px;
2135 padding: 8px 10px;
2136 display: flex;
2137 flex-direction: column;
2138 gap: 6px;
2139 }
2140
2141 .dm-agents__trigger-head {
2142 display: flex;
2143 align-items: center;
2144 gap: 8px;
2145 }
2146
2147 .dm-agents__trigger-summary {
2148 flex: 1;
2149 font-size: 12px;
2150 opacity: 0.65;
2151 white-space: nowrap;
2152 overflow: hidden;
2153 text-overflow: ellipsis;
2154 }
2155
2156 .dm-agents__trigger-config {
2157 display: flex;
2158 flex-wrap: wrap;
2159 gap: 4px 14px;
2160 }
2161
2162 .dm-agents__actions {
2163 display: flex;
2164 gap: 8px;
2165 }
2166