--- version: alpha name: WPMgr: The Ops Console description: Calm, dense, professional surface for agencies operating dozens to thousands of WordPress sites. Product register. Design serves the task. colors: background: "#FBFCFC" foreground: "#1B1F20" card: "#FFFFFF" muted: "#F1F4F4" muted-foreground: "#6C7678" border: "#E1E6E6" primary: "#1B6F77" primary-foreground: "#FBFCFC" success: "#27905F" warning: "#C58A1E" destructive: "#C13B2B" info: "#3D6FB8" severity-critical: "#8C2418" severity-high: "#C13B2B" severity-medium: "#C58A1E" severity-low: "#3D6FB8" chart-1: "#1B6F77" chart-2: "#27905F" chart-3: "#C58A1E" chart-4: "#A04C8A" chart-5: "#3D6FB8" typography: display: fontFamily: "IBM Plex Sans" fontSize: 36px fontWeight: 600 lineHeight: 1.1 letterSpacing: -0.01em h1: fontFamily: "IBM Plex Sans" fontSize: 28px fontWeight: 600 lineHeight: 1.2 h2: fontFamily: "IBM Plex Sans" fontSize: 22px fontWeight: 600 lineHeight: 1.3 body: fontFamily: "IBM Plex Sans" fontSize: 16px fontWeight: 400 lineHeight: 1.5 body-sm: fontFamily: "IBM Plex Sans" fontSize: 14px fontWeight: 400 lineHeight: 1.4 fontFeature: '"tnum" 1' caption: fontFamily: "IBM Plex Sans" fontSize: 12px fontWeight: 500 lineHeight: 1.3 letterSpacing: 0.02em mono: fontFamily: "IBM Plex Mono" fontSize: 14px fontWeight: 400 lineHeight: 1.4 fontFeature: '"zero" 1' rounded: none: 0px sm: 4px md: 6px lg: 8px xl: 12px full: 9999px spacing: xs: 4px sm: 8px md: 12px lg: 16px xl: 24px 2xl: 32px 3xl: 48px 4xl: 64px 5xl: 96px components: button-primary: backgroundColor: "{colors.primary}" textColor: "{colors.primary-foreground}" typography: "{typography.body-sm}" rounded: "{rounded.md}" padding: "8px 14px" button-secondary: backgroundColor: "transparent" textColor: "{colors.foreground}" typography: "{typography.body-sm}" rounded: "{rounded.md}" padding: "8px 14px" button-destructive: backgroundColor: "{colors.destructive}" textColor: "#FBFCFC" typography: "{typography.body-sm}" rounded: "{rounded.md}" padding: "8px 14px" input: backgroundColor: "{colors.background}" textColor: "{colors.foreground}" typography: "{typography.body-sm}" rounded: "{rounded.md}" padding: "8px 12px" card: backgroundColor: "{colors.card}" textColor: "{colors.foreground}" rounded: "{rounded.lg}" padding: "24px" row: backgroundColor: "{colors.background}" textColor: "{colors.foreground}" typography: "{typography.body-sm}" padding: "10px 16px" row-hover: backgroundColor: "{colors.muted}" badge-success: backgroundColor: "#E6F4ED" textColor: "#1A6E48" typography: "{typography.caption}" rounded: "{rounded.sm}" padding: "2px 8px" badge-warning: backgroundColor: "#FBF1DC" textColor: "#7A5612" typography: "{typography.caption}" rounded: "{rounded.sm}" padding: "2px 8px" badge-destructive: backgroundColor: "#F7E1DD" textColor: "#8B2A1F" typography: "{typography.caption}" rounded: "{rounded.sm}" padding: "2px 8px" badge-info: backgroundColor: "#E2EAF6" textColor: "#274A7B" typography: "{typography.caption}" rounded: "{rounded.sm}" padding: "2px 8px" --- ## Overview The Ops Console. A calm, dense, professional surface for agencies operating dozens to thousands of WordPress sites. Reads like Linear, Sentry, and Plausible, not like Vercel, Stripe, or a SaaS landing page. Design serves the operator, who stares at this for hours. Nothing competes with their data for attention. Hex values in YAML front matter are sRGB equivalents; the authoritative source is the OKLCH definitions in globals.css. DTCG export tools should round-trip from OKLCH for color-managed displays. ## Colors A restrained strategy: tinted neutrals + one committed primary + four semantic colors. No purple gradients, no cyan-on-dark glows, no second non-semantic accent. - Primary, Deep Restrained Teal `oklch(58% 0.12 195)`. Distinct from SaaS blue (250) and from WordPress blue (245). Used only for the single most important action per surface. - Neutrals tinted toward 195 at chroma 0.008. Subconscious cohesion; no pure gray. - Semantic at matched lightness 58 to 70 percent, distinct hues: - Success (sites up, backups OK) `oklch(58% 0.14 155)` - Warning (updates, recoverable issues) `oklch(70% 0.14 75)` - Destructive (down, vulnerabilities) `oklch(58% 0.20 25)` - Info (neutral notifications) `oklch(58% 0.10 235)` - Vulnerability severity is a discrete 4-step scale, never a continuous gradient. - Chart palette: 5 hues at matched lightness so no series visually dominates. - Dark mode: lighter surfaces, not shadows, create depth. Background 15 to Card 19 to Popover 22 percent lightness. ## Typography - IBM Plex Sans for UI body and headings. Weights 400, 500, 600, 700. Chosen because not on the flagged monoculture, excellent tabular numerals, ClearType hinting, ships matching mono. - IBM Plex Mono for versions, hostnames, paths, CVE IDs, hashes. - Fixed type scale at ratio 1.25: 11/12/14/16/18/22/28/36px. No fluid clamp. - Body text 16px minimum. Table rows 14px is the workhorse. - `font-variant-numeric: tabular-nums` on every column-bound number. - Headings get `text-wrap: balance`; prose gets `text-wrap: pretty`. - All-caps labels (column headers, captions) take +0.02em letter-spacing. ## Layout 4pt base spacing scale: 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96 / 128. Never invent off-scale values. - App shell: 240px sidebar + 48px topbar + content area (24px x 32px padding). - Content: max-width unset; inside, 12-column grid at >=1024px. - Density modes: Comfortable / Compact / Dense, persisted per user. Compact default. - Tables virtualized (TanStack + react-virtuoso) at >100 rows. Sticky header, sticky checkbox + URL column. - Breakpoints: 640 / 768 / 1024. Adapt, do not amputate. - 65 to 75ch max measure for any prose block. ## Elevation & Depth Borders over shadows. Default separator is 1px `--border`. Shadows reserved for things that literally float. - `xs`: 0 1px 0 border, sticky table header on scroll - `sm`: soft 1px row-hover lift, light mode only - `md`: popover, dropdown, command palette - `lg`: modal, drawer - Dark mode: depth from lighter surfaces, shadows nearly invisible - Never nest cards ## Shapes - Default radius 6px for inputs, buttons, badges - Cards 8px. Modals 12px. Avatars full. - No pill buttons. Buttons are rectangles with 6px radius. - Icons from lucide-react at 16/20/24px. Never emoji. ## Components - Button: 8px vertical, 14px horizontal, 6px radius, weight 600, no shadow, no gradient. Hover darkens 4%L; active 8%L. Loading replaces label with inline spinner. - Input: 36px height, 1px border, 6px radius, focus-visible ring 2px + 2px offset. - Badge: 12px caption, 0.02em tracking, 2/8 padding, 4px radius. - Card: card background, 1px border, 8px radius, 24px padding. Never nested. - Table row: 10/16 padding in Compact; hover muted; selected muted + 2px left ring primary. No striping. - Sidebar item: 8/12 padding, 6px radius, active = accent + 2px left ring primary. Counts mono right-aligned. - Toast (Sonner): popover bg, border, shadow-md, 5s/8s auto-dismiss, always a verb action link. - Modal: popover, 12px radius, shadow-lg, max 480px. Title is the action. Destructive requires typing the resource name. - Status dot: 8px filled circle in the semantic color. Always paired with a label or time. - Chip: 4px radius, 2/8 padding, never pill-shaped. - Sparkline: chart-1 stroke 1.5px, no fill, only bound to real series. ## Do's and Don'ts Do: - Use OKLCH for every color value. Tint every neutral toward the primary hue at chroma 0.008. - Use mono for every version string, hostname, path, hash, and CVE ID. - Use `tabular-nums` on every column-bound number. - Show counts in every bulk action ("Update plugins on 47 sites"). - Use verb-first button labels. Never OK or Submit. - Provide a reduced-motion fallback for every animation. - Show status as dot + label + time, never as a colored dot alone. - Use borders for separation; reserve shadows for floating elements. - Maintain WCAG AA on every text element including styled `