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 / my-wordpress.css

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

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