/** * My WordPress — window-local layout. * * Two-pane file-explorer for browsing WordPress entities. Mirrors the * Recycle Bin and Posts window CSS conventions (`desktop-mode-*` * BEM-ish prefix, container-relative geometry, theming via the * desktop-mode-variables CSS custom properties). * * @since 0.8.0 */ .desktop-mode-my-wordpress { display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 0; font-family: var( --desktop-mode-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif ); color: var( --desktop-mode-my-wordpress-fg, #1d2327 ); /* Window background — separate from the wallpaper bg so the * folder window reads as a real OS window even when the desktop * gradient is dark. Themes / plugins can override * `--desktop-mode-my-wordpress-bg` to repaint just this surface * without touching every other window. */ background: var( --desktop-mode-my-wordpress-bg, var( --desktop-mode-window-bg, #fff ) ); /* Light-context tile color tokens — same recipe as the folder * window. Tiles inside My WordPress paint dark-on-light. */ --desktop-mode-tile-fg: var( --desktop-mode-my-wordpress-fg, #1d2327 ); --desktop-mode-tile-fg-muted: rgba( 0, 0, 0, 0.55 ); --desktop-mode-tile-hover-bg: var( --desktop-mode-hover, rgba( 0, 0, 0, 0.06 ) ); /* Light-context label rendering — same recipe as the folder * window. Defined as tokens in `variables.css`; the single * `.desktop-mode-file-tile__label` rule reads them for every * surface. */ --desktop-mode-tile-label-shadow: none; --desktop-mode-tile-label-weight: 500; --desktop-mode-tile-label-smoothing: antialiased; --desktop-mode-tile-label-color: var( --desktop-mode-my-wordpress-fg, #1d2327 ); } /* Pinned-icon visual cue — used by `desktop-mode-icon--pinned` (the * generic flag added in 0.8.0). The icon-rail itself owns the * non-draggable invariant; this rule just removes the grab affordance * if the framework ever attaches one in a later phase. */ .desktop-mode-icon--pinned { cursor: pointer; } /* Breadcrumb header chrome — owned by the shared * `.desktop-mode-breadcrumbs` rules in `desktop-files.css`. No * per-surface duplication. */ /* ----- Body host ----- */ .desktop-mode-my-wordpress__body { flex: 1 1 auto; min-height: 0; overflow: hidden; position: relative; display: flex; flex-direction: column; } /* List-view toolbar — sits between the breadcrumb header and the * split pane in every entity list view (Posts, Pages, Users, Media). * Holds the server-side search input today; reserved for future * filter / sort controls. Visual treatment mirrors the Content * Graph toolbar's search row so the two surfaces read as the same * control. */ .desktop-mode-my-wordpress__list-toolbar { flex: 0 0 auto; display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-bottom: 1px solid var( --desktop-mode-border, #dcdcde ); background: transparent; } .desktop-mode-my-wordpress__list-toolbar-search { position: relative; flex: 1 1 auto; min-width: 0; max-width: 360px; } .desktop-mode-my-wordpress__list-toolbar-search-input { width: 100%; padding: 6px 10px; border: 1px solid var( --wpd-border, #d8dde4 ); border-radius: 6px; background: var( --wpd-surface, #fff ); color: inherit; font-size: 13px; box-sizing: border-box; } .desktop-mode-my-wordpress__list-toolbar-search-input:focus { outline: none; border-color: var( --wpd-accent, #2c6be5 ); box-shadow: 0 0 0 3px var( --wpd-accent-soft, rgba( 44, 107, 229, 0.18 ) ); } /* When the list-toolbar mounts, the split pane needs to claim the * remaining vertical space inside the flex column body — without * this rule it would size to its content (which, for an empty list, * is zero) and the tile canvas would collapse. */ .desktop-mode-my-wordpress__body > .desktop-mode-my-wordpress__split { flex: 1 1 auto; min-height: 0; } /* Search-in-progress dimming. The previous result set stays in place * (no skeleton flash, no empty intermediate page) but reads as * "stale" until the new page lands and the renderer atomically swaps * the tiles. `pointer-events: none` blocks the user from clicking * a tile that's about to disappear. */ .desktop-mode-my-wordpress__tiles--searching, .desktop-mode-my-wordpress__media-grid--searching { opacity: 0.45; pointer-events: none; transition: opacity 0.12s ease-out; } /* Reuse the file-system folder window's status-bar element * (`.desktop-mode-folder-status-bar`) so segments render with the * exact same DOM the file-system uses — but retone it for the * white window background. The dark default (white-on-dark) reads * as invisible against `--desktop-mode-window-bg`. */ .desktop-mode-my-wordpress > .desktop-mode-folder-status-bar { border-top: 1px solid var( --desktop-mode-border, #dcdcde ); background: transparent; color: var( --desktop-mode-muted, #50575e ); } .desktop-mode-my-wordpress > .desktop-mode-folder-status-bar button.desktop-mode-folder-status-bar__segment:hover { background: var( --desktop-mode-hover, rgba( 0, 0, 0, 0.06 ) ); } /* ----- Tile canvas (root + entity list) ----- * * Both views use the SAME tile element (`.desktop-mode-file-tile`) * the wallpaper uses, so visuals stay 1:1 with the desktop. The * canvas is `position: relative`; tiles are absolute-positioned and * draggable — same interaction pattern as the wallpaper, just * scoped to the window. Positions persist per-window in * `localStorage` (see `createTileLayout` in src/my-wordpress). */ .desktop-mode-my-wordpress__canvas { position: relative; min-height: 100%; box-sizing: border-box; /* Note — DO NOT add `overflow: auto` here. Scroll is owned by * the surrounding pane (`__list` for entity views, `__body` for * the root view via `__grid` below). A second scroller here * would steal the wheel from the outer pane and break the * IntersectionObserver-based infinite scroll. */ } .desktop-mode-my-wordpress__grid { height: 100%; overflow-y: scroll; } /* Override the wallpaper file-tile palette for in-window context. * On the wallpaper the file tile sits on a dark gradient and uses * white text + a 12% white hover — both of which would be invisible * on a white window background. Inside My WordPress we re-tone the * same element to read on light surfaces. The dimensions / tile * structure are inherited from `.desktop-mode-file-tile`. */ .desktop-mode-my-wordpress .desktop-mode-file-tile { /* Color + hover come from `--desktop-mode-tile-*` — see the * scope-level variable overrides on `.desktop-mode-my-wordpress` * above. We only override structural / animation bits here. * * Drop the wallpaper's `transition: transform` — it hints at * GPU compositing in Chrome, and the moment the layer is * composited the label rasterizes against fractional device * pixels (sub-pixel blur on HiDPI). We don't animate transform * here, so the transition is dead code anyway. */ transition: background-color 0.15s ease; transform: none; } /* Selected state for every tile in My WordPress is rendered by * the canonical `.desktop-mode-file-tile--selected` rule in * `desktop-files.css` — same accent border + tinted background * the folder windows + wallpaper tiles use. No section-specific * override here — visual parity across the whole shell. */ /* Lock state — another user is currently editing this post. We dim * the tile a touch and overlay a small dashicon-lock badge on the * top-right of the icon. The whole tile stays clickable; the lock * is just a visual heads-up so the user knows the takeover dialog * is coming if they double-click. */ .desktop-mode-my-wordpress__tile--locked { opacity: 0.85; } .desktop-mode-my-wordpress__tile-lock { position: absolute; top: 4px; inset-inline-end: 14px; width: 18px; height: 18px; font-size: 12px; line-height: 18px; text-align: center; border-radius: 50%; background: var( --desktop-mode-danger, #b32d2e ); color: #fff; box-shadow: 0 0 0 1.5px rgba( 0, 0, 0, 0.4 ), 0 1px 3px rgba( 0, 0, 0, 0.35 ); pointer-events: none; } /* Tooltip lock banner — shown above the excerpt when present. */ .desktop-mode-my-wordpress__tooltip-lock { display: flex; align-items: center; gap: 6px; margin: 0 0 8px; padding: 6px 8px; border-radius: 4px; background: rgba( 179, 45, 46, 0.08 ); color: var( --desktop-mode-danger, #b32d2e ); font-size: 12px; font-weight: 600; } .desktop-mode-my-wordpress__tooltip-lock .dashicons { font-size: 14px; width: 14px; height: 14px; } /* Plain two-line clamp without `-webkit-line-clamp`. The webkit * variant promotes the label to its own composited layer, which on * HiDPI screens snaps text to fractional device pixels and renders * blurry. `max-height: 2 × line-height` + `overflow: hidden` looks * the same and stays sharp. */ .desktop-mode-my-wordpress__tile .desktop-mode-file-tile__label { font-size: 12px; line-height: 1.3; max-height: calc( 1.3em * 2 ); text-align: center; overflow: hidden; max-width: 100%; word-break: break-word; } /* ----- Entity list: two-pane split ----- */ .desktop-mode-my-wordpress__split { display: grid; grid-template-columns: minmax( 240px, 60% ) minmax( 0, 1fr ); height: 100%; min-height: 0; } .desktop-mode-my-wordpress__list { overflow-y: scroll; border-inline-end: 1px solid var( --desktop-mode-border, #dcdcde ); min-width: 0; } /* Always-visible scrollbar styling for the icon canvases. macOS * defaults to overlay scrollbars that hide until a wheel/scroll * event — fine for documents but actively confusing on a tile * canvas where the user can't tell whether more icons live below * or to the right. We force the scrollbar to render at all times * via `::-webkit-scrollbar` (works in WebKit / Blink / Edge), and * the explicit `scrollbar-width: thin` covers Firefox. */ .desktop-mode-my-wordpress__list, .desktop-mode-my-wordpress__grid { scrollbar-width: thin; scrollbar-color: rgba( 0, 0, 0, 0.25 ) transparent; } .desktop-mode-my-wordpress__list::-webkit-scrollbar, .desktop-mode-my-wordpress__grid::-webkit-scrollbar { width: 12px; height: 12px; } .desktop-mode-my-wordpress__list::-webkit-scrollbar-thumb, .desktop-mode-my-wordpress__grid::-webkit-scrollbar-thumb { background: rgba( 0, 0, 0, 0.25 ); border-radius: 6px; border: 3px solid transparent; background-clip: padding-box; } .desktop-mode-my-wordpress__list::-webkit-scrollbar-thumb:hover, .desktop-mode-my-wordpress__grid::-webkit-scrollbar-thumb:hover { background: rgba( 0, 0, 0, 0.4 ); background-clip: padding-box; } .desktop-mode-my-wordpress__list::-webkit-scrollbar-track, .desktop-mode-my-wordpress__grid::-webkit-scrollbar-track { background: transparent; } .desktop-mode-my-wordpress__sentinel { height: 1px; } /* Tile-grid loading skeleton — placeholder tiles that mimic the * icon + label shape of what's about to load. We dropped the * spinning WordPress mark here because it read as an alien * affordance inside the file-explorer surface; a skeleton signals * "tiles are landing in these slots" instead of "the system is * busy doing something opaque." * * Each placeholder is parented directly to the positioned canvas * (`__canvas--positioned`) and `position: absolute` at the * (left, top) the next real tile will occupy — see * `layout.peekNextCells()` and `showLoadingSkeleton()` in * `src/my-wordpress/index.ts`. Per-tile shimmer delay and label * width are inlined so a row of placeholders reads as a cascade, * not a uniform pulse. * * Tile dimensions mirror the real `.desktop-mode-file-tile` width * so a placeholder sits cleanly in the cell its successor will * inherit. */ .desktop-mode-my-wordpress__skeleton-tile { position: absolute; display: flex; flex-direction: column; align-items: center; gap: 6px; width: 88px; padding: 8px 4px; box-sizing: border-box; pointer-events: none; } .desktop-mode-my-wordpress__skeleton-icon, .desktop-mode-my-wordpress__skeleton-label { background: linear-gradient( 90deg, var( --desktop-mode-skeleton-low, rgba( 0, 0, 0, 0.05 ) ) 0%, var( --desktop-mode-skeleton-high, rgba( 0, 0, 0, 0.13 ) ) 50%, var( --desktop-mode-skeleton-low, rgba( 0, 0, 0, 0.05 ) ) 100% ); background-size: 200% 100%; animation: desktop-mode-my-wordpress-skeleton-shimmer 1.4s ease-in-out var( --desktop-mode-skeleton-delay, 0s ) infinite; } .desktop-mode-my-wordpress__skeleton-icon { width: 44px; height: 44px; border-radius: 10px; } .desktop-mode-my-wordpress__skeleton-label { width: 72%; height: 10px; border-radius: 4px; } @keyframes desktop-mode-my-wordpress-skeleton-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } } @media ( prefers-reduced-motion: reduce ) { .desktop-mode-my-wordpress__skeleton-icon, .desktop-mode-my-wordpress__skeleton-label { animation: none; } } /* ----- Right pane: preview ----- */ .desktop-mode-my-wordpress__preview { overflow: auto; min-width: 0; background: transparent; } .desktop-mode-my-wordpress__preview-empty { display: flex; align-items: center; justify-content: center; height: 100%; color: var( --desktop-mode-muted, #787c82 ); font-size: 13px; padding: 24px; text-align: center; } .desktop-mode-my-wordpress__preview-loading { display: flex; align-items: center; justify-content: center; height: 100%; min-height: 320px; padding: 32px; box-sizing: border-box; } /* Preview-pane loader — same scale curve as the tile-grid first * spinner and the window-loading overlay. The JS used to hard-code * `size="128"`, which set an inline `--wpd-spinner-size` that * overrode any CSS knob; the size attribute is now omitted so this * rule is the single source of truth for both the My WordPress * preview and the wallpaper file-preview pane (which reuses this * class deliberately). */ .desktop-mode-my-wordpress__preview-loading wpd-spinner { --wpd-spinner-size: clamp( 96px, 14vw, 192px ); } .desktop-mode-my-wordpress__article { padding: 24px 32px; max-width: 720px; margin: 0 auto; } .desktop-mode-my-wordpress__article-title { font-size: 22px; margin: 0 0 8px; line-height: 1.3; } .desktop-mode-my-wordpress__article-meta { margin: 0 0 16px; color: var( --desktop-mode-muted, #50575e ); font-size: 12px; } .desktop-mode-my-wordpress__article-hero { width: 100%; height: auto; border-radius: 6px; margin-bottom: 16px; display: block; } .desktop-mode-my-wordpress__article-content { font-size: 14px; line-height: 1.6; } .desktop-mode-my-wordpress__article-content img { max-width: 100%; height: auto; } .desktop-mode-my-wordpress__article-footer { margin-top: 24px; padding-top: 16px; border-top: 1px solid var( --desktop-mode-border, #dcdcde ); display: flex; justify-content: flex-end; align-items: center; gap: 8px; flex-wrap: wrap; } /* ----- Empty / error states ----- */ .desktop-mode-my-wordpress__empty, .desktop-mode-my-wordpress__error { padding: 32px 24px; text-align: center; color: var( --desktop-mode-muted, #787c82 ); font-size: 13px; } .desktop-mode-my-wordpress__error { color: var( --desktop-mode-danger, #b32d2e ); } /* ----- Hover tooltip (floats over body) ----- */ .desktop-mode-my-wordpress__tooltip { position: fixed; z-index: 100000; max-width: 320px; background: var( --desktop-mode-surface, #fff ); color: var( --desktop-mode-fg, #1d2327 ); border: 1px solid var( --desktop-mode-border, #dcdcde ); border-radius: 6px; padding: 12px; box-shadow: 0 6px 24px rgba( 0, 0, 0, 0.18 ); font-size: 12px; pointer-events: none; } .desktop-mode-my-wordpress__tooltip-title { font-weight: 600; margin-bottom: 6px; font-size: 13px; } .desktop-mode-my-wordpress__tooltip-thumb { display: block; max-width: 100%; height: auto; border-radius: 4px; margin: 6px 0; } .desktop-mode-my-wordpress__tooltip-excerpt { margin: 0; color: var( --desktop-mode-muted, #50575e ); line-height: 1.4; } /* ----- Context menu host ----- */ .desktop-mode-my-wordpress__menu { position: fixed; z-index: 100001; } /* --------------------------------------------------------------- * User dossier — right-pane preview when a person is selected. * Header (avatar + name + roles + links), bio, stat cards row, * 12-month activity sparkline, milestones, recent posts, top * categories. Designed to fit comfortably on a 360px-wide pane * but to stretch nicely up to ~720px before the line-length stops * helping readability. * --------------------------------------------------------------- */ .desktop-mode-my-wordpress__user { max-width: 720px; } .desktop-mode-my-wordpress__user-header { display: flex; gap: 16px; align-items: center; margin-bottom: 16px; } .desktop-mode-my-wordpress__user-avatar { width: 96px; height: 96px; border-radius: 50%; flex-shrink: 0; box-shadow: 0 2px 8px rgba( 0, 0, 0, 0.12 ); } .desktop-mode-my-wordpress__user-headline { flex: 1 1 auto; min-width: 0; } .desktop-mode-my-wordpress__user .desktop-mode-my-wordpress__article-title { margin: 0 0 4px; } .desktop-mode-my-wordpress__user-roles { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 6px; } .desktop-mode-my-wordpress__user-role { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 10px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; background: rgba( 34, 113, 177, 0.12 ); color: var( --wp-admin-theme-color, #2271b1 ); } .desktop-mode-my-wordpress__user-links { display: flex; gap: 12px; font-size: 12px; } .desktop-mode-my-wordpress__user-links a { color: var( --desktop-mode-link, #2271b1 ); text-decoration: none; } .desktop-mode-my-wordpress__user-links a:hover { text-decoration: underline; } .desktop-mode-my-wordpress__user-bio { font-size: 14px; line-height: 1.5; color: var( --desktop-mode-fg, #1d2327 ); margin: 0 0 16px; padding-left: 12px; border-left: 3px solid var( --desktop-mode-border, #dcdcde ); } /* ----- Stat cards row ----- */ .desktop-mode-my-wordpress__user-stats { display: grid; grid-template-columns: repeat( auto-fit, minmax( 120px, 1fr ) ); gap: 8px; margin-bottom: 20px; } .desktop-mode-my-wordpress__user-stat { display: flex; flex-direction: column; gap: 2px; padding: 12px 14px; border-radius: 8px; background: var( --desktop-mode-hover, rgba( 0, 0, 0, 0.04 ) ); border: 1px solid var( --desktop-mode-border, #dcdcde ); } .desktop-mode-my-wordpress__user-stat-value { font-size: 26px; font-weight: 700; line-height: 1.1; color: var( --wp-admin-theme-color, #2271b1 ); font-variant-numeric: tabular-nums; } .desktop-mode-my-wordpress__user-stat-label { font-size: 12px; color: var( --desktop-mode-muted, #50575e ); text-transform: uppercase; letter-spacing: 0.04em; } .desktop-mode-my-wordpress__user-stat-caption { font-size: 11px; color: var( --desktop-mode-muted, #787c82 ); } /* ----- 12-month activity sparkline ----- */ .desktop-mode-my-wordpress__user-section { margin-bottom: 20px; } .desktop-mode-my-wordpress__user-section h3 { font-size: 13px; font-weight: 600; color: var( --desktop-mode-muted, #50575e ); text-transform: uppercase; letter-spacing: 0.04em; margin: 0 0 8px; } .desktop-mode-my-wordpress__user-spark-chart { display: grid; grid-template-columns: repeat( 12, 1fr ); gap: 4px; height: 80px; align-items: end; padding: 6px 0; } .desktop-mode-my-wordpress__user-spark-col { display: flex; flex-direction: column; align-items: stretch; justify-content: flex-end; gap: 4px; height: 100%; min-height: 0; } .desktop-mode-my-wordpress__user-spark-bar { background: linear-gradient( 180deg, var( --wp-admin-theme-color, #2271b1 ) 0%, rgba( 34, 113, 177, 0.55 ) 100% ); border-radius: 3px 3px 0 0; min-height: 2px; transition: height 0.3s ease; } .desktop-mode-my-wordpress__user-spark-bar--empty { background: var( --desktop-mode-border, #dcdcde ); min-height: 2px; height: 2px !important; } .desktop-mode-my-wordpress__user-spark-label { font-size: 10px; text-align: center; color: var( --desktop-mode-muted, #787c82 ); } /* ----- Milestones ----- */ .desktop-mode-my-wordpress__user-milestones { display: grid; grid-template-columns: repeat( auto-fit, minmax( 140px, 1fr ) ); gap: 12px; margin: 0 0 20px; } .desktop-mode-my-wordpress__user-milestones dt { font-size: 11px; color: var( --desktop-mode-muted, #50575e ); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 2px; } .desktop-mode-my-wordpress__user-milestones dd { font-size: 14px; font-weight: 600; margin: 0; } /* ----- Recent posts list ----- */ .desktop-mode-my-wordpress__user-recent { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; } .desktop-mode-my-wordpress__user-recent li { display: flex; flex-direction: column; gap: 2px; padding: 8px 10px; border-radius: 6px; background: rgba( 0, 0, 0, 0.02 ); } .desktop-mode-my-wordpress__user-recent a { font-weight: 600; color: var( --desktop-mode-link, #2271b1 ); text-decoration: none; } .desktop-mode-my-wordpress__user-recent a:hover { text-decoration: underline; } .desktop-mode-my-wordpress__user-recent-meta { font-size: 11px; color: var( --desktop-mode-muted, #787c82 ); } /* ----- Top categories chips ----- */ .desktop-mode-my-wordpress__user-chips { display: flex; flex-wrap: wrap; gap: 6px; } .desktop-mode-my-wordpress__user-chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: 999px; font-size: 12px; background: rgba( 0, 0, 0, 0.05 ); border: 1px solid var( --desktop-mode-border, #dcdcde ); } .desktop-mode-my-wordpress__user-chip--tag { background: rgba( 124, 58, 237, 0.08 ); border-color: rgba( 124, 58, 237, 0.25 ); } .desktop-mode-my-wordpress__user-chip-count { font-weight: 700; color: var( --wp-admin-theme-color, #2271b1 ); font-variant-numeric: tabular-nums; } /* --------------------------------------------------------------- * Term dossier — same skeleton as the user dossier (header, stat * cards, sparkline, milestones, recent list, chips) plus a few * term-specific bits below: a colored taxonomy icon medallion in * the header, role badge variants for category vs tag, and a * "Top contributors" grid that pairs an author avatar with a * post count. * --------------------------------------------------------------- */ .desktop-mode-my-wordpress__term-header { display: flex; align-items: center; gap: 16px; margin-bottom: 16px; } .desktop-mode-my-wordpress__term-icon { width: 64px; height: 64px; border-radius: 12px; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; color: #fff; } .desktop-mode-my-wordpress__term-icon--category { background: linear-gradient( 135deg, #2271b1 0%, #135e96 100% ); box-shadow: 0 4px 12px rgba( 34, 113, 177, 0.32 ); } .desktop-mode-my-wordpress__term-icon--tag { background: linear-gradient( 135deg, #7c3aed 0%, #5b21b6 100% ); box-shadow: 0 4px 12px rgba( 124, 58, 237, 0.32 ); } .desktop-mode-my-wordpress__user-role--category { background: rgba( 34, 113, 177, 0.12 ); color: #135e96; } .desktop-mode-my-wordpress__user-role--tag { background: rgba( 124, 58, 237, 0.12 ); color: #6d28d9; } /* Top contributors row — paired avatar + name + post count. */ .desktop-mode-my-wordpress__term-authors { display: grid; grid-template-columns: repeat( auto-fit, minmax( 180px, 1fr ) ); gap: 8px; } .desktop-mode-my-wordpress__term-author { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: 8px; background: rgba( 0, 0, 0, 0.03 ); border: 1px solid var( --desktop-mode-border, #dcdcde ); } .desktop-mode-my-wordpress__term-author-avatar { width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0; } .desktop-mode-my-wordpress__term-author-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; } .desktop-mode-my-wordpress__term-author-name { font-weight: 600; font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .desktop-mode-my-wordpress__term-author-count { font-size: 11px; color: var( --desktop-mode-muted, #50575e ); } /* --------------------------------------------------------------- * Comment dossier — header (avatar + name + status / date / count * badges + author archive / website / moderate links), optional * "in reply to" quote, the comment body, parent-post card, * direct-reply thread, and a moderation strip (IP + user agent) * for users with moderate_comments. * --------------------------------------------------------------- */ .desktop-mode-my-wordpress__comment-status--approved { background: rgba( 34, 113, 177, 0.12 ); color: #135e96; } .desktop-mode-my-wordpress__comment-status--pending { background: rgba( 217, 119, 6, 0.16 ); color: #b45309; } .desktop-mode-my-wordpress__comment-status--spam { background: rgba( 179, 45, 46, 0.14 ); color: #b32d2e; } .desktop-mode-my-wordpress__comment-status--trash { background: rgba( 0, 0, 0, 0.08 ); color: var( --desktop-mode-muted, #50575e ); } .desktop-mode-my-wordpress__comment-date-badge { background: transparent; color: var( --desktop-mode-muted, #50575e ); border: 1px solid var( --desktop-mode-border, #dcdcde ); text-transform: none; letter-spacing: normal; } /* "In reply to ..." quote shown above the comment body when this * is a thread reply. */ .desktop-mode-my-wordpress__comment-quote { margin: 0 0 16px; padding: 10px 14px; border-left: 3px solid var( --wp-admin-theme-color, #2271b1 ); background: rgba( 34, 113, 177, 0.06 ); border-radius: 0 6px 6px 0; font-size: 13px; } .desktop-mode-my-wordpress__comment-quote-lead { font-size: 11px; font-weight: 600; color: var( --desktop-mode-muted, #50575e ); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 4px; } .desktop-mode-my-wordpress__comment-quote p { margin: 0; color: var( --desktop-mode-fg, #1d2327 ); } /* Comment body — same style as article-content but with a soft * card background so it reads as the focal element. */ .desktop-mode-my-wordpress__comment-body { padding: 14px 16px; background: rgba( 0, 0, 0, 0.03 ); border-radius: 8px; border: 1px solid var( --desktop-mode-border, #dcdcde ); } /* Parent-post card under the comment body. */ .desktop-mode-my-wordpress__comment-post { display: flex; flex-direction: column; gap: 4px; padding: 10px 14px; border-radius: 8px; background: rgba( 0, 0, 0, 0.04 ); border: 1px solid var( --desktop-mode-border, #dcdcde ); } .desktop-mode-my-wordpress__comment-post-title { font-weight: 600; color: var( --desktop-mode-link, #2271b1 ); text-decoration: none; } .desktop-mode-my-wordpress__comment-post-title:hover { text-decoration: underline; } .desktop-mode-my-wordpress__comment-post-meta { font-size: 11px; color: var( --desktop-mode-muted, #787c82 ); } /* Replies list. */ .desktop-mode-my-wordpress__comment-replies { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; } .desktop-mode-my-wordpress__comment-reply { display: flex; gap: 10px; align-items: flex-start; padding: 10px 12px; border-radius: 8px; background: rgba( 0, 0, 0, 0.02 ); border: 1px solid var( --desktop-mode-border, #dcdcde ); } .desktop-mode-my-wordpress__comment-reply-avatar { width: 32px; height: 32px; border-radius: 50%; flex-shrink: 0; } .desktop-mode-my-wordpress__comment-reply-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; } .desktop-mode-my-wordpress__comment-reply-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; } .desktop-mode-my-wordpress__comment-reply-name { font-weight: 600; font-size: 13px; } .desktop-mode-my-wordpress__comment-reply-when { font-size: 11px; color: var( --desktop-mode-muted, #787c82 ); } .desktop-mode-my-wordpress__comment-reply-excerpt { margin: 0; font-size: 13px; color: var( --desktop-mode-fg, #1d2327 ); line-height: 1.45; } /* =================================================================== * * USERS — list tiles + activity footprint surface. * * The Users folder reuses the same canvas + 96×92 tile grid the * post tiles use; the user-tile content (avatar circle + label + * small sub-line) fits inside the cell. The "View activity * footprint" surface is a full-width body view (no split pane) * with hero / stats / heatmap / rhythm / timeline. * * Since 0.20.0. * =================================================================== */ /* User tile — replaces the dashicon glyph with a real avatar */ .desktop-mode-my-wordpress__tile--user { display: flex; flex-direction: column; align-items: center; justify-content: flex-start; gap: 4px; padding: 8px 4px 6px; box-sizing: border-box; } .desktop-mode-my-wordpress__user-tile-avatar { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 50%; overflow: hidden; background: linear-gradient( 135deg, rgba( 34, 113, 177, 0.18 ), rgba( 34, 113, 177, 0.04 ) ); box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.08 ), 0 2px 6px rgba( 0, 0, 0, 0.08 ); flex: 0 0 auto; } .desktop-mode-my-wordpress__user-tile-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; } .desktop-mode-my-wordpress__user-tile-initials { font-weight: 600; font-size: 14px; letter-spacing: 0.02em; color: var( --wp-admin-theme-color, #2271b1 ); text-transform: uppercase; } /* Single-line label for user tiles — we already have a generic * label clamp, but the user variant gets only ONE line so the * sub-line ("Editor · 12 posts") can fit beneath it. */ .desktop-mode-my-wordpress__tile--user .desktop-mode-file-tile__label { font-size: 11px; font-weight: 500; line-height: 1.25; max-height: 1.25em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; padding: 0 4px; box-sizing: border-box; } .desktop-mode-my-wordpress__user-tile-sub { font-size: 10px; line-height: 1.2; color: var( --desktop-mode-tile-fg-muted, rgba( 0, 0, 0, 0.55 ) ); max-height: 1.2em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; text-align: center; padding: 0 4px; box-sizing: border-box; } /* Selected/hover user tiles inherit the same chrome the post tiles * use — see `.desktop-mode-my-wordpress__tile--selected` above. */ /* ----- Activity footprint — full-width body surface ----- * * Opens via the right-click context menu on a user tile (or the * dossier's "View activity footprint" button). Replaces the split * list/preview with a wide canvas so each section gets enough room * to read. */ .desktop-mode-my-wordpress__footprint { display: flex; flex-direction: column; gap: 20px; padding: 24px 28px 32px; box-sizing: border-box; overflow-y: auto; height: 100%; /* Scroll container spans the full window width so wheel + touch * scroll work no matter where the pointer is — including in the * empty margins to the left / right of the content. The 1080px * cap is applied to each immediate child instead (below). */ align-items: center; } .desktop-mode-my-wordpress__footprint > * { width: 100%; max-width: 1080px; } .desktop-mode-my-wordpress__footprint-section { border: 1px solid var( --desktop-mode-border, #dcdcde ); border-radius: 12px; padding: 18px 20px; background: var( --desktop-mode-my-wordpress-surface, var( --desktop-mode-surface, rgba( 255, 255, 255, 0.6 ) ) ); box-shadow: 0 1px 2px rgba( 0, 0, 0, 0.04 ); /* The parent `.__footprint` is a flex column with `overflow-y: * auto`. Flex items default to `flex-shrink: 1`, so each section * would compress along the column axis when the combined natural * height exceeds the container — clipping the calendar heatmap * (the calendar section also sets `overflow-x: auto`, which * doesn't surface a vertical scrollbar). Lock the intrinsic * height so the parent scroller, not the children, handles the * overflow. */ flex: 0 0 auto; } .desktop-mode-my-wordpress__footprint-section h3 { margin: 0 0 12px; font-size: 13px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var( --desktop-mode-muted, #50575e ); } /* ----- Hero ----- */ .desktop-mode-my-wordpress__footprint-hero { display: flex; gap: 20px; align-items: center; padding: 24px; border-radius: 16px; background: linear-gradient( 135deg, rgba( 34, 113, 177, 0.10 ) 0%, rgba( 34, 113, 177, 0.02 ) 60%, transparent 100% ); border: 1px solid var( --desktop-mode-border, #dcdcde ); } .desktop-mode-my-wordpress__footprint-avatar { width: 112px; height: 112px; border-radius: 50%; overflow: hidden; flex: 0 0 auto; box-shadow: inset 0 0 0 2px rgba( 255, 255, 255, 0.8 ), 0 6px 24px rgba( 0, 0, 0, 0.14 ); background: linear-gradient( 135deg, rgba( 34, 113, 177, 0.18 ), rgba( 34, 113, 177, 0.04 ) ); display: inline-flex; align-items: center; justify-content: center; } .desktop-mode-my-wordpress__footprint-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; } .desktop-mode-my-wordpress__footprint-avatar .desktop-mode-my-wordpress__user-tile-initials { font-size: 36px; } .desktop-mode-my-wordpress__footprint-headline { min-width: 0; flex: 1 1 auto; display: flex; flex-direction: column; gap: 8px; } .desktop-mode-my-wordpress__footprint-title { margin: 0; font-size: 28px; line-height: 1.15; font-weight: 700; color: var( --desktop-mode-fg, #1d2327 ); } .desktop-mode-my-wordpress__footprint-meta { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; } .desktop-mode-my-wordpress__footprint-since { background: rgba( 0, 0, 0, 0.06 ); color: var( --desktop-mode-muted, #50575e ); } /* ----- Headline stats row (4 cards) ----- */ .desktop-mode-my-wordpress__footprint-stats-row { display: grid; grid-template-columns: repeat( auto-fit, minmax( 160px, 1fr ) ); gap: 12px; padding: 16px 18px; } .desktop-mode-my-wordpress__footprint-stats-row .desktop-mode-my-wordpress__user-stat { background: var( --desktop-mode-surface, rgba( 255, 255, 255, 0.9 ) ); box-shadow: 0 1px 4px rgba( 0, 0, 0, 0.04 ); } /* ----- Calendar heatmap (GitHub-style) ----- */ .desktop-mode-my-wordpress__footprint-calendar-section { overflow-x: auto; } .desktop-mode-my-wordpress__footprint-calendar { display: flex; flex-direction: column; gap: 8px; /* Size to the grid itself so the legend (justify-content: flex-end * inside this same column) anchors to the grid's right edge instead * of the section's. Centered within the wider section by * `margin-inline: auto`. */ width: max-content; max-width: 100%; margin-inline: auto; } .desktop-mode-my-wordpress__footprint-grid { display: grid; /* Row 1 holds month labels (auto height); rows 2–8 are the 7 * weekdays at fixed 11px. Col 1 holds weekday labels (auto width); * subsequent cols are 11px-wide week tracks, set per-cell via * `grid-column` so the JS can place items explicitly. */ grid-template-rows: auto repeat( 7, 11px ); grid-template-columns: auto; grid-auto-columns: 11px; column-gap: 3px; row-gap: 3px; width: max-content; } .desktop-mode-my-wordpress__footprint-month, .desktop-mode-my-wordpress__footprint-weekday { font-size: 10px; line-height: 11px; color: var( --desktop-mode-muted, #50575e ); white-space: nowrap; } .desktop-mode-my-wordpress__footprint-weekday { /* Sit flush to the right of the label gutter so each label reads * adjacent to its row. The 6px breathing room is in addition to * the grid's column-gap. */ padding-inline-end: 6px; align-self: center; justify-self: end; } .desktop-mode-my-wordpress__footprint-month { padding-bottom: 2px; } .desktop-mode-my-wordpress__footprint-cell { width: 11px; height: 11px; border-radius: 2px; background: var( --desktop-mode-border, #ebedf0 ); display: inline-block; transition: transform 0.12s ease; } .desktop-mode-my-wordpress__footprint-cell--pad { background: transparent; } .desktop-mode-my-wordpress__footprint-cell--l0 { background: rgba( 0, 0, 0, 0.06 ); } .desktop-mode-my-wordpress__footprint-cell--l1 { background: rgba( 34, 113, 177, 0.25 ); } .desktop-mode-my-wordpress__footprint-cell--l2 { background: rgba( 34, 113, 177, 0.5 ); } .desktop-mode-my-wordpress__footprint-cell--l3 { background: rgba( 34, 113, 177, 0.75 ); } .desktop-mode-my-wordpress__footprint-cell--l4 { background: var( --wp-admin-theme-color, #2271b1 ); } .desktop-mode-my-wordpress__footprint-cell:hover { transform: scale( 1.4 ); z-index: 1; } .desktop-mode-my-wordpress__footprint-legend { display: flex; gap: 4px; align-items: center; justify-content: flex-end; font-size: 11px; color: var( --desktop-mode-muted, #50575e ); } .desktop-mode-my-wordpress__footprint-legend-label { font-size: 11px; color: var( --desktop-mode-muted, #50575e ); padding: 0 4px; } /* ----- Rhythm (weekday + hour bar charts) ----- */ .desktop-mode-my-wordpress__footprint-rhythm-grid { display: grid; grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1.7fr ); gap: 24px; } @container ( max-width: 720px ) { .desktop-mode-my-wordpress__footprint-rhythm-grid { grid-template-columns: 1fr; } } .desktop-mode-my-wordpress__footprint-chart-caption { font-size: 12px; color: var( --desktop-mode-muted, #50575e ); margin-bottom: 6px; } .desktop-mode-my-wordpress__footprint-bars { display: flex; align-items: end; gap: 4px; height: 100px; padding-bottom: 18px; position: relative; } .desktop-mode-my-wordpress__footprint-bar-col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: stretch; justify-content: flex-end; gap: 4px; height: 100%; position: relative; } .desktop-mode-my-wordpress__footprint-bar { background: linear-gradient( 180deg, var( --wp-admin-theme-color, #2271b1 ) 0%, rgba( 34, 113, 177, 0.55 ) 100% ); border-radius: 3px 3px 0 0; min-height: 2px; transition: opacity 0.2s ease; } .desktop-mode-my-wordpress__footprint-bar--empty { background: var( --desktop-mode-border, #dcdcde ); height: 2px !important; min-height: 2px; } .desktop-mode-my-wordpress__footprint-bar-label { position: absolute; bottom: -16px; left: 0; right: 0; text-align: center; font-size: 10px; color: var( --desktop-mode-muted, #787c82 ); } /* ----- Most-prolific-month callout ----- */ .desktop-mode-my-wordpress__footprint-callout { display: flex; flex-direction: column; gap: 4px; align-items: center; text-align: center; padding: 20px 24px; background: linear-gradient( 135deg, rgba( 34, 113, 177, 0.10 ), rgba( 34, 113, 177, 0.02 ) ); } .desktop-mode-my-wordpress__footprint-callout-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; color: var( --desktop-mode-muted, #50575e ); font-weight: 600; } .desktop-mode-my-wordpress__footprint-callout-value { margin: 2px 0; font-size: 24px; font-weight: 700; color: var( --desktop-mode-fg, #1d2327 ); } .desktop-mode-my-wordpress__footprint-callout-detail { margin: 0; font-size: 13px; color: var( --desktop-mode-muted, #50575e ); max-width: 480px; } /* ----- Recent-activity timeline ----- */ .desktop-mode-my-wordpress__footprint-timeline { list-style: none; margin: 0; padding: 0; position: relative; display: flex; flex-direction: column; gap: 12px; } .desktop-mode-my-wordpress__footprint-timeline::before { content: ''; position: absolute; inset-inline-start: 13px; top: 4px; bottom: 4px; width: 2px; background: var( --desktop-mode-border, #dcdcde ); border-radius: 1px; } .desktop-mode-my-wordpress__footprint-event { display: flex; gap: 12px; align-items: flex-start; position: relative; padding-inline-start: 36px; min-height: 28px; } .desktop-mode-my-wordpress__footprint-dot { position: absolute; inset-inline-start: 0; top: 0; width: 28px; height: 28px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; background: var( --desktop-mode-surface, #fff ); border: 2px solid var( --wp-admin-theme-color, #2271b1 ); color: var( --wp-admin-theme-color, #2271b1 ); } .desktop-mode-my-wordpress__footprint-event--comment .desktop-mode-my-wordpress__footprint-dot { border-color: var( --desktop-mode-muted, #787c82 ); color: var( --desktop-mode-muted, #787c82 ); } .desktop-mode-my-wordpress__footprint-dot .dashicons { font-size: 14px; width: 14px; height: 14px; line-height: 1; } .desktop-mode-my-wordpress__footprint-event-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; } .desktop-mode-my-wordpress__footprint-event-title { font-weight: 600; font-size: 13px; color: var( --desktop-mode-link, #2271b1 ); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } a.desktop-mode-my-wordpress__footprint-event-title:hover { text-decoration: underline; } .desktop-mode-my-wordpress__footprint-event-meta { font-size: 11px; color: var( --desktop-mode-muted, #787c82 ); } /* ----- Footer actions ----- */ .desktop-mode-my-wordpress__footprint-footer { display: flex; justify-content: flex-end; align-items: center; gap: 8px; flex-wrap: wrap; background: transparent; border-color: transparent; box-shadow: none; padding: 0; } /* ============================================================ * * Status ribbon — diagonal corner banner for non-published tiles * (since 0.21.0) * * Classic 45° corner ribbon — same affordance as a stamp on a * document. Applied to every tile whose post status isn't * `publish` across every My WordPress section (Posts, Pages, * Media drill-in, plugin kinds). * * Implementation: * 1. Tiles with a status modifier get `overflow: hidden` so the * ribbon's overshoot clips to the tile bounds. * 2. Ribbon is a wide strip (`width: 110px`) anchored to the * top-right corner, rotated +45° so it forms a diagonal * banner across that corner. The strip extends past the * tile edges; `overflow: hidden` on the parent crops it * into a clean triangle. * * The status tiles need a positioning context. `.desktop-mode- * file-tile` is `position: absolute` (canvas layout) on the * Posts/Pages browse views — that satisfies the positioning- * context requirement. For the Media drill-in usage tiles we * swap from `static` to `relative` via the per-status rule * below so the ribbon stays anchored to its own tile. * ============================================================ */ /* Status ribbon — the diagonal corner banner — is now drawn by * the `` web component slotted inside ``. * The component's own shadow-DOM styles own placement, rotation, * background, lettering, and the WP admin-theme tint. The only * surface-specific rule left here is dimming the icon on non- * published tiles so the unpublished signal carries even when * the ribbon is hidden via the OS-settings toggle. */ .desktop-mode-my-wordpress__tile--draft, .desktop-mode-my-wordpress__tile--pending, .desktop-mode-my-wordpress__tile--private, .desktop-mode-my-wordpress__tile--future { overflow: hidden; } wpd-tile[ status='draft' ] .desktop-mode-file-tile__icon, wpd-tile[ status='pending' ] .desktop-mode-file-tile__icon, wpd-tile[ status='private' ] .desktop-mode-file-tile__icon, wpd-tile[ status='future' ] .desktop-mode-file-tile__icon { opacity: 0.7; } /* ============================================================ * * Media section (since 0.21.0) * ============================================================ */ .desktop-mode-my-wordpress__media-grid { display: grid; grid-template-columns: repeat( auto-fill, minmax( 120px, 1fr ) ); gap: 12px; padding: 16px; overflow-y: auto; align-content: start; } .desktop-mode-my-wordpress__media-tile { /* Override the base `.desktop-mode-file-tile` (position: absolute, * width: 88px) so media tiles flow inside the CSS Grid instead of * stacking at (0,0) like the absolute-positioned post/user tiles. * * `relative` (not `static`) so the tile remains a containing * block for absolutely-positioned descendants — the `::after` * shortcut-arrow badge on attachment tiles, and the * `` post-status corner ribbon — both of which * would otherwise escape to the nearest positioned ancestor * (the window, the desktop, the viewport) and render way off * the tile. */ position: relative; width: auto; display: flex; flex-direction: column; align-items: stretch; gap: 6px; padding: 8px; background: transparent; border: 1px solid transparent; border-radius: 8px; cursor: pointer; text-align: center; min-width: 0; } .desktop-mode-my-wordpress__media-tile:hover { background: var( --desktop-mode-hover, rgba( 0, 0, 0, 0.04 ) ); } /* Media tiles inherit the canonical `.desktop-mode-file-tile--selected` * rule from `desktop-files.css` — accent inset border + tinted * background — same as every other tile in the shell. */ /* Override the canonical 48×48 visual/preview sizing — media tiles * want the visual to fill the full grid-cell width as a square * thumbnail (or icon-fallback square). Photos browser look, not * folder-icon look. Applies to BOTH the `` (real thumbnail) * and the dashicon fallback (non-image MIME), so the two tile * shapes are visually consistent in the grid. */ .desktop-mode-my-wordpress__media-tile .desktop-mode-file-tile__visual { display: flex; align-items: center; justify-content: center; width: 100%; height: auto; aspect-ratio: 1 / 1; overflow: hidden; border-radius: 6px; background: var( --desktop-mode-media-tile-bg, rgba( 0, 0, 0, 0.05 ) ); /* Reset the base 32px font + 48px size since we're sizing the * inner img/icon explicitly below. */ font-size: 0; line-height: 1; } .desktop-mode-my-wordpress__media-tile .desktop-mode-file-tile__preview { width: 100%; height: 100%; object-fit: cover; border-radius: 0; } .desktop-mode-my-wordpress__media-tile .desktop-mode-file-tile__icon { /* Centered dashicon fallback — proportional to the larger * thumbnail well so it doesn't look like a postage stamp. */ width: auto; height: auto; font-size: 36px; color: var( --desktop-mode-muted, #787c82 ); } .desktop-mode-my-wordpress__media-tile .desktop-mode-file-tile__label { font-size: 12px; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } /* ----- Media preview pane ----- */ .desktop-mode-my-wordpress__media-pane { display: flex; flex-direction: column; gap: 16px; padding: 16px; } .desktop-mode-my-wordpress__media-title { font-size: 16px; font-weight: 600; margin: 0; } .desktop-mode-my-wordpress__media-visual { display: flex; align-items: center; justify-content: center; background: var( --desktop-mode-media-visual-bg, rgba( 0, 0, 0, 0.04 ) ); border-radius: 8px; min-height: 200px; max-height: 480px; overflow: hidden; } .desktop-mode-my-wordpress__media-image, .desktop-mode-my-wordpress__media-video { max-width: 100%; max-height: 480px; object-fit: contain; } .desktop-mode-my-wordpress__media-fallback-icon { font-size: 96px; width: 96px; height: 96px; color: var( --desktop-mode-muted, #787c82 ); } .desktop-mode-my-wordpress__media-doc-link { margin-inline-start: 16px; align-self: center; } .desktop-mode-my-wordpress__media-audio-stack { display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 24px; } .desktop-mode-my-wordpress__media-meta { display: grid; grid-template-columns: max-content 1fr; gap: 4px 16px; font-size: 13px; margin: 0; } .desktop-mode-my-wordpress__media-meta-term { color: var( --desktop-mode-muted, #787c82 ); margin: 0; } .desktop-mode-my-wordpress__media-meta-value { color: var( --desktop-mode-text, #1d2327 ); word-break: break-word; margin: 0; } .desktop-mode-my-wordpress__media-actions { display: flex; flex-wrap: wrap; gap: 8px; padding-top: 8px; border-top: 1px solid var( --desktop-mode-border, #dcdcde ); } /* ----- Media drill-in ----- */ /* Drill-in: referencing-posts list. Visually identical to the * Posts / Pages tiles — same `desktop-mode-file-tile` chrome (48px * dashicon + 88px-wide two-line label). We can't reuse the * absolute-positioning canvas layout from `renderEntityList` here * (those internals don't export), so this surface uses a flex-wrap * of fixed-width tiles to reproduce the look. * * NOTE: this rule INTENTIONALLY overrides the `__media-grid` * defaults (which target square thumbnails on 130px columns) so * usage tiles match the canvas-flowed post tiles instead. */ .desktop-mode-my-wordpress__usage-grid { display: flex; flex-wrap: wrap; gap: 12px 8px; padding: 16px; align-content: flex-start; } /* Reset the `__media-tile` overrides for usage tiles so they * inherit the unmodified `.desktop-mode-file-tile` chrome the * canvas-positioned post tiles use — except for `position: static` * so they participate in the flex layout. */ .desktop-mode-my-wordpress__tile--usage { width: 88px; align-items: center; padding: 8px 4px; gap: 6px; } /* Right-pane summary bar sits ABOVE the inline media preview. */ .desktop-mode-my-wordpress__media-detail-summary-bar { padding: 12px 16px; border-bottom: 1px solid var( --desktop-mode-border, #dcdcde ); } .desktop-mode-my-wordpress__media-detail-summary { margin: 0; color: var( --desktop-mode-muted, #787c82 ); font-size: 13px; } .desktop-mode-my-wordpress__media-detail-preview { /* Lets the embedded `__media-pane` keep its own padding without * fighting the summary bar's spacing. */ display: block; }