Files
ModelForge-Public/frontend/src/styles.css
T

1641 lines
96 KiB
CSS

/* ============================================================================
ITWorx ModelForge — operator console design system
One token layer, one component vocabulary. Every workspace already speaks
these class names, so the tokens below are the single place a visual
decision is made. Raw hex values do not appear outside the token block:
before v1.1 there were 225 of them scattered through this file, which is why
the same "border grey" existed in nine slightly different shades.
Colour carries meaning here, it never decorates. Neutrals build the surface,
the accent marks what is interactive, and the four status hues are reserved
for state the operator must be able to read at a glance. A panel is never
green because green looks nice.
============================================================================ */
/* --- Tokens -------------------------------------------------------------- */
:root {
/* Neutral ramp, very slightly cool so it reads as instrumentation rather
than as pure greyscale. 00 is the page, 06 the highest surface. */
--n-00: #07101d;
--n-01: #0a1422;
--n-02: #0e1a2a;
--n-03: #122033;
--n-04: #17263a;
--n-05: #1e2e43;
--n-06: #293b52;
--line-subtle: #17263a;
--line: #24364c;
--line-strong: #36506c;
--text: #f5f8fc;
--text-secondary: #b5c0cf;
--text-muted: #8493a7;
--text-faint: #718198;
--accent: #4f7cff;
--accent-hover: #7196ff;
--accent-surface: rgba(79, 124, 255, .13);
--accent-border: rgba(79, 124, 255, .42);
--accent-contrast: #ffffff;
--accent-cyan: #1ab7c9;
--accent-cyan-surface: rgba(26, 183, 201, .12);
--accent-violet: #8b7cff;
--accent-violet-surface: rgba(139, 124, 255, .12);
--ok: #6fd19a;
--ok-surface: rgba(111, 209, 154, .1);
--ok-border: rgba(111, 209, 154, .32);
--warn: #e5b567;
--warn-surface: rgba(229, 181, 103, .1);
--warn-border: rgba(229, 181, 103, .3);
--danger: #ef8b9b;
--danger-surface: rgba(239, 139, 155, .1);
--danger-border: rgba(239, 139, 155, .32);
--info: #7fb8e8;
--info-surface: rgba(127, 184, 232, .1);
--info-border: rgba(127, 184, 232, .3);
/* Spacing — a 4px grid. Naming is by role, not by number of pixels, so a
change of density is one edit rather than a find-and-replace. */
--s-1: 4px;
--s-2: 8px;
--s-3: 12px;
--s-4: 16px;
--s-5: 20px;
--s-6: 24px;
--s-7: 32px;
--s-8: 44px;
--r-sm: 6px;
--r-md: 10px;
--r-lg: 14px;
--r-full: 999px;
--t-xs: 10px;
--t-sm: 11px;
--t-base: 12px;
--t-md: 13px;
--t-lg: 15px;
--t-xl: 18px;
--shadow-1: 0 1px 2px rgba(0, 0, 0, .24);
--shadow-2: 0 18px 46px -20px rgba(0, 0, 0, .65);
--shadow-focus: 0 0 0 2px var(--n-00), 0 0 0 4px var(--accent);
--ease: cubic-bezier(.22, .61, .36, 1);
--sidebar-w: 264px;
/* Compatibility aliases. `--muted` and `--accent` were referenced by the
Operations workspace but never defined anywhere, so the capacity trend
chart drew `stroke: var(--accent)` — an invalid value — and rendered an
invisible line on a visible axis. */
--muted: var(--text-muted);
color-scheme: dark;
}
.operator-lock-shell {
min-height: 100vh;
display: grid;
place-items: center;
padding: 24px;
background: var(--n-00);
}
.operator-lock-card {
width: min(560px, 100%);
display: grid;
gap: 20px;
padding: 28px;
border: 1px solid var(--line);
border-radius: 16px;
background: var(--n-02);
box-shadow: var(--shadow-2);
}
.operator-lock-heading {
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
gap: 14px;
}
.operator-lock-heading h1 { margin: 3px 0 0; }
.operator-lock-card > p, .operator-lock-card > small { margin: 0; color: var(--muted); }
.operator-lock-card form { display: grid; gap: 10px; }
.operator-lock-card form button { justify-content: center; }
.operator-public-status {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.operator-public-status > div {
display: grid;
gap: 4px;
padding: 12px;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--n-01);
}
.operator-public-status span { color: var(--muted); font-size: .78rem; }
@media (max-width: 520px) {
.operator-lock-card { padding: 20px; }
.operator-public-status { grid-template-columns: 1fr; }
}
/* Light theme. The ramp inverts but the roles do not: --n-00 stays "the page",
--n-06 stays "the highest surface", so every component keeps its depth
relationship without a single component rule being duplicated. */
@media (prefers-color-scheme: light) {
:root:not([data-theme="dark"]) {
--n-00: #fbfbfd;
--n-01: #ffffff;
--n-02: #f7f8fa;
--n-03: #f2f4f7;
--n-04: #ebeef2;
--n-05: #e2e6ec;
--n-06: #d7dce4;
--line-subtle: #ecedf1;
--line: #dfe3e9;
--line-strong: #c6ccd6;
--text: #10131a;
--text-secondary: #4a5361;
--text-muted: #67707e;
--text-faint: #67707e;
--accent: #4a5bd4;
--accent-hover: #3a4ac0;
--accent-surface: rgba(74, 91, 212, .08);
--accent-border: rgba(74, 91, 212, .3);
--ok: #1d7a4d;
--ok-surface: rgba(29, 122, 77, .08);
--ok-border: rgba(29, 122, 77, .26);
--warn: #92620d;
--warn-surface: rgba(146, 98, 13, .08);
--warn-border: rgba(146, 98, 13, .24);
--danger: #b53247;
--danger-surface: rgba(181, 50, 71, .07);
--danger-border: rgba(181, 50, 71, .24);
--info: #1f6394;
--info-surface: rgba(31, 99, 148, .08);
--info-border: rgba(31, 99, 148, .24);
--shadow-1: 0 1px 2px rgba(16, 19, 26, .06);
--shadow-2: 0 12px 28px -14px rgba(16, 19, 26, .22);
color-scheme: light;
}
}
:root[data-theme="light"] {
--n-00: #fbfbfd;
--n-01: #ffffff;
--n-02: #f7f8fa;
--n-03: #f2f4f7;
--n-04: #ebeef2;
--n-05: #e2e6ec;
--n-06: #d7dce4;
--line-subtle: #ecedf1;
--line: #dfe3e9;
--line-strong: #c6ccd6;
--text: #10131a;
--text-secondary: #4a5361;
--text-muted: #67707e;
--text-faint: #67707e;
--accent: #4a5bd4;
--accent-hover: #3a4ac0;
--accent-surface: rgba(74, 91, 212, .08);
--accent-border: rgba(74, 91, 212, .3);
--ok: #1d7a4d;
--ok-surface: rgba(29, 122, 77, .08);
--ok-border: rgba(29, 122, 77, .26);
--warn: #92620d;
--warn-surface: rgba(146, 98, 13, .08);
--warn-border: rgba(146, 98, 13, .24);
--danger: #b53247;
--danger-surface: rgba(181, 50, 71, .07);
--danger-border: rgba(181, 50, 71, .24);
--info: #1f6394;
--info-surface: rgba(31, 99, 148, .08);
--info-border: rgba(31, 99, 148, .24);
--shadow-1: 0 1px 2px rgba(16, 19, 26, .06);
--shadow-2: 0 12px 28px -14px rgba(16, 19, 26, .22);
color-scheme: light;
}
/* --- Base ---------------------------------------------------------------- */
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
margin: 0;
min-width: 320px;
min-height: 100vh;
background: var(--n-00);
color: var(--text);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: var(--t-md);
line-height: 1.5;
font-synthesis: none;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
h1, h2, h3 { letter-spacing: -.018em; font-weight: 600; }
h1 { margin: var(--s-1) 0 var(--s-2); font-size: clamp(24px, 2.4vw, 32px); letter-spacing: -.03em; }
h2 { font-size: var(--t-xl); margin: 0; }
h3 { font-size: var(--t-lg); margin: 0; }
p { margin: 0; }
code, pre { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; }
button, input, select, textarea { font: inherit; color: inherit; }
/* One visible focus ring for the whole application. Keyboard operators could
previously not tell where they were: there was no :focus-visible rule at all,
and most controls reset the browser default away with `border: 0`. */
:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
box-shadow: var(--shadow-focus);
}
::selection { background: var(--accent-surface); color: var(--text); }
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: .01ms !important;
animation-iteration-count: 1 !important;
transition-duration: .01ms !important;
transition-delay: 0s !important;
}
}
@media (forced-colors: active) {
:focus-visible { outline-color: Highlight; box-shadow: none; }
nav button.active { outline: 1px solid Highlight; outline-offset: -2px; }
}
/* --- Shell --------------------------------------------------------------- */
.shell { min-height: 100vh; display: grid; grid-template-columns: var(--sidebar-w) minmax(0, 1fr); align-content: start; }
.sidebar {
border-right: 1px solid var(--line-subtle);
background: var(--n-01);
padding: var(--s-5) var(--s-3) var(--s-4);
display: flex;
flex-direction: column;
gap: var(--s-5);
position: sticky;
top: 0;
height: 100vh;
overflow-y: auto;
}
.brand { display: flex; align-items: center; gap: var(--s-3); padding: 0 var(--s-2); }
.brand-mark {
width: 34px; height: 34px; flex-shrink: 0;
border: 1px solid var(--line); border-radius: var(--r-md);
display: grid; place-items: center;
background: var(--n-03); color: var(--accent);
}
.brand-copy { display: flex; flex-direction: column; min-width: 0; }
.brand strong { font-size: var(--t-md); letter-spacing: -.015em; }
.brand span { color: var(--text-faint); font-size: var(--t-xs); }
.nav-groups { display: flex; flex-direction: column; gap: var(--s-5); flex: 1; }
.nav-group { display: flex; flex-direction: column; gap: 2px; }
.nav-group-label {
color: var(--text-faint);
font-size: 9px; font-weight: 700;
letter-spacing: .13em; text-transform: uppercase;
padding: 0 var(--s-3) var(--s-2);
}
nav { display: flex; flex-direction: column; gap: 2px; }
nav button {
width: 100%; border: 0; background: transparent; color: var(--text-muted);
padding: var(--s-2) var(--s-3); border-radius: var(--r-sm);
display: flex; gap: var(--s-3); align-items: center;
font-size: var(--t-md); cursor: pointer; text-align: left;
transition: background .13s var(--ease), color .13s var(--ease);
}
nav button span { flex: 1; min-width: 0; }
nav button svg { flex-shrink: 0; opacity: .82; }
nav button:hover { color: var(--text); background: var(--n-03); }
nav button.active { color: var(--text); background: var(--accent-surface); font-weight: 500; }
nav button.active svg { color: var(--accent); opacity: 1; }
.sidebar-footer {
margin-top: auto; color: var(--text-faint); font-size: var(--t-sm);
padding-top: var(--s-3); border-top: 1px solid var(--line-subtle);
display: flex; align-items: center; gap: var(--s-2);
}
.status-dot {
width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0;
background: var(--ok); box-shadow: 0 0 10px var(--ok-border);
}
.status-dot.error { background: var(--danger); box-shadow: 0 0 10px var(--danger-border); }
.theme-toggle {
border: 1px solid var(--line); background: var(--n-02); color: var(--text-secondary);
border-radius: var(--r-sm); padding: var(--s-2); cursor: pointer;
display: grid; place-items: center; margin-left: auto;
transition: color .13s var(--ease), border-color .13s var(--ease);
}
.theme-toggle:hover { color: var(--text); border-color: var(--line-strong); }
main { padding: var(--s-7) clamp(var(--s-5), 3.5vw, var(--s-8)) var(--s-8); max-width: 1560px; width: 100%; }
/* Mobile navigation. The sidebar used to be `display: none` below 760px with
nothing to replace it, which left the console unnavigable on a phone or a
narrow tablet — every route except the landing one became unreachable. */
.mobile-bar { display: none; }
.nav-scrim { display: none; }
.page-header {
display: flex; justify-content: space-between; gap: var(--s-6);
align-items: flex-start; margin-bottom: var(--s-6);
padding-bottom: var(--s-5); border-bottom: 1px solid var(--line-subtle);
}
.page-header > div { min-width: 0; }
.page-header p { color: var(--text-muted); max-width: 68ch; font-size: var(--t-md); }
.foundation-badge {
border: 1px solid var(--line); color: var(--text-muted); background: var(--n-02);
padding: var(--s-2) var(--s-3); border-radius: var(--r-full);
font-size: var(--t-sm); white-space: nowrap; flex-shrink: 0;
}
.eyebrow {
color: var(--text-faint); font-size: 9px; letter-spacing: .13em;
text-transform: uppercase; font-weight: 700;
}
.muted { color: var(--text-muted); font-size: var(--t-base); }
/* --- Surfaces ------------------------------------------------------------ */
.metric-card, .panel {
border: 1px solid var(--line-subtle);
background: var(--n-01);
border-radius: var(--r-lg);
box-shadow: var(--shadow-1);
}
.panel { padding: var(--s-5); }
.panel-header {
display: flex; justify-content: space-between; align-items: center;
border-bottom: 1px solid var(--line-subtle); padding-bottom: var(--s-4); gap: var(--s-4);
}
.panel-header h2 { margin: var(--s-1) 0 0; font-size: var(--t-lg); }
.panel-header > svg { color: var(--text-faint); flex-shrink: 0; }
.panel-intro { color: var(--text-muted); font-size: var(--t-md); line-height: 1.6; padding: var(--s-1) 0 var(--s-3); }
.metrics-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-3); margin-bottom: var(--s-3); }
.metric-card { min-height: 112px; padding: var(--s-4); display: flex; flex-direction: column; gap: var(--s-1); }
.metric-card strong {
font-size: 26px; margin-top: var(--s-2); letter-spacing: -.03em; font-weight: 600;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.grid-two { display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(300px, .75fr); gap: var(--s-3); }
/* --- Status vocabulary ---------------------------------------------------- */
.pill, .status-chip, .registry-status, .critical-chip {
display: inline-flex; align-items: center; width: max-content;
padding: var(--s-1) var(--s-2); border-radius: var(--r-full);
border: 1px solid var(--line-strong); background: var(--n-03); color: var(--text-secondary);
font-size: 9px; text-transform: uppercase; letter-spacing: .09em; font-weight: 600;
white-space: nowrap;
}
.status-chip.active,
.registry-status.verified, .registry-status.ready, .registry-status.active {
color: var(--ok); border-color: var(--ok-border); background: var(--ok-surface);
}
.status-chip.missing, .status-chip.degraded {
color: var(--warn); border-color: var(--warn-border); background: var(--warn-surface);
}
.registry-status.corrupt, .registry-status.missing, .registry-status.blocked,
.registry-status.security_blocked, .registry-status.license_blocked, .critical-chip {
color: var(--danger); border-color: var(--danger-border); background: var(--danger-surface);
}
.pill.candidate, .registry-status.candidate, .registry-status.remote, .registry-status.unverified {
color: var(--accent); border-color: var(--accent-border); background: var(--accent-surface);
}
/* The status vocabulary the API actually emits.
*
* `stateClass()` lowercases a state name into a modifier, so a backup in state FAILED renders as
* `status-chip failed` — a class that had no rule, in either the old stylesheet or the new one.
* A failed backup was therefore the same neutral grey as a freshly created one, which is the exact
* distinction a recovery console exists to make. These four groups close that gap for every state
* name the workspaces pass through, rather than for the handful that happened to be styled.
*/
.status-chip.completed, .status-chip.succeeded, .status-chip.verified, .status-chip.ready,
.status-chip.online, .status-chip.stable, .status-chip.eligible, .status-chip.restore-eligible,
.status-chip.passed, .status-chip.immutable, .status-chip.approved, .status-chip.committed,
.registry-status.completed, .registry-status.succeeded, .registry-status.stable,
.registry-status.online, .registry-status.approved {
color: var(--ok); border-color: var(--ok-border); background: var(--ok-surface);
}
.status-chip.pending, .status-chip.running, .status-chip.created, .status-chip.in-progress,
.status-chip.draining, .status-chip.stale, .status-chip.canary, .status-chip.awaiting,
.status-chip.planned, .status-chip.paused, .status-chip.deferred, .status-chip.requires-reindex,
.registry-status.pending, .registry-status.running, .registry-status.created,
.registry-status.in-progress, .registry-status.draining, .registry-status.quarantined,
.registry-status.stale, .registry-status.paused {
color: var(--warn); border-color: var(--warn-border); background: var(--warn-surface);
}
.status-chip.failed, .status-chip.failure, .status-chip.error, .status-chip.blocked,
.status-chip.corrupt, .status-chip.cancelled, .status-chip.quarantined, .status-chip.rejected,
.status-chip.offline, .status-chip.critical, .status-chip.revoked, .status-chip.unavailable,
.status-chip.security-blocked, .status-chip.license-blocked, .status-chip.not-supported,
.registry-status.failed, .registry-status.error, .registry-status.cancelled,
.registry-status.rejected, .registry-status.offline, .registry-status.revoked,
.registry-status.unavailable {
color: var(--danger); border-color: var(--danger-border); background: var(--danger-surface);
}
.status-chip.candidate, .status-chip.draft, .status-chip.experimental, .status-chip.shadow,
.status-chip.remote, .status-chip.unverified, .status-chip.observed,
.registry-status.draft, .registry-status.experimental, .registry-status.shadow {
color: var(--accent); border-color: var(--accent-border); background: var(--accent-surface);
}
/* A recorded failure reason must not read as ordinary prose. `p.failure` carries the backup's
failure code and reason and had no rule at all, so it sat directly under the description in the
same colour and weight. */
.failure {
display: flex; gap: var(--s-2); align-items: baseline;
border-left: 2px solid var(--danger); background: var(--danger-surface);
color: var(--danger); padding: var(--s-2) var(--s-3);
border-radius: 0 var(--r-sm) var(--r-sm) 0; font-size: var(--t-sm); overflow-wrap: anywhere;
}
/* Derived artifacts are provenance-distinct from the source bytes they came from; the panel spent
two sections making that distinction and then rendered both identically. */
.provenance-card.derived { border-left: 2px solid var(--info); }
.provenance-card.derived .eyebrow { color: var(--info); }
.comparison-verdict {
display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-3);
margin-top: var(--s-4); padding-top: var(--s-4); border-top: 1px solid var(--line-subtle);
color: var(--text-muted); font-size: var(--t-sm);
}
.liveness {
display: inline-flex; align-items: center; gap: var(--s-2);
border: 1px solid var(--line-strong); border-radius: var(--r-full);
padding: var(--s-1) var(--s-2); color: var(--text-secondary);
font-size: 9px; text-transform: uppercase; letter-spacing: .09em; font-weight: 600;
}
.liveness i { width: 6px; height: 6px; border-radius: 50%; background: var(--text-faint); flex-shrink: 0; }
.liveness.online { border-color: var(--ok-border); color: var(--ok); background: var(--ok-surface); }
.liveness.online i { background: var(--ok); box-shadow: 0 0 7px var(--ok); }
.liveness.stale { border-color: var(--warn-border); color: var(--warn); background: var(--warn-surface); }
.liveness.stale i { background: var(--warn); }
.liveness.offline, .liveness.disabled, .liveness.decommissioned { border-color: var(--danger-border); color: var(--danger); background: var(--danger-surface); }
.liveness.offline i, .liveness.disabled i, .liveness.decommissioned i { background: var(--danger); }
/* --- Controls ------------------------------------------------------------- */
.hardware-toolbar button, .registry-filters button, .registry-inline-form button,
.metadata-section button, .registry-create-row button, .registry-actions button,
.discovery-search button, .discovery-refresh button, .planner-controls button,
.plan-review button, .artifact-jobs button, .provenance-note button,
.runtime-controls button, .probe-detail button, .client-form button, .playground button,
.admin-boundary button, .promotion-actions button, .client-row button, .run-card button,
.lifecycle-boundary button, .lifecycle-toolbar button, .lifecycle-form button,
.lifecycle-json-form button, .lifecycle-actions button, .standalone-action,
.confirm-action button, .cleanup-form button, .migration-actions button,
.enrollment-panel button, .icon-action, .registry-pagination button,
.decommission-form button, .decommission-confirmation button {
display: inline-flex; align-items: center; justify-content: center; gap: var(--s-2);
border: 1px solid var(--line-strong); background: var(--n-04); color: var(--text);
border-radius: var(--r-sm); padding: var(--s-2) var(--s-3); cursor: pointer;
font-size: var(--t-base); font-weight: 500;
transition: background .13s var(--ease), border-color .13s var(--ease);
}
.hardware-toolbar button:hover, .registry-actions button:hover, .discovery-search button:hover,
.runtime-controls button:hover, .client-form button:hover, .playground button:hover,
.lifecycle-actions button:hover, .migration-actions button:hover, .enrollment-panel button:hover,
.icon-action:hover, .registry-pagination button:hover {
background: var(--n-05); border-color: var(--line-strong);
}
button:disabled { opacity: .42; cursor: not-allowed; }
button.danger, .registry-actions button.danger, .lifecycle-actions button.danger,
.confirm-action button:first-of-type, .registry-record button {
color: var(--danger); border-color: var(--danger-border); background: var(--danger-surface);
}
.icon-action, .registry-pagination button, .registry-record button {
width: 32px; height: 32px; padding: 0; display: grid; place-items: center;
}
input, select, textarea,
.registry-filters input, .registry-filters select, .registry-inline-form input,
.metadata-section input, .metadata-section textarea, .registry-create-row input,
.registry-create-row select, .discovery-search input, .discovery-refresh select,
.planner-controls select, .runtime-controls select, .runtime-controls input,
.runtime-controls textarea, .client-form input, .playground input, .playground textarea,
.admin-boundary input, .enrollment-panel input, .lifecycle-boundary input,
.lifecycle-form input, .lifecycle-form select, .lifecycle-form textarea,
.lifecycle-json-form textarea, .cleanup-form input, .cleanup-form select,
.case-workspace select, .migration-boundary input, .operations-boundary input {
border: 1px solid var(--line); background: var(--n-00); color: var(--text);
border-radius: var(--r-sm); padding: var(--s-2) var(--s-3); font: inherit;
transition: border-color .13s var(--ease);
}
input:hover, select:hover, textarea:hover { border-color: var(--line-strong); }
input::placeholder, textarea::placeholder { color: var(--text-faint); }
label { color: var(--text-muted); font-size: var(--t-sm); }
/* --- Tabs ----------------------------------------------------------------- */
.registry-tabs, .evaluation-tabs, .lifecycle-tabs {
display: flex; gap: var(--s-1); overflow-x: auto; border-bottom: 1px solid var(--line-subtle);
scrollbar-width: thin;
}
.registry-tabs button, .evaluation-tabs button, .lifecycle-tabs button {
border: 0; border-bottom: 2px solid transparent; border-radius: 0; background: transparent;
color: var(--text-muted); padding: var(--s-3); text-transform: capitalize; cursor: pointer;
white-space: nowrap; font-size: var(--t-md);
transition: color .13s var(--ease), border-color .13s var(--ease);
}
.registry-tabs button:hover, .evaluation-tabs button:hover, .lifecycle-tabs button:hover { color: var(--text-secondary); }
.registry-tabs button.active, .evaluation-tabs button.active, .lifecycle-tabs button.active {
color: var(--text); border-bottom-color: var(--accent);
}
.capability-tabs { display: flex; gap: var(--s-1); overflow-x: auto; }
.capability-tabs button {
border: 1px solid var(--line); background: var(--n-02); color: var(--text-muted);
padding: var(--s-2) var(--s-3); border-radius: var(--r-sm); text-transform: capitalize;
cursor: pointer; white-space: nowrap; font-size: var(--t-base);
}
.capability-tabs button.active { color: var(--text); border-color: var(--accent-border); background: var(--accent-surface); }
/* --- Feedback and empty states -------------------------------------------- */
.error-banner {
padding: var(--s-3) var(--s-4); border: 1px solid var(--danger-border);
background: var(--danger-surface); color: var(--danger);
border-radius: var(--r-md); margin-bottom: var(--s-3);
font-size: var(--t-base); display: flex; flex-direction: column; gap: var(--s-1);
}
.error-banner strong { color: var(--danger); }
.lifecycle-notice {
display: flex; align-items: center; gap: var(--s-2);
border: 1px solid var(--ok-border); background: var(--ok-surface); color: var(--ok);
border-radius: var(--r-md); padding: var(--s-3) var(--s-4); font-size: var(--t-base);
}
.empty { color: var(--text-muted); padding: var(--s-6) 0; }
/* Decommission is deliberately a distinct, terminal lifecycle surface. The
border, confirmation copy, and retained-evidence column make the difference
between an audited tombstone and a generic destructive delete explicit. */
.danger-zone {
border-color: var(--danger-border);
background: linear-gradient(145deg, var(--danger-surface), var(--n-01) 42%);
}
.danger-zone > .eyebrow, .danger-zone > h2 { color: var(--danger); }
.danger-zone > p { max-width: 82ch; color: var(--text-secondary); }
.decommission-form {
display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)) auto;
gap: var(--s-3); align-items: end; margin-top: var(--s-5);
}
.decommission-form label, .decommission-confirmation label {
display: grid; gap: var(--s-2); min-width: 0;
}
.decommission-form .wide { grid-column: 1 / 3; }
.decommission-form textarea { min-height: 82px; resize: vertical; }
.decommission-preview {
display: grid; gap: var(--s-4); margin-top: var(--s-5);
padding-top: var(--s-5); border-top: 1px solid var(--danger-border);
}
.decommission-verdict {
display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--s-2) var(--s-4);
padding: var(--s-3) var(--s-4); border: 1px solid; border-radius: var(--r-md);
}
.decommission-verdict span { font-size: var(--t-sm); overflow-wrap: anywhere; }
.decommission-verdict.safe { color: var(--ok); border-color: var(--ok-border); background: var(--ok-surface); }
.decommission-verdict.blocked { color: var(--danger); border-color: var(--danger-border); background: var(--danger-surface); }
.decommission-blockers { display: grid; gap: var(--s-2); }
.decommission-blockers h3, .decommission-columns h3 { margin: 0 0 var(--s-1); font-size: var(--t-md); }
.decommission-blockers article {
display: grid; grid-template-columns: minmax(150px, .7fr) minmax(240px, 1.8fr) auto;
gap: var(--s-3); align-items: baseline; padding: var(--s-3);
border: 1px solid var(--danger-border); border-radius: var(--r-sm); background: var(--danger-surface);
}
.decommission-blockers article strong { color: var(--danger); text-transform: capitalize; }
.decommission-blockers article span { color: var(--text-secondary); }
.decommission-blockers article code { color: var(--text-muted); white-space: nowrap; }
.decommission-columns { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-4); }
.decommission-columns > div {
padding: var(--s-4); border: 1px solid var(--line); border-radius: var(--r-md); background: var(--n-02);
}
.decommission-columns dl { display: grid; gap: var(--s-2); margin: 0; }
.decommission-columns dl > div {
display: flex; justify-content: space-between; gap: var(--s-3);
padding-top: var(--s-2); border-top: 1px solid var(--line-subtle);
}
.decommission-columns dt { color: var(--text-secondary); text-transform: capitalize; }
.decommission-columns dd { margin: 0; color: var(--text-muted); text-align: right; }
.decommission-confirmation {
display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--s-3); align-items: end;
padding: var(--s-4); border: 1px solid var(--danger-border); border-radius: var(--r-md); background: var(--danger-surface);
}
.decommission-confirmation code { color: var(--danger); overflow-wrap: anywhere; }
.decommission-confirmation .danger-action {
color: var(--danger); border-color: var(--danger-border); background: var(--n-02);
}
.decommission-confirmation .danger-action:not(:disabled):hover { background: var(--danger-surface); }
.decommission-complete { border-style: dashed; }
.decommission-complete .property-grid { margin-top: var(--s-4); }
.state-card {
min-height: 140px; border: 1px dashed var(--line); border-radius: var(--r-lg);
color: var(--text-muted); display: flex; align-items: center; justify-content: center;
gap: var(--s-3); background: var(--n-01); font-size: var(--t-md);
}
.state-spinner {
width: 14px; height: 14px; border-radius: 50%;
border: 2px solid var(--line-strong); border-top-color: var(--accent);
animation: spin .7s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
.spin { animation: spin .7s linear infinite; }
.future-state {
min-height: 400px; border: 1px dashed var(--line); border-radius: var(--r-lg);
display: flex; flex-direction: column; justify-content: center; align-items: center;
text-align: center; padding: var(--s-8); color: var(--text-muted); background: var(--n-01);
}
.future-state svg { color: var(--text-faint); margin-bottom: var(--s-4); }
.future-state h2 { color: var(--text); margin: var(--s-2) 0; font-size: 20px; }
.future-state p { max-width: 52ch; line-height: 1.6; font-size: var(--t-md); }
/* --- Data display --------------------------------------------------------- */
.property-grid {
display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px;
background: var(--line-subtle); border: 1px solid var(--line-subtle);
border-radius: var(--r-md); overflow: hidden;
}
.property-grid.compact { grid-template-columns: repeat(3, minmax(0, 1fr)); margin-top: var(--s-4); }
.property { display: flex; flex-direction: column; gap: var(--s-1); padding: var(--s-3); background: var(--n-02); min-width: 0; }
.property span { color: var(--text-faint); font-size: 9px; text-transform: uppercase; letter-spacing: .08em; font-weight: 600; }
.property strong { font-size: var(--t-base); color: var(--text-secondary); font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tags { display: flex; flex-wrap: wrap; gap: var(--s-1); margin-top: 2px; }
.tags code {
color: var(--text-secondary); background: var(--n-03); border: 1px solid var(--line-subtle);
padding: 2px var(--s-2); border-radius: var(--r-sm); font-size: var(--t-xs);
}
.meter, .job-progress, .migration-progress {
height: 6px; border-radius: var(--r-full); overflow: hidden; background: var(--n-05);
}
.meter span, .job-progress span { display: block; height: 100%; background: var(--accent); border-radius: inherit; }
.migration-progress span { display: block; height: 100%; background: var(--ok); }
.insight { padding: var(--s-4) 0; border-bottom: 1px solid var(--line-subtle); }
.insight:last-child { border-bottom: 0; }
.insight strong { display: block; margin-bottom: var(--s-1); font-size: var(--t-md); }
.insight p { color: var(--text-muted); font-size: var(--t-base); line-height: 1.6; }
.insight-badge { color: var(--text-faint); font-size: 9px; letter-spacing: .13em; font-weight: 700; }
.model-list { display: flex; flex-direction: column; }
.model-row {
display: grid; grid-template-columns: 36px minmax(0, 1fr) auto; gap: var(--s-3);
padding: var(--s-4) 0; border-bottom: 1px solid var(--line-subtle); align-items: start;
}
.model-row:last-child { border-bottom: 0; }
.model-icon {
width: 34px; height: 34px; border: 1px solid var(--line-subtle); border-radius: var(--r-sm);
display: grid; place-items: center; color: var(--text-muted); background: var(--n-03);
}
.model-copy { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
.model-copy strong { font-size: var(--t-md); }
.model-copy > span { color: var(--text-muted); font-size: var(--t-base); line-height: 1.45; }
.model-meta { display: flex; flex-direction: column; align-items: flex-end; gap: var(--s-2); }
.model-meta small { color: var(--text-faint); font-size: var(--t-xs); max-width: 130px; text-align: right; }
/* --- Compute nodes -------------------------------------------------------- */
.hardware-stack, .discovery-stack, .runtime-stack, .capability-stack,
.evaluation-stack, .lifecycle-stack, .migration-stack, .registry-stack, .registry-detail {
display: flex; flex-direction: column; gap: var(--s-3); min-width: 0;
}
.operations-stack { display: grid; gap: var(--s-4); }
/* Tab panels exist to complete the ARIA tabs pattern, not to introduce a new spacing context.
Without this they would collapse each workspace's stack into a single flex/grid item and the
gaps between the panels' own children would disappear. */
[role="tabpanel"] { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
.operations-stack > [role="tabpanel"] { gap: var(--s-4); }
[role="tabpanel"]:focus { outline: none; }
[role="tabpanel"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--r-sm); }
/* Typed confirmation for a completed guarded action, next to the existing .field-error tone. */
.field-success { color: var(--ok); font-size: var(--t-base); margin: 0; }
.hardware-toolbar, .lifecycle-toolbar {
display: flex; justify-content: space-between; align-items: center;
color: var(--text-muted); font-size: var(--t-base); gap: var(--s-4);
}
.toolbar-actions { display: flex; gap: var(--s-2); }
.node-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(370px, 1fr)); gap: var(--s-3); }
.node-card {
color: inherit; text-align: left; cursor: pointer; width: 100%;
transition: border-color .13s var(--ease), transform .13s var(--ease), box-shadow .13s var(--ease);
}
.node-card:hover { border-color: var(--line-strong); transform: translateY(-1px); box-shadow: var(--shadow-2); }
.node-card-footer {
display: flex; justify-content: space-between; gap: var(--s-3);
color: var(--text-muted); font-size: var(--t-sm); margin-top: var(--s-4);
padding-top: var(--s-3); border-top: 1px solid var(--line-subtle);
}
.hardware-node { display: flex; flex-direction: column; gap: var(--s-4); }
.hardware-detail { display: flex; flex-direction: column; gap: var(--s-2); padding: var(--s-6) 0; }
.hardware-detail span { color: var(--text-muted); font-size: var(--t-md); }
.accelerator-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); gap: var(--s-3); }
.gpu-card { border: 1px solid var(--line-subtle); background: var(--n-02); padding: var(--s-4); border-radius: var(--r-md); }
.gpu-title { display: flex; justify-content: space-between; gap: var(--s-4); }
.gpu-title h3 { margin: var(--s-1) 0; font-size: var(--t-lg); }
.gpu-title code { color: var(--text-faint); font-size: var(--t-xs); }
.gpu-meter-row { display: flex; justify-content: space-between; color: var(--text-muted); font-size: var(--t-sm); margin-top: var(--s-4); }
.storage-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: var(--s-2); }
.storage-list > div { display: flex; flex-direction: column; gap: var(--s-1); padding: var(--s-3); border: 1px solid var(--line-subtle); border-radius: var(--r-sm); background: var(--n-02); }
.storage-list strong { font-size: var(--t-sm); text-transform: uppercase; color: var(--text-muted); letter-spacing: .06em; }
.storage-list code { font-size: var(--t-xs); color: var(--text-faint); overflow: hidden; text-overflow: ellipsis; }
.storage-list span { font-size: var(--t-sm); color: var(--text-secondary); }
.enrollment-panel { max-width: 720px; display: flex; flex-direction: column; gap: var(--s-3); }
.enrollment-panel p, .enrollment-panel small { color: var(--text-muted); font-size: var(--t-base); line-height: 1.6; }
.enrollment-panel label { display: flex; flex-direction: column; gap: var(--s-2); font-size: var(--t-sm); }
.enrollment-panel button { align-self: flex-start; }
.secret-output, .enrollment-panel pre {
overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere;
border: 1px solid var(--line); background: var(--n-00); color: var(--text-secondary);
padding: var(--s-3); border-radius: var(--r-sm); font-size: var(--t-sm);
}
.secret-output { color: var(--warn); border-color: var(--warn-border); background: var(--warn-surface); }
.form-actions { display: flex; gap: var(--s-2); }
.eligibility-options { display: flex; flex-wrap: wrap; gap: var(--s-4); }
.eligibility-options label { flex-direction: row; align-items: center; gap: var(--s-2); }
.eligibility-options input { width: auto; accent-color: var(--accent); }
/* --- Projects ------------------------------------------------------------- */
.project-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--s-3); }
.project-card h2 { margin: var(--s-2) 0; }
.project-card > p { color: var(--text-muted); font-size: var(--t-md); line-height: 1.6; min-height: 40px; }
.binding-list { margin-top: var(--s-4); border-top: 1px solid var(--line-subtle); }
.binding-list > div { display: flex; flex-direction: column; gap: var(--s-1); padding: var(--s-3) 0; border-bottom: 1px solid var(--line-subtle); }
.binding-list > div:last-child { border-bottom: 0; }
.binding-list code { color: var(--text-secondary); font-size: var(--t-base); }
.binding-list span { color: var(--text-muted); font-size: var(--t-sm); }
/* --- Registry ------------------------------------------------------------- */
.registry-layout { display: grid; grid-template-columns: minmax(300px, .7fr) minmax(0, 1.6fr); gap: var(--s-3); align-items: start; }
.registry-list { position: sticky; top: var(--s-5); padding: var(--s-4); max-height: calc(100vh - var(--s-8)); overflow: auto; }
.registry-filters { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-2); padding: var(--s-3) 0; }
.registry-filters input, .registry-filters button { grid-column: 1 / -1; }
.registry-inline-form {
display: flex; flex-direction: column; gap: var(--s-2); padding: var(--s-3);
border: 1px solid var(--line); background: var(--n-02); border-radius: var(--r-md); margin-bottom: var(--s-3);
}
.registry-inline-form label, .metadata-section label, .registry-create-row label,
.runtime-controls label, .discovery-refresh label, .planner-controls label,
.client-form label, .playground label, .lifecycle-boundary label, .lifecycle-form label,
.cleanup-form label, .admin-boundary label, .case-workspace > label {
display: flex; flex-direction: column; gap: var(--s-1);
color: var(--text-muted); font-size: 9px; text-transform: uppercase; letter-spacing: .07em; font-weight: 600;
}
.registry-models { display: flex; flex-direction: column; }
.registry-models > button {
border: 0; border-top: 1px solid var(--line-subtle); background: transparent; color: inherit;
padding: var(--s-3) var(--s-2); text-align: left; cursor: pointer;
display: flex; justify-content: space-between; gap: var(--s-3);
transition: background .13s var(--ease);
}
.registry-models > button:hover { background: var(--n-02); }
.registry-models > button.selected { background: var(--accent-surface); box-shadow: inset 2px 0 var(--accent); }
.registry-models > button > div { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
.registry-models > button > div:last-child { align-items: flex-end; flex-shrink: 0; }
.registry-models strong { font-size: var(--t-md); }
.registry-models span, .registry-models small { color: var(--text-muted); font-size: var(--t-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.registry-pagination {
display: flex; align-items: center; justify-content: space-between; gap: var(--s-2);
padding-top: var(--s-3); border-top: 1px solid var(--line-subtle); color: var(--text-muted); font-size: var(--t-xs);
}
.registry-placeholder { min-height: 340px; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; color: var(--text-muted); }
.registry-placeholder h2 { color: var(--text); margin: var(--s-3) 0 var(--s-1); }
.registry-placeholder p { max-width: 48ch; font-size: var(--t-base); line-height: 1.6; }
.registry-hero { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--s-5); }
.registry-hero h2 { margin: var(--s-1) 0; font-size: 20px; }
.registry-hero p { color: var(--text-muted); }
.registry-actions { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; justify-content: flex-end; }
.registry-sections { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-3); }
.metadata-section:last-child { grid-column: 1 / -1; }
.metadata-section h3 { margin: var(--s-2) 0 var(--s-4); }
.metadata-section form { display: flex; flex-direction: column; gap: var(--s-2); margin-top: var(--s-2); }
.metadata-section textarea { min-height: 84px; resize: vertical; }
.registry-create-row { display: grid; grid-template-columns: minmax(150px, .7fr) repeat(2, minmax(150px, 1fr)) auto; gap: var(--s-2); align-items: end; }
.registry-create-row > div { display: flex; flex-direction: column; gap: var(--s-1); align-self: center; }
.registry-create-row.artifact-form { grid-template-columns: minmax(140px, .7fr) repeat(4, minmax(115px, 1fr)) auto; }
.registry-record { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; align-items: center; gap: var(--s-3); }
.registry-record > svg { color: var(--text-faint); }
.registry-record > div { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
.registry-record code { color: var(--text-secondary); font-size: var(--t-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.registry-record small { color: var(--text-muted); font-size: var(--t-xs); }
.registry-empty, .registry-loading { color: var(--text-muted); min-height: 84px; display: flex; justify-content: center; align-items: center; gap: var(--s-2); font-size: var(--t-base); }
.metadata-section dl, .provenance-card dl {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1px;
margin: 0 0 var(--s-3); background: var(--line-subtle);
}
.metadata-section dl div, .provenance-card dl div { background: var(--n-02); padding: var(--s-3); }
.metadata-section dt, .provenance-card dt { color: var(--text-faint); font-size: 9px; text-transform: uppercase; letter-spacing: .07em; font-weight: 600; }
.metadata-section dd, .provenance-card dd { margin: var(--s-1) 0 0; font-size: var(--t-sm); overflow-wrap: anywhere; }
.metadata-section pre, .provenance-card pre, .advisor-card pre, .operation-card pre, .lifecycle-card pre {
overflow: auto; max-height: 260px; white-space: pre-wrap;
color: var(--text-secondary); background: var(--n-00); border: 1px solid var(--line-subtle);
border-radius: var(--r-sm); padding: var(--s-3); font-size: var(--t-xs); line-height: 1.55;
}
.dependency-conflict { border: 1px solid var(--danger-border); background: var(--danger-surface); border-radius: var(--r-md); padding: var(--s-4); color: var(--danger); }
.dependency-conflict p { margin: var(--s-1) 0 var(--s-3); font-size: var(--t-sm); }
.dependency-conflict ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--s-1); }
.dependency-conflict li { display: grid; grid-template-columns: 130px 80px 1fr; gap: var(--s-2); font-size: var(--t-xs); }
.dependency-conflict small { overflow: hidden; text-overflow: ellipsis; }
.provenance-note p { color: var(--text-muted); margin: var(--s-1) 0 0; font-size: var(--t-base); }
.provenance-note button { margin-top: var(--s-3); }
.provenance-card { display: flex; flex-direction: column; gap: var(--s-3); }
.provenance-card > div:first-child { display: flex; flex-direction: column; gap: var(--s-1); }
.provenance-card code { color: var(--text-secondary); font-size: var(--t-xs); overflow-wrap: anywhere; }
.provenance-card > div:nth-child(2) { display: flex; gap: var(--s-3); align-items: center; color: var(--text-muted); font-size: var(--t-xs); }
.location-row { display: grid !important; grid-template-columns: 1fr 1fr auto; border: 1px solid var(--line-subtle); border-radius: var(--r-sm); padding: var(--s-2); }
.lineage-list { display: flex !important; flex-direction: column; gap: var(--s-1); }
.lineage-list > div { display: grid; grid-template-columns: 28px 1fr; gap: var(--s-2); }
.provenance-card details, .lifecycle-card details, .case-list details { color: var(--text-muted); font-size: var(--t-sm); }
/* --- Discovery ------------------------------------------------------------ */
.acquisition-boundary, .runtime-boundary, .evaluation-boundary,
.migration-warning, .candidate-card {
display: flex; gap: var(--s-3); align-items: flex-start;
}
.acquisition-boundary { border-color: var(--warn-border); background: var(--warn-surface); }
.acquisition-boundary svg, .migration-warning svg { color: var(--warn); flex-shrink: 0; }
.runtime-boundary { border-color: var(--warn-border); background: var(--warn-surface); align-items: center; }
.runtime-boundary > div { flex: 1; }
.evaluation-boundary { border-color: var(--info-border); background: var(--info-surface); align-items: center; }
.candidate-card { border-color: var(--ok-border); background: var(--ok-surface); align-items: center; }
.candidate-card > div { flex: 1; }
.candidate-card h2 { margin: var(--s-1) 0; }
.candidate-card code { color: var(--text-muted); font-size: 9px; }
.acquisition-boundary p, .discovery-search p, .discovery-refresh p, .artifact-set-explain p,
.artifact-jobs p, .runtime-boundary p, .candidate-card p, .evaluation-boundary p,
.run-card p, .migration-card p, .comparison-card p, .case-list p,
.capability-hero p, .scheduler-card small, .client-form p, .playground p,
.lifecycle-boundary p, .lifecycle-json-form p, .lifecycle-card p,
.migration-boundary p, .migration-warning p, .migration-plan-form p {
color: var(--text-muted); font-size: var(--t-sm); line-height: 1.6; margin: var(--s-1) 0 0;
}
.discovery-grid, .runtime-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-3); }
.discovery-search h2, .discovery-refresh h2, .download-planner h2, .artifact-jobs h2 { margin: var(--s-1) 0 var(--s-4); }
.discovery-search form { display: grid; grid-template-columns: 1fr auto; gap: var(--s-2); }
.discovery-refresh { display: flex; flex-direction: column; gap: var(--s-3); }
.discovery-results { display: flex; flex-direction: column; margin-top: var(--s-3); max-height: 300px; overflow: auto; }
.discovery-results > article { display: flex; justify-content: space-between; gap: var(--s-3); padding: var(--s-3) 2px; border-top: 1px solid var(--line-subtle); }
.discovery-results > article > div { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
.discovery-results > article > div:last-child { align-items: flex-end; }
.discovery-results small, .snapshot-summary small, .snapshot-summary span,
.artifact-set-explain span, .plan-review small, .artifact-jobs small, .upstream-files small {
color: var(--text-muted); font-size: var(--t-xs);
}
.snapshot-summary { display: flex; flex-direction: column; gap: var(--s-2); border: 1px solid var(--line); border-radius: var(--r-sm); padding: var(--s-3); background: var(--n-02); }
.snapshot-summary code, .plan-review code, .upstream-files code { color: var(--text-secondary); font-size: var(--t-xs); overflow-wrap: anywhere; }
.planner-controls { display: grid; grid-template-columns: 1fr 1fr auto; gap: var(--s-3); align-items: end; }
.artifact-set-explain { margin-top: var(--s-3); padding: var(--s-3); border-left: 2px solid var(--accent); background: var(--accent-surface); border-radius: 0 var(--r-sm) var(--r-sm) 0; }
.plan-review { margin-top: var(--s-3); border: 1px solid var(--line); border-radius: var(--r-md); padding: var(--s-3); }
.plan-review > div { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-3); }
.plan-review ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--s-1); max-height: 260px; overflow: auto; }
.plan-review li { display: flex; justify-content: space-between; gap: var(--s-3); padding: var(--s-2) 0; border-top: 1px solid var(--line-subtle); }
.artifact-jobs > article { display: grid; grid-template-columns: minmax(230px, 1fr) minmax(115px, .5fr) auto; gap: var(--s-3); align-items: center; padding: var(--s-3) 0; border-top: 1px solid var(--line-subtle); }
.artifact-jobs > article > div:first-child { display: flex; flex-direction: column; align-items: flex-start; gap: var(--s-1); min-width: 0; }
.upstream-files { display: flex; flex-direction: column; }
.upstream-files > div { display: flex; justify-content: space-between; gap: var(--s-3); border-top: 1px solid var(--line-subtle); padding: var(--s-3) 0; }
.upstream-files > div > div { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
.upstream-files > div > div:last-child { align-items: flex-end; }
/* --- Runtime -------------------------------------------------------------- */
.runtime-controls { display: flex; flex-direction: column; gap: var(--s-3); }
.runtime-controls h2 { margin: 0 0 var(--s-1); }
.runtime-controls textarea { min-height: 64px; resize: vertical; }
.runtime-facts, .evaluation-facts { display: grid; gap: 1px; background: var(--line-subtle); margin: 0; }
.runtime-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.evaluation-facts { grid-template-columns: repeat(3, 1fr); }
.runtime-facts div, .evaluation-facts div { background: var(--n-02); padding: var(--s-3); min-width: 0; }
.runtime-facts dt, .evaluation-facts dt { color: var(--text-faint); font-size: 9px; text-transform: uppercase; letter-spacing: .07em; font-weight: 600; }
.runtime-facts dd, .evaluation-facts dd { margin: var(--s-1) 0 0; color: var(--text-secondary); font-size: var(--t-sm); overflow-wrap: anywhere; }
.runtime-facts code { color: var(--text-muted); font-size: 9px; }
.gate-list { display: flex; flex-direction: column; border: 1px solid var(--line-subtle); border-radius: var(--r-sm); overflow: hidden; }
.gate-list div { display: flex; justify-content: space-between; padding: var(--s-2) var(--s-3); border-top: 1px solid var(--line-subtle); font-size: var(--t-xs); }
.gate-list div:first-child { border-top: 0; }
.gate-list span { color: var(--text-muted); }
.gate-list strong { color: var(--text-secondary); }
.runtime-blockers, .blocker-list {
display: flex; gap: var(--s-3); border: 1px solid var(--danger-border);
background: var(--danger-surface); color: var(--danger); padding: var(--s-3); border-radius: var(--r-sm);
}
.runtime-blockers > div { display: flex; flex-direction: column; gap: var(--s-1); font-size: var(--t-xs); }
.runtime-matrix { display: flex; flex-direction: column; }
.runtime-matrix button {
display: grid; grid-template-columns: minmax(165px, .5fr) auto 1fr; gap: var(--s-3); align-items: center;
border: 0; border-top: 1px solid var(--line-subtle); background: transparent; color: inherit;
padding: var(--s-3) 2px; text-align: left; cursor: pointer;
}
.runtime-matrix button:hover { background: var(--n-02); }
.runtime-matrix button > div { display: flex; flex-direction: column; gap: var(--s-1); }
.runtime-matrix button span, .runtime-matrix button small { color: var(--text-muted); font-size: var(--t-xs); }
.probe-detail { display: flex; flex-direction: column; gap: var(--s-3); }
.probe-timeline { display: grid; grid-template-columns: repeat(6, 1fr); gap: var(--s-1); }
.probe-timeline span { padding: var(--s-2); border: 1px solid var(--line); color: var(--text-faint); border-radius: var(--r-sm); text-align: center; font-size: 8px; text-transform: uppercase; letter-spacing: .05em; }
.probe-timeline span.active { border-color: var(--ok-border); color: var(--ok); background: var(--ok-surface); }
/* --- Capabilities --------------------------------------------------------- */
.capability-hero { display: flex; align-items: center; justify-content: space-between; gap: var(--s-6); background: var(--n-02); }
.capability-hero h2 { margin: var(--s-1) 0; font-size: 22px; }
.capability-health { display: flex; flex-direction: column; align-items: flex-end; gap: var(--s-2); text-transform: uppercase; font-size: var(--t-sm); }
.capability-toolbar { display: flex; justify-content: space-between; gap: var(--s-3); align-items: center; }
.capability-metrics { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.evidence-list { display: flex; flex-direction: column; }
.evidence-row { min-width: 0; display: flex; justify-content: space-between; align-items: center; gap: var(--s-5); padding: var(--s-3) 0; border-bottom: 1px solid var(--line-subtle); }
.evidence-row:last-child { border-bottom: 0; }
.evidence-row span { color: var(--text-muted); font-size: var(--t-sm); }
.evidence-row strong { color: var(--text-secondary); font-size: var(--t-sm); max-width: 68%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.scheduler-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(410px, 1fr)); gap: var(--s-3); }
.scheduler-card { display: flex; flex-direction: column; gap: var(--s-4); }
.budget-total { display: flex; align-items: baseline; gap: var(--s-2); }
.budget-total strong { font-size: 24px; letter-spacing: -.03em; }
.budget-total span { color: var(--text-muted); font-size: var(--t-sm); }
.budget-bar { display: flex; height: 10px; overflow: hidden; border-radius: var(--r-full); background: var(--n-05); }
.budget-segment { min-width: 1px; height: 100%; }
.segment-0 { background: var(--danger); }
.segment-1 { background: var(--warn); }
.segment-2 { background: var(--accent); }
.segment-3 { background: var(--info); }
.segment-4 { background: var(--ok); }
.budget-legend { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 var(--s-5); }
.table-panel { overflow: hidden; }
.operation-table { overflow: auto; min-width: 800px; }
.table-head, .table-row {
display: grid; grid-template-columns: 1.1fr 1.2fr 1.3fr .65fr .75fr .75fr 1.2fr;
gap: var(--s-3); align-items: center; padding: var(--s-3) 0;
border-bottom: 1px solid var(--line-subtle); font-size: var(--t-sm);
}
.table-head { color: var(--text-faint); text-transform: uppercase; letter-spacing: .07em; font-size: 9px; font-weight: 600; }
.table-row { color: var(--text-secondary); }
.table-row code { color: var(--text-muted); }
.admin-boundary { max-width: 720px; display: grid; grid-template-columns: auto 1fr; gap: var(--s-4); align-items: center; }
.admin-boundary p { color: var(--text-muted); font-size: var(--t-base); margin-top: var(--s-1); }
.admin-boundary label { grid-column: 2; }
.admin-boundary button { grid-column: 2; justify-self: start; }
.client-form, .playground { display: flex; flex-direction: column; gap: var(--s-3); }
.client-form h2 { margin: var(--s-1) 0; }
.client-form button { align-self: flex-start; }
.playground { max-width: 840px; }
.playground textarea { min-height: 110px; resize: vertical; }
.playground-result { display: flex; flex-direction: column; border-top: 1px solid var(--line-subtle); padding-top: var(--s-3); }
.one-time-secret {
display: flex; flex-direction: column; gap: var(--s-2); padding: var(--s-3);
border: 1px solid var(--warn-border); background: var(--warn-surface); border-radius: var(--r-sm);
}
.one-time-secret code { color: var(--warn); overflow-wrap: anywhere; }
.one-time-secret small { color: var(--text-muted); }
.client-row { display: flex; align-items: center; justify-content: space-between; gap: var(--s-4); padding: var(--s-3) 0; border-bottom: 1px solid var(--line-subtle); }
.client-row > div { display: flex; flex-direction: column; gap: var(--s-1); }
.client-row span { color: var(--text-muted); font-size: var(--t-xs); }
.promotion-actions { display: flex; gap: var(--s-2); padding-top: var(--s-4); }
/* --- Evaluation and advisor ------------------------------------------------ */
.evaluation-boundary h2 { margin: var(--s-1) 0; }
.evaluation-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--s-3); }
.evaluation-grid h3 { margin: var(--s-2) 0; }
.evaluation-grid article > code, .run-card > code, .migration-card > code { color: var(--text-muted); font-size: 9px; overflow-wrap: anywhere; }
.evaluation-title { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); }
.metric-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; margin: var(--s-3) 0; background: var(--line-subtle); }
.metric-strip > span { background: var(--n-02); padding: var(--s-3); display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
.metric-strip small { color: var(--text-faint); font-size: 8px; text-transform: uppercase; letter-spacing: .06em; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.comparison-table { display: flex; flex-direction: column; margin-top: var(--s-4); }
.comparison-table > div { display: grid; grid-template-columns: 1.4fr repeat(3, 1fr); gap: var(--s-3); padding: var(--s-2); border-bottom: 1px solid var(--line-subtle); font-size: var(--t-sm); }
.model-comparison-table { display: flex; flex-direction: column; margin-top: var(--s-4); overflow-x: auto; }
.model-comparison-table > div {
display: grid; grid-template-columns: 1.8fr repeat(4, minmax(65px, .7fr)) minmax(60px, .6fr) repeat(2, minmax(82px, .8fr)) minmax(105px, 1fr) minmax(90px, 1fr);
gap: var(--s-2); min-width: 960px; padding: var(--s-2); border-bottom: 1px solid var(--line-subtle); font-size: var(--t-sm); align-items: center;
}
.advisor-grid { display: grid; gap: var(--s-4); }
.advisor-card .evaluation-title { align-items: flex-start; }
.advisor-card .evaluation-title > .status-chip { margin-left: auto; }
.advisor-evidence { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-4); margin: var(--s-4) 0; }
.advisor-evidence section { border: 1px solid var(--line-subtle); border-radius: var(--r-sm); padding: var(--s-3); background: var(--n-02); }
.advisor-evidence ul { margin: var(--s-2) 0 0; padding-left: var(--s-5); }
.case-workspace { display: flex; flex-direction: column; gap: var(--s-3); }
.case-workspace > label { max-width: 440px; }
.case-list { display: flex; flex-direction: column; gap: var(--s-3); content-visibility: auto; }
.case-list ol { max-height: 220px; overflow: auto; }
.case-list li { display: flex; justify-content: space-between; gap: var(--s-3); padding: var(--s-1); }
/* --- Lifecycle ------------------------------------------------------------ */
.lifecycle-boundary {
display: grid; grid-template-columns: auto minmax(250px, 1fr) minmax(210px, .55fr) auto;
align-items: center; gap: var(--s-4); border-color: var(--warn-border); background: var(--warn-surface);
}
.lifecycle-boundary h2 { margin: var(--s-1) 0; }
.lifecycle-boundary > svg { color: var(--warn); }
.lifecycle-form { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)) auto; gap: var(--s-3); align-items: end; }
.lifecycle-form h3 { grid-column: 1 / -1; }
.lifecycle-form .wide { grid-column: 1 / -2; }
.lifecycle-form textarea { min-height: 88px; resize: vertical; text-transform: none; letter-spacing: normal; }
.lifecycle-json-form { display: grid; grid-template-columns: minmax(210px, .5fr) minmax(340px, 1fr) auto; gap: var(--s-3); align-items: center; }
.lifecycle-json-form h3 { margin: var(--s-1) 0; }
.lifecycle-json-form textarea, .migration-plan-form textarea { min-height: 120px; resize: vertical; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: var(--t-xs); }
.lifecycle-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(370px, 1fr)); gap: var(--s-3); }
.lifecycle-card { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
.lifecycle-card.blocked { border-color: var(--danger-border); }
.lifecycle-card.approved { border-color: var(--ok-border); }
.lifecycle-title { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--s-3); }
.lifecycle-title h3 { margin: var(--s-1) 0; }
.lifecycle-title code, .lifecycle-card > code { color: var(--text-muted); font-size: 9px; overflow-wrap: anywhere; }
.evidence-matrix, .promotion-preview, .canary-metrics, .cleanup-summary {
display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1px; background: var(--line-subtle);
}
.cleanup-summary { grid-template-columns: repeat(3, 1fr); }
.lifecycle-fact { min-width: 0; background: var(--n-02); padding: var(--s-3); display: flex; flex-direction: column; gap: var(--s-1); }
.lifecycle-fact span { color: var(--text-faint); font-size: 8px; text-transform: uppercase; letter-spacing: .06em; font-weight: 600; }
.lifecycle-fact strong { color: var(--text-secondary); font-size: var(--t-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.blocker-list > div { min-width: 0; flex: 1; }
.blocker-list p { display: grid; grid-template-columns: minmax(145px, .65fr) 1fr; gap: var(--s-2); margin: var(--s-2) 0 0; }
.blocker-list code { color: var(--danger); overflow-wrap: anywhere; }
.blocker-list span { color: var(--text-muted); }
.eligible-note { display: flex; align-items: center; gap: var(--s-2); color: var(--ok); font-size: var(--t-xs); }
.lifecycle-actions { display: flex; gap: var(--s-2); margin-top: auto; }
.confirm-action {
display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap;
border: 1px solid var(--danger-border); background: var(--danger-surface);
border-radius: var(--r-sm); padding: var(--s-3); color: var(--danger); font-size: var(--t-xs);
}
.confirm-action span { flex: 1; min-width: 170px; }
.standalone-action { align-self: flex-start; }
.retention-list { display: flex; flex-direction: column; }
.retention-list > div { display: flex; justify-content: space-between; gap: var(--s-3); padding: var(--s-2) 0; border-top: 1px solid var(--line-subtle); font-size: var(--t-xs); }
.retention-list span { color: var(--text-muted); }
.cleanup-form { display: grid; grid-template-columns: auto 1fr 1fr auto; gap: var(--s-3); align-items: end; }
.dependency-row { display: flex; justify-content: space-between; gap: var(--s-3); padding: var(--s-2); border: 1px solid var(--line-subtle); border-radius: var(--r-sm); color: var(--text-muted); font-size: 9px; }
.dependency-row.blocking { border-color: var(--danger-border); color: var(--danger); }
.dependency-row code { overflow-wrap: anywhere; }
.lifecycle-timeline { display: flex; flex-direction: column; }
.lifecycle-timeline > div { display: grid; grid-template-columns: auto 145px minmax(0, 1fr); gap: var(--s-3); padding: var(--s-3) 0; border-top: 1px solid var(--line-subtle); }
.lifecycle-timeline time, .lifecycle-timeline span, .lifecycle-timeline small { color: var(--text-muted); font-size: 9px; }
.lifecycle-timeline div > div { display: flex; flex-direction: column; gap: var(--s-1); }
.lifecycle-timeline p { margin: 2px 0; color: var(--text-secondary); font-size: var(--t-xs); }
/* --- Migrations ------------------------------------------------------------ */
.migration-boundary { display: grid; grid-template-columns: auto 1fr minmax(210px, 270px) auto; align-items: end; gap: var(--s-4); }
.migration-boundary label { font-size: var(--t-xs); color: var(--text-muted); }
.migration-boundary input { display: block; width: 100%; margin-top: var(--s-1); }
.migration-metrics { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--s-3); }
.migration-fact { display: flex; flex-direction: column; gap: var(--s-1); padding: var(--s-3); border: 1px solid var(--line-subtle); border-radius: var(--r-sm); min-width: 0; background: var(--n-02); }
.migration-fact span { font-size: 9px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .07em; font-weight: 600; }
.migration-fact strong { font-size: var(--t-sm); overflow-wrap: anywhere; color: var(--text-secondary); }
.migration-warning { border-color: var(--warn-border); background: var(--warn-surface); }
.migration-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(380px, 1fr)); gap: var(--s-3); }
.migration-card { display: flex; flex-direction: column; gap: var(--s-3); }
.migration-title { display: flex; justify-content: space-between; gap: var(--s-3); }
.migration-title h3 { font-size: var(--t-md); overflow-wrap: anywhere; }
.migration-eligibility { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--s-2); }
.migration-identities { display: flex; flex-direction: column; gap: var(--s-1); }
.migration-identities code, .migration-card > code { font-size: 9px; overflow-wrap: anywhere; color: var(--text-muted); }
.migration-actions { display: flex; gap: var(--s-2); flex-wrap: wrap; }
.migration-blocker { display: flex; align-items: center; gap: var(--s-2); color: var(--danger); font-size: var(--t-xs); }
.migration-plan-form { display: grid; grid-template-columns: 250px 1fr auto; gap: var(--s-4); align-items: end; }
.migration-timeline { display: flex; flex-direction: column; }
.migration-timeline article { display: grid; grid-template-columns: 18px 1fr; gap: var(--s-3); }
.migration-timeline i { width: 8px; height: 8px; margin-top: var(--s-1); border-radius: 50%; background: var(--ok); }
.migration-timeline article:not(:last-child) i:after { content: ""; display: block; width: 1px; height: 76px; background: var(--line); margin: var(--s-2) 0 0 3px; }
.migration-timeline div { display: flex; flex-direction: column; gap: var(--s-1); padding-bottom: var(--s-4); }
.migration-timeline span, .migration-timeline p, .migration-timeline code { font-size: var(--t-xs); color: var(--text-muted); }
/* --- Operations ------------------------------------------------------------ */
.operations-boundary { display: grid; grid-template-columns: auto minmax(270px, 1fr) minmax(200px, 270px) auto; gap: var(--s-4); align-items: center; }
.operations-boundary label { display: grid; gap: var(--s-1); color: var(--text-muted); font-size: var(--t-base); }
.operations-boundary input { min-width: 0; }
.operations-tabs { overflow-x: auto; }
.operations-summary { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-4); }
.operations-summary article { display: grid; gap: var(--s-2); }
.operations-summary h3 { font-size: 26px; margin: 0; letter-spacing: -.03em; }
.operations-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(285px, 1fr)); gap: var(--s-4); }
.operations-section-title { display: flex; align-items: end; justify-content: space-between; gap: var(--s-4); margin-bottom: var(--s-3); }
.operation-card { display: grid; gap: var(--s-3); align-content: start; }
.operation-card > div:first-child { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); }
.operation-card dl { display: grid; grid-template-columns: minmax(88px, .8fr) minmax(135px, 1.2fr); gap: var(--s-2) var(--s-3); margin: 0; font-size: var(--t-sm); }
.operation-card dt { color: var(--text-muted); }
.operation-card dd { margin: 0; overflow-wrap: anywhere; color: var(--text-secondary); }
.operations-timeline { display: grid; gap: var(--s-3); }
.operations-timeline article { display: flex; gap: var(--s-3); align-items: start; }
.operations-timeline p { margin: var(--s-1) 0; }
.capacity-trends { margin-bottom: var(--s-4); }
.capacity-chart { width: 100%; min-height: 90px; overflow: visible; }
.capacity-chart polyline { fill: none; stroke: var(--accent); stroke-width: 2; vector-effect: non-scaling-stroke; }
/* --- Responsive ------------------------------------------------------------ */
@media (max-width: 1180px) {
.registry-layout { grid-template-columns: 1fr; }
.registry-list { position: static; max-height: none; }
.registry-create-row, .registry-create-row.artifact-form { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.discovery-grid, .runtime-grid { grid-template-columns: 1fr; }
.lifecycle-boundary, .lifecycle-json-form, .migration-boundary, .migration-plan-form { grid-template-columns: 1fr; }
.lifecycle-boundary > svg { display: none; }
.lifecycle-form { grid-template-columns: 1fr 1fr; }
.lifecycle-form .wide { grid-column: 1 / -1; }
}
@media (max-width: 1050px) {
.metrics-grid, .capability-metrics { grid-template-columns: repeat(2, 1fr); }
.grid-two { grid-template-columns: 1fr; }
.property-grid { grid-template-columns: repeat(2, 1fr); }
.migration-metrics { grid-template-columns: repeat(2, 1fr); }
.operations-boundary { grid-template-columns: auto 1fr; }
.operations-boundary label, .operations-boundary button { grid-column: 2; }
.operations-summary { grid-template-columns: 1fr; }
}
/* Below 860px the sidebar becomes a drawer instead of disappearing. */
@media (max-width: 860px) {
.shell { grid-template-columns: 1fr; grid-template-rows: auto minmax(0, 1fr); }
.mobile-bar {
display: flex; align-items: center; gap: var(--s-3);
position: sticky; top: 0; z-index: 30;
padding: var(--s-3) var(--s-4);
background: var(--n-01); border-bottom: 1px solid var(--line-subtle);
}
.mobile-bar strong { font-size: var(--t-md); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mobile-bar button {
border: 1px solid var(--line); background: var(--n-02); color: var(--text);
border-radius: var(--r-sm); padding: var(--s-2); cursor: pointer; display: grid; place-items: center;
}
.sidebar {
position: fixed; inset: 0 auto 0 0; z-index: 50; width: 270px; height: 100dvh;
transform: translateX(-100%); visibility: hidden;
transition: transform .22s var(--ease), visibility 0s .22s;
box-shadow: var(--shadow-2);
}
.sidebar.open { transform: translateX(0); visibility: visible; transition-delay: 0s; }
.nav-scrim { display: block; position: fixed; inset: 0; z-index: 40; background: rgba(0, 0, 0, .5); border: 0; }
main { padding: var(--s-5) var(--s-4) var(--s-7); }
.page-header { flex-direction: column; gap: var(--s-3); }
.metrics-grid, .capability-metrics, .node-grid, .lifecycle-grid, .migration-list,
.scheduler-grid, .budget-legend, .advisor-evidence, .registry-sections,
.registry-create-row, .registry-create-row.artifact-form, .lifecycle-form,
.cleanup-form, .evidence-matrix, .promotion-preview, .canary-metrics, .cleanup-summary,
.admin-boundary, .migration-metrics {
grid-template-columns: 1fr;
}
.decommission-form, .decommission-columns, .decommission-confirmation { grid-template-columns: 1fr; }
.decommission-form .wide { grid-column: auto; }
.decommission-blockers article { grid-template-columns: 1fr; }
.metric-strip, .comparison-table > div { grid-template-columns: repeat(2, 1fr); }
.model-row { grid-template-columns: 36px 1fr; }
.model-meta { grid-column: 2; align-items: flex-start; }
.hardware-toolbar, .capability-hero, .capability-toolbar, .registry-hero { align-items: flex-start; flex-direction: column; }
.capability-health { align-items: flex-start; }
.metadata-section:last-child { grid-column: auto; }
.lifecycle-form .wide { grid-column: auto; }
.admin-boundary label, .admin-boundary button { grid-column: 1; }
.lifecycle-timeline > div { grid-template-columns: auto 1fr; }
.lifecycle-timeline > div > div { grid-column: 2; }
}
/* --- M18 premium operator experience -------------------------------------
These components are the production translation of the Stitch M18 system:
calm navy instrumentation, strong hierarchy, evidence on demand and safe,
compact actions. Existing workspace selectors intentionally inherit the
same tokens so M18 remains one product rather than an isolated dashboard. */
body {
font-family: Geist, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background: var(--n-00);
}
button { -webkit-tap-highlight-color: transparent; }
.skip-link {
position: fixed; z-index: 1000; left: var(--s-4); top: var(--s-3);
transform: translateY(-160%); padding: var(--s-2) var(--s-4);
color: var(--accent-contrast); background: var(--accent); border-radius: var(--r-sm);
font-weight: 650; text-decoration: none; transition: transform .15s var(--ease);
}
.skip-link:focus { transform: translateY(0); }
.sidebar {
padding: var(--s-5) var(--s-3) var(--s-4);
background: color-mix(in srgb, var(--n-01) 96%, var(--accent) 4%);
border-right-color: var(--line);
}
.brand { min-height: 40px; }
.brand-mark {
background: var(--accent-surface); border-color: var(--accent-border);
color: var(--accent); box-shadow: inset 0 0 0 1px rgba(255,255,255,.025);
}
.brand strong { font-size: var(--t-lg); letter-spacing: -.025em; }
.brand span { font-size: var(--t-sm); }
.nav-groups { gap: var(--s-4); }
.nav-group-label { color: var(--text-faint); padding-top: var(--s-1); }
nav button { min-height: 42px; padding: 7px var(--s-3); border: 1px solid transparent; }
nav button:hover { border-color: var(--line-subtle); }
nav button.active { border-color: var(--accent-border); box-shadow: inset 3px 0 var(--accent); }
.nav-copy { display: flex; flex-direction: column; gap: 0; line-height: 1.25; }
.nav-copy strong { color: inherit; font-size: var(--t-md); font-weight: 560; }
.nav-copy small {
color: var(--text-faint); font-size: 9px; font-weight: 450;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
nav button.active .nav-copy small { color: var(--text-muted); }
.sidebar-footer { min-height: 40px; }
main { max-width: none; padding: 0 clamp(var(--s-5), 3.2vw, 52px) 64px; overflow: hidden; }
.workspace-toolbar {
min-height: 58px; display: flex; align-items: center; justify-content: space-between; gap: var(--s-4);
position: sticky; top: 0; z-index: 20; margin: 0 calc(-1 * clamp(var(--s-5), 3.2vw, 52px));
padding: 0 clamp(var(--s-5), 3.2vw, 52px); border-bottom: 1px solid var(--line-subtle);
background: color-mix(in srgb, var(--n-00) 91%, transparent); backdrop-filter: blur(14px);
}
.breadcrumbs { display: flex; align-items: center; gap: var(--s-2); color: var(--text-faint); font-size: var(--t-sm); min-width: 0; }
.breadcrumbs strong { color: var(--text-secondary); font-weight: 550; }
.breadcrumbs span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.workspace-actions { display: flex; align-items: center; gap: var(--s-2); }
.workspace-actions .theme-toggle { margin-left: 0; min-height: 34px; min-width: 34px; }
.quick-jump {
height: 34px; display: flex; align-items: center; gap: var(--s-2); cursor: pointer;
border: 1px solid var(--line); border-radius: var(--r-md); background: var(--n-02);
color: var(--text-muted); padding: 0 var(--s-2) 0 var(--s-3);
}
.quick-jump:hover { border-color: var(--line-strong); color: var(--text); background: var(--n-03); }
kbd {
min-width: 38px; padding: 2px var(--s-1); border: 1px solid var(--line); border-radius: 4px;
background: var(--n-01); color: var(--text-faint); font: 500 9px/1.35 ui-monospace, monospace; text-align: center;
}
.page-header { margin: var(--s-7) 0 var(--s-6); padding-bottom: var(--s-5); align-items: end; }
.page-header h1 { font-size: clamp(27px, 2.6vw, 38px); line-height: 1.1; margin-top: var(--s-2); }
.page-header p { font-size: var(--t-md); color: var(--text-secondary); }
.foundation-badge { display: inline-flex; align-items: center; gap: var(--s-2); background: var(--n-01); }
.foundation-badge .status-dot { box-shadow: none; }
.metric-card, .panel { border-color: var(--line); }
.panel { box-shadow: 0 1px 0 rgba(255,255,255,.018), var(--shadow-1); }
.panel-header { border-bottom-color: var(--line); }
.panel h2, .panel h3 { color: var(--text); }
details > summary { cursor: pointer; color: var(--text-secondary); font-weight: 550; }
details > summary:hover { color: var(--text); }
/* Quick jump */
.command-scrim {
position: fixed; inset: 0; z-index: 200; display: grid; place-items: start center;
padding: min(14vh, 120px) var(--s-4) var(--s-4); background: rgba(2, 7, 15, .72);
backdrop-filter: blur(6px); animation: command-in .14s var(--ease);
}
.command-dialog {
width: min(680px, 100%); max-height: min(680px, 76vh); display: flex; flex-direction: column;
border: 1px solid var(--line-strong); border-radius: var(--r-lg); background: var(--n-01);
box-shadow: 0 34px 90px -26px rgba(0,0,0,.75); overflow: hidden;
}
.command-input-row { display: flex; align-items: center; gap: var(--s-3); padding: var(--s-4); border-bottom: 1px solid var(--line); }
.command-input-row > svg { color: var(--accent); flex-shrink: 0; }
.command-input-row input { flex: 1; min-width: 0; border: 0; background: transparent; padding: 0; font-size: var(--t-lg); }
.command-input-row input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; box-shadow: none; }
.command-input-row button { display: grid; place-items: center; border: 0; background: transparent; color: var(--text-muted); padding: var(--s-2); cursor: pointer; border-radius: var(--r-sm); }
.command-results { padding: var(--s-2); overflow-y: auto; }
.command-results button {
width: 100%; min-height: 58px; display: grid; grid-template-columns: 36px 1fr auto; align-items: center;
gap: var(--s-3); padding: var(--s-2) var(--s-3); border: 1px solid transparent; border-radius: var(--r-md);
background: transparent; color: var(--text); text-align: left; cursor: pointer;
}
.command-results button:hover, .command-results button:focus-visible { background: var(--n-03); border-color: var(--line); }
.command-result-icon { width: 34px; height: 34px; display: grid; place-items: center; border: 1px solid var(--line); border-radius: var(--r-md); color: var(--accent); background: var(--n-02); }
.command-results button > span:nth-child(2) { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.command-results small { color: var(--text-muted); }
.command-results button > svg { color: var(--text-faint); }
.command-empty { padding: var(--s-7); color: var(--text-muted); text-align: center; }
.command-hint { display: flex; justify-content: space-between; gap: var(--s-3); padding: var(--s-2) var(--s-4); border-top: 1px solid var(--line); color: var(--text-faint); font-size: var(--t-sm); }
.command-hint span { display: flex; align-items: center; gap: var(--s-1); }
@keyframes command-in { from { opacity: 0; } to { opacity: 1; } }
/* Command center */
.command-center { display: flex; flex-direction: column; gap: var(--s-4); }
.health-band {
display: flex; justify-content: space-between; align-items: center; gap: var(--s-5);
padding: var(--s-5); border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--n-01);
box-shadow: inset 3px 0 var(--accent);
}
.health-band.healthy { box-shadow: inset 3px 0 var(--ok); }
.health-band.warning { box-shadow: inset 3px 0 var(--warn); }
.health-band.critical { box-shadow: inset 3px 0 var(--danger); }
.health-identity { display: flex; align-items: center; gap: var(--s-4); min-width: 0; }
.health-identity > svg { color: var(--ok); flex-shrink: 0; }
.health-band.warning .health-identity > svg { color: var(--warn); }
.health-band.critical .health-identity > svg { color: var(--danger); }
.health-identity h2 { font-size: clamp(18px, 2vw, 23px); margin: 2px 0; }
.health-identity p { color: var(--text-muted); font-size: var(--t-sm); }
.health-actions { display: flex; align-items: center; gap: var(--s-3); flex-shrink: 0; }
.command-status { display: inline-flex; align-items: center; gap: var(--s-2); color: var(--text-muted); font-size: var(--t-sm); white-space: nowrap; }
.command-status > span { width: 7px; height: 7px; border-radius: 50%; background: var(--text-faint); }
.command-status.healthy > span { background: var(--ok); }
.command-status.warning > span { background: var(--warn); }
.command-status.critical > span { background: var(--danger); }
.secondary-action, .platform-contract button {
min-height: 36px; display: inline-flex; align-items: center; justify-content: center; gap: var(--s-2);
border: 1px solid var(--line); border-radius: var(--r-md); background: var(--n-02); color: var(--text-secondary);
padding: var(--s-2) var(--s-3); cursor: pointer;
}
.secondary-action:hover, .platform-contract button:hover { border-color: var(--accent-border); color: var(--text); background: var(--accent-surface); }
.command-kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-3); }
.command-kpi {
min-height: 114px; display: grid; grid-template-columns: 36px minmax(0, 1fr) auto; gap: var(--s-3); align-items: start;
padding: var(--s-4); border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--n-01); text-align: left;
}
button.command-kpi { cursor: pointer; color: inherit; }
button.command-kpi:hover { border-color: var(--accent-border); background: color-mix(in srgb, var(--n-01) 92%, var(--accent) 8%); transform: translateY(-1px); }
.kpi-icon { width: 34px; height: 34px; display: grid; place-items: center; border-radius: var(--r-md); border: 1px solid var(--line); color: var(--text-muted); background: var(--n-02); }
.kpi-icon.healthy { color: var(--ok); border-color: var(--ok-border); background: var(--ok-surface); }
.kpi-icon.warning { color: var(--warn); border-color: var(--warn-border); background: var(--warn-surface); }
.kpi-icon.critical { color: var(--danger); border-color: var(--danger-border); background: var(--danger-surface); }
.kpi-copy { display: flex; flex-direction: column; min-width: 0; }
.kpi-copy small { color: var(--text-faint); text-transform: uppercase; letter-spacing: .08em; font-size: 9px; font-weight: 650; }
.kpi-copy strong { margin: var(--s-2) 0 1px; font-size: 20px; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kpi-copy span { color: var(--text-muted); font-size: var(--t-sm); }
.command-kpi > svg { color: var(--text-faint); align-self: center; }
.command-grid { display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(340px, .8fr); gap: var(--s-4); }
.command-grid.lower { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.command-panel-header { margin-bottom: var(--s-4); }
.capacity-row { display: flex; flex-direction: column; gap: var(--s-3); padding: var(--s-3) 0; }
.capacity-row + .capacity-row { border-top: 1px solid var(--line-subtle); }
.capacity-row > div:first-child { display: flex; justify-content: space-between; gap: var(--s-3); }
.capacity-row > div:first-child span { color: var(--text-muted); font-size: var(--t-sm); }
.capacity-track { height: 11px; display: flex; overflow: hidden; border: 1px solid var(--line); border-radius: var(--r-full); background: var(--n-03); }
.capacity-track span { height: 100%; }
.capacity-used { background: var(--accent-cyan); }
.capacity-reserve { background: var(--accent-violet); }
.capacity-legend { display: flex; gap: var(--s-4); flex-wrap: wrap; color: var(--text-muted); font-size: var(--t-sm); }
.capacity-legend span { display: flex; align-items: center; gap: var(--s-1); }
.capacity-legend i { width: 7px; height: 7px; border-radius: 2px; background: var(--n-06); }
.capacity-legend i.used { background: var(--accent-cyan); }
.capacity-legend i.reserve { background: var(--accent-violet); }
.inline-empty { min-height: 100px; display: flex; align-items: center; justify-content: center; gap: var(--s-3); color: var(--text-faint); text-align: left; }
.inline-empty strong { color: var(--text-secondary); }
.inline-empty p { color: var(--text-muted); font-size: var(--t-sm); }
.attention-list { display: flex; flex-direction: column; }
.attention-list button {
display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; gap: var(--s-3); align-items: start;
padding: var(--s-3) 0; border: 0; border-bottom: 1px solid var(--line-subtle); background: transparent; color: var(--text); text-align: left; cursor: pointer;
}
.attention-list button:last-child { border-bottom: 0; }
.attention-list button:hover strong { color: var(--accent-hover); }
.attention-list button > span:nth-child(2) { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.attention-list small { color: var(--text-muted); line-height: 1.45; }
.attention-list button > svg { color: var(--text-faint); margin-top: var(--s-2); }
.attention-marker { width: 28px; height: 28px; display: grid; place-items: center; border-radius: var(--r-md); color: var(--text-muted); background: var(--n-03); }
.attention-marker.warning { color: var(--warn); background: var(--warn-surface); }
.attention-marker.critical { color: var(--danger); background: var(--danger-surface); }
.assurance-gate { display: grid; grid-template-columns: 1fr auto; gap: var(--s-3); align-items: end; }
.assurance-gate-copy { grid-column: 1 / -1; display: flex; gap: var(--s-3); padding: var(--s-3); border: 1px solid var(--line-subtle); border-radius: var(--r-md); background: var(--n-02); color: var(--accent); }
.assurance-gate-copy strong { color: var(--text-secondary); }
.assurance-gate-copy p { color: var(--text-muted); font-size: var(--t-sm); }
.assurance-gate label { display: grid; gap: var(--s-1); color: var(--text-muted); font-size: var(--t-sm); }
.assurance-gate input { width: 100%; }
.assurance-gate button { min-height: 38px; padding: var(--s-2) var(--s-4); border: 1px solid var(--accent-border); border-radius: var(--r-md); background: var(--accent); color: white; cursor: pointer; }
.assurance-gate .field-error { grid-column: 1 / -1; color: var(--danger); }
.assurance-metrics { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-3); }
.assurance-metrics > button { min-height: 92px; display: grid; grid-template-columns: auto 1fr auto; gap: var(--s-3); align-items: center; padding: var(--s-3); border: 1px solid var(--line); border-radius: var(--r-md); background: var(--n-02); color: var(--text); text-align: left; cursor: pointer; }
.assurance-metrics > button > svg { color: var(--accent); }
.assurance-metrics > button > span:nth-child(2) { display: flex; flex-direction: column; }
.assurance-metrics strong { font-size: 22px; }
.assurance-metrics small { color: var(--text-muted); }
.assurance-foot { grid-column: 1 / -1; color: var(--text-muted); font-size: var(--t-sm); }
.activity-timeline { display: flex; flex-direction: column; }
.activity-timeline button { min-height: 52px; display: grid; grid-template-columns: 16px minmax(0,1fr) auto; gap: var(--s-2); align-items: start; padding: var(--s-2) 0; border: 0; background: transparent; color: var(--text); text-align: left; cursor: pointer; }
.activity-timeline button > span:nth-child(2) { display: flex; flex-direction: column; min-width: 0; }
.activity-timeline small, .activity-timeline time { color: var(--text-muted); font-size: var(--t-sm); }
.activity-timeline time { white-space: nowrap; }
.timeline-node { width: 8px; height: 8px; margin-top: 6px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 4px var(--accent-surface); }
.activity-timeline button:not(:last-child) .timeline-node:after { content: ""; display: block; width: 1px; height: 39px; margin: 8px 0 0 3px; background: var(--line); }
.platform-contract { display: flex; align-items: center; gap: var(--s-3); padding: var(--s-3) var(--s-4); border: 1px solid var(--accent-border); border-radius: var(--r-lg); background: var(--accent-surface); color: var(--accent); }
.platform-contract > span { flex: 1; color: var(--text-secondary); }
.platform-contract button { flex-shrink: 0; background: var(--n-01); }
/* Route templates and registry workspace */
.registry-layout { grid-template-columns: minmax(360px, .9fr) minmax(0, 1.5fr); gap: var(--s-4); }
.registry-list { top: 74px; border-color: var(--line); }
.registry-models > button { min-height: 68px; border-left: 3px solid transparent; }
.registry-models > button.selected { border-left-color: var(--accent); box-shadow: none; }
.registry-tabs, .evaluation-tabs, .lifecycle-tabs, .capability-tabs, .operations-tabs {
scrollbar-width: thin; border-bottom-color: var(--line);
}
.registry-tabs { position: sticky; top: 58px; z-index: 8; flex-direction: row; overflow-x: auto; background: var(--n-00); padding-top: var(--s-2); }
.registry-tabs button { width: auto; min-width: max-content; flex: 0 0 auto; }
.registry-tabs button, .evaluation-tabs button, .lifecycle-tabs button { min-height: 38px; }
.table-head { position: sticky; top: 0; z-index: 3; background: var(--n-02); }
.table-row { min-height: 42px; transition: background .12s var(--ease); }
.table-row:hover { background: var(--n-02); }
.hardware-toolbar, .capability-toolbar, .registry-hero, .capability-hero { border-color: var(--line); }
.node-card, .project-card, .operation-card, .lifecycle-card, .migration-card { transition: border-color .14s var(--ease), transform .14s var(--ease), background .14s var(--ease); }
.node-card:hover, .project-card:hover, .operation-card:hover { border-color: var(--line-strong); background: var(--n-02); }
.error-banner { border-radius: var(--r-md); }
.safety-scrim {
position: fixed; inset: 0; z-index: 180; display: grid; place-items: center; padding: var(--s-4);
background: rgba(2, 7, 15, .72); backdrop-filter: blur(5px);
}
.safety-dialog {
width: min(560px, 100%); display: flex; flex-direction: column; gap: var(--s-4);
padding: var(--s-5); border: 1px solid var(--danger-border); border-radius: var(--r-lg);
background: var(--n-01); box-shadow: var(--shadow-2);
}
.safety-title { display: grid; grid-template-columns: 36px 1fr auto; gap: var(--s-3); align-items: start; }
.safety-title > span { width: 34px; height: 34px; display: grid; place-items: center; border-radius: var(--r-md); color: var(--danger); background: var(--danger-surface); }
.safety-title h2 { margin-top: 2px; }
.safety-title > button { border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--n-02); color: var(--text-muted); padding: var(--s-2); cursor: pointer; }
.safety-impact { display: grid; gap: var(--s-2); padding: var(--s-4); border: 1px solid var(--line); border-radius: var(--r-md); background: var(--n-02); }
.safety-impact p { color: var(--text-muted); line-height: 1.55; }
.safety-impact dl { display: grid; gap: var(--s-2); margin: var(--s-2) 0 0; }
.safety-impact dl div { display: flex; justify-content: space-between; gap: var(--s-3); }
.safety-impact dt { color: var(--text-muted); }
.safety-impact dd { margin: 0; color: var(--text-secondary); text-align: right; }
.safety-confirm { display: flex; align-items: flex-start; gap: var(--s-3); color: var(--text-secondary); cursor: pointer; }
.safety-confirm input { width: 18px; height: 18px; flex-shrink: 0; accent-color: var(--danger); }
.safety-actions { display: flex; justify-content: flex-end; gap: var(--s-2); }
.safety-actions button { min-height: 38px; display: inline-flex; align-items: center; gap: var(--s-2); border: 1px solid var(--line); border-radius: var(--r-md); background: var(--n-02); padding: var(--s-2) var(--s-4); cursor: pointer; }
.safety-actions button.danger { border-color: var(--danger-border); background: var(--danger-surface); color: var(--danger); }
.promotion-review { padding: var(--s-3); border: 1px solid var(--warn-border); border-radius: var(--r-md); background: var(--warn-surface); }
.promotion-review > p { margin: var(--s-2) 0 var(--s-3); color: var(--text-muted); font-size: var(--t-sm); }
.promotion-checklist { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-2); }
.promotion-checklist label { display: flex; gap: var(--s-2); align-items: flex-start; color: var(--text-secondary); font-size: var(--t-sm); }
.promotion-checklist input { width: 16px; height: 16px; flex-shrink: 0; accent-color: var(--accent); }
.license-review { display: grid; gap: var(--s-1); margin-top: var(--s-3); color: var(--text-muted); font-size: var(--t-sm); }
.projects-workspace, .projects-list { display: flex; flex-direction: column; gap: var(--s-4); }
.projects-summary { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-3); }
.projects-summary > div { display: flex; flex-direction: column; gap: 2px; padding: var(--s-4); border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--n-01); }
.projects-summary span { color: var(--text-faint); font-size: 9px; font-weight: 650; letter-spacing: .08em; text-transform: uppercase; }
.projects-summary strong { margin-top: var(--s-1); font-size: 23px; }
.projects-summary small { color: var(--text-muted); }
.project-workspace-card { padding: 0; overflow: hidden; }
.project-title-row { display: flex; justify-content: space-between; align-items: start; gap: var(--s-5); padding: var(--s-5); border-bottom: 1px solid var(--line); }
.project-title-row h2 { margin: var(--s-1) 0; font-size: 21px; }
.project-title-row p { color: var(--text-muted); max-width: 68ch; }
.project-count { flex-shrink: 0; padding: var(--s-1) var(--s-2); border: 1px solid var(--line); border-radius: var(--r-full); color: var(--text-muted); font-size: var(--t-sm); }
.project-columns { display: grid; grid-template-columns: minmax(270px, .55fr) minmax(0, 1.45fr); }
.project-bindings, .project-integrations { min-width: 0; padding: var(--s-5); }
.project-bindings { border-right: 1px solid var(--line); background: var(--n-02); }
.section-label { display: flex; justify-content: space-between; gap: var(--s-3); padding-bottom: var(--s-3); border-bottom: 1px solid var(--line); }
.section-label span { color: var(--text-secondary); font-weight: 600; }
.section-label small { color: var(--text-faint); }
.project-binding-row { display: flex; flex-direction: column; gap: 2px; padding: var(--s-3) 0; border-bottom: 1px solid var(--line-subtle); }
.project-binding-row code { color: var(--text); font-size: var(--t-sm); }
.project-binding-row span { color: var(--text-muted); font-size: var(--t-sm); }
.integration-row { display: grid; gap: var(--s-3); padding: var(--s-4) 0; border-bottom: 1px solid var(--line); }
.integration-row:last-child { border-bottom: 0; }
.integration-title { display: flex; justify-content: space-between; gap: var(--s-3); }
.integration-title > div { display: flex; flex-direction: column; gap: 2px; }
.integration-title code { color: var(--text); font-size: var(--t-md); font-weight: 600; }
.integration-title small, .integration-row > p { color: var(--text-muted); font-size: var(--t-sm); }
.integration-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border: 1px solid var(--line-subtle); border-radius: var(--r-md); overflow: hidden; }
.integration-metrics > span { display: flex; flex-direction: column; gap: 1px; padding: var(--s-2) var(--s-3); background: var(--n-02); }
.integration-metrics > span + span { border-left: 1px solid var(--line-subtle); }
.integration-metrics small { color: var(--text-faint); font-size: 9px; text-transform: uppercase; letter-spacing: .06em; }
.integration-metrics strong { color: var(--text-secondary); font-size: var(--t-sm); }
.project-fit-row { display: flex; flex-wrap: wrap; gap: var(--s-2); }
.project-fit-row > span { padding: var(--s-1) var(--s-2); border: 1px solid var(--line-subtle); border-radius: var(--r-full); color: var(--text-muted); font-size: 9px; }
.project-fit-row strong { color: var(--text-secondary); }
@media (max-width: 1280px) {
.command-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.command-grid, .command-grid.lower { grid-template-columns: 1fr; }
.project-columns { grid-template-columns: 1fr; }
.project-bindings { border-right: 0; border-bottom: 1px solid var(--line); }
}
@media (max-width: 1180px) {
.registry-layout { grid-template-columns: 1fr; }
.registry-tabs { position: static; }
}
@media (max-width: 860px) {
main { padding: 0 var(--s-4) var(--s-7); overflow: hidden; }
.workspace-toolbar { position: relative; top: auto; margin: 0 calc(-1 * var(--s-4)); padding: 0 var(--s-4); min-height: 48px; }
.breadcrumbs span:first-child, .breadcrumbs span:nth-child(2), .breadcrumbs strong, .breadcrumbs span:nth-child(4) { display: none; }
.workspace-actions .theme-toggle { display: none; }
.quick-jump { min-width: 44px; height: 44px; padding: 0; justify-content: center; }
.quick-jump span, .quick-jump kbd { display: none; }
.page-header { margin-top: var(--s-5); }
.foundation-badge { white-space: normal; }
nav button, .mobile-bar button, .theme-toggle { min-height: 44px; min-width: 44px; }
.sidebar { width: min(88vw, 320px); }
.health-band, .health-actions, .platform-contract { align-items: stretch; flex-direction: column; }
.health-actions { gap: var(--s-2); }
.health-actions .secondary-action { min-height: 44px; }
.command-kpis { grid-template-columns: 1fr; }
.command-kpi { min-height: 104px; }
.capacity-row > div:first-child { flex-direction: column; gap: 2px; }
.assurance-gate, .assurance-metrics { grid-template-columns: 1fr; }
.assurance-gate button { min-height: 44px; }
.assurance-foot { grid-column: auto; }
.platform-contract button { min-height: 44px; }
.command-dialog { max-height: calc(100dvh - 32px); }
.command-scrim { padding-top: var(--s-4); }
.command-results button { min-height: 64px; }
.safety-actions button { min-height: 44px; }
.promotion-checklist { grid-template-columns: 1fr; }
.projects-summary { grid-template-columns: 1fr; }
.project-title-row { flex-direction: column; }
.integration-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.integration-metrics > span:nth-child(3) { border-left: 0; border-top: 1px solid var(--line-subtle); }
.integration-metrics > span:nth-child(4) { border-top: 1px solid var(--line-subtle); }
}
@media (max-width: 520px) {
.page-header h1 { font-size: 27px; }
.health-band, .command-kpi, .panel { border-radius: var(--r-md); }
.health-identity { align-items: flex-start; }
.health-identity h2 { font-size: 18px; }
.command-kpi { grid-template-columns: 34px minmax(0, 1fr); }
.command-kpi > svg { display: none; }
.capacity-legend { flex-direction: column; gap: var(--s-1); }
.activity-timeline button { grid-template-columns: 16px minmax(0, 1fr); }
.activity-timeline time { grid-column: 2; }
.command-hint span:last-child { display: none; }
}