/* ===========================================================================
   soil.css -- the Soil design system, as shipped.
   ===========================================================================

   Three sections, in cascade order: Tokens, Components, App layer.

   Sections 1 and 2 are GENERATED: they are verbatim copies of the files named
   at the top of each one, under design/soil-design-system/. Every value in them
   comes from the approved mock. DO NOT HAND-EDIT THEM -- edit the source file
   and re-copy, or the next regeneration silently reverts your change.

   This sheet is linked AFTER soil/web/static/legacy.css (the pre-2026-10-09
   design, kept alive only so unconverted screens keep rendering). Equal
   specificity, later sheet -- so everything here wins over legacy.css. See the
   header of legacy.css for how that file goes away.
   =========================================================================== */

/* 1. Tokens */
/* Source: design/soil-design-system/tokens.css -- verbatim, generated, do not hand-edit. */

/* Soil — generated from tokens.json */

:root, [data-theme="light"] {
  --bg-page: #FEFEFF;
  --bg-sidebar: #F4F5F8;
  --bg-surface: #FFFFFF;
  --bg-hover: #ECEEF3;
  --bg-row-hover: #FAFBFC;
  --bg-subtle: #F2F4F7;
  --line-card: #EDF0F5;
  --line-control: #E8EBF0;
  --line-divider: #F0F2F5;
  --line-sidebar: #ECEEF2;
  --ink: #0E1116;
  --ink-2: #1D2230;
  --text-2: #3B4150;
  --text-3: #4A5060;
  --text-muted: #5E6472;
  --text-faint: #686E7D;
  --icon-faint: #98A2B3;
  --action: #0E1116;
  --on-action: #FFFFFF;
  --nav-active: #2F3138;
  --on-nav-active: #FFFFFF;
  --nav-badge: #55575F;
  --spark: #5C56FC;
  --soil-violet: #4F46E5;
  --soil-violet-icon: #5B55F0;
  --recommend-bg: #F5F4FE;
  --avatar-bg: #E4E2F3;
  --avatar-ink: #23223A;
  --ok-bg: #E4FBEF;
  --ok-ink: #0D7A3A;
  --warn-bg: #FEF3E2;
  --warn-ink: #B25000;
  --bad-bg: #FDE8E8;
  --bad-ink: #C41016;
  --info-bg: #EBF2FF;
  --info-ink: #1D5AD6;
  --stall-bg: #F2F4F7;
  --stall-ink: #344054;
  --done-bg: #E7FAF0;
  --done-ink: #12804A;
  --critical: #D41921;
  --critical-tag-bg: #FEE2E2;
  --critical-tag-ink: #C81E1E;
  --critical-card: #FFF4F5;
  --critical-card-line: #FCCFD3;
  --critical-pill-bg: #FEF0F2;
  --critical-pill-ink: #C02619;
  --risk: #F38A0B;
  --risk-tag-bg: #FFF1DD;
  --risk-tag-ink: #A84A08;
  --risk-card: #FFFCF6;
  --risk-card-line: #FCEBD0;
  --risk-pill-bg: #FEF5E7;
  --risk-pill-ink: #A85300;
  --unusual-tag-bg: #EBEBFE;
  --unusual-tag-ink: #4338CA;
  --unusual-card: #F6F8FE;
  --unusual-card-line: #E5E9F8;
  --unusual-pill-bg: #F3F2FE;
  --unusual-pill-ink: #4F46E5;
  --bar-ok: #16A34A;
  --bar-warn: #F38A0B;
  --bar-empty: #E2E4EB;
  --acc-strong: #6E63F6;
  --acc-mid: #A9AEF9;
  --acc-soft: #D3D6FB;
  --team-platform: #4F46E5;
  --team-design: #F38A0B;
  --focus-ring: #5C56FC;
  --focus-glow: rgba(92,86,252,0.14);
  --toast-bg: #0E1116;
  --on-toast: #FFFFFF;
  --toast-link: #B4B0FF;
  --skeleton: #EEF0F4;
  --skeleton-shine: #F7F8FA;
  --source-bg: #F2F4F7;
  --source-ink: #3B4150;
  --error-ink: #C41016;
  --outside-bg: #FEF5E7;
  --outside-ink: #A85300;
  --selected-bg: #F3F2FE;
  --selected-line: #5C56FC;
  --shadow-card: 0 1px 2px rgba(16,24,40,0.03);
  --shadow-lift: 0 14px 32px -22px rgba(16,24,40,0.3);
  --shadow-pop: 0 12px 32px -8px rgba(16,24,40,0.28);
  --shadow-inset-top: inset 0 1px 0 rgba(255,255,255,0.7);
}

[data-theme="dark"] {
  --bg-page: #0E1015;
  --bg-sidebar: #14161C;
  --bg-surface: #171A21;
  --bg-hover: #20242C;
  --bg-row-hover: #1C1F27;
  --bg-subtle: #22262E;
  --line-card: #262A33;
  --line-control: #2C313B;
  --line-divider: #232730;
  --line-sidebar: #22262E;
  --ink: #F2F4F7;
  --ink-2: #E1E4EA;
  --text-2: #C3C8D2;
  --text-3: #A9AFBB;
  --text-muted: #8D94A1;
  --text-faint: #818999;
  --icon-faint: #6B7280;
  --action: #F2F4F7;
  --on-action: #0E1116;
  --nav-active: #F2F4F7;
  --on-nav-active: #0E1116;
  --nav-badge: #C3C8D2;
  --spark: #8B86FF;
  --soil-violet: #A5A0FF;
  --soil-violet-icon: #8B86FF;
  --recommend-bg: #1E1F38;
  --avatar-bg: #2E2C48;
  --avatar-ink: #E4E2F3;
  --ok-bg: #0F2E1F;
  --ok-ink: #4ADE80;
  --warn-bg: #33220C;
  --warn-ink: #F5A524;
  --bad-bg: #3A1316;
  --bad-ink: #F87171;
  --info-bg: #10223F;
  --info-ink: #6EA8FE;
  --stall-bg: #22262E;
  --stall-ink: #C3C8D2;
  --done-bg: #0F2E1F;
  --done-ink: #4ADE80;
  --critical: #F04438;
  --critical-tag-bg: #4A1A1E;
  --critical-tag-ink: #FCA5A5;
  --critical-card: #231417;
  --critical-card-line: #4A1F25;
  --critical-pill-bg: #3A1316;
  --critical-pill-ink: #F87171;
  --risk: #F5A524;
  --risk-tag-bg: #3D2A10;
  --risk-tag-ink: #FDBA74;
  --risk-card: #221B11;
  --risk-card-line: #4A3718;
  --risk-pill-bg: #33220C;
  --risk-pill-ink: #F5A524;
  --unusual-tag-bg: #25244A;
  --unusual-tag-ink: #B4B0FF;
  --unusual-card: #161A2C;
  --unusual-card-line: #2C3260;
  --unusual-pill-bg: #1E1F38;
  --unusual-pill-ink: #A5A0FF;
  --bar-ok: #22C55E;
  --bar-warn: #F5A524;
  --bar-empty: #2C313B;
  --acc-strong: #8B86FF;
  --acc-mid: #5C5FB8;
  --acc-soft: #34366A;
  --team-platform: #8B86FF;
  --team-design: #F5A524;
  --focus-ring: #8B86FF;
  --focus-glow: rgba(139,134,255,0.22);
  --toast-bg: #F2F4F7;
  --on-toast: #0E1116;
  --toast-link: #4F46E5;
  --skeleton: #22262E;
  --skeleton-shine: #2A2F38;
  --source-bg: #22262E;
  --source-ink: #C3C8D2;
  --error-ink: #F87171;
  --outside-bg: #33220C;
  --outside-ink: #F5A524;
  --selected-bg: #1E1F38;
  --selected-line: #8B86FF;
  --shadow-card: 0 1px 2px rgba(0,0,0,0.4);
  --shadow-lift: 0 14px 32px -20px rgba(0,0,0,0.7);
  --shadow-pop: 0 12px 32px -8px rgba(0,0,0,0.8);
  --shadow-inset-top: inset 0 1px 0 rgba(255,255,255,0.04);
}

@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
  --bg-page: #0E1015;
  --bg-sidebar: #14161C;
  --bg-surface: #171A21;
  --bg-hover: #20242C;
  --bg-row-hover: #1C1F27;
  --bg-subtle: #22262E;
  --line-card: #262A33;
  --line-control: #2C313B;
  --line-divider: #232730;
  --line-sidebar: #22262E;
  --ink: #F2F4F7;
  --ink-2: #E1E4EA;
  --text-2: #C3C8D2;
  --text-3: #A9AFBB;
  --text-muted: #8D94A1;
  --text-faint: #818999;
  --icon-faint: #6B7280;
  --action: #F2F4F7;
  --on-action: #0E1116;
  --nav-active: #F2F4F7;
  --on-nav-active: #0E1116;
  --nav-badge: #C3C8D2;
  --spark: #8B86FF;
  --soil-violet: #A5A0FF;
  --soil-violet-icon: #8B86FF;
  --recommend-bg: #1E1F38;
  --avatar-bg: #2E2C48;
  --avatar-ink: #E4E2F3;
  --ok-bg: #0F2E1F;
  --ok-ink: #4ADE80;
  --warn-bg: #33220C;
  --warn-ink: #F5A524;
  --bad-bg: #3A1316;
  --bad-ink: #F87171;
  --info-bg: #10223F;
  --info-ink: #6EA8FE;
  --stall-bg: #22262E;
  --stall-ink: #C3C8D2;
  --done-bg: #0F2E1F;
  --done-ink: #4ADE80;
  --critical: #F04438;
  --critical-tag-bg: #4A1A1E;
  --critical-tag-ink: #FCA5A5;
  --critical-card: #231417;
  --critical-card-line: #4A1F25;
  --critical-pill-bg: #3A1316;
  --critical-pill-ink: #F87171;
  --risk: #F5A524;
  --risk-tag-bg: #3D2A10;
  --risk-tag-ink: #FDBA74;
  --risk-card: #221B11;
  --risk-card-line: #4A3718;
  --risk-pill-bg: #33220C;
  --risk-pill-ink: #F5A524;
  --unusual-tag-bg: #25244A;
  --unusual-tag-ink: #B4B0FF;
  --unusual-card: #161A2C;
  --unusual-card-line: #2C3260;
  --unusual-pill-bg: #1E1F38;
  --unusual-pill-ink: #A5A0FF;
  --bar-ok: #22C55E;
  --bar-warn: #F5A524;
  --bar-empty: #2C313B;
  --acc-strong: #8B86FF;
  --acc-mid: #5C5FB8;
  --acc-soft: #34366A;
  --team-platform: #8B86FF;
  --team-design: #F5A524;
  --focus-ring: #8B86FF;
  --focus-glow: rgba(139,134,255,0.22);
  --toast-bg: #F2F4F7;
  --on-toast: #0E1116;
  --toast-link: #4F46E5;
  --skeleton: #22262E;
  --skeleton-shine: #2A2F38;
  --source-bg: #22262E;
  --source-ink: #C3C8D2;
  --error-ink: #F87171;
  --outside-bg: #33220C;
  --outside-ink: #F5A524;
  --selected-bg: #1E1F38;
  --selected-line: #8B86FF;
  --shadow-card: 0 1px 2px rgba(0,0,0,0.4);
  --shadow-lift: 0 14px 32px -20px rgba(0,0,0,0.7);
  --shadow-pop: 0 12px 32px -8px rgba(0,0,0,0.8);
  --shadow-inset-top: inset 0 1px 0 rgba(255,255,255,0.04);
} }

:root {
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-8: 32px;
  --space-10: 40px;
  --radius-xs: 4px;
  --radius-sm: 6px;
  --radius-md: 8px;
  --radius-lg: 10px;
  --radius-xl: 12px;
  --radius-full: 9999px;
  --sidebar-width: 222px;
  --topbar-height: 60px;
  --control-height: 36px;
  --search-height: 34px;
  --nav-height: 38px;
  --pill-height: 22px;
  --ask-input-height: 54px;
  --touch-min: 44px;
  --source-height: 18px;
  --font-sans: "Inter", "Helvetica Neue", Arial, sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, Menlo, monospace;
}

/* 2. Components */
/* Source: design/soil-design-system/components/bundle.css -- verbatim, generated, do not hand-edit.
   One deliberate omission: bundle.css's first line was
     @import url("https://fonts.googleapis.com/css2?family=Inter...&family=JetBrains+Mono...");
   It is dropped here. base.html already pulls Inter + JetBrains Mono with a
   <link rel="stylesheet">, so the @import would request the same fonts twice --
   and an @import inside a stylesheet cannot start until this sheet has been
   fetched and parsed, making it a second blocking round-trip in front of first
   paint. The <link> in the document head starts in parallel instead. If the
   fonts ever stop loading, fix the <link> in base.html, not this file. */

/* Soil components. Every value is a token from tokens.css. */
body { margin: 0; background: var(--bg-page); color: var(--ink); font-family: var(--font-sans); font-size: 12.5px; line-height: 1.45; letter-spacing: -0.01em; -webkit-font-smoothing: antialiased; }
.sl-icon { flex-shrink: 0; }
.sl-faint { color: var(--icon-faint); }
.sl-blue { color: var(--info-ink); }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; cursor: pointer; letter-spacing: inherit; }
:focus-visible { outline: 2px solid var(--soil-violet); outline-offset: 2px; }

/* Button */
.sl-btn { display: inline-flex; align-items: center; justify-content: center; gap: 9px; height: var(--control-height); padding: 0 var(--space-4); border-radius: 7px; font-size: 12.5px; font-weight: 500; white-space: nowrap; border: 1px solid transparent; transition: background .15s, border-color .15s; }
.sl-btn-primary { background: var(--action); color: var(--on-action); padding: 0 var(--space-5); }
.sl-btn-primary:hover { opacity: .9; }
.sl-btn-secondary { background: var(--bg-surface); border-color: var(--line-control); color: var(--ink); }
.sl-btn-secondary:hover { background: var(--bg-row-hover); }
.sl-btn-ghost { background: transparent; color: var(--text-muted); padding: 0 var(--space-2); }
.sl-btn-ghost:hover { background: var(--bg-hover); color: var(--ink); }
.sl-btn-sm { height: 30px; padding: 0 var(--space-3); }

/* Pill */
.sl-pill { display: inline-flex; align-items: center; gap: 6px; height: var(--pill-height); padding: 0 var(--space-2); border-radius: var(--radius-sm); font-size: 12px; white-space: nowrap; border: 0; }
button.sl-pill { font-size: 11.5px; }
.sl-dot { width: 5px; height: 5px; border-radius: 3px; background: currentColor; }
.sl-pill-ok { background: var(--ok-bg); color: var(--ok-ink); }
.sl-pill-warn { background: var(--warn-bg); color: var(--warn-ink); }
.sl-pill-bad { background: var(--bad-bg); color: var(--bad-ink); }
.sl-pill-info { background: var(--info-bg); color: var(--info-ink); }
.sl-pill-stall { background: var(--stall-bg); color: var(--stall-ink); }
.sl-pill-done { background: var(--done-bg); color: var(--done-ink); font-weight: 600; }

/* Severity */
.sl-sev { display: inline-flex; align-items: center; gap: 9px; height: 26px; padding: 0 9px 0 6px; border-radius: var(--radius-sm); font-family: var(--font-mono); font-size: 12px; font-weight: 500; letter-spacing: .03em; }
.sl-sev-critical { background: var(--critical-tag-bg); color: var(--critical-tag-ink); }
.sl-sev-risk { background: var(--risk-tag-bg); color: var(--risk-tag-ink); }
.sl-sev-unusual { background: var(--unusual-tag-bg); color: var(--unusual-tag-ink); }
.sl-sev-trend { color: var(--soil-violet-icon); }
.sl-sev-disc { width: 19px; height: 19px; border-radius: var(--radius-lg); color: #FFFFFF; font-family: var(--font-sans); font-size: 12px; font-weight: 800; display: inline-flex; align-items: center; justify-content: center; }
.sl-sev-disc-critical { background: var(--critical); }
.sl-sev-disc-risk { background: var(--risk); }
.sl-count { display: inline-flex; align-items: center; gap: 8px; height: 30px; padding: 0 9px; border-radius: 7px; font-size: 12.5px; white-space: nowrap; }
.sl-count .sl-sev-disc { width: 17px; height: 17px; font-size: 11px; }
.sl-count-critical { background: var(--critical-pill-bg); color: var(--critical-pill-ink); }
.sl-count-risk { background: var(--risk-pill-bg); color: var(--risk-pill-ink); }
.sl-count-risk .sl-icon { color: var(--risk); }
.sl-count-unusual { background: var(--unusual-pill-bg); color: var(--unusual-pill-ink); }

/* App logo + avatar */
.sl-logo { display: inline-flex; align-items: center; justify-content: center; border-radius: 5px; font-weight: 800; flex-shrink: 0; background: var(--bg-subtle); color: var(--ink); }
.sl-logo-img { flex-shrink: 0; object-fit: contain; }
[data-theme="dark"] .sl-logo-gh { box-shadow: inset 0 0 0 1px #3A3F4B; }
.sl-logo-gh { background: #0E1116; color: #FFFFFF; }
.sl-logo-sl { background: #F4EBFF; color: #6941C6; }
.sl-logo-no { background: #FFFFFF; color: #0E1116; box-shadow: inset 0 0 0 1.5px #0E1116; }
.sl-logo-ji, .sl-logo-ca { background: #EEF4FF; color: #1D4ED8; }
.sl-logo-fi { background: #FFF1F3; color: #C01048; }
.sl-logo-gm { background: #FEF3F2; color: #B42318; }
.sl-avatar { display: inline-flex; align-items: center; justify-content: center; border-radius: var(--radius-full); color: #FFFFFF; font-weight: 700; flex-shrink: 0; object-fit: cover; }
.sl-avatar-self { background: var(--avatar-bg); color: var(--avatar-ink); font-weight: 800; }

/* Sidebar */
.sl-sidebar { width: var(--sidebar-width); box-sizing: border-box; background: var(--bg-sidebar); border-right: 1px solid var(--line-sidebar); padding: 14px 15px 22px; display: flex; flex-direction: column; min-height: 100%; }
.sl-brand { display: flex; align-items: center; gap: 22px; height: 34px; padding-left: 12px; margin-bottom: 28px; }
.sl-wordmark { font-size: 24px; font-weight: 800; letter-spacing: -0.045em; }
.sl-nav-list { display: flex; flex-direction: column; gap: 5px; }
.sl-nav { display: flex; align-items: center; gap: 15px; height: var(--nav-height); padding: 0 9px 0 13px; border-radius: var(--radius-md); font-size: 14.5px; color: var(--text-2); }
.sl-nav:hover { background: var(--bg-hover); }
.sl-nav.is-active { background: var(--nav-active); color: var(--on-nav-active); }
.sl-nav-badge { margin-left: auto; min-width: 20px; height: 20px; padding: 0 5px; box-sizing: border-box; border-radius: 5px; font-size: 12px; font-weight: 800; display: flex; align-items: center; justify-content: center; }
.sl-nav.is-active .sl-nav-badge { background: var(--nav-badge); color: var(--on-nav-active); }
.sl-eyebrow-sm { margin-top: 42px; padding: 0 0 12px 11px; font-size: 10.5px; font-weight: 500; letter-spacing: .1em; color: var(--text-faint); }
.sl-team { display: flex; align-items: center; gap: 12px; height: 37.5px; padding: 0 9px 0 12px; border-radius: var(--radius-md); font-size: 13px; }
.sl-team:hover { background: var(--bg-hover); }
.sl-team-dot { width: 10px; height: 10px; border-radius: 5px; }
.sl-team-tag { margin-left: auto; font-size: 11.5px; }
.sl-team-tag.is-ok { color: var(--ok-ink); }
.sl-team-tag.is-bad { color: var(--critical); }
.sl-tools { margin-top: auto; padding: 14px 18px 16px; background: var(--bg-surface); border: 1px solid var(--line-sidebar); border-radius: var(--radius-lg); display: block; }
.sl-tools-k { display: block; font-size: 12px; color: var(--text-3); }
.sl-tools b { font-weight: 500; }
.sl-tools-row { display: flex; align-items: center; gap: 17px; margin-top: 14px; }
.sl-tools-more { height: 24px; padding: 0 6px; border: 1px solid var(--line-sidebar); border-radius: var(--radius-sm); display: inline-flex; align-items: center; color: var(--text-2); font-weight: 500; }
.sl-user { margin-top: 56px; display: flex; align-items: center; gap: 12px; padding: 0 12px 0 8px; }
.sl-user-t { display: flex; flex-direction: column; font-size: 13px; line-height: 1.3; }
.sl-user-t small { font-size: 12px; color: var(--text-muted); }
.sl-user .sl-icon { margin-left: auto; }

/* Top bar */
.sl-top { height: var(--topbar-height); display: flex; align-items: center; gap: 19px; padding: 0 20px 0 15px; }
.sl-search { flex: 1; min-width: 0; max-width: 851px; display: flex; align-items: center; gap: 13px; height: var(--search-height); padding: 0 9px 0 17px; border: 1px solid var(--line-control); border-radius: var(--radius-md); background: var(--bg-surface); color: var(--text-2); font-size: 13.5px; text-align: left; }
.sl-search-t { flex: 1; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.sl-search kbd, kbd { font-family: var(--font-sans); font-size: 10.5px; color: var(--text-faint); padding: 1px 5px; border: 1px solid var(--line-control); border-radius: var(--radius-xs); }
.sl-search kbd + kbd { margin-left: -9px; }
.sl-date { display: inline-flex; align-items: center; gap: 9px; font-size: 13px; margin-left: 50px; white-space: nowrap; }
.sl-top-av { margin-left: auto; }
.sl-seg { display: inline-flex; gap: 2px; border: 1px solid var(--line-control); border-radius: var(--radius-md); background: var(--bg-surface); }
.sl-seg button { width: 56px; height: 32px; border: 0; border-radius: 7px; background: transparent; color: var(--text-3); font-size: 12.5px; }
.sl-seg button.is-on { background: var(--action); color: var(--on-action); font-weight: 500; }

/* Tabs (filter chips on list pages) */
.sl-tabs { display: inline-flex; gap: 6px; flex-wrap: wrap; }
.sl-tabs button { display: inline-flex; align-items: center; gap: 7px; height: 30px; padding: 0 12px; border: 0; border-radius: var(--radius-md); background: transparent; color: var(--text-3); font-size: 12.5px; }
.sl-tabs button:hover { background: var(--bg-hover); }
.sl-tabs button.is-on { background: var(--action); color: var(--on-action); font-weight: 500; }
.sl-tab-n { min-width: 18px; height: 18px; padding: 0 4px; box-sizing: border-box; border-radius: 5px; background: var(--bg-subtle); color: var(--text-2); font-size: 11px; display: inline-flex; align-items: center; justify-content: center; }
.sl-tab-n.is-alert { background: var(--bad-bg); color: var(--bad-ink); }
.sl-tabs button.is-on .sl-tab-n { background: var(--nav-badge); color: var(--on-action); }

/* Card */
.sl-card { background: var(--bg-surface); border: 1px solid var(--line-card); border-radius: var(--radius-xl); box-shadow: var(--shadow-card); padding: 14px var(--space-4) var(--space-3); box-sizing: border-box; transition: transform .2s, box-shadow .2s; position: relative; min-width: 0; }
.sl-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-lift); }
.sl-card-h { display: flex; align-items: center; gap: 9px; min-height: 22px; margin-bottom: 12px; }
.sl-h, .sl-h-sm { margin: 0; font-size: 16px; font-weight: 700; letter-spacing: -0.025em; white-space: nowrap; }
.sl-h-sm { font-size: 15px; }
.sl-link { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; color: var(--text-muted); font-size: 12.5px; white-space: nowrap; }
.sl-link:hover { color: var(--ink); }
.sl-aside { display: inline-flex; align-items: center; gap: 10px; color: var(--text-2); font-size: 12.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sl-reddot { width: 15px; height: 15px; border-radius: var(--radius-md); background: var(--critical-tag-bg); display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
.sl-reddot::after { content: ""; width: 6px; height: 6px; border-radius: 3px; background: var(--critical); }

/* Attention card */
.sl-att { box-sizing: border-box; min-height: 264px; padding: 14px 15px 19px; border-radius: var(--radius-lg); display: flex; flex-direction: column; border: 1px solid; transition: transform .2s, box-shadow .2s; min-width: 0; }
.sl-att:hover { transform: translateY(-2px); box-shadow: var(--shadow-lift); }
.sl-att-critical { background: var(--critical-card); border-color: var(--critical-card-line); }
.sl-att-risk { background: var(--risk-card); border-color: var(--risk-card-line); }
.sl-att-unusual { background: var(--unusual-card); border-color: var(--unusual-card-line); }
.sl-att-top { display: flex; align-items: center; gap: 13px; height: 28px; }
.sl-att-age { color: var(--text-3); font-size: 13px; }
.sl-att-logo { margin-left: auto; margin-right: 4px; }
.sl-att-title { margin: 11px 0 0 4px; font-size: 16.5px; font-weight: 700; letter-spacing: -0.025em; line-height: 21px; }
.sl-att-body { margin: 6px 0 14px 4px; color: var(--text-3); font-size: 12.5px; line-height: 19px; }
.sl-rec { margin-top: auto; padding: 9px 10px 11px; border-radius: var(--radius-md); background: var(--recommend-bg); }
.sl-rec-k { display: inline-flex; align-items: center; gap: 9px; color: var(--soil-violet); font-weight: 500; }
.sl-rec-k .sl-icon { color: var(--soil-violet-icon); }
.sl-rec-t { color: var(--text-3); margin-top: 5px; }
.sl-att-actions { margin-top: 12px; display: flex; gap: 14px; padding-left: 5px; flex-wrap: wrap; }
.sl-done { display: inline-flex; align-items: center; gap: 6px; height: var(--control-height); padding: 0 14px; border-radius: 7px; background: var(--done-bg); color: var(--done-ink); font-weight: 600; }

/* Health banner: one per broken connection, same on every page */
.sl-health { display: flex; align-items: center; gap: 12px; padding: 10px 12px 10px 14px; border: 1px solid var(--critical-card-line); background: var(--critical-card); border-radius: var(--radius-lg); }
.sl-health-t { flex: 1; font-size: 13px; color: var(--ink); }

/* Pulse */
.sl-pulse { display: grid; grid-template-columns: 17px 82px 95px 1fr 14px; gap: 12px; align-items: center; height: 41px; font-size: 12.5px; border-radius: var(--radius-sm); }
.sl-pulse:hover { background: var(--bg-row-hover); }
.sl-pulse .sl-pill { justify-self: start; }
.sl-bars { justify-self: end; display: flex; align-items: flex-end; gap: 2px; height: 17px; }
.sl-bars span { width: 3.5px; border-radius: 1px; background: var(--bar-empty); }
.sl-bars span.is-ok { background: var(--bar-ok); }
.sl-bars span.is-warn, .sl-bars span.is-bad { background: var(--bar-warn); }

/* Stat */
.sl-stat-row { display: flex; align-items: center; gap: 12px; margin-top: -6px; }
.sl-stat { font-size: 33px; font-weight: 800; letter-spacing: -0.05em; line-height: 40px; }
.sl-stat-ch { font-size: 10.5px; line-height: 1.35; color: var(--text-3); }
.sl-up { display: inline-block; padding: 0 6px; border-radius: var(--radius-xs); background: var(--done-bg); color: var(--done-ink); font-size: 11.5px; }
.sl-stat-cap { margin: 0; color: var(--text-2); }
.sl-acc { position: absolute; right: 16px; top: 24px; display: flex; align-items: flex-end; gap: 4px; height: 52px; }
.sl-acc span { width: 6px; border-radius: 2px 2px 1px 1px; background: var(--acc-soft); }
.sl-acc .is-mid { background: var(--acc-mid); }
.sl-acc .is-strong { background: var(--acc-strong); }

/* Work table */
.sl-table { font-size: 12px; }
.sl-tr { display: grid; grid-template-columns: minmax(150px, 1.6fr) minmax(110px, 1.1fr) 82px 111px minmax(90px, 1fr); align-items: center; min-height: 39.5px; padding-left: 4px; border-radius: var(--radius-sm); }
a.sl-tr:hover { background: var(--bg-row-hover); }
.sl-th { min-height: 0; padding-bottom: 8px; font-size: 11px; color: var(--text-2); border-bottom: 1px solid var(--line-divider); border-radius: 0; }
.sl-td-work { display: flex; align-items: center; gap: 12px; min-width: 0; white-space: nowrap; }
.sl-td-work > span:last-child { overflow: hidden; text-overflow: ellipsis; }
.sl-td-owner { display: block; color: var(--text-3); font-size: 11.5px; white-space: nowrap; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.sl-td-muted { color: var(--text-3); }

/* Timeline */
.sl-timeline { list-style: none; margin: 0; padding: 0; position: relative; }
.sl-timeline::before { content: ""; position: absolute; left: 77px; top: 8px; bottom: 8px; width: 1px; background: var(--line-divider); }
.sl-timeline li { display: grid; grid-template-columns: 64px 30px minmax(0, 1fr); align-items: center; min-height: 50px; font-size: 11.5px; }
.sl-timeline time { color: var(--text-3); font-size: 12px; }
.sl-timeline time.is-day { font-size: 10.5px; }
.sl-timeline .sl-logo, .sl-timeline .sl-logo-img { margin-left: 4px; position: relative; }
.sl-timeline li > span:last-child { color: var(--ink-2); padding-left: 10px; line-height: 16.5px; }

/* Agents */
.sl-agent { display: grid; grid-template-columns: 32px minmax(0, 1fr) 14px; gap: 12px; align-items: center; min-height: 80px; }

.sl-agent-logo { width: 32px; height: 32px; border-radius: var(--radius-md); border: 1px solid var(--line-divider); background: var(--bg-surface); display: flex; align-items: center; justify-content: center; }
.sl-agent-n { display: flex; align-items: center; gap: 8px; font-size: 12.5px; white-space: nowrap; }
.sl-agent-n .sl-pill { margin-left: auto; }
.sl-agent-d { display: block; color: var(--text-3); font-size: 11.5px; margin-top: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Ask */
.sl-ask { padding: 15px 22px 20px 21px; }
.sl-ask:hover { transform: none; box-shadow: var(--shadow-card); }
.sl-ask-h { display: flex; align-items: center; gap: 16px; min-height: 50px; }
.sl-spark { fill: var(--spark); flex-shrink: 0; }
.sl-ask-title { font-size: 20.5px; font-weight: 800; letter-spacing: -0.04em; line-height: 26px; }
.sl-ask-sub { color: var(--text-2); }
.sl-ask-try { margin-left: auto; align-self: flex-start; display: inline-flex; align-items: center; gap: 22px; border: 0; background: transparent; color: var(--text-2); }
.sl-ask-in { margin-top: 7px; display: flex; align-items: center; height: var(--ask-input-height); box-sizing: border-box; padding: 0 9px 0 16px; border: 1px solid var(--line-control); border-radius: var(--radius-md); background: var(--bg-surface); }
.sl-ask-in:focus-within { border-color: var(--soil-violet); }
.sl-ask-in input { flex: 1; border: 0; outline: 0; background: transparent; color: var(--ink); font: inherit; font-size: 15px; min-width: 0; }
.sl-ask-in input::placeholder { color: var(--text-2); }
.sl-ask-send { width: 34px; height: 30px; border: 0; border-radius: var(--radius-sm); background: var(--bg-subtle); color: var(--icon-faint); display: flex; align-items: center; justify-content: center; }
.sl-ask-send.is-ready { background: var(--action); color: var(--on-action); }
.sl-chips { margin-top: 15px; display: flex; gap: 13px; flex-wrap: wrap; }
.sl-chip { display: inline-flex; align-items: center; gap: 30px; height: 40px; padding: 0 16px; border: 1px solid var(--line-control); border-radius: var(--radius-full); background: var(--bg-surface); color: var(--text-2); font-size: 13.5px; white-space: nowrap; }
.sl-chip:hover { border-color: var(--text-faint); color: var(--ink); }

/* Empty */
.sl-empty { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 6px; padding: var(--space-10) var(--space-4); }
.sl-empty-i { width: 36px; height: 36px; border-radius: var(--radius-full); background: var(--ok-bg); color: var(--done-ink); display: flex; align-items: center; justify-content: center; margin-bottom: 6px; }
.sl-empty b { font-size: 15px; }
.sl-empty p { margin: 0 0 8px; color: var(--text-3); max-width: 320px; }

/* Today layout */
.sl-app { display: grid; grid-template-columns: var(--sidebar-width) minmax(0, 1fr); min-height: 100vh; background: var(--bg-page); }
.sl-main { min-width: 0; display: flex; flex-direction: column; }
.sl-today { padding: 15px 16px 24px 19px; display: grid; grid-template-columns: minmax(0, 1fr) 333px; gap: 16px 15px; }
.sl-hello { padding: 10px 0 0 8px; }
.sl-eyebrow { font-family: var(--font-mono); font-size: 13px; font-weight: 500; letter-spacing: .13em; color: var(--text-2); }
.sl-hello-row { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; row-gap: 8px; margin-top: 1px; }
.sl-headline { margin: 0; font-size: 38px; font-weight: 800; letter-spacing: -0.05em; line-height: 46px; }
.sl-counts { margin-left: auto; margin-right: 10px; display: flex; gap: 10px; }
.sl-lead { margin: 3px 0 0; color: var(--text-2); font-size: 15px; }
.sl-att-row { margin-top: 20px; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 15px; padding-left: 3px; }
.sl-today-r { display: flex; flex-direction: column; gap: 18px; }
.sl-stat-card { min-height: 117px; }
.sl-today-b { grid-column: 1 / -1; display: grid; grid-template-columns: minmax(0, 1.8fr) minmax(0, 1fr) minmax(0, 1fr); gap: 16px; }
.sl-today-b .sl-card { overflow: hidden; }
.sl-ask { grid-column: 1 / -1; }

@media (max-width: 1180px) {
  .sl-today { grid-template-columns: minmax(0, 1fr); }
  .sl-today-b { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 900px) {
  .sl-app { grid-template-columns: minmax(0, 1fr); }
  .sl-app > .sl-sidebar { display: none; }
  .sl-att-row { grid-template-columns: minmax(0, 1fr); }
  .sl-date, .sl-seg, .sl-search kbd { display: none; }
  .sl-top { gap: 12px; padding: 0 16px; }
  .sl-headline { font-size: 28px; line-height: 34px; white-space: normal; }
  .sl-counts { margin-left: 0; flex-wrap: wrap; }
  .sl-today { padding: 8px 16px 24px; }
  .sl-table { overflow-x: auto; }
  .sl-tr { min-width: 560px; }
  .sl-chips { flex-direction: column; }
  .sl-chip { justify-content: space-between; min-height: var(--touch-min); }
  .sl-btn { min-height: var(--touch-min); min-width: var(--touch-min); }
  /* TAP TARGETS -- the rest of a promise this breakpoint was already making.
   *
   * The design README says of everything under 900px: "cards stack, and tap targets
   * grow to 44px (`touch-min`)". The two rules above were the whole of it. Chrome,
   * measured at 390px by scripts/ui_audit.py: a nav row 324x38, the search button
   * 203x34, a card header's "see all" link 18px tall, a PulseRow 41px, a table row
   * that IS a link 40px, a counter chip 30px, a secondary button 41px WIDE. 440 of
   * the audit's findings were one of these, on 220 screens -- i.e. all of them.
   *
   * `min-height`, not `height`: it clamps the explicit `height` each of these
   * components declares for the desktop, and leaves anything already taller alone.
   * Every component here centres its own content (flex or grid with
   * `align-items: center`), so the box grows around the type instead of moving it.
   *
   * `min-width` is the OTHER axis, and it is not decoration: `.sl-btn-sm` measured
   * 41x44 and `.sl-ask-send` 34x44. A 41x44 target is as hard to hit as a 44x41 one.
   *
   * The three link-only selectors are spelled with their tag ON PURPOSE. `.sl-pill`,
   * `.sl-src` and `.sl-tr` are each drawn two ways: as a <span>/<div> that is a status
   * tag or a header row, and as an <a> that goes somewhere. Only the <a> is a tap
   * target, and a 44px-tall inert status tag inside a table row is noise.
   *
   * NOT here, deliberately: a link that is a word inside a sentence. WCAG 2.5.8
   * excepts those, the audit lists them separately as `touch-target-inline` and does
   * not count them, and growing one to 44px pushes the sentence it belongs to apart.
   */
  .sl-nav, .sl-search, .sl-link, .sl-count, .sl-pulse,
  a.sl-tr, a.sl-pill, a.sl-src { min-height: var(--touch-min); }
  .sl-ask-send, a.sl-src { min-width: var(--touch-min); }
}
@media (prefers-reduced-motion: reduce) { * { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; } }

/* ───────── Detail layer ───────── */
body { text-rendering: optimizeLegibility; }
.sl-stat, .sl-timeline time, .sl-td-muted, .sl-nav-badge, .sl-tab-n, .sl-count, .sl-cust-m b, .sl-conn-t, .sl-slot span, .sl-prep-when b { font-variant-numeric: tabular-nums; }
::selection { background: var(--selected-bg); color: var(--ink); }
:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; border-radius: var(--radius-sm); }

@keyframes sl-in { from { opacity: 0; transform: translateY(6px); } }
@keyframes sl-grow { from { transform: scaleY(0); } }
@keyframes sl-pulse { 0% { box-shadow: 0 0 0 0 currentColor; } 70% { box-shadow: 0 0 0 5px transparent; } 100% { box-shadow: 0 0 0 0 transparent; } }
@keyframes sl-spin { to { transform: rotate(360deg); } }
@keyframes sl-pop { 0% { transform: scale(.6); opacity: 0; } 60% { transform: scale(1.12); } 100% { transform: scale(1); opacity: 1; } }
@keyframes sl-shine { from { background-position: -200px 0; } to { background-position: 200px 0; } }
@keyframes sl-drain { from { transform: scaleX(1); } to { transform: scaleX(0); } }

/* Cards breathe in, one after another */
.sl-card, .sl-att { animation: sl-in .45s cubic-bezier(.2,.8,.2,1) both; }
.sl-today-r .sl-card:nth-child(2) { animation-delay: 80ms; }
.sl-today-b .sl-card:nth-child(1) { animation-delay: 140ms; }
.sl-today-b .sl-card:nth-child(2) { animation-delay: 190ms; }
.sl-today-b .sl-card:nth-child(3) { animation-delay: 240ms; }

/* Buttons: press, arrow nudge, loading */
.sl-btn { position: relative; transition: background .15s, border-color .15s, transform .12s, box-shadow .15s; }
.sl-btn:active { transform: scale(.97); }
.sl-btn-primary { box-shadow: 0 1px 2px rgba(16,24,40,.12), inset 0 1px 0 rgba(255,255,255,.08); }
.sl-btn-primary:hover { opacity: 1; box-shadow: 0 4px 12px -4px rgba(16,24,40,.35), inset 0 1px 0 rgba(255,255,255,.1); }
.sl-btn-secondary { box-shadow: 0 1px 2px rgba(16,24,40,.04); }
.sl-btn-secondary:hover { border-color: var(--text-faint); }
.sl-btn-arrow { transition: transform .18s cubic-bezier(.2,.8,.2,1); }
.sl-btn:hover .sl-btn-arrow, .sl-link:hover .sl-icon, .sl-chip:hover .sl-icon { transform: translateX(2px); }
.sl-chip:hover .sl-icon { transform: translate(2px, -2px); }
.sl-link .sl-icon, .sl-chip .sl-icon { transition: transform .18s cubic-bezier(.2,.8,.2,1); }
.sl-btn:disabled { cursor: default; }
.sl-btn:disabled:not(.is-loading) { opacity: .45; }
.sl-spin { width: 13px; height: 13px; border-radius: 50%; border: 2px solid currentColor; border-right-color: transparent; animation: sl-spin .7s linear infinite; }
.sl-btn.is-loading .sl-btn-t { opacity: .75; }

/* Pills: live dot */
.sl-dot.is-live { animation: sl-pulse 1.8s ease-out infinite; }
button.sl-pill { transition: filter .15s, transform .12s; }
button.sl-pill:hover { filter: brightness(.96); }
button.sl-pill:active { transform: scale(.96); }

/* Count pills */
.sl-count { transition: filter .15s, transform .15s; }
.sl-count:hover { filter: brightness(.97); transform: translateY(-1px); }

/* Attention cards: top hairline, done state, undo */
.sl-att { box-shadow: var(--shadow-inset-top); position: relative; }
.sl-att-title { text-wrap: balance; }
.sl-att.is-done .sl-rec { opacity: .8; }
.sl-att.is-done .sl-att-title { color: var(--text-3); }
.sl-done { gap: 8px; padding: 0 14px 0 10px; animation: sl-in .3s cubic-bezier(.2,.8,.2,1); }
.sl-done-check { width: 18px; height: 18px; border-radius: 50%; background: var(--done-ink); color: var(--done-bg); display: inline-flex; align-items: center; justify-content: center; animation: sl-pop .4s cubic-bezier(.2,.8,.2,1); }
.sl-undo { display: inline-flex; align-items: center; gap: 6px; height: var(--control-height); padding: 0 10px; border: 0; border-radius: 7px; background: transparent; color: var(--text-3); font-size: 12.5px; font-weight: 500; }
.sl-undo:hover { background: var(--bg-hover); color: var(--ink); }
.sl-rec { box-shadow: inset 0 0 0 1px rgba(92,86,252,.06); }

/* Sidebar */
.sl-nav { transition: background .15s, color .15s; }
.sl-nav:hover { color: var(--ink); }
.sl-nav.is-active { box-shadow: 0 1px 2px rgba(16,24,40,.18), inset 0 1px 0 rgba(255,255,255,.08); }
.sl-tools { transition: border-color .15s, box-shadow .15s; }
.sl-tools:hover { border-color: var(--line-control); box-shadow: var(--shadow-card); }

/* Search + Ask focus */
.sl-search { transition: border-color .15s, box-shadow .15s; }
.sl-search:hover { border-color: var(--text-faint); }
.sl-ask-in { transition: border-color .15s, box-shadow .2s; }
.sl-ask-in:focus-within { border-color: var(--focus-ring); box-shadow: 0 0 0 3px var(--focus-glow); }
.sl-ask-send { transition: background .15s, color .15s, transform .12s; }
.sl-ask-send.is-ready:active { transform: scale(.94); }
.sl-chip { transition: border-color .15s, color .15s, background .15s; }
.sl-chip:hover { background: var(--bg-row-hover); }
.sl-spark { filter: drop-shadow(0 2px 6px rgba(92,86,252,.35)); }

/* Pulse bars grow in */
.sl-bars span { transform-origin: bottom; animation: sl-grow .5s cubic-bezier(.2,.8,.2,1) both; }
.sl-bars span:nth-child(2) { animation-delay: 30ms; } .sl-bars span:nth-child(3) { animation-delay: 60ms; } .sl-bars span:nth-child(4) { animation-delay: 90ms; } .sl-bars span:nth-child(5) { animation-delay: 120ms; } .sl-bars span:nth-child(6) { animation-delay: 150ms; } .sl-bars span:nth-child(7) { animation-delay: 180ms; }
.sl-pulse > .sl-icon:last-child, .sl-agent > .sl-icon:last-child { color: var(--icon-faint); transition: transform .18s, color .15s; }
.sl-pulse:hover > .sl-icon:last-child, .sl-agent:hover > .sl-icon:last-child { color: var(--ink); transform: translateX(2px); }
.sl-acc span { transform-origin: bottom; animation: sl-grow .6s cubic-bezier(.2,.8,.2,1) both; transition: filter .15s; }
.sl-acc span:hover { filter: brightness(.9); }

/* Table: row arrow on hover */
.sl-td-risk { display: flex; align-items: center; justify-content: space-between; padding-right: 6px; }
.sl-row-go { color: var(--icon-faint); opacity: 0; transform: translateX(-4px); transition: opacity .15s, transform .18s; }
a.sl-tr:hover .sl-row-go, .sl-cust:hover .sl-row-go { opacity: 1; transform: none; }
.sl-td-owner .sl-avatar { box-shadow: 0 0 0 2px var(--bg-surface); vertical-align: middle; margin-right: 9px; }

/* Timeline: logos sit on the line, newest gets a ring */
.sl-tl-node { position: relative; display: inline-flex; margin-left: 4px; border-radius: var(--radius-sm); box-shadow: 0 0 0 3px var(--bg-surface); background: var(--bg-surface); }
.sl-timeline .sl-tl-node .sl-logo { margin: 0; }
.sl-timeline li.is-new .sl-tl-node::after { content: ""; position: absolute; right: -3px; top: -3px; width: 7px; height: 7px; border-radius: 50%; background: var(--spark); box-shadow: 0 0 0 2px var(--bg-surface); }
.sl-timeline li { border-radius: var(--radius-sm); transition: background .15s; }
.sl-timeline li:hover { background: var(--bg-row-hover); }

/* Agents */
.sl-agent { transition: background .15s; border-radius: 0; }
.sl-agent-logo { box-shadow: 0 1px 2px rgba(16,24,40,.05); }

/* Toast */
.sl-toast { position: fixed; left: 50%; bottom: 24px; transform: translateX(-50%); z-index: 50; display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 0 8px 0 12px; border-radius: var(--radius-lg); background: var(--toast-bg); color: var(--on-toast); box-shadow: var(--shadow-pop); font-size: 13px; overflow: hidden; animation: sl-in .3s cubic-bezier(.2,.8,.2,1); }
.sl-toast.is-inline { position: relative; left: auto; bottom: auto; transform: none; display: inline-flex; }
.sl-toast-i { width: 20px; height: 20px; border-radius: 50%; background: var(--done-ink); color: var(--done-bg); display: inline-flex; align-items: center; justify-content: center; }
.sl-toast-a { border: 0; background: transparent; color: var(--toast-link); font-weight: 600; padding: 6px 8px; border-radius: var(--radius-sm); }
.sl-toast-a:hover { background: rgba(255,255,255,.08); }
.sl-toast-x { border: 0; background: transparent; color: inherit; opacity: .6; width: 28px; height: 28px; border-radius: var(--radius-sm); display: inline-flex; align-items: center; justify-content: center; }
.sl-toast-x:hover { opacity: 1; }
.sl-toast-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: var(--toast-link); transform-origin: left; animation: sl-drain linear forwards; }

/* Source chip */
.sl-src { display: inline-flex; align-items: center; gap: 4px; height: var(--source-height); padding: 0 6px 0 3px; margin: 0 2px; border-radius: 5px; background: var(--source-bg); color: var(--source-ink); font-size: 10.5px; font-weight: 500; vertical-align: 1px; white-space: nowrap; transition: background .15s, box-shadow .15s; }
.sl-src .sl-logo { border-radius: 3px; font-size: 6px !important; }
.sl-src:hover { background: var(--bg-surface); box-shadow: 0 0 0 1px var(--line-control), var(--shadow-card); color: var(--ink); }
.sl-src sup { font-size: 9px; color: var(--text-muted); }

/* Ask answer */
.sl-answer { padding: 18px 20px; }
.sl-answer-q { display: flex; align-items: center; gap: 10px; font-size: 14px; font-weight: 600; letter-spacing: -0.015em; padding-bottom: 14px; border-bottom: 1px solid var(--line-divider); }
.sl-answer-a { display: grid; grid-template-columns: 26px minmax(0,1fr); gap: 10px; padding-top: 14px; }
.sl-answer-a .sl-spark { margin: 2px 0 0 2px; }
.sl-answer-sum { margin: 0 0 10px; font-size: 14px; line-height: 21px; color: var(--ink); }
.sl-answer-lines { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 8px; }
.sl-answer-lines li { position: relative; padding-left: 16px; line-height: 20px; color: var(--ink-2); font-size: 13px; }
.sl-answer-lines li::before { content: ""; position: absolute; left: 3px; top: 8px; width: 5px; height: 5px; border-radius: 50%; background: var(--acc-mid); }
.sl-answer-act { display: flex; gap: 10px; margin-top: 14px; }
.sl-answer-foot { display: flex; align-items: center; gap: 6px; margin-top: 14px; color: var(--text-muted); font-size: 11.5px; }

/* Meeting prep */
.sl-prep { padding: 16px; }
.sl-prep-h { display: flex; align-items: center; gap: 12px; }
.sl-prep-when { width: 46px; height: 46px; border-radius: var(--radius-xl); background: var(--action); color: var(--on-action); display: flex; flex-direction: column; align-items: center; justify-content: center; line-height: 1; flex-shrink: 0; }
.sl-prep-when b { font-size: 17px; font-weight: 800; letter-spacing: -0.03em; }
.sl-prep-when small { font-size: 9.5px; opacity: .8; margin-top: 2px; }
.sl-prep-t { display: flex; flex-direction: column; min-width: 0; }
.sl-prep-k { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: .1em; color: var(--soil-violet); }
.sl-prep-t b { font-size: 15px; letter-spacing: -0.02em; margin-top: 1px; }
.sl-prep-t small { color: var(--text-3); font-size: 12px; }
.sl-stack { margin-left: auto; display: flex; }
.sl-stack .sl-avatar { box-shadow: 0 0 0 2px var(--bg-surface); }
.sl-stack .sl-avatar + .sl-avatar { margin-left: -6px; }
.sl-prep-facts { list-style: none; margin: 14px 0 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.sl-prep-facts li { display: grid; grid-template-columns: 22px minmax(0,1fr); gap: 10px; align-items: start; padding: 9px 8px; border-radius: var(--radius-md); transition: background .15s; }
.sl-prep-facts li:hover { background: var(--bg-row-hover); }
.sl-prep-n { width: 22px; height: 22px; border-radius: var(--radius-sm); font-size: 11px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; }
.sl-prep-n.is-bad { background: var(--bad-bg); color: var(--bad-ink); }
.sl-prep-n.is-warn { background: var(--warn-bg); color: var(--warn-ink); }
.sl-prep-n.is-ok { background: var(--ok-bg); color: var(--ok-ink); }
.sl-prep-n.is-stall { background: var(--stall-bg); color: var(--stall-ink); }
.sl-prep-f { line-height: 20px; font-size: 13px; color: var(--ink-2); }
.sl-prep-act { display: flex; gap: 10px; margin-top: 12px; padding-top: 14px; border-top: 1px solid var(--line-divider); }

/* Schedule card */
.sl-sched { padding: 18px 18px 16px; }
.sl-sched-title { width: 100%; box-sizing: border-box; border: 0; border-bottom: 1px solid transparent; background: transparent; color: var(--ink); font: inherit; font-size: 18px; font-weight: 700; letter-spacing: -0.025em; padding: 2px 0 8px; outline: 0; transition: border-color .15s; }
.sl-sched-title:hover, .sl-sched-title:focus { border-bottom-color: var(--line-control); }
.sl-sched-row { display: flex; align-items: center; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--line-divider); flex-wrap: wrap; }
.sl-sched-k { width: 64px; color: var(--text-3); font-size: 12px; flex-shrink: 0; }
.sl-guests { display: flex; gap: 8px; flex-wrap: wrap; flex: 1; }
.sl-guest { display: inline-flex; align-items: center; gap: 8px; padding: 4px 10px 4px 4px; border: 1px solid var(--line-control); border-radius: var(--radius-full); background: var(--bg-surface); }
.sl-guest > span:nth-child(2) { display: flex; flex-direction: column; line-height: 1.2; }
.sl-guest b { font-size: 12px; font-weight: 600; }
.sl-guest small { font-size: 10.5px; color: var(--text-muted); }
.sl-outside { display: inline-flex; align-items: center; gap: 4px; height: 18px; padding: 0 6px; border-radius: 5px; background: var(--outside-bg); color: var(--outside-ink); font-size: 10.5px; font-weight: 500; }
.sl-slots { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 8px; flex: 1; }
.sl-slot { position: relative; display: flex; flex-direction: column; align-items: flex-start; gap: 1px; padding: 10px 12px; border: 1px solid var(--line-control); border-radius: var(--radius-lg); background: var(--bg-surface); text-align: left; transition: border-color .15s, background .15s, box-shadow .15s, transform .12s; }
.sl-slot:hover { border-color: var(--text-faint); }
.sl-slot:active { transform: scale(.98); }
.sl-slot.is-on { border-color: var(--selected-line); background: var(--selected-bg); box-shadow: 0 0 0 3px var(--focus-glow); }
.sl-slot b { font-size: 12.5px; }
.sl-slot span { font-size: 13px; color: var(--ink); }
.sl-slot small { font-size: 10.5px; color: var(--text-muted); }
.sl-slot-best { position: absolute; right: 8px; top: 8px; font-size: 9.5px !important; font-weight: 600; color: var(--soil-violet) !important; letter-spacing: .02em; }
.sl-sched-video { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 10px; border-radius: var(--radius-md); background: var(--bg-subtle); color: var(--text-2); font-size: 12px; }
.sl-sched-foot { display: flex; align-items: center; gap: 12px; padding-top: 14px; }
.sl-sched-note { color: var(--text-muted); font-size: 11.5px; }
.sl-sched-foot .sl-btn { margin-left: auto; }
.sl-sched-ok { display: grid; grid-template-columns: 40px minmax(0,1fr); gap: 14px; align-items: start; }
.sl-sched-okc { width: 40px; height: 40px; border-radius: 50%; background: var(--done-bg); color: var(--done-ink); display: flex; align-items: center; justify-content: center; animation: sl-pop .45s cubic-bezier(.2,.8,.2,1); }
.sl-sched-ok b { font-size: 15px; letter-spacing: -0.02em; }
.sl-sched-ok p { margin: 3px 0 12px; color: var(--text-3); }
.sl-sched-okb { display: flex; gap: 8px; flex-wrap: wrap; }

/* Customer row */
.sl-cust { display: grid; grid-template-columns: 32px minmax(140px,1.4fr) 120px repeat(4, minmax(70px,1fr)) 14px; gap: 14px; align-items: center; min-height: 58px; padding: 0 10px; border-radius: var(--radius-lg); transition: background .15s; }
.sl-cust + .sl-cust { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-cust:hover { background: var(--bg-row-hover); }
.sl-cust-mark { width: 32px; height: 32px; border-radius: 9px; color: #FFFFFF; font-weight: 800; font-size: 14px; display: flex; align-items: center; justify-content: center; box-shadow: inset 0 -1px 0 rgba(0,0,0,.12); }
.sl-cust-n, .sl-cust-m, .sl-conn-n { display: flex; flex-direction: column; min-width: 0; line-height: 1.3; }
.sl-cust-n b, .sl-conn-n b { font-size: 13px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sl-cust-n small, .sl-conn-n small { color: var(--text-3); font-size: 11.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sl-cust-m small { color: var(--text-muted); font-size: 10.5px; }
.sl-cust-m b { font-size: 12.5px; font-weight: 500; }
.sl-cust-m b.is-bad { color: var(--bad-ink); }

/* Connection row */
.sl-conn { display: grid; grid-template-columns: 40px minmax(0,1fr) auto 110px 110px; gap: 14px; align-items: center; padding: 12px 12px; border-radius: var(--radius-lg); transition: background .15s; }
.sl-conn + .sl-conn { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-conn:hover { background: var(--bg-row-hover); }
.sl-conn.is-bad { background: var(--critical-card); box-shadow: inset 0 0 0 1px var(--critical-card-line); }
.sl-conn.is-attn { background: var(--risk-card); box-shadow: inset 0 0 0 1px var(--risk-card-line); }
.sl-conn-logo { width: 40px; height: 40px; border-radius: var(--radius-lg); border: 1px solid var(--line-card); background: var(--bg-surface); display: flex; align-items: center; justify-content: center; box-shadow: 0 1px 2px rgba(16,24,40,.05); }
.sl-conn-t { color: var(--text-muted); font-size: 11.5px; text-align: right; }
.sl-conn .sl-btn { justify-self: end; }

/* Field */
.sl-field { display: flex; flex-direction: column; gap: 6px; max-width: 360px; }
.sl-field-l { font-size: 12px; font-weight: 500; color: var(--ink); }
.sl-field input { height: 38px; padding: 0 12px; border: 1px solid var(--line-control); border-radius: var(--radius-md); background: var(--bg-surface); color: var(--ink); font: inherit; font-size: 13px; outline: 0; transition: border-color .15s, box-shadow .2s; }
.sl-field input:hover { border-color: var(--text-faint); }
.sl-field input:focus { border-color: var(--focus-ring); box-shadow: 0 0 0 3px var(--focus-glow); }
.sl-field.is-error input { border-color: var(--error-ink); box-shadow: 0 0 0 3px var(--bad-bg); }
.sl-field-e { display: inline-flex; align-items: center; gap: 6px; color: var(--error-ink); font-size: 12px; }
.sl-field-h { color: var(--text-muted); font-size: 12px; }

/* Toggle */
.sl-toggle { display: inline-flex; align-items: center; gap: 10px; font-size: 13px; cursor: pointer; }
.sl-toggle button { width: 34px; height: 20px; padding: 2px; border: 0; border-radius: var(--radius-lg); background: var(--bar-empty); transition: background .2s; display: flex; }
.sl-toggle button span { width: 16px; height: 16px; border-radius: 50%; background: #FFFFFF; box-shadow: 0 1px 3px rgba(16,24,40,.25); transition: transform .22s cubic-bezier(.3,1.4,.5,1); }
.sl-toggle button.is-on { background: var(--action); }
.sl-toggle button.is-on span { transform: translateX(14px); background: var(--on-action); }

/* Sparkline */
.sl-spark-line { overflow: visible; }
.sl-spark-stroke { fill: none; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.sl-spark-fill { opacity: .12; }
.sl-spark-line.is-ok .sl-spark-stroke { stroke: var(--bar-ok); } .sl-spark-line.is-ok .sl-spark-fill, .sl-spark-line.is-ok .sl-spark-dot { fill: var(--bar-ok); }
.sl-spark-line.is-warn .sl-spark-stroke { stroke: var(--bar-warn); } .sl-spark-line.is-warn .sl-spark-fill, .sl-spark-line.is-warn .sl-spark-dot { fill: var(--bar-warn); }
.sl-spark-line.is-bad .sl-spark-stroke { stroke: var(--critical); } .sl-spark-line.is-bad .sl-spark-fill, .sl-spark-line.is-bad .sl-spark-dot { fill: var(--critical); }
.sl-spark-dot { stroke: var(--bg-surface); stroke-width: 1.5; }

/* Skeleton */
.sl-skel { display: flex; flex-direction: column; gap: 10px; }
.sl-skel-b { display: block; height: 10px; border-radius: 5px; background: var(--skeleton) linear-gradient(90deg, transparent, var(--skeleton-shine), transparent) no-repeat; background-size: 200px 100%; animation: sl-shine 1.3s ease-in-out infinite; }

@media (max-width: 900px) {
  .sl-slots { grid-template-columns: minmax(0,1fr); }
  .sl-cust { grid-template-columns: 32px minmax(0,1fr) auto; }
  .sl-cust .sl-cust-m, .sl-cust .sl-row-go { display: none; }
  .sl-conn { grid-template-columns: 40px minmax(0,1fr) auto; }
  .sl-conn-t { display: none; }
  .sl-conn .sl-pill { display: none; }
  .sl-sched-k { width: 100%; }
}
@media (prefers-reduced-motion: reduce) { .sl-card, .sl-att, .sl-bars span, .sl-acc span { animation: none !important; } }

.sl-cust > .sl-pill, .sl-conn > .sl-pill { justify-self: start; }
.sl-toast.is-error .sl-toast-i { background: var(--critical); color: var(--bg-surface); }
.sl-prep-f .sl-src { margin-left: 4px; }

/* Headline and its counts share one line on desktop, as in the reference */
@media (min-width: 1181px) {
  .sl-hello-row { flex-wrap: nowrap; }
  .sl-headline { white-space: nowrap; }
  .sl-counts { flex-shrink: 0; }
}

/* 3. App layer */

/* The rail stays on screen; only the page scrolls.
 *
 * `.sl-sidebar` is `min-height: 100%`, and its parent is the full DOCUMENT, so on a
 * long page the rail stretched to match it: measured on Today at 1440x900, the sidebar
 * was 2861px tall and the account card sat at y=2805. "Log out" -- the only way out of
 * the product -- was three screens below the fold, and so were the Connected tools
 * card and every team link under the nav.
 *
 * `position: sticky` with an explicit viewport height is the whole fix. The rail's own
 * `margin-top: auto` on `.sl-tools` then does what it was always meant to do and pins
 * the tools card and the account card to the bottom of the SCREEN. `overflow-y: auto`
 * is the safety valve for a workspace with enough teams to overflow the rail itself --
 * it then scrolls inside the rail instead of dragging the page with it.
 *
 * Desktop only: below 900px bundle.css hides the sidebar outright and the phone bar is
 * the navigation, so a sticky full-height element there would be an invisible
 * scroll trap. */
@media (min-width: 901px) {
  .sl-sidebar {
    position: sticky;
    top: 0;
    height: 100vh;
    min-height: 100vh;
    overflow-y: auto;
    overscroll-behavior: contain;
  }
  /* The account card pins to the bottom of the rail rather than the bottom of the
     document. "Log out" is the only way out of the product and it was three screens
     down; it is now always on screen, whatever the page or the team count.
     `position: sticky` on a child of the scrolling rail rather than a wrapper, because
     the markup between the wordmark and these cards is not tag-balanced as a block and
     wrapping it would have meant restructuring the rail to win 20px of tidiness.
     The background is load-bearing: without it the nav scrolls visibly underneath. */
  .sl-user {
    position: sticky;
    bottom: 0;
    z-index: 1;
    background: var(--bg-sidebar);
    /* The rule and the fade together. Pinned, this card sits ON TOP of whatever nav row
       happens to be behind it, and with only a background the row above reads as
       CLIPPED rather than scrolled under -- "Revenue at risk" looked truncated. The
       1px line says "this is a pinned layer", and the gradient above it gives the row
       somewhere to go instead of ending abruptly against the line. */
    border-top: 1px solid var(--line-sidebar);
    padding-top: var(--space-3);
    margin-bottom: calc(var(--space-2) * -1);
    padding-bottom: var(--space-2);
  }
  .sl-user::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 100%;
    height: 18px;
    pointer-events: none;
    background: linear-gradient(to top, var(--bg-sidebar), transparent);
  }
}

/* The Ask box shares the page's gutter.
 *
 * `sl_ask_box` is rendered from base.html as a direct child of <main>, next to the
 * page body rather than inside it, so it never picked up `.sl-page`/`.sl-today`'s
 * `padding: 15px 16px 24px 19px`. Measured at 1440 on /org/demo/customers: the
 * notices and the Customers card sat at 265..1382 while the Ask box sat at
 * 246..1398 -- 19px wider on the left and 16px on the right, which reads as the one
 * box on the screen that is not lined up with the rest.
 *
 * Margins here rather than moving the element inside the page body: every screen
 * renders its own body block, so the box would have to be repeated 24 times.
 * Works on both shells -- Today zeroes `.main-content`'s padding and insets by 19px
 * itself, other pages pad `.main-content` and then `.sl-page` adds the same 19px,
 * so in both cases this lands on the same edge as the cards above it. */
main > .sl-ask { margin-left: 19px; margin-right: 16px; }
@media (max-width: 900px) { main > .sl-ask { margin-left: 16px; margin-right: 16px; } }

/* Provider logos in dark mode.
 *
 * The design system ships letter tiles, each with its own brand pair (`.sl-logo-gh` and
 * friends above), and those are fine on either theme. The official SVGs we added for
 * step 3 of the brief are not: github (#1B1F23), notion (#000), linear (#222326) and
 * aws_cost (#252F3E) are near-black, and they sit on `--bg-surface`, which is dark in
 * dark mode. The tile rendered as an empty square.
 *
 * A light plate rather than a filter: `invert()` would fix the four monochrome marks and
 * destroy the multicolour ones -- google_calendar alone carries #1A73E8, #1967D2 and
 * #188038, and an inverted Slack is not Slack. Every vendor's own dark-mode guidance says
 * to put the full-colour mark on a light surface, so that is what this does, for all of
 * them, so the row reads consistently instead of one tile per vendor's luck. */
[data-theme="dark"] .sl-conn-logo,
[data-theme="dark"] .sl-agent-logo,
[data-theme="dark"] .sl-logo-plate { background: #F2F4F7; border-color: #D0D5DD; }
[data-theme="dark"] .sl-conn-logo .sl-logo-img,
[data-theme="dark"] .sl-agent-logo .sl-logo-img,
[data-theme="dark"] .sl-logo-plate .sl-logo-img { mix-blend-mode: normal; }


/* --- the notice strip above every screen ----------------------------------------------
 *
 * Four banners can stack here -- setup, demo, placeholder answers, degraded search --
 * and each was a full-bleed legacy slab with its own colour and its own shape. On a
 * demo org with pgvector missing, two of them loaded before any content, the louder
 * one being the less important, and on Ask the red one sat directly above
 * `sl_health`'s own designed banner: two red things, different shapes, saying
 * different kinds of thing.
 *
 * They are notices, not content, so they get one shape: the system's card edge, a
 * tone band down the left, and the same gutter as the cards beneath them. Tone says
 * what kind: violet for "this is a demo", amber for "something here is reduced".
 */
/* No wrapper element: the notices are plain siblings before the content block, so
 * each carries its own spacing rather than base.html growing a div around them. */
/* No wrapper element: the notices are plain siblings before the content block, so
 * each carries its own spacing rather than base.html growing a div around them.
 *
 * The horizontal inset matches `.sl-today` / `.sl-page` exactly, because a notice
 * that runs edge to edge above a column of inset cards reads as a different page.
 * Measured before this: notices spanned 222..1422 while the cards beneath them sat
 * at 241..1058. */
.sl-notice { margin-left: 19px; margin-right: 16px; }
.sl-notice + .sl-notice { margin-top: var(--space-2); }
.sl-notice:first-of-type { margin-top: 15px; }
.sl-notice:last-of-type { margin-bottom: var(--space-1); }
@media (max-width: 900px) { .sl-notice { margin-left: 16px; margin-right: 16px; } }
.sl-notice { display: flex; align-items: flex-start; gap: var(--space-3);
  padding: 11px var(--space-4); border: 1px solid var(--line-card);
  border-left: 3px solid var(--line-control); border-radius: var(--radius-md);
  background: var(--bg-surface); color: var(--text-2); font-size: 12.5px;
  line-height: 19px; }
.sl-notice strong { color: var(--ink); font-weight: 600; }
.sl-notice a { color: var(--soil-violet); text-decoration: underline;
  text-underline-offset: 2px; }
.sl-notice-demo { border-left-color: var(--soil-violet); }
.sl-notice-warn { border-left-color: var(--risk); }
.sl-notice-mark { flex-shrink: 0; font-family: var(--font-mono); font-size: 9.5px;
  letter-spacing: .06em; padding: 3px 6px; border-radius: var(--radius-xs);
  background: var(--bg-subtle); color: var(--text-muted); margin-top: 1px; }
.sl-notice-demo .sl-notice-mark { background: var(--recommend-bg); color: var(--soil-violet); }
.sl-notice code { font-family: var(--font-mono); font-size: 11.5px;
  background: var(--bg-subtle); padding: 1px 4px; border-radius: var(--radius-xs); }


/* --- legacy.css's bare `h2` rule reaches the card title -----------------------------
 *
 * `bundle.css` styles only CLASSES; `legacy.css` styles bare elements and loads
 * first. `.sl-h` is an `<h2>` and its class sets font-size, weight and tracking but
 * NOT line-height -- so for that one property nothing in the design system applies
 * and legacy's `h2` rule wins by default, not by specificity. Measured: a card title
 * came out at 20.8px line-height where the approved mock is 23.2px.
 *
 * The fix is to declare the value, not to reset the tag. My first attempt was a
 * blanket `font: inherit` on every bare tag inside a card, which has HIGHER
 * specificity than the component classes (0,1,1 against 0,1,0) and so clobbered
 * every component's own font-size -- card titles dropped to 12.5px. Stated here
 * because the blanket version looks like the tidier fix and is the wrong one.
 */
.sl-h, .sl-h-sm { line-height: 1.45; }
/* `.sl-lead` is a <p> and hits the same leak: its class sets font-size 15px and no
 * line-height, so legacy's bare `p` rule (1.55) applied instead of the design's 1.45
 * -- 23.25px where the mock is 21.75px. */
.sl-lead { line-height: 1.45; }


/* --- the page head sits on the same left edge as the cards -----------------------------
 *
 * bundle.css gives `.sl-hello` `padding-left: 8px`. On Today that is invisible: the
 * greeting is the first thing on the page and there is nothing above it to line up
 * with. On every other screen the headline is directly above a column of cards, and
 * measured on team detail it started at 273px while the cards started at 265 -- a
 * visible 8px step that reads as a mistake because it is one.
 *
 * The padding is kept on the row's children where bundle.css wants the breathing room
 * and removed from the block's left edge, so nothing moves vertically. */
.sl-hello { padding-left: 0; }


/* The week grid takes the whole card, and its detail cards sit under it.
 *
 * With a 333px rail the day column measured 130px, so a three-way overlap drew each
 * event at 41px -- "Pricing review" rendered as "Pri ci...". The overlap packing was
 * correct; it had nowhere to put the result. Full width gives ~223px a day and ~74px
 * per column in a 3-up, which is legible. Google's week view has no rail either; it
 * opens a meeting OVER the grid rather than beside it.
 *
 * The detail cards lose nothing by moving: they were in a 333px column and are now in
 * a three-up row that is wider per card below 1180px and no narrower above it. */
.cal-stack { display: flex; flex-direction: column; gap: 15px; min-width: 0; }
.cal-below { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 15px; align-items: start; margin-top: 15px; }
@media (max-width: 900px) { .cal-below { grid-template-columns: minmax(0, 1fr); } }


/* --- Company pace rows ---------------------------------------------------------------
 *
 * These were `display: flex; justify-content: space-between; align-items: baseline`,
 * which means every row negotiated its own proportions and no two shared a column.
 * With four rows of different shapes -- one figure alone, three with a sparkline and
 * a delta pill -- the result was four different layouts stacked: "Merged per / week"
 * and "Incidents / Customer- / facing" wrapping to two and three lines against
 * single-line neighbours, the big numbers landing at four different heights, and the
 * sparklines floating at four different x positions.
 *
 * A grid instead, so the four rows are four instances of one row. The label takes
 * what is left, the figure column is sized to the widest number in the card
 * (`max-content` across rows is not a thing in CSS grid, so the floor is set to fit
 * "10 hours" at 24px), and both columns start at the TOP rather than on a baseline --
 * a baseline is the wrong anchor when one side is one line and the other is three.
 */
.normal-list { gap: 0; }
.normal-row2 { display: grid; grid-template-columns: minmax(0, 1fr) minmax(104px, auto);
  align-items: start; gap: var(--space-2) var(--space-3);
  padding: var(--space-4) 0; border-bottom: 0; }
.normal-row2 + .normal-row2 { border-top: 1px solid var(--line-divider); }
.normal-head { gap: 1px; }
.normal-figure { align-items: flex-end; gap: var(--space-2); }
/* The number, the shape and the delta sit in one right-aligned stack, so the three
 * rows that have all three line up with the one row that has only a number. */
.normal-figure .normal-value { line-height: 1.1; }
.normal-figure .sparkline, .normal-figure svg { display: block; }
.normal-figure .sl-pill { white-space: normal; text-align: right; height: auto;
  padding-top: 3px; padding-bottom: 3px; }


/* --- text inside a card ---------------------------------------------------------------
 *
 * The design system styles no list and no paragraph. bundle.css has rules for every
 * component's own text -- `.sl-att-body`, `.sl-stat-cap`, `.sl-answer-lines` -- and
 * nothing at all for a plain <ul> or <p> that a screen puts inside `.sl-card`. Six
 * cards across Track record, the Backtest report and Connections do exactly that, and
 * what renders is the BROWSER DEFAULT: disc bullets at a 40px indent, so the text
 * starts on a different left edge from every other thing on the card, and the bullets
 * hang outside the card's own text column.
 *
 * Measured on Track record at 1440 before this: `list-style: disc`, `padding-left:
 * 40px`, and prose running the full 735px of the card -- about 100 characters a line,
 * where 45-75 is the readable range and every other text block on the page is inside
 * it.
 *
 * So: a list reads as rows, not as a bulleted memo, and prose stops at 68ch. The cap
 * is a max-width, so it never stretches anything narrow -- a rail card is unaffected.
 */
.sl-card ul, .sl-card ol { margin: 0; padding: 0; list-style: none; display: flex;
  flex-direction: column; gap: var(--space-2); }
.sl-card ul > li, .sl-card ol > li { min-width: 0; }
/* A list that is genuinely enumerating gets its marker back, inside the text column
 * rather than hanging outside it. Opt in with `sl-bullets`; the default is rows. */
.sl-card ul.sl-bullets { list-style: disc; padding-left: 1.1em; }
.sl-card ul.sl-bullets > li::marker { color: var(--icon-faint); }

/* Prose measure. Only bites above ~68 characters, so nothing narrow moves. */
.sl-card > p, .sl-card > div > p, .sl-note { max-width: 68ch; }


/* `.sl-today-l` has NO RULE ANYWHERE in the design system. bundle.css styles
 * `.sl-today-r` and `.sl-today-b` and simply forgets `-l`, and five templates use it
 * -- home, calendar, schedule, warning_detail, waiting. It survives as the grid's
 * first child, so the column lands in the right place and nobody notices; what it
 * does not get is the flex column and the gap, so every card in the main column of
 * all five screens sat EDGE TO EDGE, doubled hairline and no air, while the rail
 * beside it kept its proper 18px rhythm.
 *
 * tests/test_sl_components.py already records it as a design-system gap. This is the
 * rule it needed.
 *
 * 16px, NOT the 15px this rule first carried, and the correction is the owner's:
 * "why is there not equal spacing between each box". 15px is `.sl-today`'s COLUMN
 * gap; its ROW gap is 16, and so is `.sl-today-b`'s. So the main column stacked its
 * cards 15px apart while every other vertical join on the same screen measured 16 --
 * see the Today rhythm block further down this section for the measured before and
 * after of all six. */
.sl-today-l { display: flex; flex-direction: column; gap: 16px; min-width: 0; }

/* `.sl-aside` is `display: inline-flex` with `text-overflow: ellipsis`, which does
 * nothing at all for a bare text node in a flex container -- People's aside was hard
 * cut at "...one perso" with no ellipsis. The text needs its own shrinkable box. */
.sl-aside-t { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }


/* WorkTable holds real values, not the mock's short ones.
 *
 * bundle.css fixes Status at 111px and floors Risk at 90px, which fits "In review" and
 * "6x usual". A real Jira status is "Waiting for approval" and a real risk cell is
 * "Not measured", and both overran -- Status was clipped mid-word by the Risk column.
 *
 * Ellipsising them was the wrong fix (and was the first thing tried): a status you
 * cannot read is not better than one you have to scroll to.
 *
 * SIZING THE COLUMNS TO THEIR CONTENT WAS ALSO WRONG, and it is what this rule used
 * to do (`max-content` tracks plus `min-width: max-content`). Every `.sl-tr` is its
 * OWN grid -- the component builds a row per record, not one grid for the table -- so
 * content-sized tracks are computed nine times and come out nine different widths.
 * Measured on Today at 1440: the rows were 571, 593, 593, 795, 636, 641, 648, 641 and
 * 614px wide, and "In progress" started at a different x on every single line. A
 * column of figures that does not line up is the defect the audit's rule 2 exists to
 * catch, and it was being caused here.
 *
 * So the tracks are the SAME on every row, and they are sized to the widest value
 * Soil actually prints rather than to the mock's: 146px fits "Waiting for approval",
 * 126px fits a "Not measured" pill and its chevron, and the two text columns flex.
 * `column-gap` is new -- the design system sets none, which is fine for its short
 * sample names and is why a real 39-character Jira summary ran flush into the owner's
 * avatar with no space at all between them.
 *
 * 722px is the sum of the five minimums plus the gaps, so a row is never narrower
 * than its own content; the card below is wide enough to hold it at every width above
 * 1180px, and `.sl-table { overflow-x: auto }` plus section 2's
 * `.sl-today-b .sl-card { overflow: hidden }` keep the phone's scroll inside the card
 * so the PAGE still never moves. Verified 0px of document overflow at 1440 and 390 in
 * both themes. */
.sl-table { overflow-x: auto; }
.sl-tr { grid-template-columns: minmax(200px, 1.6fr) minmax(120px, 1fr) 82px 146px minmax(126px, 0.9fr);
  column-gap: var(--space-3); min-width: 722px; }


/* An attention card's own secondary controls, below its actions: the score disclosure
 * and the "Not useful" mute. bundle.js has no slot for them -- the mock's cards carry
 * nothing but the one action -- and rendering them in a detached loop after the row,
 * which is what the conversion first did, left five control rows under the cards with
 * nothing tying each to its card.
 *
 * A HAIRLINE, because without one these two read as a third and fourth action. The
 * card's own order is severity, title, body, recommendation, then the black primary
 * and the white secondary -- and "Why am I seeing this?" and "Not useful" were
 * landing 12px under that pair in the same tint, so the card looked like it offered
 * four things to press when it offers two plus a disclosure and a mute. The rule is
 * the design's own `--line-divider`, inset to the card's text column so it does not
 * run into the padding.
 *
 * `margin-top: auto` pins the footer to the bottom of the card, which is what keeps
 * five cards of different content lengths showing their footers on one baseline per
 * row -- measured identical at 1440 (y=951 across the first row) and correct at 390,
 * where each card sizes to its own content. */
.sl-att-foot { margin-top: auto; padding-top: var(--space-3); display: flex;
  align-items: center; gap: var(--space-3); flex-wrap: wrap;
  border-top: 1px solid var(--line-divider); margin-left: 4px; margin-right: 4px; }
.sl-att-foot > * { min-width: 0; }


/* FIVE attention cards, on a screen the design drew with three.
 *
 * `repeat(3, minmax(0, 1fr))` is right for three and leaves a hole for four or five:
 * the fourth and fifth cards took a third of the row each and the third cell stayed
 * empty, so the second row read as a grid that had run out rather than as a decision.
 * `attention_list` is as long as the ranking makes it, so three is a shape this page
 * will keep being handed more than.
 *
 * Flex-wrap instead, with a one-third basis and `flex-grow`, so a short last row
 * SPREADS to fill its width rather than leaving a gap: five cards are 3 + 2, and the
 * two are half-width each. `max-width` caps that growth at a half, so four cards are
 * 3 + 1-at-half rather than 3 + 1 running the whole width -- a single full-bleed
 * attention card would be the loudest thing on Today and would be loudest for the
 * LEAST important item in the list.
 *
 * Items in one flex line stretch to the tallest, so the cards in each row still share
 * a top edge and a height, which is what the grid gave and what rule 2 asks for. At
 * 900px section 2 stacks them and the basis below hands that back.
 *
 * `:has(> .sl-att)` on purpose, and it is not decoration. `.sl-att-row` is the design
 * system's ONLY equal-cards grid, so three other screens borrow it for plain
 * `.sl-card`s -- dashboard.html's connect-a-tool cards, mcp_connections.html's server
 * cards, billing.html's plan cards. A bare `display: flex` here sizes those to their
 * own content and stacks them one per line (measured on billing: 351 / 803 / 412px),
 * which is somebody else's screen broken by a change made for this one. Scoped like
 * this, the row is a flex row only where it actually holds attention cards and stays
 * the design's 3-up grid everywhere else. */
.sl-att-row:has(> .sl-att) { display: flex; flex-wrap: wrap; }
.sl-att-row > .sl-att { flex: 1 1 calc((100% - 30px) / 3);
  max-width: calc((100% - 15px) / 2); min-width: 0; }
/* ...except when it is ALONE on its line, which the half-width cap turns into a hole.
 * Measured at 1440 on a real org with one attention card: the card took 520px of a
 * 1057px row and left 535px of nothing beside it. Four cards did the same thing on the
 * second line. The cap is right when a card has a neighbour -- a single card stretched
 * across a full 1057px row is a very wide, very short box -- but a lone card with
 * half the row empty next to it reads as a rendering fault, which is what it was
 * reported as. `:only-child` covers one card; `:nth-child(3n+1):last-child` covers a
 * lone card left on a wrapped line (the 4th of four, the 7th of seven). */
.sl-att-row > .sl-att:only-child,
.sl-att-row > .sl-att:nth-child(3n + 1):last-child { max-width: 100%; }
@media (max-width: 900px) {
  .sl-att-row > .sl-att { flex-basis: 100%; max-width: 100%; }
}


/* The sidebar's second nav region. bundle.js renders ONE flat nav; this app groups,
 * and Connections/Settings are neither money nor a feature -- they are the workspace.
 * A hairline instead of a fifth 42px eyebrow gap, because the list is already tall. */
.sl-nav-list-end { margin-top: var(--space-4); padding-top: var(--space-3);
  border-top: 1px solid var(--line-sidebar); }
.sl-nav-list-end .sl-eyebrow-sm { margin-top: 0; }



/* Work at risk gets the width its five columns actually need, and the bottom row
 * collapses again on a phone.
 *
 * TWO BUGS WERE IN THIS ONE DECLARATION. The first: section 2 collapses `.sl-today-b`
 * to a single column inside `@media (max-width: 1180px)`, and an unconditional rule
 * further down the same stylesheet beats a media query of equal specificity. So the
 * three-across row survived all the way down to 390px, where it measured
 * 160px / 67px / 67px -- "What changed" and "Agents" were each 67 pixels wide, one
 * word per line, with the card titles clipped to "W..." and "Manag". The media query
 * is restated below so the collapse works again.
 *
 * The second: 1.8fr (or 2.4fr) of a 1183px row is about 630px for the table card, and
 * Work at risk needs 722px plus its padding before anything can be read. The mock fits
 * in less only because its sample statuses are short ("In review"); Soil prints the
 * workflow state the tool recorded, so "Waiting for approval" is the normal case, and
 * every Risk cell on this account says "Not measured" because no multiplier is
 * computed anywhere yet. That sentence is the honest answer -- but it was arriving on
 * screen as "Not measure", "Not meas", "Not n", "Not", clipped at the card edge by a
 * sideways scroll nobody can see on a desktop. A column cut mid-word does not read as
 * honest, it reads as broken, which is the opposite of what it is there to say.
 *
 * So the five-column table takes the whole row and the two short cards share the row
 * under it. That is a departure from the mock's three-across bottom band, and a
 * deliberate one: the mock's own Work at risk is clipped in exactly the same place
 * (audit/today/today-mock-1440-light.png, the "6x usual" column), so this is a defect
 * the reference inherits rather than an intention it has. Both remaining cards keep a
 * real card's width, and the page's own `1fr`-based rhythm is unchanged.
 *
 * The two text cells still get `overflow: hidden`, so an unusually long owner or status
 * is cut at its own column edge rather than over its neighbour.
 */
.sl-today-b { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* Work at risk is unconditionally the first card in this region (home.html), and it
 * is the only one of the three with a table in it. */
.sl-today-b > :first-child { grid-column: 1 / -1; }
.sl-today-b .sl-tr > span:nth-child(2),
.sl-today-b .sl-tr > span:nth-child(4) { min-width: 0; overflow: hidden; }
@media (max-width: 1180px) {
  .sl-today-b { grid-template-columns: minmax(0, 1fr); }
  .sl-today-b > :first-child { grid-column: auto; }
}

/* A textarea and a checkbox, neither of which the design system has. bundle.css styles
 * `.sl-field input` only, so both rendered browser-default inside a design-system card. */
.sl-field textarea { width: 100%; box-sizing: border-box; padding: 9px var(--space-3);
  border: 1px solid var(--line-control); border-radius: var(--radius-md);
  background: var(--bg-surface); color: var(--ink); font: inherit; letter-spacing: inherit;
  line-height: 19px; resize: vertical; }
.sl-field textarea:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 1px;
  box-shadow: 0 0 0 3px var(--focus-glow); }
.sl-check { display: flex; align-items: flex-start; gap: 9px; padding: 7px 0; cursor: pointer; }
.sl-check input { margin: 2px 0 0; accent-color: var(--soil-violet); flex-shrink: 0; }
.sl-check-t { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.sl-check-t small { color: var(--text-faint); }
.sl-check.is-off { cursor: default; color: var(--text-faint); }

/* Visually hidden, but read aloud. Only legacy.css had `sr-only`, so a converted
 * screen either lost its screen-reader-only labels or kept a legacy class -- two
 * survived on Custom agents for exactly that reason. */
.sl-sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }

/* --- the week grid's block positions -------------------------------------------------
 *
 * THE LAST INLINE STYLE IN THE APP. calendar.html placed each meeting with
 * `style="--slot-top: 37.5%; --slot-height: 5.6%"` -- a genuinely continuous value,
 * which is why it outlived the other 152. With it gone, `docs/SECURITY.md` section 3's
 * remaining hole, `style-src-attr 'unsafe-inline'`, can finally be closed.
 *
 * THE TRADE, stated plainly: these steps are 1% of the 9-hour day
 * (calendar_view.DAY_START_HOUR..DAY_END_HOUR), so a block can sit up to ~3 minutes off
 * its true position. That is invisible at any realistic column height, the grid is an
 * overview rather than a measuring instrument, and the exact time is printed inside
 * every block as `slot.time_label`. If that ever stops being true, halve the step --
 * this block is generated, not typed.
 */
.sl-cal-t-0 { --slot-top: 0%; } .sl-cal-t-1 { --slot-top: 1%; } .sl-cal-t-2 { --slot-top: 2%; } .sl-cal-t-3 { --slot-top: 3%; } .sl-cal-t-4 { --slot-top: 4%; } .sl-cal-t-5 { --slot-top: 5%; } .sl-cal-t-6 { --slot-top: 6%; } .sl-cal-t-7 { --slot-top: 7%; } .sl-cal-t-8 { --slot-top: 8%; } .sl-cal-t-9 { --slot-top: 9%; } .sl-cal-t-10 { --slot-top: 10%; } .sl-cal-t-11 { --slot-top: 11%; } .sl-cal-t-12 { --slot-top: 12%; } .sl-cal-t-13 { --slot-top: 13%; } .sl-cal-t-14 { --slot-top: 14%; } .sl-cal-t-15 { --slot-top: 15%; } .sl-cal-t-16 { --slot-top: 16%; } .sl-cal-t-17 { --slot-top: 17%; } .sl-cal-t-18 { --slot-top: 18%; } .sl-cal-t-19 { --slot-top: 19%; } .sl-cal-t-20 { --slot-top: 20%; } .sl-cal-t-21 { --slot-top: 21%; } .sl-cal-t-22 { --slot-top: 22%; } .sl-cal-t-23 { --slot-top: 23%; } .sl-cal-t-24 { --slot-top: 24%; } .sl-cal-t-25 { --slot-top: 25%; } .sl-cal-t-26 { --slot-top: 26%; } .sl-cal-t-27 { --slot-top: 27%; } .sl-cal-t-28 { --slot-top: 28%; } .sl-cal-t-29 { --slot-top: 29%; } .sl-cal-t-30 { --slot-top: 30%; } .sl-cal-t-31 { --slot-top: 31%; } .sl-cal-t-32 { --slot-top: 32%; } .sl-cal-t-33 { --slot-top: 33%; } .sl-cal-t-34 { --slot-top: 34%; } .sl-cal-t-35 { --slot-top: 35%; } .sl-cal-t-36 { --slot-top: 36%; } .sl-cal-t-37 { --slot-top: 37%; } .sl-cal-t-38 { --slot-top: 38%; } .sl-cal-t-39 { --slot-top: 39%; } .sl-cal-t-40 { --slot-top: 40%; } .sl-cal-t-41 { --slot-top: 41%; } .sl-cal-t-42 { --slot-top: 42%; } .sl-cal-t-43 { --slot-top: 43%; } .sl-cal-t-44 { --slot-top: 44%; } .sl-cal-t-45 { --slot-top: 45%; } .sl-cal-t-46 { --slot-top: 46%; } .sl-cal-t-47 { --slot-top: 47%; } .sl-cal-t-48 { --slot-top: 48%; } .sl-cal-t-49 { --slot-top: 49%; } .sl-cal-t-50 { --slot-top: 50%; } .sl-cal-t-51 { --slot-top: 51%; } .sl-cal-t-52 { --slot-top: 52%; } .sl-cal-t-53 { --slot-top: 53%; } .sl-cal-t-54 { --slot-top: 54%; } .sl-cal-t-55 { --slot-top: 55%; } .sl-cal-t-56 { --slot-top: 56%; } .sl-cal-t-57 { --slot-top: 57%; } .sl-cal-t-58 { --slot-top: 58%; } .sl-cal-t-59 { --slot-top: 59%; } .sl-cal-t-60 { --slot-top: 60%; } .sl-cal-t-61 { --slot-top: 61%; } .sl-cal-t-62 { --slot-top: 62%; } .sl-cal-t-63 { --slot-top: 63%; } .sl-cal-t-64 { --slot-top: 64%; } .sl-cal-t-65 { --slot-top: 65%; } .sl-cal-t-66 { --slot-top: 66%; } .sl-cal-t-67 { --slot-top: 67%; } .sl-cal-t-68 { --slot-top: 68%; } .sl-cal-t-69 { --slot-top: 69%; } .sl-cal-t-70 { --slot-top: 70%; } .sl-cal-t-71 { --slot-top: 71%; } .sl-cal-t-72 { --slot-top: 72%; } .sl-cal-t-73 { --slot-top: 73%; } .sl-cal-t-74 { --slot-top: 74%; } .sl-cal-t-75 { --slot-top: 75%; } .sl-cal-t-76 { --slot-top: 76%; } .sl-cal-t-77 { --slot-top: 77%; } .sl-cal-t-78 { --slot-top: 78%; } .sl-cal-t-79 { --slot-top: 79%; } .sl-cal-t-80 { --slot-top: 80%; } .sl-cal-t-81 { --slot-top: 81%; } .sl-cal-t-82 { --slot-top: 82%; } .sl-cal-t-83 { --slot-top: 83%; } .sl-cal-t-84 { --slot-top: 84%; } .sl-cal-t-85 { --slot-top: 85%; } .sl-cal-t-86 { --slot-top: 86%; } .sl-cal-t-87 { --slot-top: 87%; } .sl-cal-t-88 { --slot-top: 88%; } .sl-cal-t-89 { --slot-top: 89%; } .sl-cal-t-90 { --slot-top: 90%; } .sl-cal-t-91 { --slot-top: 91%; } .sl-cal-t-92 { --slot-top: 92%; } .sl-cal-t-93 { --slot-top: 93%; } .sl-cal-t-94 { --slot-top: 94%; } .sl-cal-t-95 { --slot-top: 95%; } .sl-cal-t-96 { --slot-top: 96%; } .sl-cal-t-97 { --slot-top: 97%; } .sl-cal-t-98 { --slot-top: 98%; } .sl-cal-t-99 { --slot-top: 99%; } .sl-cal-t-100 { --slot-top: 100%; }
.sl-cal-h-1 { --slot-height: 1%; } .sl-cal-h-2 { --slot-height: 2%; } .sl-cal-h-3 { --slot-height: 3%; } .sl-cal-h-4 { --slot-height: 4%; } .sl-cal-h-5 { --slot-height: 5%; } .sl-cal-h-6 { --slot-height: 6%; } .sl-cal-h-7 { --slot-height: 7%; } .sl-cal-h-8 { --slot-height: 8%; } .sl-cal-h-9 { --slot-height: 9%; } .sl-cal-h-10 { --slot-height: 10%; } .sl-cal-h-11 { --slot-height: 11%; } .sl-cal-h-12 { --slot-height: 12%; } .sl-cal-h-13 { --slot-height: 13%; } .sl-cal-h-14 { --slot-height: 14%; } .sl-cal-h-15 { --slot-height: 15%; } .sl-cal-h-16 { --slot-height: 16%; } .sl-cal-h-17 { --slot-height: 17%; } .sl-cal-h-18 { --slot-height: 18%; } .sl-cal-h-19 { --slot-height: 19%; } .sl-cal-h-20 { --slot-height: 20%; } .sl-cal-h-21 { --slot-height: 21%; } .sl-cal-h-22 { --slot-height: 22%; } .sl-cal-h-23 { --slot-height: 23%; } .sl-cal-h-24 { --slot-height: 24%; } .sl-cal-h-25 { --slot-height: 25%; } .sl-cal-h-26 { --slot-height: 26%; } .sl-cal-h-27 { --slot-height: 27%; } .sl-cal-h-28 { --slot-height: 28%; } .sl-cal-h-29 { --slot-height: 29%; } .sl-cal-h-30 { --slot-height: 30%; } .sl-cal-h-31 { --slot-height: 31%; } .sl-cal-h-32 { --slot-height: 32%; } .sl-cal-h-33 { --slot-height: 33%; } .sl-cal-h-34 { --slot-height: 34%; } .sl-cal-h-35 { --slot-height: 35%; } .sl-cal-h-36 { --slot-height: 36%; } .sl-cal-h-37 { --slot-height: 37%; } .sl-cal-h-38 { --slot-height: 38%; } .sl-cal-h-39 { --slot-height: 39%; } .sl-cal-h-40 { --slot-height: 40%; } .sl-cal-h-41 { --slot-height: 41%; } .sl-cal-h-42 { --slot-height: 42%; } .sl-cal-h-43 { --slot-height: 43%; } .sl-cal-h-44 { --slot-height: 44%; } .sl-cal-h-45 { --slot-height: 45%; } .sl-cal-h-46 { --slot-height: 46%; } .sl-cal-h-47 { --slot-height: 47%; } .sl-cal-h-48 { --slot-height: 48%; } .sl-cal-h-49 { --slot-height: 49%; } .sl-cal-h-50 { --slot-height: 50%; } .sl-cal-h-51 { --slot-height: 51%; } .sl-cal-h-52 { --slot-height: 52%; } .sl-cal-h-53 { --slot-height: 53%; } .sl-cal-h-54 { --slot-height: 54%; } .sl-cal-h-55 { --slot-height: 55%; } .sl-cal-h-56 { --slot-height: 56%; } .sl-cal-h-57 { --slot-height: 57%; } .sl-cal-h-58 { --slot-height: 58%; } .sl-cal-h-59 { --slot-height: 59%; } .sl-cal-h-60 { --slot-height: 60%; } .sl-cal-h-61 { --slot-height: 61%; } .sl-cal-h-62 { --slot-height: 62%; } .sl-cal-h-63 { --slot-height: 63%; } .sl-cal-h-64 { --slot-height: 64%; } .sl-cal-h-65 { --slot-height: 65%; } .sl-cal-h-66 { --slot-height: 66%; } .sl-cal-h-67 { --slot-height: 67%; } .sl-cal-h-68 { --slot-height: 68%; } .sl-cal-h-69 { --slot-height: 69%; } .sl-cal-h-70 { --slot-height: 70%; } .sl-cal-h-71 { --slot-height: 71%; } .sl-cal-h-72 { --slot-height: 72%; } .sl-cal-h-73 { --slot-height: 73%; } .sl-cal-h-74 { --slot-height: 74%; } .sl-cal-h-75 { --slot-height: 75%; } .sl-cal-h-76 { --slot-height: 76%; } .sl-cal-h-77 { --slot-height: 77%; } .sl-cal-h-78 { --slot-height: 78%; } .sl-cal-h-79 { --slot-height: 79%; } .sl-cal-h-80 { --slot-height: 80%; } .sl-cal-h-81 { --slot-height: 81%; } .sl-cal-h-82 { --slot-height: 82%; } .sl-cal-h-83 { --slot-height: 83%; } .sl-cal-h-84 { --slot-height: 84%; } .sl-cal-h-85 { --slot-height: 85%; } .sl-cal-h-86 { --slot-height: 86%; } .sl-cal-h-87 { --slot-height: 87%; } .sl-cal-h-88 { --slot-height: 88%; } .sl-cal-h-89 { --slot-height: 89%; } .sl-cal-h-90 { --slot-height: 90%; } .sl-cal-h-91 { --slot-height: 91%; } .sl-cal-h-92 { --slot-height: 92%; } .sl-cal-h-93 { --slot-height: 93%; } .sl-cal-h-94 { --slot-height: 94%; } .sl-cal-h-95 { --slot-height: 95%; } .sl-cal-h-96 { --slot-height: 96%; } .sl-cal-h-97 { --slot-height: 97%; } .sl-cal-h-98 { --slot-height: 98%; } .sl-cal-h-99 { --slot-height: 99%; } .sl-cal-h-100 { --slot-height: 100%; }


/* --- the page shell every screen except Today needs -----------------------------------
 *
 * The design system ships three layouts and none of them is "an ordinary page":
 * `.sl-today` is Today's two-column grid, `.sl-today-r` is Today's 333px rail, and
 * `.sl-shell` is for pages outside the app frame. `.sl-card` has no margin, so a
 * screen that emits cards gets them flush together and running to the sidebar edge.
 * Six separate screen conversions hit this and each worked around it differently;
 * several borrowed `.sl-today > .sl-today-r`, which stacks correctly and leaves a dead
 * 333px column above 1180px.
 *
 * Padding and gap are the same values `.sl-today` uses, so a converted screen lines
 * up with Today exactly rather than nearly.
 */
.sl-page { padding: 15px 16px 24px 19px; display: grid; gap: 16px 15px; align-content: start; }
.sl-page-full { grid-template-columns: minmax(0, 1fr); }
.sl-page-rail { grid-template-columns: minmax(0, 1fr) 333px; }
.sl-page-r { display: flex; flex-direction: column; gap: 18px; min-width: 0; }
@media (max-width: 1180px) { .sl-page-rail { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 900px) { .sl-page { padding: 8px 16px 24px; } }

/* Tabular figures for any number the components do not already cover. bundle.css binds
 * font-variant-numeric to ten named classes, so a total inside a StatCard lines up and
 * the same money on the line beneath it does not -- visibly disagreeing on one screen. */
.sl-num { font-variant-numeric: tabular-nums; }

/* The same rule as a CONTAINER, for the column of figures `sl_num` must not touch.
 *
 * `sl_num` wraps its figure in an element, and three honesty tests grep the rendered
 * page for the contiguous strings "0 warnings" and "1 merged" (test_backtest_screens,
 * test_agent_handoff): `<b class="sl-num">0</b> warnings` is not that string, so the
 * wrapper would make the guard vacuous while changing nothing a reader sees. The
 * backtest's five counts and the coding-agent handoff counts are therefore the one
 * place a per-figure wrapper is not available -- and they are a column of five
 * numbers, which is exactly the case the README's "Numbers" rule is about.
 *
 * Pass it as `sl_card_open(extra_class="sl-nums")`: the card is all counts, the
 * figures line up, and not one character of the markup inside the sentence moves. */
.sl-nums { font-variant-numeric: tabular-nums; }

/* Repeated rows inside ONE card, separated.
 *
 * Revenue at risk and Cash leaks both draw a list whose row is a name, a money figure,
 * a reason list with its own source chips and one or two forms -- more than any row
 * component in the system can hold (`sl_work_table` has five fixed columns,
 * `sl_customer_row` one line), and a card inside a card is forbidden. So both render a
 * bare `<article>` per row, and with `.sl-card` supplying no rhythm between them the
 * last control of one line sat directly against the name of the next: five deals read
 * as one undifferentiated block of text.
 *
 * A hairline and 16px, which is the gap `.sl-card` already uses inside itself. Opt in
 * with `sl_card_open(extra_class="sl-rows")`; `article + article` means the first row
 * keeps the card's own top padding and only the joins are drawn. */
.sl-rows article + article { margin-top: var(--space-4); padding-top: var(--space-4);
  border-top: 1px solid var(--line-divider); }

/* The warning detail's why-chain date column, which wrapped on EVERY row.
 *
 * `.why-step` is a grid whose first track is a fixed 76px and the dates in it are
 * JetBrains Mono at 14.4px: "Fri 9 Oct" measures 77px and "Sat 19 Sep" 85px, so every
 * single row broke after the day number -- "Sat 19" over "Sep" -- down a column whose
 * whole job is to be read as one date per line. A content-sized track fixes it for any
 * date the chain can hold rather than for the two it holds today.
 *
 * Desktop only: below 900px legacy.css deliberately narrows this track to 44px and
 * lets it wrap, which is the right trade on a phone. */
@media (min-width: 901px) {
  .why-chain .why-step { grid-template-columns: max-content 12px minmax(0, 1fr) auto; }
  .why-chain .why-when { white-space: nowrap; }
}

/* A card title is `white-space: nowrap` with nothing to stop it. The mock's titles are
 * authored and short; a real one can be a customer's name or a new hire's question, and
 * at 390px it ran straight out of the card. Truncating is the lesser loss -- the full
 * text stays available to a screen reader and to a title attribute. */
.sl-h, .sl-h-sm { overflow: hidden; text-overflow: ellipsis; min-width: 0; }

/* A <select> inside .sl-field. bundle.css styles `.sl-field input` only, so a select
 * fell back to the browser default inside a design-system card. */
.sl-field select { width: 100%; height: var(--control-height); padding: 0 var(--space-3);
  border: 1px solid var(--line-control); border-radius: var(--radius-md);
  background: var(--bg-surface); color: var(--ink); font: inherit; letter-spacing: inherit; }
.sl-field select:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 1px;
  box-shadow: 0 0 0 3px var(--focus-glow); }
.sl-field.is-error select { border-color: var(--error-ink); }


/* --- a headline that came from somebody else's tool ----------------------------------
 *
 * bundle.css sets `.sl-headline { white-space: nowrap }` above 1181px. That is right
 * for Today, whose headline Soil writes and keeps short. It is wrong for every screen
 * whose title is a Jira summary or a PR title: 60-120 characters at 38px measures past
 * 1700px inside an ~1100px column, nothing between it and `.sl-app` clips, and the
 * WHOLE DOCUMENT goes into horizontal scroll at 1440px -- the one thing CLAUDE.md
 * calls non-negotiable.
 *
 * `sl_page_head` adds `is-long` unless a caller opts out, so wrapping is what you get
 * by default and the nowrap is the deliberate choice.
 */
.sl-headline.is-long { white-space: normal; overflow-wrap: break-word; }
.sl-hello-row:has(.sl-headline.is-long) { flex-wrap: wrap; }

/* A caption that is reporting something bad. StatCard's caption has one colour in the
 * design because the mock's numbers are all fine. */
.sl-stat-cap.is-bad { color: var(--bad-ink); }
.sl-stat-cap.is-warn { color: var(--warn-ink); }

/* An empty state is where a screen is most tempted to look fine. bundle.css paints the
 * circle ok-bg/done-ink unconditionally, so a withheld-data notice got a cheerful green
 * tick -- principle 5 is "never green while something is broken". */
.sl-empty-i.sl-empty-info { background: var(--info-bg); color: var(--info-ink); }
.sl-empty-i.sl-empty-warn { background: var(--warn-bg); color: var(--warn-ink); }
.sl-empty-i.sl-empty-stall { background: var(--stall-bg); color: var(--stall-ink); }

/* A quiet paragraph. The design system renders no prose at all -- its only wrapping
 * text is an empty state's body and a timeline cell -- so screens that must EXPLAIN
 * something (access.py's multi-sentence withheld notices) had nowhere to put it. */
.sl-note { display: flex; align-items: flex-start; gap: 7px; margin: 0 0 var(--space-2);
  color: var(--text-3); font-size: 12.5px; line-height: 19px; }
.sl-note-quiet { color: var(--text-faint); }
.sl-note-warn { color: var(--warn-ink); }

/* "Soil cannot know this", as distinct from "we looked and it is zero". On a customer
 * list that is the difference between a fact and a guess. */
.sl-cust-m b.is-unknown { color: var(--text-faint); font-weight: 500; }


/* The menu glyph is a real <button> here, not the mock's inert <svg>, so it needs the
 * button reset -- otherwise it inherits a UA border and background inside `.sl-brand`. */
.sl-brand-menu { display: inline-flex; align-items: center; justify-content: center;
  padding: 0; border: 0; background: none; color: inherit; cursor: pointer; }
@media (min-width: 901px) { .sl-brand-menu { pointer-events: none; } }


/* The overflow count on an avatar stack. bundle.css styles `.sl-stack` and the rings
 * on its avatars but has no counter, because the mock never shows more faces than fit. */
.sl-stack-more { display: inline-flex; align-items: center; justify-content: center;
  height: 24px; min-width: 24px; padding: 0 5px; margin-left: -6px; border-radius: var(--radius-full);
  background: var(--bg-subtle); color: var(--text-2); font-size: 10px; font-weight: 700;
  box-shadow: 0 0 0 2px var(--bg-surface); }

/* --- the mobile navigation drawer ----------------------------------------------------
 *
 * NOT FROM THE DESIGN SYSTEM, and it has to be here rather than in a template.
 * bundle.css hides the sidebar below 900px with `display: none` and the mock simply
 * draws an inert hamburger -- a mock has nowhere to navigate to. A real app does, and
 * below 900px this was the only route to nine of the fourteen destinations.
 *
 * soil.js toggles `is-nav-open` on `.sl-app` from the `data-sl-menu` trigger.
 */
@media (max-width: 900px) {
  .sl-app.is-nav-open > .sl-sidebar {
    display: flex; position: fixed; inset: 0 auto 0 0; z-index: 40;
    width: min(282px, 86vw); overflow-y: auto;
    box-shadow: var(--shadow-pop);
  }
  /* The scrim is the sidebar's own ::after so the drawer needs no extra element --
   * a template cannot add one to a component it does not own. */
  .sl-app.is-nav-open > .sl-sidebar::after {
    content: ""; position: fixed; inset: 0; z-index: -1;
    background: rgba(14, 17, 22, 0.44);
  }
  /* Between 769px and 900px legacy's tab bar was off (it switches at 768px) and
   * bundle's sidebar was already hidden, so that 131px band had NO navigation at
   * all. The two breakpoints now agree. */
  .mobile-tabbar { display: grid; }
}

/* The sidebar scrolls on its own, and the top bar stays put.
 *
 * The nav has four `.sl-eyebrow-sm` group headings the design system's flat sidebar
 * does not, and each carries `margin-top: 42px` -- about 215px of extra height. The
 * old shell had an inner `.sidebar-scroll` for exactly this; the design system has no
 * equivalent, so without these two rules a short viewport scrolls the whole PAGE and
 * takes the top bar with it. */
.sl-sidebar { overflow-y: auto; }
.sl-top { position: sticky; top: 0; z-index: 20; background: var(--bg-page); }

/* --- standalone page shell -----------------------------------------------------------
 *
 * NOT FROM THE DESIGN SYSTEM. bundle.css has no shell for a page outside the app
 * frame -- sign-in, consent, error, the OAuth hand-off, "your email is confirmed".
 * Every max-width it defines belongs to a control, so a `.sl-card` on one of those
 * pages stretches the full viewport and a two-line message ends up a metre wide.
 *
 * The numbers are not new: 96px/420px are what oauth_redirect.html carried as inline
 * styles and what legacy `.centered-shell` uses, so nothing moves on screen -- the
 * values just stop being style attributes. Kept in the App layer, not folded into
 * section 2, so a future version of the design system can replace it wholesale.
 */
.sl-shell { box-sizing: border-box; margin: 0 auto; padding: 96px var(--space-4) var(--space-8); }
.sl-shell-narrow { max-width: 420px; }
.sl-shell-wide { max-width: 720px; }
@media (max-width: 600px) { .sl-shell { padding-top: var(--space-8); } }

/* The wordmark outside the sidebar. bundle.css styles `.sl-wordmark` only as a child
 * of `.sl-brand`; a standalone page has no sidebar, so it needs the type on its own.
 * There is no logo file -- the wordmark is the word, per the design README. */
.sl-wordmark { font-weight: 800; font-size: 24px; letter-spacing: -0.045em; color: var(--ink); display: inline-block; }

/* --- the two tap targets the design system cannot reach -------------------------------
 *
 * Section 2's phone block now carries the 44px floor for every component the system
 * draws. These two are not components, which is why they are here:
 *
 *   `a.sl-wordmark` -- the standalone-page wordmark above, which only THIS layer
 *   declares. It is the back-link on /orgs, every auth page and every error page, and
 *   it measured 38x35: short on BOTH axes, because the box is exactly the four
 *   letters. Centring the glyphs inside a 44x44 box moves nothing on screen.
 *
 *   A BARE <a> INSIDE A CARD -- an <a> with no class at all, which is markup that
 *   went round the component set and so has nothing for a component rule to bind to.
 *   Measured at 390px: the Graph board's column entries at 314x42, a team page's row
 *   title links at 285x43 and 163x15, Connections' "Open Slack's settings to fix it"
 *   at 163x15. Every one of them computes `display: inline` -- the tall ones are not
 *   boxes, they are a sentence-worth of link wrapped over two lines -- so `min-height`
 *   does nothing to any of them: it does not apply to a non-replaced inline box.
 *
 *   Vertical PADDING is what does, and it is the better answer anyway. On an inline
 *   box, padding-top/bottom grow the border box -- which is what a tap lands on and
 *   what getBoundingClientRect() returns -- WITHOUT touching the line box. So the hit
 *   area and the measurement clear 44px while the leading of the paragraph the link
 *   sits in, and therefore the page, does not move by a pixel. `display: inline-flex`
 *   would also have reached 44px and would have cost the wrap: a two-line title
 *   becomes one atomic 500px inline, which is horizontal scroll at 390px -- the one
 *   thing CLAUDE.md calls non-negotiable.
 *
 *   The rule is not narrowed to only the links the audit COUNTS, and that is on
 *   purpose. It also reaches the ones the audit lists under `touch-target-inline` and
 *   excuses -- a ticket key inside a timeline line, a word in a note. The reason WCAG
 *   2.5.8 excuses those is that growing them would break the sentence they live in,
 *   and padding on an inline box does not: the sentence is where it was, the link is
 *   merely easier to hit. Nothing here changes a layout the audit decided was right.
 *
 *   The reset underneath is not optional. legacy.css already gives `p > a:only-child`
 *   `display: inline-flex; min-height: 44px` -- a link that is the whole paragraph is
 *   a control, and that rule got there first and is right. Those are ALREADY on the
 *   floor, so the padding above would be 30px of nothing on top of a passing target.
 */
@media (max-width: 900px) {
  a.sl-wordmark { display: inline-flex; align-items: center; justify-content: center;
    min-height: var(--touch-min); min-width: var(--touch-min); }
  .sl-card a:not([class]) { padding-top: 15px; padding-bottom: 15px; }
  .sl-card p > a:not([class]):only-child { padding-top: 0; padding-bottom: 0; }
  /* The same floor for the two controls this layer draws that section 2 has no
     component for: the Graph board's node (`.sl-gnode`, a grid, measured 292x37) and
     a disclosure inside a card whose label is one short word -- "Why" in Connections'
     key/value list measured 39x44, on the floor for height and 5px under it on width,
     which is the axis the first version of the audit did not look at. */
  .sl-gnode { min-height: var(--touch-min); }
  .sl-card summary { min-width: var(--touch-min); }
}

/* An empty state that IS the page needs a real heading, on the same type ramp as the
 * <b> it replaces, so the two render identically and only the outline changes. */
.sl-empty-t { margin: 0; font-size: 13.5px; font-weight: 700; letter-spacing: -0.015em; color: var(--ink); }


/* --- the six values bundle.js sets with a React `style` prop ------------------------
 *
 * Every one of them is a CLOSED SET of classes here instead. Two reasons, and the
 * second is the one that matters:
 *
 *   1. CLAUDE.md closes the utility set and tests/test_component_states.py asserts
 *      the component set carries no `style="`.
 *   2. soil/web/app.py's CSP has NO `style-src-elem 'unsafe-inline'`. `style-src-attr`
 *      still allows attributes today, so an inline style would work -- but it is the
 *      one hole docs/SECURITY.md is still trying to close, and a component set that
 *      depends on it keeps that hole open for every screen at once.
 *
 * Mapped from design/soil-design-system/components/bundle.js. Do not add a value to
 * one of these sets without a macro that can emit it.
 */

/* PulseRow: the seven bar heights are the design's, not the data's. */
.sl-bars .sl-bar-1 { height: 35%; } .sl-bars .sl-bar-2 { height: 50%; } .sl-bars .sl-bar-3 { height: 60%; } .sl-bars .sl-bar-4 { height: 75%; } .sl-bars .sl-bar-5 { height: 85%; } .sl-bars .sl-bar-6 { height: 95%; } .sl-bars .sl-bar-7 { height: 100%; }

/* StatCard accuracy bars: a real percentage, rounded to the nearest 5.
 * Finer than the eye reads at 52px tall, so nothing is lost. */
.sl-acc .sl-h-5 { height: 5%; }
.sl-acc .sl-h-10 { height: 10%; }
.sl-acc .sl-h-15 { height: 15%; }
.sl-acc .sl-h-20 { height: 20%; }
.sl-acc .sl-h-25 { height: 25%; }
.sl-acc .sl-h-30 { height: 30%; }
.sl-acc .sl-h-35 { height: 35%; }
.sl-acc .sl-h-40 { height: 40%; }
.sl-acc .sl-h-45 { height: 45%; }
.sl-acc .sl-h-50 { height: 50%; }
.sl-acc .sl-h-55 { height: 55%; }
.sl-acc .sl-h-60 { height: 60%; }
.sl-acc .sl-h-65 { height: 65%; }
.sl-acc .sl-h-70 { height: 70%; }
.sl-acc .sl-h-75 { height: 75%; }
.sl-acc .sl-h-80 { height: 80%; }
.sl-acc .sl-h-85 { height: 85%; }
.sl-acc .sl-h-90 { height: 90%; }
.sl-acc .sl-h-95 { height: 95%; }
.sl-acc .sl-h-100 { height: 100%; }

/* AttentionCard arrival: 70ms apart, in order. */
.sl-d-0 { animation-delay: 0ms; } .sl-d-1 { animation-delay: 70ms; } .sl-d-2 { animation-delay: 140ms; } .sl-d-3 { animation-delay: 210ms; } .sl-d-4 { animation-delay: 280ms; } .sl-d-5 { animation-delay: 350ms; }

/* Avatar + letter-tile sizes. bundle.js sets font-size as a ratio of
 * the box (0.42 for an avatar, 0.44 for a logo tile), so the pair has to
 * travel together in CSS. A closed set of the sizes the design uses. */
.sl-avatar-16 { width: 16px; height: 16px; font-size: 7px; }
.sl-avatar-20 { width: 20px; height: 20px; font-size: 8px; }
.sl-avatar-24 { width: 24px; height: 24px; font-size: 10px; }
.sl-avatar-26 { width: 26px; height: 26px; font-size: 11px; }
.sl-avatar-32 { width: 32px; height: 32px; font-size: 13px; }
.sl-avatar-34 { width: 34px; height: 34px; font-size: 14px; }
.sl-logo-12 { width: 12px; height: 12px; font-size: 5px; }
.sl-logo-16 { width: 16px; height: 16px; font-size: 7px; }
.sl-logo-18 { width: 18px; height: 18px; font-size: 8px; }
.sl-logo-20 { width: 20px; height: 20px; font-size: 9px; }
.sl-logo-22 { width: 22px; height: 22px; font-size: 10px; }
.sl-logo-24 { width: 24px; height: 24px; font-size: 11px; }

/* The six avatar colours, verbatim from bundle.js's AV array. Which one
 * a person gets is decided by `avatar_tone()` in soil/web/jinja.py, so the
 * same person is the same colour on every screen. */
.sl-av-0 { background: #7456EC; } .sl-av-1 { background: #C03998; } .sl-av-2 { background: #A56006; } .sl-av-3 { background: #2472C6; } .sl-av-4 { background: #11814D; } .sl-av-5 { background: #5666D9; }

/* Toast drain. The duration must be the undo window the SERVER enforces;
 * a bar that empties early tells the person their undo is gone when it is
 * not, and one that empties late is worse. */
.sl-toast-5s { animation-duration: 5s; } .sl-toast-8s { animation-duration: 8s; } .sl-toast-10s { animation-duration: 10s; } .sl-toast-15s { animation-duration: 15s; } .sl-toast-30s { animation-duration: 30s; }

/* Skeleton line widths, same closed-set fix `.skeleton-text-w*` carries. */
.sl-skel-w-38 { width: 38%; } .sl-skel-w-64 { width: 64%; } .sl-skel-w-78 { width: 78%; } .sl-skel-w-84 { width: 84%; } .sl-skel-w-92 { width: 92%; }

/* Hand-written. The ONLY section of this file that may be edited by hand.
   Reserved for screens that have no bundle component yet: anything a converted
   screen needs that design/soil-design-system/ does not provide. Keep it small
   -- a rule that lives here long enough to be reused belongs in the design
   system instead. Everything above this line is generated; everything below it
   is ours. */

/* htmx loading indicators. htmx normally injects these three rules itself, as a
   <style> element appended to <head> (insertIndicatorStyles, htmx 1.9.12). The CSP
   in soil/web/app.py sets `style-src-elem 'self' https://fonts.googleapis.com` with
   NO 'unsafe-inline', so the browser refuses that injected element. That is why
   base.html carries <meta name="htmx-config" content='{"includeIndicatorStyles":false}'>
   (as do _auth_layout.html and _onboarding_layout.html) and why the rules live here
   instead. Copied verbatim from htmx's own source, and carried over from the old
   soil.css (now legacy.css) during the design-system migration.

   These must not be dropped: without them every .htmx-indicator sits permanently
   visible instead of fading in only during a request -- i.e. every loading spinner
   in the app is always on screen. It is a browser-only finding; no template contains
   the <style> block, so no grep over the repo can reveal it. */
.htmx-indicator { opacity: 0; }
.htmx-request .htmx-indicator { opacity: 1; transition: opacity 200ms ease-in; }
.htmx-request.htmx-indicator { opacity: 1; transition: opacity 200ms ease-in; }

/* --- a string with nowhere to break --------------------------------------------------
 *
 * MEASURED, not guessed: /org/<slug>/invite took the WHOLE DOCUMENT into 309px of
 * horizontal scroll at 1440 and 1101px at 390, in both themes. The invite URL is
 * `/join/<signed token>` -- ~190 unbroken characters, 1486px wide at 13px -- inside an
 * 1118px paragraph, and this file contained no `overflow-wrap` rule of any kind. (The
 * one in `.sl-headline.is-long` below arrived for the same class of bug and covers only
 * a headline.) legacy.css has three; a CONVERTED screen therefore had no way at all to
 * break a long unbroken string, which is the one thing CLAUDE.md calls non-negotiable.
 *
 * Why no element-level audit could find it: a text node is not an element, so the
 * overflowing run has no box of its own. The <p> around it measured 1118px wide --
 * exactly in bounds -- while its text ran 368px past the card. Every "widest node"
 * sweep came back empty, which is why this sat unfixed. The instrument that finds it
 * is Range.getClientRects() over text nodes, not getBoundingClientRect() over elements.
 *
 * TWO RULES, deliberately different:
 *
 *   `.sl-break` is the opt-in, for a value that IS a machine string -- an invite URL,
 *   a repo path, a signed token. `anywhere` also lets the box shrink below that string,
 *   so it is safe to put one in a narrow column.
 *
 *   The net under card prose is `break-word`, NOT `anywhere`: `break-word` leaves
 *   min-content sizing alone, so it cannot shrink a card in a grid that sizes to its
 *   content, and it still breaks any word that would otherwise overrun its line. It is
 *   a floor, not a licence -- a screen that prints a machine string says so with
 *   `.sl-break`.
 */
.sl-break { overflow-wrap: break-word; }
.sl-card p, .sl-lead, .sl-note { overflow-wrap: break-word; }

/* --- a group of checkboxes ----------------------------------------------------------
 *
 * `.sl-check` (above) is one checkbox and is deliberately full-width: a consent line or
 * a single confirmation wants the whole row. A GROUP of them does not. Settings' brief
 * tab has nine topics and seven days, and stacked one per row that is sixteen rows in a
 * card whose next control is a Save button -- the form stops looking like a form.
 *
 * `auto-fit` rather than a fixed column count so the same markup is one column at 390px
 * and three or four at 1440 with no second breakpoint to keep in step. 168px is the
 * widest label in the set ("Due soon, not started") plus the box and its gap; `-tight`
 * is for a set of short labels (Mon..Sun) that would otherwise sit in a very sparse
 * grid. The gap is `.sl-page`'s own 15/16px so a group lines up with the cards around it.
 */
.sl-checks { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));
  gap: 0 var(--space-4); }
.sl-checks-tight { grid-template-columns: repeat(auto-fit, minmax(84px, 1fr)); }

/* --- "Your calendars", and a name rendered one letter per line ----------------------
 *
 * MEASURED on /calendar at 1440: the <span> holding "Outlook" was 15px wide and 78px
 * tall -- O / utl / o / ok stacked vertically -- and "Zoom" the same. It is not a
 * narrow-column problem; the rail is 333px and the row had room.
 *
 * legacy.css gives `.cal-cal-list li` `display: flex` and `overflow-wrap: break-word`.
 * `anywhere` (unlike `break-word`) lowers a box's MIN-CONTENT width to one character,
 * so when the third child -- "Soil needs a Microsoft app registration first..." --
 * asked for its share of the row, the name had no floor to stop at and was squeezed to
 * a single glyph. The rule is right for the connected rows, whose only long value is a
 * calendar address that must be allowed to break; it is wrong for a two-word app name
 * sharing a row with a sentence.
 *
 * legacy.css is not this pass's file to edit and soil.css is loaded after it, so the
 * floor is set here: the name keeps its own width, and the reason drops to its own line
 * instead of competing for the first one. That also puts the "Not connected" pill
 * directly beside the name it is about, which is what it is for.
 */
.cal-cal-off { flex-wrap: wrap; }
.cal-cal-off > span:first-child { flex: 0 0 auto; overflow-wrap: normal; }
.cal-cal-off > span:last-child { flex: 1 1 100%; }

/* --- three plain cards in a row -----------------------------------------------------
 *
 * /billing's three plan cards borrowed `.sl-att-row`, because it was the design
 * system's only 3-up equal grid and billing.html's own comment says so. On 2026-10-09
 * `.sl-att-row` became `display: flex` with the sizing on `> .sl-att`, so an
 * ATTENTION card can wrap 3-up then 2-up. A plain `.sl-card` matches no part of that
 * selector, so the plan cards fell out of the grid and stacked: Free 351px, Team 803px,
 * Design partner 412px, each on its own line, each a different width. Measured, after
 * the fact, on a screen nobody had changed.
 *
 * That is what borrowing a component's layout rule costs, so /billing stops borrowing.
 * This is the same three columns and the same 15px gap the attention row used to give
 * it, named for what it is and belonging to nothing else. The 900px collapse is
 * `.sl-att-row`'s own breakpoint, kept so the two still agree on a phone.
 */
.sl-cards-3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 15px; }
@media (max-width: 900px) { .sl-cards-3 { grid-template-columns: minmax(0, 1fr); } }


/* --- the work graph's board, node cards and legend ----------------------------------
 *
 * The design system has NO graph component, which graph.html says out loud and worked
 * around by emitting bare `<div>`s: the four columns the board is built on had no
 * class, so the browser laid them out as blocks and the node links flowed inline like
 * words in a paragraph. "Read left to right: a person said or did something, it
 * touched a ticket..." -- the sentence the card ends on -- was printed under a board
 * that read top to bottom, with "SSO error copy pass" on one line and its "Done" pill
 * on the next.
 *
 * `auto-fit, minmax(200px, 1fr)` rather than a fixed four: graph.html drops an empty
 * column on purpose, so the track count is whatever survived the filter, and the same
 * rule is one column at 390px with no second breakpoint to keep in step.
 */
.sl-gboard { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: var(--space-4) var(--space-4); align-items: start; }
.sl-gcol { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.sl-gcol > h3 { margin: 0 0 2px; font-size: 10.5px; font-weight: 600; letter-spacing: .08em;
  text-transform: uppercase; color: var(--text-faint); }
.sl-gcol > .sl-note { margin: 2px 0 0; }

/* One node. A card, not a sentence: the mark, the title on its own line, the status
 * under it. `align-items: start` on the mark so a two-line title does not drag the
 * app logo down to its optical middle. */
.sl-gnode { display: grid; grid-template-columns: 20px minmax(0, 1fr); gap: 2px var(--space-2);
  align-items: start; padding: 7px 9px; border: 1px solid var(--line-divider);
  border-radius: var(--radius-md); background: var(--bg-surface); color: var(--ink-2);
  text-decoration: none; transition: background .15s, border-color .15s; }
.sl-gnode:hover { background: var(--bg-row-hover); border-color: var(--line-control); }
.sl-gnode[aria-current] { border-color: var(--action); background: var(--bg-row-hover); }
.sl-gnode > .sl-logo, .sl-gnode > .sl-logo-img, .sl-gnode > .sl-avatar { grid-row: 1 / 3; margin-top: 1px; }
.sl-gnode-t { font-size: 12.5px; line-height: 16px; overflow-wrap: break-word; }
.sl-gnode > .sl-pill { grid-column: 2; justify-self: start; }

/* The five category colours are graph.js's own and Pill is a status, not a colour key,
 * so the legend keeps its own dots -- but it is a row in a card header position now,
 * not a bare line of spans, and its count sits on the opposite end. */
.sl-glegend { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-2) var(--space-4);
  padding-bottom: var(--space-3); margin-bottom: var(--space-3);
  border-bottom: 1px solid var(--line-divider); font-size: 11.5px; color: var(--text-muted); }
.sl-glegend > span { display: inline-flex; align-items: center; gap: 6px; }
.sl-glegend-n { margin-left: auto; font-variant-numeric: tabular-nums; color: var(--text-faint); }

/* The force-directed render. Its colours were hard-coded in graph.js -- `#3B4150`
 * labels, `#D5D8DF` links and a `#fff` ring on every node -- which is a light-theme
 * palette painted onto a dark card: in dark mode the labels measured about 1.4:1 and
 * the links read as a bright white web over near-black. CSS wins over an SVG
 * presentation attribute, so binding them to the tokens here themes the graph with no
 * JavaScript and no second code path, and it follows a theme toggle live. */
.sl-gsvg { display: block; width: 100%; }
/* `display: block` would otherwise beat the `hidden` ATTRIBUTE the svg ships with --
 * graph.html renders it hidden and graph.js clears the attribute once d3 is up, which
 * is how this screen reveals the graph without an inline style (the CSP has no
 * style-src-attr budget for a new one). tests/test_web_mobile_css.py catches exactly
 * this, and caught it here. */
.sl-gsvg[hidden] { display: none; }
.sl-gsvg line { stroke: var(--line-control); }
.sl-gsvg circle { stroke: var(--bg-surface); }
.sl-gsvg text { fill: var(--text-2); }


/* --- a person row, a release row and a release's issue row --------------------------
 *
 * Three screens (People, Releases, Release detail) each emit one `<div>` per row with
 * no class, and each says in its own comment that the design system has no component
 * for the row it wants. The consequence is the same on all three: the row's parts flow
 * inline, so nothing lines up with the row above it.
 *
 * On People that cost the one thing the screen is for. Three counts per person --
 * issues, PR/MRs, reviews -- sat after a name, so they started at a different x for
 * every person and the column could not be read down. The counts now have their own
 * track and `sl_num`'s tabular figures, which is the design README's "Numbers" rule.
 */
.sl-prow { display: grid; grid-template-columns: 26px minmax(120px, 1.2fr) minmax(0, 2fr);
  gap: var(--space-3); align-items: center; min-height: 40px; padding: 0 10px;
  border-radius: var(--radius-lg); }
.sl-prow + .sl-prow { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-prow-n { font-size: 13px; font-weight: 600; min-width: 0; overflow-wrap: break-word; }
/* Three equal cells, and inside each one a fixed track for the figure with the figure
 * RIGHT-aligned in it. Tabular figures alone do not finish this job: they make every
 * digit the same width, so "24" and "10" line up, but "8" is one glyph where "24" is
 * two and the words after it still shifted left by a digit on every short row. The
 * number column has to have a width of its own for the units to stack. 2.4em at 12px
 * is three digits, which is more than any count this page has ever shown. */
.sl-prow-c { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 2px var(--space-4); font-size: 12px; color: var(--text-3); }
.sl-prow-c span { display: grid; grid-template-columns: 2.4em minmax(0, 1fr); gap: 5px;
  align-items: baseline; }
.sl-prow-c .sl-num { text-align: right; }
@media (max-width: 760px) {
  .sl-prow { grid-template-columns: 26px minmax(0, 1fr); }
  .sl-prow-c { grid-column: 2; grid-template-columns: minmax(0, 1fr); }
}

/* A release and an issue inside one. Both end in an action, and both had it sitting
 * wherever the text before it finished: Release detail's three "Open in Jira" buttons
 * landed at three different x positions in three consecutive rows. The action gets its
 * own track at the end of the row, so a column of them is a column. */
.sl-rrow { display: grid; grid-template-columns: 18px minmax(0, 1fr) auto;
  gap: 4px var(--space-3); align-items: center; padding: 11px 10px; border-radius: var(--radius-lg); }
.sl-rrow + .sl-rrow { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-rrow:hover { background: var(--bg-row-hover); }
/* EVERY cell is placed explicitly. Leaving the middle span to auto-placement while
 * the mark and the button named a row put the button in track 2 and the title in
 * track 3 -- the action in the middle of the row and the release's name to the right
 * of it, which is worse than the ragged version it replaced. Four children, four
 * stated positions, no auto-placement to reason about. */
.sl-rrow > .sl-logo, .sl-rrow > .sl-logo-img { grid-area: 1 / 1; align-self: start; margin-top: 2px; }
.sl-rrow-m { grid-area: 1 / 2; display: flex; align-items: center; flex-wrap: wrap;
  gap: 4px var(--space-2); min-width: 0; }
.sl-rrow-t { font-size: 13px; font-weight: 600; min-width: 0; overflow-wrap: break-word; }
.sl-rrow-s { font-size: 12px; color: var(--text-3); font-variant-numeric: tabular-nums; }
.sl-rrow > .sl-btn { grid-area: 1 / 3; justify-self: end; align-self: start; }
/* The forecast sentence belongs to the row above it, so it sits under that row's text
 * column rather than starting at the card's edge -- the whole reason the list read as
 * "button, then the next release" instead of "release, then its button". */
.sl-rrow > .sl-note { grid-area: 2 / 2 / 3 / -1; margin: 0; }
@media (max-width: 560px) {
  .sl-rrow { grid-template-columns: 18px minmax(0, 1fr); }
  .sl-rrow > .sl-btn { grid-area: 2 / 2; justify-self: start; }
  .sl-rrow > .sl-note { grid-area: 3 / 2 / 4 / -1; }
}


/* --- a team's four headline figures, as a row ---------------------------------------
 *
 * team_detail.html emitted four `sl_stat_card`s as siblings, and `.sl-card` has no
 * layout of its own, so they stacked full-width: four numbers in 470px of page, each
 * in a 1152px-wide card. The design puts a set of figures in a row that shares a top
 * edge and a height, which is what `.sl-today-r` does for Today's rail and what this
 * does across the page. `1fr` tracks and `align-items: stretch` are what make the
 * heights equal -- `.sl-stat-card`'s own `min-height: 117px` only sets a floor.
 */
.sl-metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: var(--space-4) 15px; align-items: stretch; }
.sl-metrics > .sl-card { margin: 0; }


/* --- a dated timeline whose dates are real dates ------------------------------------
 *
 * `.sl-timeline` fixes its time column at 64px, which fits the mock's clock times and
 * the day labels it was measured against. A customer's timeline prints "17 Sep 2026",
 * which does not fit, so roughly half the rows wrapped their date onto a second line
 * and the rail's dots stopped lining up with the rows beside them. The column widens
 * and the rail moves with it; both numbers are this one screen's, not the component's.
 */
.sl-cust-tl .sl-timeline li { grid-template-columns: 82px 30px minmax(0, 1fr); }
.sl-cust-tl .sl-timeline time { white-space: nowrap; }
.sl-cust-tl .sl-timeline::before { left: 95px; }


/* --- Connections / Agents: rows, disclosures and key-value lists --------------------
 *
 * NOT FROM THE DESIGN SYSTEM, and the reason is the same one three times: the mock
 * renders no prose, no disclosure and no definition list, so every screen that has to
 * say something in words fell back to a browser default INSIDE a design-system card.
 * On /connections that was most of the page -- "Add more tools" was a bare <dl> whose
 * <dd> carried the description AND the Upgrade button on one wrapped, indented line,
 * which reads as a text list rather than as the system's rows.
 *
 * Every number below is `.sl-conn`'s own (bundle.css, section 2), copied deliberately
 * so a hand-built row and a ConnectionRow measure identically and sit in one rhythm.
 * They are copied rather than shared because section 2 is generated and may not be
 * hand-edited; the right end state is the component, and the report says so.
 */

/* One app, with no health state to report: a tool nobody has connected yet, or a
 * connection whose problem is not "it stopped working" (see `sl_connection_row`'s
 * three states, and the fourth this screen needs). Same grid, same logo tile, same
 * divider and hover as `.sl-conn`, so the two stack into one list. */
.sl-approw { display: grid; grid-template-columns: 40px minmax(0, 1fr) minmax(0, auto);
  gap: 14px; align-items: center; padding: 12px; border-radius: var(--radius-lg);
  transition: background .15s; }
.sl-approw + .sl-approw { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-approw:hover { background: var(--bg-row-hover); }
/* The attention tone, for a connection that needs a person but is not a dead login.
 * Soft red fill plus a hairline, exactly as `.sl-conn.is-bad` -- never colour alone:
 * the row always carries its own sentence saying what is wrong. */
.sl-approw.is-attn { background: var(--critical-card);
  box-shadow: inset 0 0 0 1px var(--critical-card-line); }
.sl-approw.is-attn:hover { background: var(--critical-card); }
.sl-approw-logo { width: 40px; height: 40px; border-radius: var(--radius-lg);
  border: 1px solid var(--line-card); background: var(--bg-surface); display: flex;
  align-items: center; justify-content: center; box-shadow: 0 1px 2px rgba(16,24,40,.05); }
.sl-approw-t { display: flex; flex-direction: column; min-width: 0; line-height: 1.3; gap: 1px; }
.sl-approw-t b { font-size: 13px; font-weight: 600; color: var(--ink); }
.sl-approw-t small { color: var(--text-3); font-size: 11.5px; }
/* The trailing cell is EITHER a control or the sentence that says why there is none
 * ("An admin connects this one"). A sentence must wrap rather than push the row wide,
 * so it is capped and right-aligned against the control it stands in for. */
.sl-approw-a { display: flex; align-items: center; justify-content: flex-end;
  gap: var(--space-2); justify-self: end; flex-wrap: wrap; }
.sl-approw-a small { color: var(--text-faint); font-size: 11.5px; text-align: right;
  max-width: 22ch; line-height: 1.35; }
.sl-approw-a .sl-btn { flex: none; }
/* Below 560px the action drops under the name rather than squeezing it: the same
 * move `.sl-conn` makes at 900px, at the width this row actually needs it. */
@media (max-width: 560px) {
  .sl-approw { grid-template-columns: 40px minmax(0, 1fr); row-gap: 8px; }
  .sl-approw-a { grid-column: 2; justify-self: start; justify-content: flex-start; }
  .sl-approw-a small { text-align: left; max-width: none; }
}

/* THE CONNECTION ROW'S OWN TEXT WAS UNREADABLE ON A PHONE -- /org/demo/connections at 390.
 *
 * `.sl-conn` folds to `40px minmax(0,1fr) auto` at 900px (section 2, generated), and
 * `auto` is the fix button. On /connections that button says "Read it all again", which
 * measures 117px, so at 390 the text track resolved to 114.5px for all ten at-risk rows
 * -- and BOTH lines inside it are `nowrap` + ellipsis (`.sl-conn-n b`, `.sl-conn-n
 * small`). Measured: the explanation wants 395px and got 115 ("The last sync was ...",
 * five words of twenty-four), and five of the ten headlines were cut too -- "Google
 * Drive is ...", "Stripe (invoices)...", "AWS Cost is beh...". Ten rows of a sentence
 * that is the entire point of the row, all saying nothing.
 *
 * Two rules, because there are two separate causes:
 *
 * 1. The ellipses. `nowrap` on both lines is right where the row is a scannable line in
 *    a list of aligned columns -- that is the 2026-10-10 audit's reason for `.sl-cust-n
 *    b` / `.sl-conn-n b` above, and it holds on desktop. Below 900px every column that
 *    alignment protected is already `display: none` (`.sl-conn-t`, `.sl-conn .sl-pill`),
 *    so an uneven row costs nothing and a cut sentence costs everything. Let it wrap.
 *
 * 2. The width. Even wrapped, 115px is 2-3 words a line. Below 560px the button drops
 *    under the name, exactly as `.sl-approw` does above and for the same reason.
 *    `grid-column: 2` keeps it under the text rather than under the logo; it beats
 *    `.sl-conn .sl-btn { justify-self: end }` on order, not specificity, which is what
 *    section 3 is for.
 *
 * 3. AND THE SAME ELLIPSES COME BACK AT 901, because 900 is the width at which the
 *    222px rail APPEARS (`.sl-app` above, and `--sidebar-width`). The row's own content
 *    box is therefore 778px at viewport 900 and 538px at viewport 901 -- it loses 240px
 *    by getting wider -- while the full five tracks return: 40 + 1fr + pill 115 +
 *    `.sl-conn-t` 110 + button 110, 56px of gaps. Measured on /org/demo/connections the
 *    text track is 107px at 901 -- worse than the 390 blocker's 114.5 -- and 17 of the
 *    21 text lines on the page were clipped there: 7 headlines ("Google Drive is
 *    behind" wants 139px, "Stripe (invoices) is behind" 170px) and all 10 sentences.
 *    The headlines come back as the track passes them, but the sentence wants 395px and
 *    stays cut until about 1189. At 1024 -- a laptop -- the track was 230px and the
 *    sentence showed five words of twenty-four.
 *
 *    Section 2 folds at 900 because the mock has no rail; in this app that same fold is
 *    due 240px later. So repeat it for the band the rail squeezes, and drop only
 *    `.sl-conn-t`: "Read 5 days ago" is a restatement of "The last sync was 5 days
 *    ago." already in the sentence, whereas the pill is the row's state and stays.
 *    The scope is `.sl-conn > .sl-conn-t` because dashboard.html and connect.html put
 *    `.sl-conn-t` in a CARD foot, where it is the only stat line and must not vanish on
 *    a laptop. The button track goes to `auto`, not 110px: "Read it all again" measures
 *    117.5px and would hang out of a 110px track.
 *
 * Measured after the 390 fix, at 390: the text track is 214px, no headline is clipped,
 * every explanation reads in full over two lines, and the row grows 68px -> 123px,
 * which is the right trade for the only sentence on the row. 1440 is untouched (five
 * tracks, text 628px, one line). `scrollWidth - clientWidth` is 0 for the PAGE at 390,
 * 559, 561, 900 and 1440 -- the button is inside the row's second track, not pushed
 * out of the card.
 *
 * Measured after, as text track / clipped lines / page `scrollWidth - clientWidth`:
 * 390 214/0/0, 550 374/0/0, 768 461/0/0, 901 224/0/0, 1024 347/0/0, 1199 522/0/0,
 * 1201 407/0/0 (five tracks again, sentence back on one line), 1280 486/0/0,
 * 1440 628/0/0 -- and zero clipped lines and zero page overflow at EVERY width from
 * 360 to 1440, swept one pixel at a time, which is how this band was missed. Inside it
 * the sentence takes two lines and the row grows 64px -> 71px up to 1072, then fits on
 * one line again from 1073. Nothing above 1200 changes. */
@media (max-width: 1200px) {
  .sl-conn-n b, .sl-conn-n small { white-space: normal; overflow: visible; text-overflow: clip; }
}
@media (min-width: 901px) and (max-width: 1200px) {
  .sl-conn { grid-template-columns: 40px minmax(0, 1fr) auto auto; }
  .sl-conn > .sl-conn-t { display: none; }
}
@media (max-width: 560px) {
  .sl-conn { grid-template-columns: 40px minmax(0, 1fr); row-gap: 8px; }
  .sl-conn > .sl-btn { grid-column: 2; justify-self: start; }
}

/* A disclosure that belongs to the card it is in. `<details>`/`<summary>` is how this
 * app keeps a paragraph that is read once off a list that is scanned often -- there
 * are thirteen of them on /connections alone -- and unstyled each one drew a UA
 * triangle, a 19px line and no hit area, which is what made the page read as prose.
 *
 * 44px on a phone is CLAUDE.md's touch floor; 32px on a desktop, because thirteen
 * 44px rows between the connection rows would be taller than the connections. */
.sl-disclose { margin: 0; min-width: 0; }
.sl-disclose > summary { display: flex; align-items: center; gap: 7px; min-height: 32px;
  padding: 4px 2px; list-style: none; cursor: pointer; color: var(--text-2);
  font-size: 12.5px; font-weight: 500; border-radius: var(--radius-sm); }
.sl-disclose > summary::-webkit-details-marker { display: none; }
.sl-disclose > summary::marker { content: ""; }
.sl-disclose > summary::before { content: ""; flex: none; width: 6px; height: 6px;
  margin-left: 3px; border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor; transform: rotate(-45deg);
  transition: transform .15s; }
.sl-disclose[open] > summary::before { transform: rotate(45deg); }
.sl-disclose > summary:hover { color: var(--ink); }
.sl-disclose > summary:focus-visible { outline: 2px solid var(--focus-ring);
  outline-offset: 1px; box-shadow: 0 0 0 3px var(--focus-glow); }
/* The body is indented behind a hairline so that where the disclosure ends is never a
 * guess -- the thing that goes wrong when thirteen of them sit in one card. */
.sl-disclose-b { display: flex; flex-direction: column; align-items: flex-start;
  gap: var(--space-2); margin: 2px 0 var(--space-3) 5px; padding: 2px 0 0 14px;
  border-left: 1px solid var(--line-divider); }
.sl-disclose-b > p, .sl-disclose-b > ul, .sl-disclose-b > ol { margin: 0;
  color: var(--text-3); font-size: 12.5px; line-height: 19px; }
.sl-disclose-b > ul, .sl-disclose-b > ol { padding-left: 18px; }
.sl-disclose-b > pre { margin: 0; max-width: 100%; overflow-x: auto; padding: var(--space-2);
  border-radius: var(--radius-sm); background: var(--bg-subtle); color: var(--text-3);
  font-size: 11.5px; line-height: 17px; white-space: pre-wrap; overflow-wrap: break-word; }
@media (max-width: 900px) { .sl-disclose > summary { min-height: var(--touch-min); } }

/* A label-and-value list. Six of these on /connections ("Reads", "Can do", "Last
 * read", "Connected by", and the two overview lists), every one of them a bare <dl>:
 * the UA's 40px <dd> indent put the value on its own line below a label it was
 * supposed to sit beside, which is the "nothing lines up" half of this screen.
 *
 * A grid, so every value on the card shares one left edge whatever its label is, and
 * tabular figures so a column of counts aligns on its digits. */
.sl-kv { display: grid; grid-template-columns: minmax(96px, max-content) minmax(0, 1fr);
  gap: 7px var(--space-3); margin: 0; align-items: baseline; }
.sl-kv > dt { color: var(--text-faint); font-size: 11.5px; font-weight: 500;
  letter-spacing: .01em; }
.sl-kv > dd { margin: 0; min-width: 0; color: var(--text-2); font-size: 12.5px;
  line-height: 19px; font-variant-numeric: tabular-nums; display: flex;
  align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.sl-kv > dd > p { margin: 0; }
@media (max-width: 560px) {
  .sl-kv { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .sl-kv > dt { margin-top: var(--space-2); }
}

/* A list of choices with a box in front of each. The picker is the screen every OAuth
 * callback lands on and it was the last one still rendering legacy `.picker-row`s:
 * 70px bordered cards, 16px apart, inside a 26rem scroller -- six words of content in
 * a block as tall as six ConnectionRows, with the seventh row sliced by the scroll
 * edge. A row here is a row: the same 12px padding and hairline divider as `.sl-conn`,
 * and the whole list grows with its content instead of hiding four of ten choices. */
/* `list-style: none` and no padding because one of the two callers is a <ul> (the
 * Manage panel on /connections, whose <li> carries picker.js's `data-name`) and the
 * other is a bare <div> of <label>s. Unset, the panel drew a UA bullet and a 40px
 * indent in front of every checkbox. */
.sl-pick { display: flex; flex-direction: column; margin: 0; padding: 0; list-style: none; }
.sl-pick-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  gap: var(--space-3); align-items: center; padding: 9px 12px; min-height: var(--touch-min);
  box-sizing: border-box; border-radius: var(--radius-md); cursor: pointer;
  transition: background .15s; }
/* The divider is on the LIST's children, not on the row, for the same reason: in the
 * Manage panel the row is wrapped in an <li>, so `.sl-pick-row + .sl-pick-row` never
 * matched and ten choices ran together with nothing between them. */
.sl-pick > * + * { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-pick-row:hover { background: var(--bg-row-hover); }
.sl-pick-row:has(input:checked) { background: var(--bg-subtle); }
.sl-pick-row:has(input:focus-visible) { outline: 2px solid var(--focus-ring);
  outline-offset: -2px; }
.sl-pick-row > input { margin: 0; flex: none; accent-color: var(--soil-violet); }
.sl-pick-t { display: flex; flex-direction: column; min-width: 0; line-height: 1.3; gap: 1px; }
.sl-pick-t b { font-size: 13px; font-weight: 600; color: var(--ink); overflow-wrap: break-word; }
.sl-pick-t small { color: var(--text-3); font-size: 11.5px; }

/* A row of form controls that have to line up. `.sl-field` is a column (label over
 * control) and the two screens that put three of them side by side used legacy
 * `.picker-toolbar`, which is `align-items: center` -- so a field with a hint sat
 * ~10px higher than its neighbours and no two labels shared a baseline. Stretch, not
 * centre, is the whole fix; the search field is the one that takes the slack. */
.sl-formrow { display: flex; align-items: stretch; gap: var(--space-3); flex-wrap: wrap; }
.sl-formrow > .sl-field { flex: 1 1 11rem; min-width: 0; }
/* 24px is `.sl-field`'s own label block: a 12px label measures 17px tall and the
 * field's column gap is 6px, plus 1px to centre a 36px button against a 38px input.
 * `flex-end` was the obvious answer and is wrong -- the row is as tall as its TALLEST
 * field, and one of the three carries a hint, so the button aligned 33px below the
 * inputs it belongs with. A closed number, because `.sl-field`'s label is always one
 * line of 12px text; if that changes, this moves with it. */
.sl-formrow > .sl-btn { align-self: flex-start; margin-top: 24px; flex: none; }

/* A strip of one-tap suggestions. Nine example prompts, each its own <form> with a
 * full-sentence button: as inline blocks they measured 644px inside a 390px viewport
 * and put the WHOLE DOCUMENT into horizontal scroll -- the one thing CLAUDE.md calls
 * non-negotiable. A column of wrapping buttons at phone width, a wrapping row above. */
.sl-suggest { display: flex; flex-wrap: wrap; gap: var(--space-2); min-width: 0; }
.sl-suggest > form { display: contents; }
.sl-suggest .sl-btn { max-width: 100%; height: auto; min-height: var(--touch-min);
  padding-top: 7px; padding-bottom: 7px; text-align: left; white-space: normal;
  overflow-wrap: break-word; }
@media (max-width: 700px) { .sl-suggest { flex-direction: column; align-items: stretch; } }

/* A table with more columns than a phone has room for. The design README allows
 * exactly one thing to scroll sideways -- "a wide table inside its own card" -- and
 * Action rules (four columns, nineteen rows) is one. Without this the page scrolled
 * instead of the table. */
/* `position: relative` is load-bearing, not tidiness. An `overflow` box only clips an
 * absolutely-positioned descendant when it is that descendant's containing block, and
 * `.sl-sr-only` -- the visually-hidden labels on this table's nineteen selects -- is
 * `position: absolute`. Statically positioned, the wrapper scrolled the table and let
 * the 1px labels sit at their static x inside it: 462px on a 390px viewport, i.e. the
 * exact 72px of document overflow that was left after the table itself was contained. */
.sl-tablewrap { position: relative; overflow-x: auto; max-width: 100%; min-width: 0; }
.sl-tablewrap > table { min-width: max-content; }

/* A disclosure that hangs off the row above it. On /connections every connection has
 * one, and flush against the card edge it reads as a separate thing between two rows
 * rather than as part of the row it belongs to. 66px is `.sl-conn`'s own text column
 * (12px padding + 40px logo + 14px gap), so the summary starts under the app's name. */
.sl-disclose-in { margin-left: 66px; }
@media (max-width: 560px) { .sl-disclose-in { margin-left: 54px; } }

/* The same hang, against AgentRow's narrower text column: `.sl-agent` is a 32px logo
 * and a 12px gap, with no padding of its own. */
.sl-disclose-sm { margin-left: 44px; }


/* --- Today and Ask: the 2026-10-09 per-screen visual pass -------------------------
 *
 * Everything below is Today's or Ask's own layout, written against the two screens'
 * page classes. Nothing here is an `sl-*` component the design system owns; the two
 * exceptions that touch component classes (`.sl-att-row`, `.sl-tr`, `.sl-today-b`)
 * are further up this section, beside the reasoning for each.
 */

/* Today is DOUBLE-PADDED, and it is the only screen whose own padding is part of the
 * approved design.
 *
 * legacy.css's `.main-content` wraps `{% block content %}` in `20px 24px 48px`, and
 * `.sl-today` then adds the design system's own `15px 16px 24px 19px`. Measured at
 * 1440: the page content started at x=265 instead of the design's 241, and the two
 * columns had 1152px to share instead of 1218px. 66px is not a rounding error on this
 * screen -- it is the difference between the headline and its severity counts sitting
 * on ONE line, as the reference mock draws them, and the counts wrapping to a second
 * line pushed to the right margin, which is what Today has been doing. The attention
 * cards and the Work at risk table were each about 20px short of their drawn widths
 * for the same reason.
 *
 * Scoped with `:has(> .sl-today)` so this touches Today and nothing else: every other
 * screen uses `.sl-page`, which was written to live inside `.main-content`'s padding
 * and would lose all of it. base.html is not this pass's to edit; what was wanted
 * there is `.main-content` carrying no padding at all and each screen owning its own,
 * which is what `.sl-page` already does for everybody else.
 *
 * The two legacy banners (the demo notice and the degraded-search notice) are
 * siblings of `.sl-today` inside the same wrapper, so they take the page's own
 * margins by hand -- otherwise they would run flush to the sidebar while every card
 * below them sits 19px in. */
.main-content:has(> .sl-today) { padding: 0; }
/* Was `.llm-fake-banner, .demo-banner` until those two slabs became `.sl-notice`.
 * `.sl-notice` now carries its own gutter (see the notice block above), so there is
 * nothing left to special-case here beyond zeroing the wrapper's padding. */
@media (max-width: 900px) {
  .sl-notice:first-of-type { margin-top: 8px; }
}

/* The onboarding checklist, as one row rather than three paragraphs.
 *
 * Each step is a pill plus at most one small button; stacked, the three of them left
 * a full-width card roughly 70% empty at the very top of Today -- the first thing on
 * the screen and the least dense thing on it (the audit's rule 4). They wrap back to
 * a column when the card is too narrow to hold them, which is the stacked layout
 * again exactly where it is needed. */
.today-setup { display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--space-2) var(--space-5); }
.today-setup > p { display: flex; align-items: center; gap: var(--space-2);
  margin: 0; min-width: 0; }

/* Ask: three suggestion groups, one of which has fewer questions than the others.
 *
 * `align-items: start` in legacy.css let each group card size to its own content, so
 * at 1440 two cards were 327px tall and the third -- the group with one suggestion
 * instead of two -- was 195px, leaving a ragged bottom edge across a row of three.
 * Cards in a row share a top edge AND a height (the audit's rule 2); how many live
 * questions a group happens to have is not a reason for its card to be a different
 * size. */
.ask-suggest-groups { align-items: stretch; }

/* Ask: "Soil can answer from", with its four rows actually in four columns.
 *
 * Each `.ask-layer` is its own grid with `auto auto` end tracks, and
 * `.ask-layer-action:empty { display: none }` removes the fourth item entirely on a
 * layer that has no button. The result was that "checked"/"not checked yet" -- the
 * one column a reader scans down to find the gap -- started at x=1208 on the two rows
 * without a button and x=1154 on the two with one. Fixed tracks instead, with the
 * empty action cell holding its place, so all four rows line up and the buttons form
 * a column of their own.
 *
 * Inside `@media (min-width: 901px)` on purpose: legacy.css re-lays these rows into
 * two columns below 900px, and an unconditional rule here would beat that media query
 * and strand a 7.5rem pill track on a 390px phone. */
@media (min-width: 901px) {
  .ask-layer { grid-template-columns: 7.5rem minmax(0, 1fr) 11rem 8.5rem; }
  .ask-layer-action:empty { display: block; }
  .ask-layer-synced { justify-self: end; text-align: right; }
}

/* Ask: the proof disclosure has to look like one.
 *
 * `.ask-proof > summary` drops the browser's marker (`list-style: none` plus the
 * -webkit rule) and puts nothing back, so "How Soil found this · 10 steps · 3
 * sources" -- the control that opens the confidence, the trace and the numbered
 * sources, i.e. the entire proof Soil's pitch rests on -- rendered as a line of grey
 * text with no affordance at all. A caret that turns on open, built from borders so
 * it needs no icon the macro cannot emit. */
.ask-proof > summary::after {
  content: ""; width: 6px; height: 6px; margin-left: var(--space-1);
  border-right: 1.6px solid currentColor; border-bottom: 1.6px solid currentColor;
  transform: rotate(45deg) translate(-1px, -1px);
  transition: transform .15s; flex: none;
}
.ask-proof[open] > summary::after { transform: rotate(-135deg) translate(-2px, -2px); }

/* Ask: "this line has no source" is a property of the answer, not a notification.
 *
 * `sl_toast` is the design system's transient dark toast -- the one that confirms
 * something that LEFT Soil and carries an Undo while the bar drains. Used inline for
 * the uncited-line warning it rendered a black bar wider than the answer above it,
 * with a close button that let a reader dismiss the one sentence telling them a claim
 * on screen cannot be checked. That control is removed here and the band is re-toned
 * to the same pale-red the health banner uses, so "a real thing is wrong" looks the
 * same on this screen as it does everywhere else in the app.
 *
 * Reported as a macro gap: what was wanted is `sl_toast(..., dismissible=False)` and
 * an `inline` error variant that is tinted rather than black. */
.sl-toast.ask-uncited { display: flex; width: 100%; box-sizing: border-box;
  padding: 10px var(--space-3); border: 1px solid var(--critical-card-line);
  border-radius: var(--radius-lg); background: var(--critical-card);
  color: var(--bad-ink); box-shadow: none; animation: none; }
.sl-toast.ask-uncited .sl-toast-t { min-width: 0; }
.sl-toast.ask-uncited .sl-toast-x { display: none; }

/* The score disclosure carries its OWN top rule and top padding from legacy.css,
 * written for when it was a detached control row below the card. Inside the card's
 * footer that is a second hairline 12px under the footer's own, and a short rule
 * that stops at the end of the word rather than crossing the card. The footer owns
 * the divider now. */
.sl-att-foot > .why-score { margin-top: 0; padding-top: 0; border-top: 0; }

/* A row of controls that belong together: the two buttons under a page headline, the
 * Save / Use suggested pair at the foot of the picker. Inside `.sl-page` (a grid with
 * one full-width column) a bare `<a class="sl-btn">` stretches to 1100px, and a
 * button in its own `<form>` takes a grid row of its own -- which is how three
 * controls end up as three full-width bands down a page. */
.sl-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2);
  min-width: 0; }
.sl-actions > form { display: contents; }
.sl-actions > p { flex-basis: 100%; margin: 0; color: var(--text-faint); font-size: 12px;
  line-height: 18px; }

/* Several cards inside ONE element that is not the page shell -- a <form> that spans
 * three of them, which is the picker. `.sl-card` has no margin of its own, so without
 * this they stack flush; 16px is `.sl-page`'s own gap, so a card inside the form and
 * a card outside it sit the same distance apart. */
.sl-colstack { display: flex; flex-direction: column; gap: 16px; min-width: 0; }

/* Ask: the layer pill is a pill, not a bar.
 *
 * legacy.css means to pin it with `.ask-layer-chip { justify-self: start }`, but the
 * template renders the design system's `sl_pill`, whose class is `.sl-pill` -- no
 * element on this screen has ever carried `ask-layer-chip`. So the pill stretched to
 * fill its whole 7.5rem track and "Code" arrived as a 120px light-blue slab with the
 * word at one end of it, at every width. A pill that is wider than its label stops
 * reading as a pill and starts reading as an input. */
.ask-layer > .sl-pill { justify-self: start; }

/* Ask: the same four rows, stacked honestly on a phone.
 *
 * legacy.css's own phone layout assigns `.ask-layer-sees` to `1 / -1` and
 * `.ask-layer-synced` to column 2, and grid auto-placement then pushes the "checked"
 * stamp onto a THIRD row of its own -- the pill alone on line one with 200px of dead
 * space beside it, the sentence on line two, and the date hanging right on line
 * three. Explicit areas instead: pill and stamp share the first line, the sentence
 * takes the second, the button the third. */
@media (max-width: 900px) {
  .ask-layer > .sl-pill { grid-area: 1 / 1 / 2 / 2; }
  .ask-layer-synced { grid-area: 1 / 2 / 2 / 3; justify-self: end; }
  .ask-layer-sees { grid-area: 2 / 1 / 3 / -1; }
  .ask-layer-action { grid-area: 3 / 1 / 4 / -1; justify-self: start; }
}

/* graph.html's "Back to the focused view". `.sl-page-full` is one `minmax(0, 1fr)`
 * track, so a button that is a direct child of the page grid stretches across the
 * whole page -- 1152px of primary ink for five words. Scoped to this one button
 * rather than set on `.sl-page-full > .sl-btn`, which would be the right general rule
 * but would relayout several screens this pass does not own. */
.sl-gback { justify-self: start; }


/* --- a card header that still has a title on a phone --------------------------------
 *
 * SHARED, NOT PER-SCREEN -- flagged in the conversion report so the other agents in
 * this pass know it moved. It belongs here rather than on one screen because the
 * defect is in the header's layout, and every card in the app has one.
 *
 * `.sl-card-h` is `display: flex` with no wrap, and the App layer above already gives
 * `.sl-h` / `.sl-h-sm` `overflow: hidden` so a long title truncates instead of pushing
 * the row wide. At 1440 that is right. At 390 it is the title that gives way and
 * nothing else does: an `.sl-aside` is `white-space: nowrap`, and `.sl-link` has no
 * `min-width: 0` either, so on Customers the header rendered "C…  4 customers from
 * your CRM  Review possible matches" -- a card of customers with the word "Customers"
 * reduced to one letter. Team detail lost "Who's working on what" and "Areas that
 * depend on one person" the same way.
 *
 * Below 560px the title takes a row of its own and the note and the action share the
 * one under it. Nothing is hidden, nothing truncates, and the rule is inert at every
 * width where the row did fit.
 */
@media (max-width: 560px) {
  .sl-card-h { flex-wrap: wrap; row-gap: 4px; }
  .sl-card-h > .sl-h, .sl-card-h > .sl-h-sm { flex: 1 0 100%; }
  .sl-card-h > .sl-aside { min-width: 0; }
  .sl-card-h > .sl-link { margin-left: auto; flex-shrink: 0; }
}

/* Company pace: a sentence where a number would be, set as a sentence.
 *
 * `.normal-row2` is label-left / figure-right, which is right for "0.5" and wrong for
 * "Not enough completed work yet". In a 333px rail three of the four rows have no
 * number yet, so the card was a two-line label on the left against a three-line
 * right-ragged sentence on the right, with no edge either of them shared -- the
 * rhythm reads as broken even though every word is correct.
 *
 * A row with no figure stacks instead: label, then the sentence under it on the left,
 * so the reader's eye has one left edge to follow down the card. A row that DOES have
 * a figure is untouched and still right-aligns it. Only in Today's rail -- home.html
 * is the one template with these rows, and this keeps it that way explicitly. */
.sl-today-r .normal-row2:has(.normal-empty) { display: block; }
.sl-today-r .normal-row2:has(.normal-empty) .normal-figure { align-items: flex-start;
  text-align: left; margin-top: 2px; }
.sl-today-r .normal-row2 .normal-empty { text-align: left; }

/* The controls that hang off an AgentRow: Enable, Test run, Turn on, Run now. Each
 * sits in its own `<form>` (one CSRF token each) and a form is a block, so three
 * buttons stacked into three full-width bands under a 32px row. 44px is `.sl-agent`'s
 * own text column, so they start under the agent's name. */
.sl-rowfoot { margin: 0 0 var(--space-3) 44px; }

/* A field that should take the card rather than a control's natural measure.
 * `.sl-field` caps at 360px, which is right for a name or a date and wrong for the
 * three-line description that is the whole of the agent builder's first screen: it
 * rendered a third as wide as the card it sits in. */
.sl-fieldwide > .sl-field { max-width: none; }

/* One risk flag in the Agents list -- "this does not look good to me", the owner, on
 * this exact card.
 *
 * A COLUMN IS NOT A ROW. The first pass at this got the two controls onto one line
 * (`.sl-actions`, below) and stopped there, which left a flag as three stacked
 * full-width bands: title, reason, then a bordered button and a ghost button in a
 * band of their own. Measured at 1440 with the demo org's eight flags: 133px, 114px,
 * 133px... and the same "See the full warning / Mark as wrong" pair repeated eight
 * times down the LEFT edge of the card, directly under eight different sentences. A
 * reader scanning the card sees eight buttons before they see eight flags.
 *
 * So the controls take a column of their own at the end of the row, on the title's
 * line -- which is what `.sl-rrow` does for a release and `.sl-approw` for an app,
 * and it is the shape the brief's rule 1 describes: identity left, the controls
 * inline, the explanation beneath in muted type. Three bands become two, the eight
 * action pairs become one column the eye can skip, and the card loses about 36px per
 * flag.
 *
 * `align-self: start` on the actions, not `center`: a flag's reason runs to three
 * lines on a narrow card and the buttons belong beside the TITLE, not floating at the
 * optical middle of a paragraph they are not about.
 *
 * The hairline stays. Rule 4 says a line is for rows that would otherwise run
 * together and this is the case it was written for -- eight of them, each ending in a
 * wrapped grey sentence, with the next one's title 24px below it. A line OR a gap,
 * never both: the rows touch, and their own 12px padding is the air. */
.sl-flagrow { display: grid; grid-template-columns: minmax(0, 1fr) auto;
  gap: 5px var(--space-4); align-items: start;
  padding: var(--space-3) 0; min-width: 0; }
.sl-flagrow + .sl-flagrow { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-flagrow > b { grid-area: 1 / 1; font-size: 13px; font-weight: 600; color: var(--ink);
  min-width: 0; overflow-wrap: break-word; }
.sl-flagrow > p { grid-area: 2 / 1; margin: 0; color: var(--text-3); font-size: 12.5px;
  line-height: 19px; min-width: 0; }
.sl-flagrow > .sl-actions { grid-area: 1 / 2 / 3 / 3; justify-self: end;
  align-self: start; flex-wrap: nowrap; }
/* Below 760px the card is narrower than a title plus two buttons, so the controls go
 * back under the text -- the stacked layout, kept exactly where it is needed and
 * nowhere else. `1 / -1` so they still start at the card's text edge. */
@media (max-width: 760px) {
  .sl-flagrow { grid-template-columns: minmax(0, 1fr); }
  .sl-flagrow > .sl-actions { grid-area: 3 / 1 / 4 / -1; justify-self: start;
    flex-wrap: wrap; margin-top: 3px; }
}


/* ===========================================================================
   THE WEEK GRID on /calendar -- made to read like a calendar (2026-10-10)
   ===========================================================================

   The grid's markup is still `cal-*` from legacy.css: `design/soil-design-system/`
   ships no calendar component at all, so there is nothing to convert it to, and
   inventing `sl-cal-grid` would be a renamed class with no design behind it. What
   follows is the App layer correcting that legacy sheet from above (soil.css is
   linked after it, so equal specificity wins) plus the closed class sets the CSP
   requires. legacy.css is not this pass's file to edit.

   Six things were wrong, all of them visible in audit/screens/calendar-grid.png,
   and each block below says which one it fixes. -------------------------------- */

/* --- 1. THE GRIDLINES WERE IN THE WRONG PLACES ---------------------------------
 *
 * The worst of the six, and it was not on the list because it does not look like a
 * bug -- it looks like a calendar whose meetings are half an hour out.
 *
 * `cal-day-body` was emitting ONE `.cal-rule` PER HOUR LABEL: ten of them, for the
 * nine hours between 9am and 6pm. legacy.css gives the last one `flex: 0 0 auto` to
 * collapse it, but `.cal-rule:last-child` stops matching the moment a `<a class=
 * "cal-slot">` is appended after it -- i.e. on every day that has a meeting. So a
 * day with events divided 390px into TEN bands of 39px while the blocks were
 * positioned as a percentage of NINE hours (43.3px each). Measured: the 10am line
 * landed at 9:54 and a 10:30 meeting drew just above the line labelled 11 am.
 *
 * The template now emits one rule per hour INTERVAL. This rule stops the collapse
 * from ever coming back, on an empty day as well as a full one -- equal specificity
 * to `.cal-rule:last-child`, and this sheet is later.
 */
.cal-day-body .cal-rule { flex: 1 1 0; min-height: 0;
  border-bottom: 1px solid var(--line-divider); }

/* --- 2. THE HOUR LABELS DID NOT SIT ON THEIR LINES -----------------------------
 *
 * Same root cause plus one of its own: the gutter's ten labels were sized by a
 * `flex` that the body's bands did not share, so the two columns drifted apart down
 * the day. A label is now absolutely positioned on the line it names -- one per hour
 * band, right-aligned in the gutter and pulled up half its own line box so the line
 * runs through its middle, which is where Google Calendar puts it.
 *
 * `.cal-hours-body` mirrors `.cal-day-body` exactly -- same flex, same min-height,
 * same number of 1fr bands -- so the two cannot drift however the card is sized.
 */
.cal-hours-body { position: relative; flex: 1 1 auto; min-height: 23.4rem;
  display: flex; flex-direction: column; }
.cal-hours-body .cal-hour { flex: 1 1 0; min-height: 0; position: relative;
  transform: none; padding-right: 0; }
.cal-hour-l { position: absolute; right: var(--space-2); top: 0;
  transform: translateY(-50%); font-size: 10.5px; line-height: 14px;
  color: var(--text-faint); white-space: nowrap; }
/* The closing hour has no band below it to be centred on, and half a label hanging
 * past the card's bottom edge would simply be clipped by `.cal-grid`'s overflow.
 * It sits just inside instead -- the only label not centred, and the only one that
 * marks an end rather than a start. */
.cal-hour-end { top: auto; bottom: 1px; transform: none; }

/* --- 3. OVERLAPPING EVENTS OVERWROTE EACH OTHER --------------------------------
 *
 * Every block was `left: 3px; right: 3px`, so two meetings at the same hour were
 * drawn exactly on top of one another -- Wednesday's standup and the SSO-login-crash
 * review were both unreadable, which is the single thing that made this not read as
 * a calendar.
 *
 * `soil/calendar_view.py` now packs each day's overlaps into side-by-side columns
 * and hands the template a `column`/`columns` pair; these classes are the only way
 * to apply it. soil/web/app.py's CSP sets `style-src-attr 'none'`, so `style="left:
 * 50%"` is REFUSED BY THE BROWSER, not merely discouraged -- a closed set is not a
 * preference here, it is the only mechanism available.
 *
 * Capped at four, which is `MAX_COLUMNS` in that module and has the argument beside
 * it: a fifth column is 30px at 1440. The 2px inset on each side is what keeps two
 * adjacent blocks from sharing an edge.
 */
.cal-slot { left: calc(var(--slot-left, 0%) + 2px);
  width: calc(var(--slot-width, 100%) - 4px); right: auto; box-sizing: border-box; }
.sl-cal-col-1-of-1 { --slot-left: 0%; --slot-width: 100%; }
.sl-cal-col-1-of-2 { --slot-left: 0%; --slot-width: 50%; }
.sl-cal-col-2-of-2 { --slot-left: 50%; --slot-width: 50%; }
.sl-cal-col-1-of-3 { --slot-left: 0%; --slot-width: 33.3333%; }
.sl-cal-col-2-of-3 { --slot-left: 33.3333%; --slot-width: 33.3333%; }
.sl-cal-col-3-of-3 { --slot-left: 66.6667%; --slot-width: 33.3333%; }
.sl-cal-col-1-of-4 { --slot-left: 0%; --slot-width: 25%; }
.sl-cal-col-2-of-4 { --slot-left: 25%; --slot-width: 25%; }
.sl-cal-col-3-of-4 { --slot-left: 50%; --slot-width: 25%; }
.sl-cal-col-4-of-4 { --slot-left: 75%; --slot-width: 25%; }

/* --- 4. A SHORT BLOCK IS ONE LINE ----------------------------------------------
 *
 * A 30-minute block is 30px tall and the template put a title AND "9:30 am · Google
 * Meet" inside it, at 18px a line. Both were sliced through the middle. Google
 * Calendar's rule is that a short event gets one line, time first -- "9:30am
 * Standup" -- and only a block with room for two gets two.
 *
 * The decision is the ENGINE's (`Slot.is_compact`, under 45 visible minutes), not a
 * CSS guess: the template renders what it is handed, in the order it is handed.
 */
.cal-slot.is-compact { flex-direction: row; align-items: baseline; gap: 5px;
  padding-top: 3px; padding-bottom: 3px; }
.cal-slot.is-compact .cal-slot-when { flex: 0 0 auto; font-weight: 700;
  font-size: 10.5px; }
.cal-slot.is-compact .cal-slot-title { -webkit-line-clamp: 1; font-weight: 500;
  white-space: nowrap; text-overflow: ellipsis; }

/* THE SECOND TIER. legacy.css clamps every title at two lines, which is right for a
 * 90-minute block (62px) and wrong for an hour (41px): two 14.6px title lines plus a
 * 12.5px time plus 8px of padding is 49px, so "Nouson Work Technologies - quarterly"
 * wrapped and its time was sliced in half -- the standup's defect again, one size up.
 * One line of title unless the engine says the block is tall enough for two. */
.cal-slot .cal-slot-title { -webkit-line-clamp: 1; }
.cal-slot.is-tall .cal-slot-title { -webkit-line-clamp: 2; }
.cal-slot .cal-slot-meta { flex: 0 0 auto; }

/* A 3-up or 4-up overlap is 41px or 30px wide at 1440, because the day column is
 * 130px once the 333px rail has had its share. "11 am Pricing review" in 41px is
 * "11 Pri...", which spends the whole block saying the hour the row already says.
 * The time comes off and the title gets the width; the full line is in the `title`
 * attribute and in the panel beside. A closed set, because there is no selector for
 * "narrower than N px". */
.cal-slot .cal-slot-app { flex: 0 0 auto; display: inline-flex; align-items: center;
  margin-left: auto; }
/* Neither the time nor the logo survives a 41px column -- the title is the one thing
 * worth the width there. */
.cal-slot.sl-cal-col-1-of-3 .cal-slot-app,
.cal-slot.sl-cal-col-2-of-3 .cal-slot-app,
.cal-slot.sl-cal-col-3-of-3 .cal-slot-app,
.cal-slot.sl-cal-col-1-of-4 .cal-slot-app,
.cal-slot.sl-cal-col-2-of-4 .cal-slot-app,
.cal-slot.sl-cal-col-3-of-4 .cal-slot-app,
.cal-slot.sl-cal-col-4-of-4 .cal-slot-app { display: none; }
.cal-slot.sl-cal-col-1-of-3 .cal-slot-when,
.cal-slot.sl-cal-col-2-of-3 .cal-slot-when,
.cal-slot.sl-cal-col-3-of-3 .cal-slot-when,
.cal-slot.sl-cal-col-1-of-4 .cal-slot-when,
.cal-slot.sl-cal-col-2-of-4 .cal-slot-when,
.cal-slot.sl-cal-col-3-of-4 .cal-slot-when,
.cal-slot.sl-cal-col-4-of-4 .cal-slot-when { display: none; }

/* --- 5. THE BLOCKS HAD NO COLOUR, AND COLOUR HAS TO MEAN SOMETHING -------------
 *
 * Every event was the same white card with a left edge. A calendar fills its blocks.
 *
 * There is exactly one fact about a meeting that is true, free and worth a colour:
 * whether anyone on it is from outside the domains this workspace's own members sign
 * in with. That is `meeting_prep`'s own definition of "us", read through
 * `calendar_view._internal_domains`, so this screen and a meeting's prep can never
 * disagree about who is a guest. It is NOT a hue per event and NOT per calendar --
 * there is one calendar, and a random colour would be decoration pretending to be
 * information. The foot of the grid prints what the colour means, and prints it only
 * on a week that actually contains one.
 *
 * An org whose members all sign in on free email has no "us", so `has_external` is
 * None, nothing is tinted, and no legend appears -- rather than every guest in the
 * company being painted as an outsider.
 *
 * Both pairs are design-system tokens and both invert for dark: measured 4.56:1
 * (internal) and 5.76:1 light, 6.57:1 and 6.93:1 dark.
 */
.cal-slot { background: var(--info-bg); color: var(--info-ink);
  border-left-color: var(--info-ink); }
.cal-slot.is-external { background: var(--recommend-bg); color: var(--soil-violet);
  border-left-color: var(--soil-violet); }
/* The `*-bg` tokens are pale by design -- they are made to sit behind a pill, where
 * the pill's own border does the separating. Side by side in a grid, #EBF2FF and
 * #F5F4FE are the same colour to the eye, so the distinction the tint exists to make
 * was not legible. These mix the tone's OWN ink into the surface instead: no new
 * palette, no literal hex, and it follows both tokens into dark automatically. The
 * plain declaration above stays as the fallback for a browser without `color-mix`
 * (pre-111 Chromium, pre-16.2 Safari), which then simply gets the paler pair.
 *
 * 12% is the measured ceiling, not a taste. Text on the fill is the tone's own ink,
 * so every step of tint costs contrast: at 14% the dark theme measured 4.43:1 and
 * 4.48:1 for a past block, under the 4.5 floor. At 12% the four pairs that exist
 * measure 5.04 / 5.26 light and 5.89 / 6.10 dark live, 4.96 / 4.96 light and
 * 4.67 / 4.63 dark past. Re-measure if a token moves -- `--info-ink` already did
 * once during this pass. */
.cal-slot { background: color-mix(in srgb, var(--info-ink) 12%, var(--bg-surface)); }
.cal-slot.is-external { background: color-mix(in srgb, var(--soil-violet) 12%, var(--bg-surface)); }
.cal-slot:hover { border-left-color: currentColor; filter: brightness(0.97); }
/* A MEETING THAT HAS HAPPENED KEEPS ITS COLOUR.
 *
 * legacy.css painted `.is-past` flat `--stall-bg` on `--text-faint`, which threw the
 * tone away. That is not a small loss on a week view: by Friday evening every block
 * on the screen is past, so the grid was uniformly grey and the tint this pass added
 * was invisible in every screenshot of it -- which is exactly how it was caught.
 * Google Calendar fades a past event and keeps its hue, so this does: the same two
 * mixes at 6% instead of 14%, the left edge at 45%, and the words in `--text-muted`
 * (6.2:1 on the lighter fill) rather than the fainter grey.
 *
 * Ordered after the two tone rules above because `.cal-slot.is-past` and
 * `.cal-slot.is-external` are the same specificity; the external-and-past pair is a
 * third class and wins on its own. */
.cal-slot.is-past { background: var(--stall-bg); color: var(--text-muted);
  border-left-color: var(--line-control); }
.cal-slot.is-past { background: color-mix(in srgb, var(--info-ink) 6%, var(--bg-surface));
  border-left-color: color-mix(in srgb, var(--info-ink) 45%, var(--bg-surface)); }
.cal-slot.is-past.is-external {
  background: color-mix(in srgb, var(--soil-violet) 6%, var(--bg-surface));
  border-left-color: color-mix(in srgb, var(--soil-violet) 45%, var(--bg-surface)); }
/* Happening right now is the one block that should be unmissable, so it keeps the
 * solid treatment and outranks both the tone and the past fade. */
.cal-slot.is-now, .cal-slot.is-now.is-external, .cal-slot.is-now.is-past {
  background: var(--ink); color: var(--bg-surface); border-left-color: var(--ink); }
.cal-legend-dot { display: inline-block; width: 8px; height: 8px; margin-right: 5px;
  border-radius: 50%; background: var(--soil-violet); vertical-align: baseline; }

/* --- 6. THE "NOW" LINE ---------------------------------------------------------
 *
 * The clearest thing a calendar does, and this grid did not do it. A thin red line
 * across today's column at the current time, with a dot at its left end.
 *
 * `calendar_view` only supplies `now_step` when the week on screen contains today
 * AND the clock is inside the drawn 9am-6pm window, so the line is never pinned to
 * the top of a day that has not begun or the bottom of one that is over. It reuses
 * the same `sl-cal-t-*` set the blocks use, which is why it needs no rule of its own
 * for the position.
 *
 * `z-index` because it has to cross a block, and `pointer-events: none` because
 * every block is a link and a decoration must not eat a click.
 */
.cal-now { position: absolute; left: 0; right: 0; top: var(--slot-top); height: 0;
  border-top: 2px solid var(--bad-ink); z-index: 3; pointer-events: none; }
.cal-now::before { content: ""; position: absolute; left: -3px; top: -5px;
  width: 8px; height: 8px; border-radius: 50%; background: var(--bad-ink); }

/* --- 7. THE DAY HEADER ---------------------------------------------------------
 *
 * It read "Mon 5" on one line. Google Calendar stacks a small uppercase weekday over
 * a large date number. Today's filled circle was already right and is kept.
 */
.cal-day-head { flex-direction: column; justify-content: center; gap: 1px; }
.cal-day-name { font-size: 10px; font-weight: 600; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--text-faint); }
.cal-day-num { font-size: 18px; line-height: 22px; }
.cal-day-num.is-today { width: 24px; height: 24px; font-size: 13px; line-height: 1; }

/* --- the grid on a phone -------------------------------------------------------
 *
 * Five days plus a gutter cannot fit in 390px: squeezed to fit, a column is 60px and
 * a two-column overlap is 28px. The design README allows exactly one thing to scroll
 * sideways -- "a wide table inside its own card" -- and this is that case. The
 * scroll container is the wrapper, which already carries `min-width: 0`, so the
 * DOCUMENT still measures 0px of overflow at 390. Verified in both themes.
 */
@media (max-width: 900px) {
  .cal-grid-wrap { overflow-x: auto; }
  .cal-grid { min-width: 640px; }
}

/* --- a money list inside a card: Revenue at risk, Cash leaks --------------------
 *
 * The owner read one of these lines back as a single sentence: "Northwind Retail —
 * 120 seats ₹42,00,000 In 'Negotiation' 28 days; deals in New business usually leave
 * it in 6 days (measured from 12 of your own past deals)". That is a customer, a
 * size, a figure, a status, an age and a method note at ONE weight on ONE line, and
 * it is what `.sl-rows` left behind: that rule drew a hairline between `<article>`s
 * and stopped, so inside a row every `<p>` was still a full-width band at body ink.
 *
 * A row instead. Identity left, figure right, the reason beneath in muted type, the
 * provenance quieter again, the controls on one line.
 *
 * THE FIGURES SHARE A COLUMN, and that needs `subgrid`. The list is the grid and its
 * second track is `max-content`, which resolves across EVERY row at once; each row
 * borrows those two tracks. A per-row `minmax(104px, auto)` -- what `.normal-row2`
 * does -- sizes to that row's own content, so seven amounts of different lengths
 * land on seven different right edges, which is the defect, not the fix. With
 * `sl_num`'s tabular figures on top, the digits line up down the card.
 *
 * The @supports fallback is a fixed 9.5rem track: wide enough for "₹1,36,50,000" at
 * 14px without wrapping, so a browser with no subgrid gets a column that is aligned
 * but not content-fitted, rather than no column at all.
 */
.money-rows { display: grid; grid-template-columns: minmax(0, 1fr) max-content;
  align-items: baseline; }
.money-row { grid-column: 1 / -1; display: grid; grid-template-columns: subgrid;
  align-items: baseline; column-gap: var(--space-4); row-gap: 5px;
  padding: var(--space-3) 0; min-width: 0; }
@supports not (grid-template-columns: subgrid) {
  .money-rows { display: block; }
  .money-row { grid-template-columns: minmax(0, 1fr) 9.5rem; }
}
.money-row:first-child { padding-top: 0; }
.money-row:last-child { padding-bottom: 0; }
/* A hairline OR a gap, never both: the rows above already have 12px of air each
 * side, so the join is the only thing that needs drawing. */
.money-row + .money-row { border-top: 1px solid var(--line-divider); }

.money-row-h { grid-column: 1; display: flex; align-items: center; flex-wrap: wrap;
  gap: 7px; min-width: 0; }
.money-row-h > b { font-size: 13.5px; font-weight: 600; color: var(--ink);
  min-width: 0; overflow-wrap: break-word; }
/* The figure column. `justify-self: end` is what puts the digits on one right edge;
 * `white-space: nowrap` stops a long amount breaking after the currency mark. */
.money-row-f { grid-column: 2; justify-self: end; text-align: right;
  white-space: nowrap; font-size: 14px; font-weight: 700; color: var(--ink); }
.money-row-f .sl-num { font-size: 14px; }
.money-row-f small { display: block; font-size: 10.5px; font-weight: 500;
  color: var(--text-faint); letter-spacing: .01em; }
/* No figure is a fact too, and it is said in the column where a figure would be --
 * quietly, so it does not read as an amount. */
.money-row-f.is-none { font-size: 11.5px; font-weight: 500; color: var(--text-faint);
  white-space: normal; }

.money-row-b { grid-column: 1 / -1; display: flex; flex-direction: column; gap: 4px;
  min-width: 0; }
.money-row-b > p, .money-row-b > ul, .money-row-b > ul > li { margin: 0;
  color: var(--text-3); font-size: 12.5px; line-height: 18px; min-width: 0; }
.money-row-b > ul { display: flex; flex-direction: column; gap: 4px; }
/* The method note -- "(measured from 12 of your own past deals)" -- is provenance,
 * not the reason. Section 6 of the brief: keep it, as the short form attached to the
 * number, not as a second sentence at the same weight. */
.money-prov { color: var(--text-faint); font-size: 11.5px; }
.money-row-b .sl-disclose > summary { min-height: 26px; font-size: 11.5px; }

/* The controls of ONE row, on one line. Each needs its own CSRF token, so each is
 * its own `<form>` -- a block element, which is how two controls of one item ended
 * up as four full-width bands with more air between them than between two items.
 * `.sl-actions` already collapses the forms; this aligns a label-over-control field
 * with a bare button, which `align-items: center` does not. */
.money-act { align-items: flex-end; gap: var(--space-2) var(--space-3);
  margin-top: var(--space-1); }
.money-act .sl-field { flex: 1 1 12rem; max-width: 19rem; gap: 4px; }
.money-act .sl-field-l { font-size: 11px; color: var(--text-3); font-weight: 500; }
.money-act .sl-btn { flex: none; }

/* --- Customers: four columns of the same non-answer ----------------------------
 *
 * `sl_customer_row` holds four cells open -- Promises, Owed, Renewal, Next meeting.
 * On this org, and on every org, three of the four are not computable and Renewal
 * has no column in Soil at all, so the list rendered "Not enough data / On their
 * page / Not recorded / Not enough data" identically on every row. Four columns
 * repeating one non-answer down a list is worse than not showing the columns: it
 * costs 60% of the row width and invites a reader to compare cells that cannot
 * differ.
 *
 * The macro is in `_components.html`, which this pass may not edit, so the cells are
 * hidden here and the four limitations are stated ONCE, in words, under the list.
 * The proper fix is in the report: make the four cells optional in the macro.
 */
.cust-plain .sl-cust { grid-template-columns: 32px minmax(0, 1fr) auto 14px; }
.cust-plain .sl-cust-m { display: none; }
/* The row is a link; its disclosure is not, so it sits outside the rows. */
.cust-why { margin-top: var(--space-3); padding-top: var(--space-3);
  border-top: 1px solid var(--line-divider); }

/* --- Warning detail: the chain, and what Soil already tried --------------------
 *
 * 1. `.why-step` carried a `border-bottom` AND `.why-text` carried 16px of
 *    `padding-bottom`, which is the brief's "never a line AND a gap" exactly. The
 *    line is kept (eight steps would otherwise run together) and the gap goes.
 * 2. A date repeated on six consecutive rows is not a chain, it is a column with one
 *    value in it. `.is-same-day` hides the repeat and leaves the date on the row
 *    where it changes, so the chain reads as the two days it actually spans. The
 *    date is still in the DOM for a screen reader.
 * 3. `.tried-row` was `flex-direction: column`, so the one card under the chain used
 *    none of the chain's columns: its time sat on its own line at a different size
 *    from the dates directly above it. Same four tracks, same alignment.
 */
.why-chain .why-text { padding-bottom: 0; }
.why-chain .why-step { padding: 9px 0; }
.why-chain .why-step:first-child { padding-top: 0; }
.why-chain .why-step:last-child { padding-bottom: 0; border-bottom: 0; }
.why-when.is-same-day { visibility: hidden; }

.tried-list { padding: 0; }
.tried-row { display: grid; grid-template-columns: 76px 16px minmax(0, 1fr);
  gap: 4px var(--space-3); align-items: start; padding: 9px 0; }
.tried-row:first-child { padding-top: 0; }
.tried-row > .mono { grid-column: 1; line-height: 1.35; }
.tried-what { grid-column: 3; font-weight: 600; }
.tried-msg { grid-column: 3; }
@media (min-width: 901px) {
  .tried-row { grid-template-columns: max-content 12px minmax(0, 1fr); }
  .tried-row > .mono { white-space: nowrap; }
}

/* --- Waiting on you: the two cards that are lists of sentences -----------------
 *
 * "Not proven yours" and "Held back from you" rendered as `<li class="note">`: four
 * paragraphs of body prose, each a different length, with nothing naming which
 * source each one is about until the middle of the sentence. They are rows -- the
 * source on the left, the sentence beside it -- and the sentences themselves are
 * untouched, because each one is a real limitation and the only place it is stated.
 */
.wait-why { display: flex; flex-direction: column; gap: 0; margin: 0; padding: 0;
  list-style: none; }
.wait-why > li { display: grid; grid-template-columns: minmax(0, 1fr);
  gap: 3px; padding: 9px 0; min-width: 0; }
.wait-why > li:first-child { padding-top: 0; }
.wait-why > li:last-child { padding-bottom: 0; }
.wait-why > li + li { border-top: 1px solid var(--line-divider); }
.wait-why p { margin: 0; color: var(--text-3); font-size: 12.5px; line-height: 18px; }

/* The "Not here yet" disclosures were `.nb-detail`, a legacy control with its own
 * chevron and its own 16px rhythm, four of them in a column with nothing between.
 * `.sl-disclose` is the app's own disclosure and is what every other screen's
 * provenance opens with; these are the same thing. */
.wait-nb { display: flex; flex-direction: column; margin: 0; padding: 0;
  list-style: none; }
.wait-nb > li + li { border-top: 1px solid var(--line-divider); }
.wait-nb .sl-disclose-b > p { color: var(--text-3); font-size: 12.5px;
  line-height: 18px; }


/* --- Track record / Backtest / Value / Updates: the card interior ------------------
 *
 * Four screens, one defect repeated: a card's list items render as a run of block
 * elements (a bold line, a method paragraph, a date line, a button in its own form),
 * so eight short facts take 900px and no two items share a column. Everything below
 * turns one of those runs into a row. Nothing here is a component the design system
 * owns -- the mock renders no list of releases, no money line and no prose document,
 * which is why these four screens fell back to browser defaults inside an `.sl-card`.
 */

/* ONE RELEASE, on Track record's "Where each release stands now". Was: name, pill,
 * a three-line method sentence, then "Due 6 Oct 2026 · computed 4 Oct" -- four stacked
 * lines per release, five releases, and the pill landing at a different x on every
 * row because it followed the name inline.
 *
 * Three tracks, the same on every row: identity, status, dates. The pill track is
 * 148px, which fits "Not enough history" (the widest this screen can print) without
 * being sized to whichever row happens to be longest; the date track is sized to
 * "Due 12 Oct 2026 · computed 4 Oct" and right-aligned so the column reads down.
 * The reason hangs under the name in muted type as row 2. */
.sl-fcrow { display: grid; grid-template-columns: minmax(0, 1fr) 148px 210px;
  gap: 3px var(--space-3); align-items: center; padding: 10px 2px; }
.sl-fcrow + .sl-fcrow { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-fcrow-t { grid-area: 1 / 1; font-size: 13px; font-weight: 600; color: var(--ink);
  min-width: 0; overflow-wrap: break-word; }
.sl-fcrow-p { grid-area: 1 / 2; justify-self: start; min-width: 0; }
/* 210px and `nowrap`: at 196px "Due 12 Oct 2026 · computed 4 Oct" broke after the
 * day and two of five rows carried a second line that said "Oct", which is the one
 * column on this card that exists to be read down. The track is sized to the longest
 * string this row can print, and the media query below takes it away rather than
 * letting it squeeze. */
.sl-fcrow-d { grid-area: 1 / 3; justify-self: end; text-align: right; font-size: 12px;
  color: var(--text-3); font-variant-numeric: tabular-nums; white-space: nowrap; }
.sl-fcrow-w { grid-area: 2 / 1 / 3 / -1; margin: 0; color: var(--text-3);
  font-size: 12.5px; line-height: 18px; max-width: 68ch; }
/* Below 640px three tracks are 90px each, and the widest thing on the row is the
 * name. So the name takes the first line on its own and the status and the dates
 * share the second -- pill left, dates right, the same two ends the desktop row has.
 * Keeping the pill on the name's line was the first attempt and is what the backtest
 * example rows disproved: "Slipped, as Soil warned" is 150px of nowrap, which left
 * 110px for a ticket summary and wrapped it to four lines. */
@media (max-width: 640px) {
  .sl-fcrow { grid-template-columns: auto minmax(0, 1fr); }
  .sl-fcrow-t { grid-area: 1 / 1 / 2 / -1; }
  .sl-fcrow-p { grid-area: 2 / 1; }
  .sl-fcrow-d { grid-area: 2 / 2; justify-self: end; text-align: right; }
  .sl-fcrow-w { grid-area: 3 / 1 / 4 / -1; }
}

/* A TIMELINE ROW THAT CARRIES THREE LINES -- "Every prediction", and the same shape
 * on the Backtest report. The component gives the row its date, its logo and its
 * rail; what it has no opinion about is the cell, and three `<br>`-separated runs
 * left the result pill sitting wherever the release's name happened to end (measured
 * x = 470, 480, 470 down three consecutive rows). The pill goes to the end of the
 * first line, so the verdicts form a column. */
.sl-tlrow { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.sl-tlrow-h { display: flex; align-items: center; gap: var(--space-2); min-width: 0; }
.sl-tlrow-h > b { font-weight: 600; color: var(--ink); min-width: 0;
  overflow-wrap: break-word; }
.sl-tlrow-h > .sl-pill { margin-left: auto; flex: none; }
.sl-tlrow-s { color: var(--text-3); min-width: 0; overflow-wrap: break-word; }

/* A COLUMN OF COUNTS inside a card's list -- the backtest's five buckets, on Track
 * record and on the full report. The figure is in a `<strong>` inside the sentence
 * ("**67** warnings"), and it has to stay there: three honesty tests grep the page
 * for the contiguous strings those sentences make, so the number may not be lifted
 * into a cell of its own. An inline-block minimum width does the same job from CSS
 * without touching one character of the markup -- 2.2em at 12.5px holds three
 * digits, which is more than this feature has ever printed. */
.sl-countlist > li > strong:first-child { display: inline-block; min-width: 2.2em; }

/* ONE MONEY LINE on the value report. Was: amount and label, a pill, a method
 * paragraph, a row of source chips, and then "This wasn't us" alone on a full-width
 * band because a button that needs a CSRF token gets its own `<form>` and a form is
 * a block. The arithmetic stays directly under its figure -- A5 requires that, and
 * it is the one thing on the card that is not method but evidence -- and the control
 * moves onto the first line, at the end, where three of them make a column. */
.sl-mrow { display: grid; grid-template-columns: minmax(0, 1fr) auto;
  gap: 4px var(--space-3); align-items: start; padding: 11px 2px; }
.sl-mrow + .sl-mrow { box-shadow: 0 -1px 0 var(--line-divider); }
.sl-mrow-h { grid-area: 1 / 1; display: flex; align-items: center; flex-wrap: wrap;
  gap: 4px var(--space-2); min-width: 0; font-size: 13px; }
.sl-mrow-h > .sl-num { font-weight: 600; color: var(--ink); }
.sl-mrow > form { grid-area: 1 / 2; justify-self: end; }
.sl-mrow-w { grid-area: 2 / 1 / 3 / -1; margin: 0; color: var(--text-3);
  font-size: 12.5px; line-height: 18px; max-width: 68ch; }
.sl-mrow-s { grid-area: 3 / 1 / 4 / -1; display: flex; flex-wrap: wrap;
  gap: var(--space-2); min-width: 0; }

/* A FIGURE WITH ITS BASIS UNDER IT -- "What Soil did do". Four counts, and one of
 * them (hours of chasing) ships with a method sentence that docs/SOIL_FEATURES.md
 * requires to be beside the number rather than a click away. As a sibling paragraph
 * after the list it read as a fifth item; as the row's own second line it reads as
 * the basis for the row above it. */
.sl-didrow { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.sl-didrow > span { font-size: 13px; }
.sl-didrow > small { color: var(--text-faint); font-size: 12px; line-height: 18px;
  max-width: 68ch; }

/* THE UPDATE DOCUMENT -- the one piece of full-ink body copy in the app, and the one
 * place a `<ul>` genuinely is a bulleted list rather than a set of rows. `.sl-card
 * ul` strips the markers by design (a card's lists are rows); a board update's
 * highlights are prose and need them back, and its `<h3>`s need a rhythm: the UA's
 * collapsed margins put "Lowlights, and what we're doing" 2px under the sentence
 * above it and 2px over the one below, so the section breaks were invisible. */
.sl-doc > p { margin: 0 0 var(--space-3); line-height: 21px; }
.sl-doc > h3 { margin: var(--space-5) 0 var(--space-2); font-size: 13px;
  font-weight: 600; color: var(--ink); letter-spacing: .01em; }
.sl-doc > h3:first-child { margin-top: 0; }
.sl-card .sl-doc > ul { list-style: disc; padding-left: 1.15em; gap: 5px;
  margin: 0 0 var(--space-3); }
.sl-card .sl-doc > ul > li { color: var(--text-2); line-height: 20px;
  max-width: 68ch; }
.sl-card .sl-doc > ul > li::marker { color: var(--icon-faint); }

/* "Built from": a source and what it contributed, or a source and the button that
 * connects it. Two lists of bare `<li>`s where the button sat inline after the
 * name, so no two rows ended at the same place. One grid, one right-hand track, and
 * the rows that have no button simply leave it empty. */
.sl-srcrow { display: grid; grid-template-columns: minmax(0, 1fr) auto;
  gap: var(--space-3); align-items: center; min-height: 26px; }
.sl-srcrow > span:first-child { min-width: 0; overflow-wrap: break-word; }
.sl-srcrow > .sl-btn { justify-self: end; flex: none; }

/* A disclosure at the foot of a card, holding the method a reader needs once rather
 * than the facts they scan every time. `.sl-disclose` already draws the caret and
 * the indent; this is only the air that separates it from the rows above it. */
.sl-foot-rule { margin-top: var(--space-2); padding-top: var(--space-2);
  border-top: 1px solid var(--line-divider); }
/* The backtest's example rows carry "Slipped, as Soil warned" where a release row
 * carries "Not enough history", and a 148px track clips it. Same grid, one wider
 * status column -- sized to the longest verdict soil/backtest.py prints. */
.sl-fcrow-wide { grid-template-columns: minmax(0, 1fr) 172px 210px; }
@media (max-width: 640px) {
  .sl-fcrow-wide { grid-template-columns: auto minmax(0, 1fr); }
}
/* A source chip for a row in this org's own data. `sl_src` always draws an app mark
 * and `sl_app_logo` has no "no app" case, so an empty provider rendered the
 * unknown-app tile -- a "?" in front of every citation on the value report. */
.sl-mrow-s .sl-logo, .sl-mrow-s .sl-logo-img { display: none; }


/* ===========================================================================
   THE COMPONENT AUDIT, 2026-10-10 — defects found by LOOKING at each component
   on its own, in the gallery, at 1440 light, 1440 dark and 390.

   tests/fixtures/component_gallery.html.j2 now draws every macro with the
   content this app really produces — a customer's full legal name, an 80-
   character ticket summary, "₹1,36,50,000", "Waiting for approval", the five
   strings connections.html's `read_ago` can emit — in the three widths
   `.sl-page` really gives a card (1152px full, 870px main column, 333px rail).
   Each number below is measured off that page, and the specimen that shows it
   is named so the next person can look at the same thing.

   Two defects were in the component's own rules rather than in this app, and
   are corrected in section 2 AND in design/soil-design-system/components/
   bundle.css identically, with the reasoning in that system's README:

     * `.sl-td-owner` was a flex row with no `min-width: 0` and no overflow,
       so "Meera Lakshmi Sharma → Arjun Nair" printed 213px of ink into a
       169px track and overprinted the "In progress" column beside it. Its
       sibling `.sl-td-work` already had both. It is a block with an ellipsis
       now, and the avatar carries the 9px as a margin.
     * `.sl-cust-n b` / `.sl-conn-n b` could wrap while the `small` underneath
       them was already `nowrap` + ellipsis, so one customer with a long legal
       name made its row a line taller than every other row in the list and
       the four metric cells stopped lining up across rows.
   =========================================================================== */

/* THE HEALTH PILL'S COLUMN IS SIZED FOR THE MOCK'S WORDS, NOT SOIL'S.
 *
 * `.sl-cust`'s third track is a fixed 120px, which fits "At risk" (60px) and
 * "Healthy" (67px). customers.html does not pass either: its pill says how many
 * links are known, and the three strings it can hold measure "Nothing linked
 * yet" 122px, "12 things linked" 110px and "Guesses only" 98px. `.sl-pill` is
 * `white-space: nowrap`, so the two long ones overflowed a fixed track and sat
 * against the "Promises" label of the cell beside them — on the same row where
 * every other row had 60px of air there.
 *
 * 136px is the longest of those plus the pill's own breathing room. It is this
 * app's number and not the system's, which is why it is here: the component is
 * right for the words it was drawn with. */
.sl-cust { grid-template-columns: 32px minmax(140px, 1.4fr) 136px
  repeat(4, minmax(70px, 1fr)) 14px; }
@media (max-width: 900px) { .sl-cust { grid-template-columns: 32px minmax(0, 1fr) auto; } }

/* A TIMELINE WHOSE TEXT WRAPS PUT THE DATE IN THE MIDDLE OF NOWHERE.
 *
 * `.sl-timeline li` is `align-items: center`, which is identical to `start`
 * for the mock, where every line is one line. In a 333px rail almost nothing
 * is: "Meera promised the settlement report by the 12th." is two lines, and
 * the date and the app mark then floated to the vertical centre of those two
 * lines while the single-line row above kept them level with its text. The
 * rail's dots stopped reading as a column.
 *
 * `align-content: center` keeps the whole row centred inside the component's
 * own `min-height: 50px`, so a short row is unchanged; `align-items: start`
 * then puts the date and the mark on the FIRST line of the text, which is the
 * line the date is about. The 1px is optical: `time` is 10.5px against the
 * text's 16.5px line box. */
.sl-timeline li { align-content: center; align-items: start; }
.sl-timeline time { margin-top: 1px; }
.sl-timeline li > span:last-child { align-self: start; }

/* AN AGENT'S DESCRIPTION IS THE LINE THAT SAYS WHAT THE AGENT DOES.
 *
 * `.sl-agent-d` is `nowrap` + ellipsis, which is right in an 870px card and
 * wrong on a phone: measured at 390px, "Pings the reviewer in Slack after 3
 * days of no movement." is 283px of text in a 280px cell, so the sentence
 * loses its last word and its full stop to an ellipsis — three pixels short of
 * the one thing the row exists to say. `.sl-agent` is already `min-height:
 * 80px` against ~46px of content, so a second line costs the row nothing. */
@media (max-width: 900px) {
  .sl-agent-d { white-space: normal; overflow: visible; text-overflow: clip; }
}

/* DARK MODE EATS THE BLACK LOGOS.
 *
 * `sl_app_logo` paints an official SVG straight onto `--bg-surface`, which is
 * #FFFFFF in light and #171A21 in dark. Four of the files in static/logos/ are
 * drawn in near-black and nothing else: github.svg is #1B1F23 alone,
 * linear.svg #222326 alone, razorpay.svg is a #072654 wordmark, and
 * aws_cost.svg is #252F3E lettering beside its orange smile. In dark mode the
 * GitHub tile in a ConnectionRow renders EMPTY — a connected tool with no mark
 * at all — and Razorpay and AWS lose their names.
 *
 * The fix is the one every one of those brands publishes for a dark surface:
 * the mark on white, never recoloured. It is matched on the filename because
 * that is the only thing that distinguishes them — the macro emits one class
 * for all thirteen providers — and it is APP LAYER ONLY, not carried back:
 * `/static/logos/*.svg` are this app's files and the design system's own LOGO
 * map does not have them.
 *
 * `padding` and `border-radius` rather than a plain background, so the white
 * reads as the mark's own plate instead of as a square hole in the row. Every
 * other logo (Slack, Gmail, Jira, Drive, Calendar, HubSpot, Figma, Zoom, Meet,
 * GitLab, Notion) is already full-colour or carries its own white, and is left
 * exactly as the vendor drew it. */
[data-theme="dark"] .sl-logo-img[src$="/github.svg"],
[data-theme="dark"] .sl-logo-img[src$="/linear.svg"],
[data-theme="dark"] .sl-logo-img[src$="/razorpay.svg"],
[data-theme="dark"] .sl-logo-img[src$="/aws_cost.svg"] {
  background: #FFFFFF; border-radius: 3px; padding: 1px; box-sizing: border-box;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .sl-logo-img[src$="/github.svg"],
  :root:not([data-theme="light"]) .sl-logo-img[src$="/linear.svg"],
  :root:not([data-theme="light"]) .sl-logo-img[src$="/razorpay.svg"],
  :root:not([data-theme="light"]) .sl-logo-img[src$="/aws_cost.svg"] {
    background: #FFFFFF; border-radius: 3px; padding: 1px; box-sizing: border-box;
  }
}

/* A TEXTAREA IS NEVER A 360px CONTROL.
 *
 * `.sl-field` caps at 360px, which is the right measure for a name, a date or
 * a seat count — a text input wider than its longest plausible value reads as
 * a mistake. A TEXTAREA is the opposite case: it holds prose, and in a 1152px
 * card the agent builder's "What it should do" rendered a third of the card
 * wide with 790px of white beside it. `.sl-fieldwide` already opts one screen
 * out; this makes the default right for every caller instead, and stops at the
 * same measure `.sl-card > p` uses, because a line of typed prose is as hard
 * to read at 1100px as a line of printed prose is. `.sl-fieldwide > .sl-field`
 * is (0,2,0) against this rule's (0,1,1), so a screen that asked for the full
 * card still gets it whichever order they land in. */
.sl-field:has(textarea) { max-width: 68ch; }


/* ===========================================================================
   TODAY'S VERTICAL RHYTHM, and the two cards that broke it (2026-10-10)
   ===========================================================================

   "why is there not equal spacing between each box" -- the owner, on Today.

   MEASURED AT 1440 BEFORE, down the main column, card bottom to next card top:

     attention row -> Revenue at risk   15px
     Revenue at risk -> Cash leaks      15px
     Cash leaks -> Work at risk         16px
     Work at risk -> What changed       16px
     What changed -> Ask Soil           16px
     rail: every join                   18px

   Four different numbers on one screen, and the 15 and the 18 sit side by side in
   the two columns where the difference is easiest to see. None of them is a bug in
   isolation -- 15px is `.sl-today`'s column gap, 18px is `.sl-today-r`'s own, 16px is
   `.sl-today`'s row gap and `.sl-today-b`'s -- which is exactly why nobody caught it:
   every value is defensible and the page still reads as broken.

   16px is the one with the best claim. It is the gap the design system itself puts
   between the rows of Today's grid and between the three cards along the bottom, both
   verbatim from the mock, so it is the number this screen already uses for "one card
   above another". `.sl-today-l` is corrected at its own rule above; the rail is
   overridden here.

   WHY THE RAIL IS SCOPED TO `main.sl-today`. `.sl-today-r` is borrowed by eighteen
   other templates as a plain page rail, and 18px is right for them -- it is the
   design's own number and those screens are nobody's to relayout from here.
   `main` is home.html and only home.html: aws_cost_connect.html and
   revenue_connect.html, the two other users of `.sl-today`, open it on a `<div>`.
   ---------------------------------------------------------------------------- */
main.sl-today > .sl-today-r { gap: 16px; }

/* The attention row, same two corrections.
 *
 * ROW GAP. `.sl-att-row` is `gap: 15px` and this org has five attention cards, so the
 * row wraps 3 + 2 and that 15px is a real vertical join between two rows of cards --
 * one more number in a column that now has only one. The COLUMN gap stays 15px: it is
 * the page's own horizontal gutter (`.sl-today`'s column gap, and the width
 * `.sl-att-row > .sl-att`'s flex basis is computed against), and nothing about the
 * owner's question is horizontal.
 *
 * MARGIN. `.sl-att-row { margin-top: 20px }` is the design's gap between the greeting
 * and the first row of cards, and it was written when `.sl-today-l` had no rule at all
 * -- the mock's `-l` is `display: block` and that margin IS the gap. Now that the
 * column supplies 16px of its own the two stack: measured 35px before, against 20px in
 * the mock. 4px + the column's 16px restores the design's number exactly and stops the
 * doubling. Scoped to Today because three other screens borrow `.sl-att-row` outside
 * `.sl-today-l` and get their margin from the parent they are actually in. */
main.sl-today .sl-att-row { row-gap: 16px; margin-top: 4px; }


/* --- a card's own headline figure ---------------------------------------------------
 *
 * Today stacks two money cards -- Revenue at risk, then Cash leaks -- and each one
 * opens with its total. Revenue's was a plain `<p>`: 13px body bold, the same size as
 * the sentence under it. Cash leaks' was legacy.css's `.leak-card-figure`: 25.6px, a
 * heading font, and `padding: 16px 20px 0` of its own INSIDE a `.sl-card` that already
 * pads itself, so the number started 20px right of the card title above it.
 *
 * One class for both. No padding, so the figure starts where the title starts; a flex
 * baseline row so a unit or a second currency sits beside it rather than under it;
 * tabular figures, because two totals on one screen that disagree about digit width is
 * the defect the README's "Numbers" rule exists to catch.
 *
 * 26px rather than `.sl-stat`'s 33px: a StatCard is a whole card whose only job is one
 * number, and this is the first line of a card that goes on to list things. It is also
 * within half a pixel of what Cash leaks already rendered, so the card the owner is
 * looking at does not change size -- only what it lines up with.
 */
.sl-figure { margin: 0; display: flex; align-items: baseline; flex-wrap: wrap;
  gap: 0 7px; font-size: 26px; font-weight: 700; letter-spacing: -0.03em;
  line-height: 1.2; color: var(--ink); font-variant-numeric: tabular-nums; }
.sl-figure .sl-num { font-size: inherit; font-weight: inherit; }
/* The unit, and the separator between two currencies: beside the number, never the
 * same weight as it. */
.sl-figure-u { font-size: 12.5px; font-weight: 500; letter-spacing: 0;
  color: var(--text-faint); }

/* Today's Cash leaks rows. `.money-rows` names Cash leaks in its own comment and the
 * full /cash-leaks page already draws them; this is the Today card joining it, so the
 * two money cards stacked in the main column are one shape.
 *
 * The one difference, and it is a data difference rather than a design one: the page's
 * rows carry `subject_label`, and `cash_leaks.today_card` returns `{text, amount}`
 * only -- the subject is the first clause of the sentence, not a field. There is
 * nothing honest to put in `.money-row-h`, so rather than render an empty name cell
 * with the figure floating beside it, the reason takes column 1 on the first line and
 * the figure keeps the shared right edge. One key on `today_card` would remove this
 * rule; it is named in the report. */
.leak-rows .money-row > .money-row-b:first-child { grid-column: 1; }


/* --- a column of form controls that share a baseline --------------------------------
 *
 * The agent builder on /custom-agents: ten controls, a checkbox, a save button and a
 * qualifying sentence, all direct children of one `<form>`.
 *
 * NOTHING SEPARATED THEM. `.sl-field` is a block-level `<label>` with no margin, so
 * what stood between two fields was the anonymous line box made by the newline in the
 * template. Measured at 1440: 9, 8, 9, 8, 8, 8, 9, 8, 8, 8 px, and 0px between the
 * button and the note under it. Not a rhythm -- whitespace.
 *
 * AND THEY DID NOT AGREE ON A HEIGHT. `.sl-field input` is 38px (section 2) and
 * `.sl-field select` was `var(--control-height)`, 36px -- that token is the BUTTON's
 * height and a select is not a button. Four inputs and six selects down one column, in
 * two heights, two pixels apart: close enough to look like a rendering fault rather
 * than a decision. The floor is the input's, since that is the one section 2 states.
 *
 * Two tracks, not ten rows: ten 360px controls stacked in a 1083px card ran 770px tall
 * and left two thirds of the card empty. 16px is `.sl-page`'s own gap, so the form
 * breathes at the same rate as the cards around it. The checkbox, the save control and
 * its note span both tracks at the foot, which is the order the form is read in.
 */
.sl-field select { height: 38px; }
.sl-formstack { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-4); align-items: start; max-width: 736px; min-width: 0; }
.sl-formstack > .sl-field { max-width: none; min-width: 0; }
/* A hidden input is still a grid item if it is allowed to be one -- two CSRF fields
 * would take two of the first row's cells and push Name and Trigger onto row two. */
.sl-formstack > input[type="hidden"] { display: none; }
.sl-formstack > .sl-check,
.sl-formstack > .sl-actions,
.sl-formstack > .sl-btn,
.sl-formstack > p { grid-column: 1 / -1; }
.sl-formstack > .sl-check { padding: 0; }
.sl-formstack > .sl-btn { justify-self: start; }
.sl-formstack > p { margin: 0; }
.sl-disclose > .sl-formstack { margin: var(--space-2) 0 var(--space-3) 5px; }
@media (max-width: 620px) { .sl-formstack { grid-template-columns: minmax(0, 1fr); } }

/* ===========================================================================
   Screen-specific rules requested by the per-screen design pass (2026-10-10).

   Each screen was fixed by an agent that owned only its own template and could
   not touch this file, so anything needing CSS came back as a measured request
   instead of a drive-by edit. The `why` under each rule is that measurement,
   kept because the number is the argument -- without it these read as taste.
   =========================================================================== */

/* Customers -- Replaces the `auto` third track (line 2627). Measured at 1440: pill left edges are
 * ragged at x=1212, 1212, 1213, 1220 -- 8px of raggedness down a 4-row list -- because
 * an `auto` track sizes to each row's own pill. The widest pill this screen can emit is
 * "Nothing linked yet" at 127px (measured by cloning the pill; "999 things linked" =
 * 122px, "20 things linked" = 115px), so 136px holds every state and matches the 136px
 * third track soil.css already gives the full .sl-cust. All four pills then start at
 * x=1201. */
.cust-plain .sl-cust { grid-template-columns: 32px minmax(0, 1fr) 136px 14px; }

/* Customers -- At 390 every customer name is ellipsised -- "Crestline…", "Harbour …", "Northwin…",
 * "Vantage S…" -- while 38px sits empty to the right of the pill. Cause: `.cust-plain
 * .sl-cust` (specificity 0,2,0) overrides the breakpoint rule `.sl-cust { grid-template-
 * columns: 32px minmax(0,1fr) auto }` (0,1,0), so the 14px chevron track survives below
 * 900px even though `.sl-cust .sl-row-go { display: none }` has already hidden the
 * chevron. Measured row interior at 390: 292px row - 20px padding = 272px; 32 + name +
 * 115 (pill) + 14 (dead track) + 42 (3 gaps) leaves the name track 69px. Dropping the
 * dead track and its gap returns the name track to 97px (+28px). This cannot be worked
 * around from a template. */
@media (max-width: 900px) {
  .cust-plain .sl-cust { grid-template-columns: 32px minmax(0, 1fr) auto; }
}

/* Cash leaks -- `.money-row-b > p` (soil.css:2593, specificity 0,1,1) beats `.money-prov`
 * (soil.css:2599, 0,1,0), and `.sl-disclose-b > p` (soil.css:1907) does the same, so
 * `.money-prov` loses everywhere it is actually used -- on Cash leaks AND on Revenue at
 * risk, which uses the same class. Measured in audit/agent/cash-leaks-1440-a.png: in
 * "Where Soil gets cost data", "Daily and monthly cost per service, for 13 months back."
 * (the fact, plain <p>) and "Read-only (two ce:Get* actions)..." (the caveat, p.money-
 * prov) paint at the identical 12.5px / var(--text-3) -- same cap-height, same grey. The
 * intended 11.5px / var(--text-faint) never applies. Same for the vendor seat-price
 * note, the finding status note and the seat warning inside the disclosure. One extra
 * selector restores the three-level hierarchy those rows were built for. */
.money-row-b > p.money-prov, .sl-disclose-b > p.money-prov {
  color: var(--text-faint); font-size: 11.5px; line-height: 17px;
}

/* Cash leaks -- `.sl-field input` (soil.css:817) already gives the file input the right 38px box, so
 * it lines up with the two selects beside it -- but the button INSIDE it is still the
 * browser's own control. Measured in both audit/agent/cash-leaks-1440-a.png and
 * audit/agent/cash-leaks-1440-dark-a.png: "Choose File" renders as a 22px OS button in
 * the system font with a grey bevel, and "No file chosen" renders at the OS default
 * size, inside a design-system field, next to two selects that are 13px var(--font-
 * sans). It is the only browser-default control left on the screen and it looks the same
 * in dark mode, where the rest of the card is on var(--bg-surface). The file input is
 * hand-rolled in the template because neither `field` nor `sl_field` can emit `accept`,
 * so there is no macro to fix instead. */
.sl-field input[type="file"] { padding: 0 8px; font-size: 12.5px; }
.sl-field input[type="file"]::file-selector-button {
  height: 26px; margin: 0 10px 0 0; padding: 0 10px;
  border: 1px solid var(--line-control); border-radius: var(--radius-md);
  background: var(--bg-surface); color: var(--ink);
  font: inherit; font-size: 12.5px; font-weight: 500; cursor: pointer;
}

/* Track record -- The 2px x-padding insets every row's text from the rest of its own card. Measured at
 * 1440 on /org/demo/track-record: .sl-fcrow-t renders at x=284 and .sl-fcrow-d ends at
 * 1015, while every other line in the same card -- .sl-card-h (the title), .sl-note, and
 * .sl-disclose > summary -- is at x=282 and ends at 1017. So the card title and the row
 * titles directly under it are 2px apart, on three cards (releases, handoffs, and the
 * backtest examples). Re-rendered with `padding: 10px 0` injected: row text lands at
 * x=282, right=1017, exactly on the card's own edges. Safe -- the row divider is a box-
 * shadow on the <li> box, which is already full width, so nothing but the text moves. */
/* line ~2713: drop the 2px horizontal padding. */
.sl-fcrow { display: grid; grid-template-columns: minmax(0, 1fr) 148px 210px;
  gap: 3px var(--space-3); align-items: center; padding: 10px 0; }

/* Revenue at risk -- Measured in audit/agent/crop-how.png: summary text bottom to first-row text top = 15
 * CSS px, no divider. The five joins below it are 12 px padding-bottom + 1 px --line-
 * divider + 12 px padding-top = 24 px + hairline. I worked around it by moving the
 * <details> into the grid as `article.money-row > div.money-row-b` (see
 * audit/agent/crop-how2.png, now 24 px + hairline), but that also pulls in `.money-row-b
 * .sl-disclose > summary { font-size: 11.5px }`, which is a side effect the rule above
 * would let me drop. */
/* `.money-row:first-child { padding-top: 0 }` assumes `.money-rows` opens the card.
   On Revenue at risk the rules disclosure precedes it, so the first row's text sat
   15px below the summary's text while every other join in the same block is 24px
   plus a hairline. With this, the disclosure can sit outside the grid again. */
.sl-card > :not(.sl-card-h) + .money-rows {
  margin-top: var(--space-3);
  border-top: 1px solid var(--line-divider);
  padding-top: var(--space-3);
}

/* Revenue at risk -- After deduping, 7 chips remain and 6 of them carry a label that is character-for-
 * character the bold row title 4 CSS px above them ("Northwind Retail — 120 seats",
 * "Crestline Health — enterprise", "Harbour Logistics — multi-site", "Vantage Studios —
 * team plan", "Crestline Health — training", "Northwind Retail"). Each chip is 110–210
 * px of pure repetition and at 390 it wraps to a line of its own. With this rule I would
 * write `<b><a href="{{ ns.href }}">{{ line.label }}</a></b>` and delete all six,
 * keeping every link. I did NOT want to invent a label like "HubSpot" to shorten them,
 * so they stay for now. */
/* The row title IS the link. `.money-row-h > b` cannot carry an href, so Revenue at
   risk prints the deal name bold at 13.5px/600 and then repeats it verbatim as an
   `sl_src` chip just to have somewhere to put the URL. */
.money-row-h > b > a { color: inherit; text-decoration: none; }
.money-row-h > b > a:hover {
  text-decoration: underline;
  text-underline-offset: 2px;
  text-decoration-color: var(--line-divider);
}
.money-row-h > b > a:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; border-radius: var(--radius-sm); }

/* Meetings -- Measured at 1440 in the day card: tile x=282, title x=336, disclosure summary text
 * x=300. The 36px offset makes the caret read as a left rail down the card instead of as
 * the row's own control. The selector is keyed to `.sl-prep-h + .sl-disclose` so it
 * cannot reach the disclosures in Revenue at risk / Cash leaks, which use `.sl-rows
 * article` without a meeting header. */
/* The prep disclosure belongs to the meeting above it, so it starts where that
 * meeting's title starts. A row on /meetings is a 46px `.sl-prep-when` tile plus the
 * 8px row gap, so the title column begins 54px in; `.sl-disclose > summary` insets its
 * own text 18px (2px padding + 3px caret margin + 6px caret + 7px gap). 54 - 18 = 36. */
.sl-rows article > .sl-prep-h + .sl-disclose { margin-left: 36px; }

/* Meetings -- Measured at 390: the text column was 104px and the meta wrapped to six lines.
 * meetings.html currently works around it by putting `sl-actions` on the row div purely
 * for its `flex-wrap: wrap` (it also drops the gap 12px -> 8px). When this rule lands,
 * delete `sl-actions` from that one div in meetings.html and the row gets its 12px gap
 * back; the stack rule removes the orphan 24px line the workaround leaves at 390. */
/* A meeting row on /meetings is the mock's `.sl-prep-h` carrying one more thing than
 * the 333px rail it was drawn for: a prep pill. At 390px, nowrap squeezed the text
 * column to 104px and broke the subtitle over six lines against a 46px tile. The faces
 * go with it -- the subtitle already names the people, and a 24px stack alone on a
 * wrapped line is a row of pixels carrying no fact. */
@media (max-width: 560px) {
  .sl-rows .sl-prep-h { flex-wrap: wrap; }
  .sl-rows .sl-prep-h > .sl-stack { display: none; }
}

/* Meetings / week grid — soil/web/templates/calendar.html -- The single worst thing left on this screen. A 30-minute block is 6% of the 374.4px day
 * body = 22.5px, but legacy.css's `min-height: 1.9rem` (30.4px) inflates it. Measured on
 * /org/demo/calendar: all four 9:30 standups draw y 523.8 → 554.2 while the 10 am
 * gridline is at 542.9, so each overruns its own line by 11.3px; on Monday the standup
 * overlaps the 10 am "Android 3.2 release review" block (top 542.5) by 11.7px and the
 * two read as one merged card. At 22px the chip is 22.5px and the overlap drops to
 * 3.8px. Content fits: 3px padding + a 15px line box + 3px padding = 21px (verified
 * live, scrollHeight == clientHeight, no clipping). */
.cal-slot { min-height: 22px; }

/* Meetings / week grid — soil/web/templates/calendar.html -- 468/9 = 52px an hour, Google Calendar's own week-row height, against today's 374.4/9 =
 * 41.6px. A 30-minute chip becomes 26px instead of 20.8px so it stops needing the min-
 * height clamp at all, and a one-hour chip becomes 52px instead of 41.6px — the tight
 * fit that COMPACT_UNDER_MINUTES was raised to 60 to dodge. Verified live by injecting
 * it (audit/agent/cal-proposed.png): hour lines land at 553.3 / 605.3 / 657.3 / 709.3 /
 * 761.3 / 813.3 / 865.3 / 917.3 / 969.3 and every label still centres exactly on its own
 * line. Apply together with the min-height above — on its own, a 28.1px chip still gets
 * clamped to 30.4px. */
.cal-day-body, .cal-hours-body { min-height: 468px; }

/* Meetings / week grid — soil/web/templates/calendar.html -- Today's column is not marked at all in light mode. legacy.css sets `var(--page-bg)`,
 * which in the current token set computes to rgb(255, 255, 255) — identical to the
 * rgb(255, 255, 255) card it sits on. Measured on Friday 9 (the is-today column):
 * background rgba identical to its four neighbours. Dark mode happens to work only
 * because --page-bg differs there. With --bg-subtle the column measures rgb(242, 244,
 * 247) against the white surface — visible in audit/agent/cal-proposed.png, and Google
 * Calendar tints today's column the same way. */
.cal-day.is-today { background: var(--bg-subtle); }

/* Meetings / week grid — soil/web/templates/calendar.html -- Below 900px `.cal-grid` switches to `min-width: 640px` and scrolls, so a day column is
 * a fixed 116.4px whatever the viewport (measured at 390). Inside it: 16px padding +
 * "9:30 am" at 41.5px + the 5px gap + the 12px platform mark leaves 42px, and "Standup"
 * needs 47.8px — so every compact chip at 390 renders "9:30 am St…" (see
 * audit/agent/cal-390.png). Hiding both gives the title 100px. This is the same rule
 * soil.css already applies to 3-up and 4-up columns at desktop, extended to the one
 * width where even a 1-of-1 column is narrow; the template cannot express it because it
 * keys on slot.columns, not pixels. */
@media (max-width: 900px) {
  .cal-slot .cal-slot-when,
  .cal-slot .cal-slot-app { display: none; }
}

/* /org/demo/customers — soil/web/templates/customers.html -- THE ONE REAL DEFECT LEFT, AND IT IS TWO LINES. `.cust-plain .sl-cust` (soil.css:2648)
 * has no media query, so at specificity 0,2,0 it beats soil.css's own `@media (max-
 * width: 900px) { .sl-cust { ... } }` (line 846, 0,1,0) and keeps a 14px chevron track
 * whose content is `display: none` at that width — 28px of the row spent on nothing.
 * Measured at 390 today: row content box 272px, tracks 32 | 69 | 115 | 14 with 3x14px
 * gaps, so the name track is 69px while "Harbour Logistics" needs 109px (overflows by
 * 40) and "harbourlogistics.example" needs 134px (overflows by 65). All four names and
 * all four domains ellipsise: the list reads "Crestline...", "Harbour ...",
 * "Northwin...", "Vantage S...". I rendered the rule above against the live page (routed
 * soil.css through Playwright; screenshot at audit/agent/cust-390-with-request.png) and
 * measured the result: name track 226px, name overflow 0 and subtitle overflow 0 on all
 * four rows, rows a uniform 76px, pills all starting at x=105 so they align to the name
 * column, documentElement.scrollWidth still 390. Nothing in customers.html can reach
 * this — the class it owns is the cause. NOTE: the general `.sl-cust` at <=900 has the
 * same squeeze (name track would be 97px, still 37px short), so scoping these same two
 * declarations to `.sl-cust` instead of `.cust-plain` would fix every screen that uses
 * the macro; I measured only the `.cust-plain` form. */
@media (max-width: 560px) {
  .cust-plain .sl-cust { grid-template-columns: 32px minmax(0, 1fr); row-gap: 4px; padding: 9px 10px; }
  .cust-plain .sl-cust > .sl-pill { grid-column: 2; }
}

/* Today -- Measured at 1440 on /org/demo: every card on Today ends 13px below its last child
 * (12px `.sl-card` padding-bottom + 1px border) EXCEPT Agents, which ends 21px below it,
 * because `.sl-note { margin: 0 0 var(--space-2) }` survives on the card's last child.
 * Agents is one of the three cards in `.sl-today-b` and the only one of the three whose
 * content does not stop flush — 8px of dead space its two neighbours do not have. This
 * is the card's own bottom padding, not the gap between cards. It also now covers three
 * more feet on this screen that end on an `sl_note` after this pass (Held back from you,
 * Last week, What changed when something is muted), and any card anywhere that ends on
 * `.sl-note` or a bare `<p>` (legacy's `p { margin: 0 0 var(--space-3) }` makes that one
 * 24px, double). I could not work around it inside home.html: there is no existing class
 * that zeroes a trailing margin, and inventing one is a CSS change. */
.sl-card > *:last-child { margin-bottom: 0; }

/* Team detail — /org/demo/teams/{team_slug} -- `.sl-note` carries `margin: 0 0 var(--space-2)`. As the last child of `.sl-approw-t`
 * that puts 8px of dead space inside every person row below the work line. Measured at
 * 1440: the row box is 106px tall with the text cell inset 12px top and 12px bottom, but
 * the last glyph sits 20px above the row's bottom edge and only 12px below its top — an
 * 8px optical asymmetry on every row in "Who's working on what". */
.sl-approw-t > .sl-note { margin-bottom: 0; }

/* Team detail — /org/demo/teams/{team_slug} -- `.sl-note` is capped at `max-width: 68ch` (= 428px CSS at 12.5px). The work line in a
 * person row is a meta line, not prose: measured at 1440 the row's text column is 940px
 * wide, so "#58 APP-501 settings page refactor · acme/mobile-app · open 7 days · 1
 * reviewer requested" wrapped after "1 reviewer" and left "requested" orphaned on its
 * own line with 512px of empty row to its right. Same thing on every "Needs attention"
 * row with its baseline sentence. The 68ch measure is right for `.sl-note` as prose and
 * wrong for it as a row's second line. */
.sl-approw-t > .sl-note, .sl-rrow > .sl-note { max-width: none; }

/* Team detail — /org/demo/teams/{team_slug} -- `.sl-rrow` places only `.sl-btn` in its action track (`grid-area: 1 / 3`). A trailing
 * cell that is a pill, or a pill plus a form, auto-places instead: at 1440 it lands at
 * 1/3 by luck, and at 390 — where the rule drops the grid to `18px minmax(0,1fr)` — it
 * lands at row 2 / column 1, i.e. under the 18px mark and left of the text it belongs to
 * (measured: pill at x=125 against a text column starting at x=79). I worked around it
 * by using `.sl-approw` for the people rows, which already has the responsive action
 * cell, but `.sl-rrow` is the row any screen reaches for first and it currently only
 * works when the action is literally one `.sl-btn`. */
.sl-rrow > .sl-actions { grid-area: 1 / 3; justify-self: end; align-self: start; }
@media (max-width: 560px) { .sl-rrow > .sl-actions { grid-area: 2 / 2; justify-self: start; } }

/* /org/demo/track-record — `soil/web/templates/track_record.html` -- Row content is inset 2px from its own card's content edge, on every row of both lists
 * on this page. Measured at 1440: .sl-fcrow-t x=284.0 and .sl-fcrow-d right=1015.0,
 * against .sl-card-h x=282.0/right=1017.0 and .sl-disclose > summary
 * x=282.0/right=1017.0 in the same card. The 2px is horizontal padding on .sl-fcrow
 * (soil.css:2734); dropping it to 0 puts the release name on the same left edge as the
 * card title and the date column on the same right edge as the disclosure summary.
 * Nothing in .sl-fcrow draws a focus ring or background that needs the inset. This also
 * affects the handoff list on this screen and the backtest example rows. */
.sl-fcrow { padding: 10px 0; }   /* was: padding: 10px 2px */

/* /org/demo/track-record — `soil/web/templates/track_record.html` -- OVERLAPPING TEXT at 390 — the pill is printed on top of the date on all three backtest
 * example rows. The ≤640px block (soil.css:2846) gives .sl-fcrow-wide `grid-template-
 * columns: auto minmax(0,1fr)` and puts the pill and the date on one shared line, but
 * both are `white-space: nowrap`: "Slipped, as Soil warned" is 145.7px and "Flagged 24
 * Aug 2026 · 8 days" is 169.3px, 315px of content in 288px of track. Measured at 390:
 * row5 pill 51.0..196.7 vs date 169.7..339.0 = 27.0px overlap; row6 21.1px; row7 26.3px.
 * The narrow .sl-fcrow rows on the same page are fine (68.5..105.9px of clearance)
 * because their pill is only 90.5-122.3px — it is specifically the -wide variant that
 * cannot hold two nowrap strings on one mobile line, so it needs its own stacked rows. */
@media (max-width: 640px) {
  .sl-fcrow-wide { grid-template-columns: minmax(0, 1fr); }
  .sl-fcrow-wide .sl-fcrow-p { grid-area: 2 / 1; justify-self: start; }
  .sl-fcrow-wide .sl-fcrow-d { grid-area: 3 / 1; justify-self: start; text-align: left; }
  .sl-fcrow-wide .sl-fcrow-w { grid-area: 4 / 1; }
}

/* /org/demo/track-record — `soil/web/templates/track_record.html` -- Two sibling pairs inside the backtest card touch with zero gap. Measured at 1440:
 * ul.sl-countlist bottom 1797.9 / p.sl-note top 1797.9 (the "Median 4 days between
 * Soil's first warning and the thing resolving" line runs straight into "25 not resolved
 * yet" above it), and ul bottom 2102.0 / p top 2102.0 ("Open the full backtest report
 * ->" sits flush on the last example row, so that card does not look like it ends).
 * Every other sibling pair in the same card is 8.0px or 12.0px. One rule fixes both. It
 * is safe for the rest of this page: the lists in "Where each release stands now",
 * "Handed to a coding agent" and "Every prediction" are each followed by a <details>,
 * not a <p>. */
.sl-card > ul + p { margin-top: var(--space-2); }

/* /org/demo/track-record — `soil/web/templates/track_record.html` -- Optional, and only if you want a proper home for the pattern — I already fixed the 0px
 * gap under the "Every prediction" filter row inside my own file by making the group a
 * <p> (base p margin-bottom is 12px, which equals var(--space-3) and equals the 12.0px
 * .sl-card-h already puts under a card title). A real class would let the row be a flex
 * container with a 6px gap instead of relying on inter-anchor whitespace, and would let
 * the group go back to being a <div>. Do NOT apply this without also changing
 * track_record.html — a class a template writes with no rule behind it fails
 * tests/test_sl_components.py::test_every_sl_class_a_template_writes_is_styled, which is
 * why I could not add it myself. */
.sl-tabrow { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: var(--space-3); }

/* Cash leaks — http://127.0.0.1:8000/org/demo/cash-leaks -- The previous agent filed this and it is still unapplied, so I re-measured it rather
 * than repeat the claim. `.money-row-b > p` (specificity 0,1,1) beats `.money-prov`
 * (0,1,0), so EVERY provenance line on the screen computes to fontSize 12.5px / color
 * rgb(74,80,96) — identical to the fact above it. Affected and measured: the four cost-
 * source caveats, the Figma seat-price line, the finding status note. In "Where Soil
 * gets cost data" the two lines of every row are pixel-identical in size and colour, so
 * a source's caveat reads as a second fact. I could NOT work around it in my file: the
 * only escape from that selector is a non-<p> element, and `<small class="money-prov sl-
 * note">` picks up `.sl-note`'s `margin: 0 0 8px` (which `.money-row-b > p { margin: 0
 * }` currently kills), adding 8px of trailing air below the last row of every card —
 * trading a weight bug for the uneven-spacing bug the user has complained about twice.
 * The rule above is the whole fix. */
.money-row-b > p.money-prov { font-size: 11.5px; line-height: 17px; color: var(--text-faint); }

/* Cash leaks — http://127.0.0.1:8000/org/demo/cash-leaks -- legacy.css's bare `label { display: block; ...; margin-bottom: var(--space-2) }`
 * applies to `.sl-field`, which IS a <label>, and soil.css's `.sl-field` rule never
 * resets it — the exact 'legacy styles bare tags, the system styles classes' case as
 * commit 33af543. Measured at 1440 in the first finding's `.money-act` (which correctly
 * computes `align-items: flex-end`): the field's border box is top 667.5 / bottom 725.5,
 * the button beside it is top 697.5 / bottom 733.5. Flex-end aligns the MARGIN boxes, so
 * every submit button sits exactly 8px below the control it belongs to. That is 8
 * buttons across the four finding cards and 15 more inside the five vendor editors, and
 * it is the most visible misalignment left on the screen. No template workaround exists
 * — `sl_field` renders the label and inline style= is dead under the CSP. */
.sl-field { margin-bottom: 0; }

/* Cash leaks — http://127.0.0.1:8000/org/demo/cash-leaks -- The upload card's rhythm, measured as element tops/bottoms. At 1440 every join inside
 * the card is 12px (header->form 12, hint->label 12, label->rows 12) EXCEPT form->hint,
 * which is 0 — it only looks like 8px today because of the stray `.sl-field` margin in
 * the request above, so applying that one alone makes this collision visible at 1440
 * too. At 390 it is already visible: the stacked fields sit 20px apart, then `.sl-
 * formrow > .sl-btn { margin-top: 24px }` (soil.css:1997, a desktop label-height hack
 * that does not switch off when the row wraps) opens a 44px hole above "Read this file",
 * and the retention hint then starts at exactly the button's bottom edge — 0px, text
 * touching a black button. Sequence measured at 390: 20 / 20 / 44 / 0 against a 12px
 * card rhythm. */
.sl-card > form { margin: 0 0 var(--space-3); }
@media (max-width: 640px) { .sl-formrow > .sl-btn { margin-top: 0; } }

/* Cash leaks — http://127.0.0.1:8000/org/demo/cash-leaks -- The one unthemed control on the screen and the only light-mode artifact in dark mode.
 * The hand-rolled file input (kept on purpose: neither `field` nor `sl_field` can render
 * one) shows the browser's native `::file-selector-button`, which paints a light-grey 3D
 * button with black text and white "No file chosen" text INSIDE a dark bordered field at
 * 1440 --dark. In light mode it is merely undesigned next to two design-system selects.
 * Nothing in the template can reach a ::file-selector-button pseudo-element. */
.sl-field input[type="file"] { height: auto; padding: 7px 10px; font-size: 12.5px; }
.sl-field input[type="file"]::file-selector-button { height: 24px; margin-right: 10px; padding: 0 10px; border: 1px solid var(--line-control); border-radius: var(--radius-sm); background: var(--bg-subtle); color: var(--ink); font: inherit; font-size: 12px; cursor: pointer; }

/* Cash leaks — http://127.0.0.1:8000/org/demo/cash-leaks -- `.sl-disclose-b` is a flex column with `align-items: flex-start` and no measure on its
 * children, so prose inside a disclosure sets itself across the whole card while the
 * same prose one level up is capped at 68ch. Measured at 1440 before my fix: the cloud-
 * spike citation line 1063px, the unused-seats roster 1063px, against the 536px (68ch)
 * the same stylesheet calls the measure. I worked both around with `sl-note` plus a
 * <span> wrapper; this rule would let the wrapper go and would also catch the reasons
 * <ul>, which `sl-note` cannot be used on (flex would destroy the list) and which is
 * still uncapped. */
.sl-disclose-b > p, .sl-disclose-b > ul, .sl-disclose-b > ol { max-width: 68ch; }

/* Cash leaks — http://127.0.0.1:8000/org/demo/cash-leaks -- At 390 the StatCard's header link wraps onto a line of its own: `.sl-card-h` measures
 * 70px tall (23px at 1440), with "See the items ->" sitting 26px below "Leaking each
 * month" and right-aligned against nothing, then the figure 6px under that. The link
 * reads as a stray floating control and pushes Rs 2,04,571.46 — the one number the
 * screen exists to show — 36px further down the first screen. "Leaking each month" +
 * "See the items ->" is 38 characters and fits on one 342px line at 13px/12.5px with the
 * gap above. */
/* REVISED 2026-10-10. The rule as requested forced `flex-wrap: nowrap` here to stop the
 * header link dropping onto its own line. It did stop that, by pushing the link out of
 * the card entirely: measured at 390, the header ended at x=341 and the link ran
 * 349..450, taking the whole page 60px wide on Revenue at risk and 57px on Cash leaks.
 * The request was checked against the card and not against the page.
 *
 * A link on its own line is the lesser evil, so the header wraps. The link keeps
 * `white-space: nowrap` -- "See the items" broken across two lines is worse than a
 * second row -- but it is allowed to shrink so it can never be the thing that widens
 * the document. */
@media (max-width: 560px) {
  .sl-stat-card .sl-card-h { flex-wrap: wrap; gap: var(--space-2); min-width: 0; }
  .sl-stat-card .sl-card-h .sl-h-sm { min-width: 0; }
  .sl-stat-card .sl-card-h .sl-link { flex: 0 1 auto; min-width: 0; white-space: nowrap; }
}

/* /org/demo/agents — soil/web/templates/agents.html -- soil.css:1042 `.sl-card > p, .sl-card > div > p, .sl-note { max-width: 68ch }` also
 * matches the risk-flag reason, because `.sl-flagrow` IS a direct child div of `.sl-
 * card`. Measured at 1440 on /org/demo/agents: the reason <p> is capped at 536px inside
 * a grid column that is 781px wide (its own <b> measures 781). Two of the eight flags
 * wrap to a second line at 536px and fit on one at 781px — PLAT-124's reason runs
 * ~621px, WEB-135's ~610px. Row heights today, top to bottom: 86 / 67 / 67 / 67 / 66 /
 * 67 / 67 / 86. With the cap off all eight are 67px and the card goes 636px -> ~598px.
 * 68ch is a prose measure; this is a one-line metadata row whose grid column already
 * caps it. I cannot work around it in the template: dropping the <p> for a <div> would
 * lose `.sl-flagrow > p`'s grid-area 2/1 placement. */
.sl-flagrow > p { max-width: none; }

/* /org/demo/agents — soil/web/templates/agents.html -- Each agent carries a <details> whose summary reads 'Open', in a band of its own under
 * the row. Measured at 1440: `[data-agent]` = 112px (`.sl-agent` 80px + summary 32px),
 * x9 = 1008px of list for 720px of rows — 288px of the card spent on the word 'Open'
 * nine times. It is a SECOND affordance for one action: `sl_agent_row` already draws a
 * chevron at x=1352 with a hover translate, and agents.js opens that same <details> from
 * a click anywhere on the row. The summary is still the only keyboard way in, so the
 * rule keeps it focusable and brings it back at full size on focus and while open. I
 * already put `sl-disclose-quiet` on the element in agents.html, so this lands with no
 * template change. Note I could NOT instead make the summary carry the schedule: a
 * <summary> counts as visible on load and
 * tests/test_web_agents_page.py::test_the_approval_screen_stays_under_its_prose_budget
 * measured that at 446 words against its 430 ceiling (nine schedules plus nine 'Never
 * run's). CSS is the only lever here that costs no words. */
.sl-disclose-quiet > summary { height: 0; min-height: 0; padding: 0; overflow: hidden; color: transparent; }
.sl-disclose-quiet > summary::before { display: none; }
.sl-disclose-quiet[open] > summary,
.sl-disclose-quiet > summary:focus-visible { height: auto; min-height: 32px; color: var(--text-3); overflow: visible; }
.sl-disclose-quiet[open] > summary::before,
.sl-disclose-quiet > summary:focus-visible::before { display: block; }

/* /org/demo/agents — soil/web/templates/agents.html -- At 390 the Running/Paused pill on every agent row renders as a 67x44 filled grey
 * block. Source is legacy.css's `@media (max-width: 900px) {
 * ...button:not(.citation):not(.skeleton)... { min-height: 44px } }` — the pill is a
 * real <button> here (it carries toggle_url), so the 44px TAP TARGET is correct, but it
 * is applied to the painted box, so an 11.5px label inflates from --pill-height 22px to
 * 44px. Knock-on: `.sl-agent-n` grows 22px -> 44px (measured 222x44 at y 968–1012) while
 * the 32px logo stays centred on the whole 83px row at y 994, i.e. 16px below the name
 * it labels. The rule above keeps a 44px-tall hit area as an unpainted ::after and
 * restores the 22px paint. I own neither legacy.css nor soil.css, and there is no
 * template-side workaround — the pill is drawn inside `sl_agent_row`. */
@media (max-width: 900px) {
  .sl-agent-n > .sl-pill { min-height: var(--pill-height); height: var(--pill-height); position: relative; }
  .sl-agent-n > .sl-pill::after { content: ""; position: absolute; inset: -11px -4px; }
}

/* http://127.0.0.1:8000/org/demo/meetings -- The one defect visible on every row at 1440 that no markup in meetings.html can reach.
 * The disclosure sits 54px left of the title it opens; six carets line up inside the
 * time-tile column instead of under the meetings. Every in-file workaround either nests
 * <details> inside `.sl-prep-t` (which is a <span>, and `.sl-prep-h`'s align-
 * items:center would then float the 46px tile in the middle of a 300px-tall open prep)
 * or costs the right-aligned faces column. `.sl-disclose-in` (66px) and `.sl-disclose-
 * sm` (44px) already exist but are cut for `.sl-conn` and `.sl-agent`; 66px would be a
 * 12px near-miss, which reads worse than the deliberate flush column it has now. */
/* meetings.html: the prep disclosure belongs to the meeting, not to the time column.
 * The row is a 46px `.sl-prep-when` tile + the 8px gap `.sl-prep-h` inherits from
 * `.sl-actions`, so the meeting's text column starts 54px in. Measured at 1440: the
 * title is at x=336 and the <summary> at x=282, flush under the tile, so the caret
 * reads as a left rail under the row rather than as part of it. Confirmed by eye
 * with the rule injected: audit/agent/rev-1440-disclose-proposed.png. */
.sl-rows .sl-prep-h + .sl-disclose { margin-left: 54px; }

/* http://127.0.0.1:8000/org/demo/meetings -- Measured with the rule injected at 390 (audit/agent/rev-390-proposed.png): one
 * <article> goes from 205px to 158px, the tile and the text share line 1 (tile x=49
 * y=1267, text x=103 y=1242, text column 170px), and the stack drops to line 2 at x=281.
 * 47px x 6 rows = ~280px of card height recovered, and the 46px black square stops
 * having a whole line to itself. Scoped to <=560px so the 1440 layout (text column
 * shrink-to-fit, pill after the title, faces at the card's right edge x=1365) is
 * untouched. */
/* meetings.html at phone width: the meeting row folds to two lines, not four.
 * `.sl-prep-h` is nowrap, right for the 333px rail it was drawn for and wrong for a
 * row that also carries a pill and a face stack, so this screen rides `.sl-actions`
 * for flex-wrap. Wrapping is decided on the item's CONTENT size, and the text
 * column's max-content (~420px) exceeds the 238px left beside the tile, so the 46px
 * tile wraps onto a line of its OWN with ~250px of nothing beside it, and
 * `.sl-stack`'s margin-left:auto then strands the faces on a third, right-aligned
 * line. Giving the text column a zero basis stops it forcing that break. */
@media (max-width: 560px) { .sl-rows .sl-prep-h > .sl-prep-t { flex: 1 1 0; } }

/* http://127.0.0.1:8000/org/demo/meetings -- This is the proper fix for the 26px of left-edge drift I worked around by wrapping
 * each <ol> in a bare <div> in meetings.html. With this rule in soil.css those three
 * wrapper <div>s come straight out of the template, and any other screen that puts `.sl-
 * prep-facts` inside `.sl-disclose-b` gets it right without the same trick. Verified
 * equivalent: with the wrapper, ol x=302 and the number track at 310, and all eleven
 * child y-positions in the prep body are unchanged. */
/* `.sl-disclose-b > ul, .sl-disclose-b > ol { padding-left: 18px }` is the
 * browser-marker indent for a plain list inside a disclosure. It also catches
 * `.sl-prep-facts`, whose own rule says `padding: 0` and loses on specificity --
 * (0,1,1) against (0,1,0). Measured at 1440 in meetings.html: every other child of
 * the prep body starts at x=302 (the violet section labels, the guest chips, the
 * paragraphs, the button) and the numbered squares started at x=328. */
.sl-disclose-b > ol.sl-prep-facts { padding-left: 0; }

/* http://127.0.0.1:8000/org/demo/meetings -- Lowest priority of the four, and strictly a refinement: the rhythm IS equal, which is
 * what the user asked for, but equal everywhere means the four section labels (WHO IS
 * ATTENDING / WORTH RAISING / WHAT IS OPEN WITH THEM / LAST TIME WITH THESE PEOPLE) do
 * not bind to their own content. Visible in audit/agent/rev-facts2-crop.png: the
 * footnote 'Worded from the facts below, and nothing else.' reads as belonging to WHAT
 * IS OPEN WITH THEM rather than closing the list above it. No markup in meetings.html
 * can add the 8px (no inline style, and wrapping a section makes the gap worse, not
 * better). */
/* A section label groups with what is UNDER it. `.sl-disclose-b`'s uniform
 * `gap: var(--space-2)` puts every child exactly 8px from its neighbours, so a
 * `.sl-prep-k` eyebrow sits as close to the paragraph above it as to its own
 * content -- measured in meetings.html's open prep, all eleven consecutive child
 * gaps are 8px, including chips->WORTH RAISING and 'Worded from the facts
 * below'->WHAT IS OPEN WITH THEM. 16 above / 8 below is the normal reading. */
.sl-disclose-b > .sl-prep-k { margin-top: var(--space-2); }
.sl-disclose-b > .sl-prep-k:first-child { margin-top: 0; }

/* /org/demo/calendar -- This is the defect the user screenshotted twice: the gridlines do not mean anything
 * while a 30-minute block is drawn 11.3px past its hour line and over the next meeting.
 * 9.6px of the 11.3 is this min-height mismatch alone; the remaining ~1.7px is the
 * 1%-step rounding (see `remaining`). Both files are outside my ownership and there is
 * no template workaround -- the CSP refuses `style=` and the height classes are a closed
 * set. */
/* --- the week grid: a 30-minute meeting must FIT INSIDE its half hour ----------
 * Measured at 1440: `.cal-day-body` is 23.4rem/374.4px for nine hours, so an hour
 * band is 41.6px and a half hour is 20.8px -- while `.cal-slot` carries
 * `min-height: 1.9rem` (30.4px, legacy.css line 11122). Monday's 9:30 standup is
 * therefore drawn from y=523.8 to y=554.2: 11.3px PAST the 10 am line at y=542.9,
 * and on top of the 10 am "Android 3.2 release review" whose own top is y=542.5.
 * The two read as one violet block. The same overrun is on all five 9:30 standups
 * (Mon-Fri), i.e. every short meeting in the week crosses the hour line below it.
 * 52px an hour is Google Calendar's own default scale and makes the block floor
 * exactly one half hour. */
.cal-day-body, .cal-hours-body { min-height: 29.25rem; }   /* 468px: 52px an hour */
.cal-slot { min-height: 26px; }                            /* exactly a half hour */

/* /org/demo/calendar -- Hour labels aligned to their lines was explicitly on the brief; nine are and one is
 * not, and the one that is not is the last thing the eye lands on leaving the grid. Side
 * effect to accept: today's column tint stops 7px above the card's bottom border. */
/* The closing hour label is the only one of the ten not on its line. Measured: the
 * nine `.cal-hour-l` labels centre at 501.3 / 542.9 / 584.5 / 626.1 / 667.8 / 709.3
 * / 751.0 / 792.5 / 834.1, each within 0.1px of its `.cal-rule`; "6 pm" centres at
 * 867.7 against the body's bottom line at 875.7 -- 8.0px high. It cannot simply be
 * centred where it is: `.cal-grid` has `overflow: hidden` and that line IS the
 * card's bottom border, so half the label would be clipped. 7px of padding is half
 * the label's 14px line box, and `overflow: hidden` clips at the PADDING edge, so
 * the label fits. */
.cal-grid { padding-bottom: 7px; }
.cal-hour-end { top: auto; bottom: 0; transform: translateY(-50%); }

/* /org/demo/calendar -- The only thing on the card that opens looks exactly like the things that do not. I
 * worked around it in wording ("Why ..."), which helps but is not an affordance. */
/* A <details> summary that is `display: flex` (legacy.css line 11331) loses its
 * ::marker in Chromium and WebKit both, so "Why moving it needs a reconnect" and any
 * other disclosure on this screen render as plain sentences with no affordance. */
.cal-blocked > summary { gap: 6px; }
.cal-blocked > summary::before { content: ""; flex: 0 0 auto; width: 6px; height: 6px;
  border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
  transform: rotate(-45deg); transition: transform .15s; }
.cal-blocked[open] > summary::before { transform: rotate(45deg); }

/* /org/demo/calendar -- The only text on this screen that wraps where the design expects one line, and it is
 * the row that carries the "outside your company" claim. */
/* "Who's coming" on a phone: the pill and the name fight for one line. Measured at
 * 390: the row is 292px, and the 24px avatar + 12px gap + the 141.7px "Outside your
 * company" pill + its 12px gap leave the name 102.3px, so "kartik.malhotra177"
 * (118px at 13px) breaks mid-token and the row grows from 53.6px to 74px. Below the
 * name is where the marker belongs on a narrow screen; 36px is the avatar plus its
 * gap, so it lines up with the name above it. */
@media (max-width: 560px) {
  .cal-person { flex-wrap: wrap; }
  .cal-person > .sl-pill { margin-left: 36px; }
}

/* /org/demo/calendar -- Seen in audit/agent/cal-final-dark.png: the column Soil is telling you is TODAY is the
 * least present thing in the grid. */
/* Today's column reads as a HOLE in dark. legacy.css paints it `var(--page-bg)`,
 * which in dark (#0E1116-ish) is darker than the card it sits in, so Friday is the
 * one black column in a grid of grey ones -- "switched off" rather than "today".
 * `--bg-subtle` is #F2F4F7 light (the same quiet tint it has now) and #22262E dark
 * (raised, not sunken), so one declaration is right in both themes. */
.cal-day.is-today { background: var(--bg-subtle); }

/* /org/demo/calendar -- Lowest priority of the six -- the grouping fix in my file already does most of the
 * work. This is the last 10%. */
/* The week nav belongs at the left of the toolbar and the page actions at its right,
 * which is where Google Calendar keeps them. The two groups now exist in the markup
 * as two `.sl-actions`; at 1440 they occupy x=265-453 and x=469-682 with 402px of
 * empty toolbar to the right of them. Not below 761px, where `.cal-top-right` wraps
 * and a right-aligned group would float away from everything else. */
@media (min-width: 761px) {
  .cal-top-right > .sl-actions + .sl-actions { margin-left: auto; }
}

/* Revenue at risk — /org/demo/revenue-at-risk -- At 390 the card's content box is 292px and `.money-rows`' `max-content` second track
 * takes 185px of it (measured `grid-template-columns: 107.281px 184.719px`), leaving the
 * name 99px -- about 12 characters. `.money-row-h` is then 88px tall on five rows and
 * 119px on two (22px at 1440), i.e. 'Northwind Retail — 120 seats' + its pill over four
 * to five lines. `.money-row` is already `grid-column: 1 / -1`, so a one-track parent
 * needs no other change; `.money-row-b` is `1 / -1` and lands in the same track. Order
 * becomes name, amount, reason, which is the reading order. 560px because the two tracks
 * still fit at 600px. No horizontal overflow exists today (scrollWidth 390 =
 * clientWidth) -- this is wrapping, not overflow. */
@media (max-width: 560px) {
  .money-rows { grid-template-columns: minmax(0, 1fr); }
  .money-row-f { grid-column: 1; justify-self: start; text-align: left; }
}

/* Revenue at risk — /org/demo/revenue-at-risk -- legacy.css:776 styles the bare tag -- `label { display: block; ... margin-bottom:
 * var(--space-2) }` -- and `.sl-field` is a `<label>`, so every field carries an 8px
 * bottom margin the design system never asked for. `.money-act` is `align-items: flex-
 * end`, which aligns MARGIN boxes, so on all 7 rows the select/input bottom is at y=664
 * and the button it belongs to is at y=672: the buttons sit 8px below their own
 * controls, measured at 1440, and visibly so in both light and dark. cash_leaks.html's
 * `.money-act` has the identical bug. Scoped to `.money-act` rather than `.sl-field`
 * because other screens' stacked forms may be leaning on the leaked 8px. */
.money-act .sl-field { margin-bottom: 0; }

/* Revenue at risk — /org/demo/revenue-at-risk -- `.money-row-b > p` (specificity 0,2,1) sets `color: var(--text-3); font-size: 12.5px`
 * and beats `.money-prov` (0,1,0), so `class="money-prov"` on a paragraph inside a money
 * row is inert. Measured in the stubbed 'Links to confirm' render: the matched item, the
 * match rationale and the rename footnote all come out at 12.5px/--text-3, which is the
 * one-weight stack the card was supposed to stop being. cash_leaks.html's `<p
 * class="money-prov sl-note">` status note has the same dead class. The `<span
 * class="money-prov">` inside a reason `<li>` works today only because the li rule does
 * not target the span. */
.money-row-b > p.money-prov { color: var(--text-faint); font-size: 11.5px; }

/* Today — http://127.0.0.1:8000/org/demo -- The single most visible unequal sizing on Today, and the user has complained twice
 * about unequal spacing between boxes. `.sl-att-row` already declares `grid-template-
 * columns: repeat(3, minmax(0px, 1fr))` but computes `display: flex`, so the declaration
 * is inert and the five cards wrap 3 + 2. Measured at 1440 on /org/demo: cards 1-3 are
 * 261px wide, cards 4-5 are 400px -- a 139px difference between siblings in the same
 * component. It also changes their interiors: the 261px cards stack "Draft nudge" above
 * "Open the full warning" and "Why am I seeing this?" above "Not useful", while the
 * 400px cards put each pair side by side, so the same card looks like two different
 * components depending on where it landed. With `display: grid` all five are 261px (3 x
 * 261 + 2 x 15px gap = 813 in an 817px row) and the fifth cell stays empty. Gap values
 * untouched -- that part is yours. */
.sl-att-row { display: grid; }

/* Today — http://127.0.0.1:8000/org/demo -- Two defects, one rule. (1) The seven bars on a Company pulse row are "the last seven
 * periods" and no per-area weekly series exists in this schema, so sl_pulse_row is
 * called with level=0 on every row -- all five bars elements on /org/demo carry aria-
 * label "0 of 7". They still render, 37x17px, as an ascending light-grey ramp identical
 * on all five rows, which reads as a seven-period trend chart where there is no series
 * at all. That is the "placeholder that reads as a fact" rule. The template cannot
 * suppress them: sl_pulse_row draws them unconditionally and level is the only lever.
 * (2) The row's computed grid is `17px 82px 95px 43px 14px` with a 12px gap in a 299px
 * row, so the name column is a hard 82px: "acme/mobile-app" and "acme/platform-api" wrap
 * to 36px of text inside a 41px row while the other three names are 18px, and the five
 * rows read as ragged. Hiding the dead bars frees exactly 55px (43px column + 12px gap),
 * which takes the name column to ~137px -- enough for "acme/platform-api" (~118px at
 * 0.92rem) on one line. */
.sl-pulse .sl-bars[aria-label^="0 of "] { display: none; }
.sl-pulse { grid-template-columns: 17px minmax(82px, 1fr) 95px 43px 14px; }
.sl-pulse:has(.sl-bars[aria-label^="0 of "]) { grid-template-columns: 17px minmax(82px, 1fr) 95px 14px; }

/* Today — http://127.0.0.1:8000/org/demo -- Company pace's four rows do not share a grid, so labels and values do not line up down
 * the card. `minmax(104px, auto)` lets every row size its own figure column to its own
 * widest child. Measured computed columns at 1440 on /org/demo: row 1 "Review time"
 * 165.16px / 121.84px; row 2 "Cycle time" 112.53 / 174.47; row 3 "Merged per week"
 * 113.53 / 173.47; row 4 "Incidents" 112.36 / 174.64. Two consequences on screen: the
 * figure column's left edge jumps 52px between row 1 and row 2, and the three delta
 * pills stacked down the card start at x=1215, x=1216 and x=1214 -- a 2px ragged left
 * edge on three elements that should be one column. 175px is the widest pill measured
 * ("▲ 2.0 worse than last month"). Trade-off you should know before applying: at 175px
 * the label column becomes 112px for every row, and "Median wait to merge" (165px at
 * 0.8rem, one line today after my fix) would wrap to two. If that is not acceptable the
 * alternative is to let the delta pill take its own grid row spanning both columns,
 * which needs a markup change I will make in home.html on request. */
.sl-today-r .normal-row2 { grid-template-columns: minmax(0, 1fr) 175px; }

/* Team detail — soil/web/templates/team_detail.html -- Every multi-clause work line on this screen breaks mid-phrase and leaves one orphan
 * word on line 2 ("…1 reviewer / requested", "…no reviewer requested / yet", "…last
 * update / 10 days ago"). MEASURED at 1440 on /org/demo/teams/app: the `.sl-approw-t`
 * text cell is 917-929px wide, and the note inside it is capped at 536.23px by `.sl-note
 * { max-width: 68ch }` (line 1042) — so it wraps with 393px of its own cell unused. 68ch
 * is the right measure for a paragraph; this is a single metadata line inside a row grid
 * that already has `minmax(0, 1fr)` doing the constraining. With the cap off, Meera's
 * row goes from 106px to 87px and matches the other four. */
.sl-approw-t > .sl-note { max-width: none; }

/* Team detail — soil/web/templates/team_detail.html -- `.sl-approw { align-items: center }` centres the 32px avatar on the whole text block,
 * so on a three-line row it sits beside line 2 and not beside the name it identifies.
 * MEASURED at 1440 on /org/demo/teams/app, Meera's 106px row: avatar top 860, name top
 * 835 — the mark is 25px below the name. On the one-line rows it is 15px below. This is
 * the same escape `.sl-rrow > .sl-logo` already has. If it must not change Connections'
 * own `.sl-approw` rows, a `.sl-card .sl-approw > .sl-avatar` scope or a modifier class
 * works equally — say which and I will add the class. */
.sl-approw > .sl-avatar { align-self: start; }

/* Team detail — soil/web/templates/team_detail.html -- The one gap on this page that is not 16px. legacy.css:8270 gives `.team-switcher`
 * `margin-top: var(--space-3)` (computed 12px, confirmed in the browser), and `.sl-
 * page`'s grid gap adds to it, so the headline-to-switcher gap measures 28 where every
 * other gap on the page measures 16. soil.css loads after legacy.css, so this one line
 * fixes it without touching legacy. Measured on acme-mobile-app, api and acme-web at
 * both 1440 and 390 — same 28 everywhere. */
.sl-page > .team-switcher { margin-top: 0; }

/* Team detail — soil/web/templates/team_detail.html -- `.sl-disclose-b` is `display: flex; flex-direction: column; align-items: flex-start`
 * (line 1925), so each `.sl-formrow` shrinks to its own content and `.sl-formrow > .sl-
 * field { flex: 1 1 11rem }` never gets a width to grow into. MEASURED at 1440 with the
 * admin disclosure open on /org/demo/teams/acme-mobile-app: the two selects are 195px
 * and 229px wide, left edges both x=302, right edges x=497 and x=531 — 34px of
 * misalignment between two controls stacked 58px apart. 320px clears the widest option
 * label ("acme/platform-api", 229px intrinsic) and lands both right edges on x=622. */
.sl-disclose-b > .sl-formrow { align-self: stretch; }
.sl-disclose-b > .sl-formrow > .sl-field { flex: 0 1 320px; }

/* Two overflow regressions from the per-screen pass, measured at 390px.
 *
 * 1. `.sl-fcrow`'s phone grid is `auto minmax(0, 1fr)`. An `auto` track's floor is its
 *    own content, so a wide pill in column 1 pushed the whole row to 382px inside a
 *    358px column, and `.sl-fcrow-t` (which spans 1 / -1) inherited that width. Track
 *    record overflowed the page by 41px. `minmax(0, auto)` lets the track shrink.
 *
 * 2. Revenue at risk and Cash leaks put a link in `.sl-card-h`, which is `display:flex`
 *    with no wrap. Measured: the header ended at x=341 and its `a.sl-link` started at
 *    x=349 -- the link had already been pushed clean out of its own card, taking the
 *    page 60px and 57px wide. Letting the header wrap is right rather than shrinking the
 *    link: a truncated "See all 12" is not a usable control. */
@media (max-width: 900px) {
  .sl-fcrow { grid-template-columns: minmax(0, auto) minmax(0, 1fr); }
  .sl-card-h { flex-wrap: wrap; row-gap: var(--space-2); }
  .sl-card-h > .sl-link { flex-shrink: 1; min-width: 0; }
}

/* Two more 390px overflows, measured.
 *
 * 1. `.sl-suggest`'s buttons are whole SENTENCES ("Every Monday 9am, find pull requests
 *    waiting..."), and `.sl-btn` is `white-space: nowrap`. Measured: 611px of button
 *    inside a 324px form, taking the page 254px wide. A one-line button is right for
 *    "Save"; this control is a prompt, so it wraps and grows instead. Left-aligned
 *    because centred text over three ragged lines is unreadable.
 *
 * 2. A `.sl-pill` is the last child of a `.sl-card-h` whose line is already full, and
 *    both the pill and the header refuse to give. 9px on Cash leaks. The header wraps;
 *    the pill keeps its own nowrap, since "1 found" broken across two lines is worse
 *    than a second row. */
@media (max-width: 900px) {
  .sl-suggest .sl-btn {
    white-space: normal;
    text-align: left;
    height: auto;
    min-height: var(--control-height, 36px);
    padding-top: 8px;
    padding-bottom: 8px;
  }
  .sl-suggest .sl-btn .sl-btn-t { white-space: normal; }
  .sl-card-h { flex-wrap: wrap; row-gap: var(--space-2); }
  .sl-card-h > .sl-pill { flex-shrink: 0; }
}

/* The organization picker's rows.
 *
 * The screen is a list you choose FROM, so the thing that differs between two rows --
 * your role -- belongs on a common right edge where it can be compared down the column,
 * not trailing each name at a different x. `.sl-nav` is the design system's row and
 * already carries the hover, the radius and the gap; this only moves the trailing meta.
 *
 * Scoped to `.sl-shell` so the sidebar's own `.sl-nav-list` is untouched: there the
 * trailing slot is `.sl-nav-badge`, which has its own `margin-left: auto` already. */
.sl-shell .sl-nav-list > .sl-nav { min-height: 44px; }
.sl-shell .sl-nav-list > .sl-nav > .sl-pill { margin-left: auto; }
.sl-shell .sl-nav-list > .sl-nav > .sl-aside { margin-left: auto; }
.sl-shell .sl-nav-list > .sl-nav > .sl-pill ~ .sl-aside { margin-left: 0; }

/* Two collisions seen on production (org aivetech-cbfe17, real data, 2026-10-10).
 *
 * 1. `.sl-acc` is `position: absolute; right: 16px; top: 24px` -- the StatCard's bars
 *    own the card's top-right corner. `.sl-card-h`'s action link owns the SAME corner.
 *    The design system never has both: its accuracy card carries bars and no header
 *    action. Home passes both (home.html:691, bars= plus action_label="All warnings"),
 *    and the label rendered ON TOP of the bars -- measured 66x34px of overlap, link at
 *    x306-372/y63-107 against bars at x256-372/y73-125.
 *
 *    Dropping the bars below the header when a header link exists keeps both
 *    affordances. 48 + the bars' own 52px height = 100px, inside `.sl-stat-card`'s
 *    117px floor, so the card does not grow.
 *
 * 2. `.sl-pulse` is a grid whose name track is `minmax(82px, 1fr)`, and the name span
 *    had no `min-width: 0`. A grid track's floor is its content, so a long repository
 *    path ("nousonworktechnologies/readme-card-data") refused to shrink and drove
 *    straight through the state pill beside it. The demo org's short team names never
 *    showed it; a real org's repo paths do immediately. */
/* Moving the bars DOWN by a fixed amount does not work, and both failures were
 * measured: at `top: 48px` the bars cleared the link on desktop but then landed on the
 * caption (116x18px), and below 900px legacy.css inflates the link to a 44px tap
 * target, so they still collided there (66x40px). A fixed offset cannot win against
 * content whose height changes with the viewport.
 *
 * So when the card carries BOTH, the bars stop being absolutely positioned and simply
 * flow after the caption, right-aligned. The card grows by the bars' height, which is
 * honest: it is showing one more thing than the design system's version of this card
 * ever does. A card with bars and NO header link is untouched and still uses the
 * design system's absolute placement. */
.sl-stat-card:has(.sl-card-h .sl-link) .sl-acc {
  position: static;
  margin-top: 10px;
  justify-content: flex-end;
}

.sl-pulse > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* A 211-character signed invite token has no spaces, so it overflows its card rather
   than wrapping. Only where a raw token or URL is shown to be copied. */
.sl-breakall { overflow-wrap: break-word; word-break: break-word; }

/* A URL you are meant to copy: the value and its control on one line, in the shape a
   person already knows. The value ellipses rather than wrapping -- a 211-character
   signed token wrapped to three lines is what this replaces -- and carries the full
   string in `title` so it is still readable without copying. */
.sl-copyfield { display: flex; align-items: center; gap: var(--space-2);
  padding: 5px 5px 5px var(--space-3); border: 1px solid var(--line-control);
  border-radius: var(--radius-md); background: var(--bg-surface); }
.sl-copyfield-v { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; font-family: var(--font-mono); font-size: 12.5px; color: var(--text-2); }
.sl-copyfield .sl-btn { flex: 0 0 auto; }
@media (max-width: 560px) {
  .sl-copyfield { flex-wrap: wrap; }
  .sl-copyfield .sl-btn { width: 100%; justify-content: center; }
}

/* The way OUT of a flow, rather than one more choice inside it. */
.sl-btn-wide { width: 100%; justify-content: center; }

/* The same message needs more LINES on a narrow screen, so a fixed `rows` cannot be
   right at every width. Measured on the invite step: 8 rows (170px) holds the content
   at 560px and up, falls 57px short at 430 and 95px short at 390, clipping the last
   lines mid-character.
   `min-height` rather than more rows, because rows would make the control needlessly
   tall on desktop where it already fits. The control stays resizable either way. */
@media (max-width: 559px) { .sl-field textarea { min-height: 275px; } }
@media (max-width: 460px) { .sl-field textarea { min-height: 300px; } }

/* An empty state inside a CARD is not a page-level empty state.
 * `.sl-empty` is the design system's full-page shape: 40px of padding top and bottom
 * around a 36px mark. Inside a card that already has its own title and padding, that
 * is ~260px of height spent saying "no data" -- on Today, where Cash leaks and three
 * others are empty for any org that has not connected those tools, four of those
 * stacked is most of the page.
 * The mark and the wording stay; only the air around them shrinks. */
.sl-card > .sl-empty { padding: var(--space-5) var(--space-4); }
.sl-card > .sl-empty .sl-empty-i { margin-bottom: 2px; }

/* A card is as tall as what is in it.
 * `.sl-today-b` is a grid, and a grid item's default `align-self` is `stretch`, so the
 * three bottom cards all take the height of the tallest. On the demo org they hold
 * 8 / 6 / 6 rows and end up within 2px of each other, which is why this never showed.
 * On a real org with 8 rows of work at risk and 3 agents, the Agents card stretched to
 * match and carried ~250px of white below its last line -- reported, fairly, as looking
 * broken.
 * `start` lets each card end where its content does. The row is then ragged at the
 * bottom, which is the honest shape: these are three different things, not three
 * columns of one table. */
.sl-today-b { align-items: start; }

/* Room under the last thing on the page.
 * The Ask box is a sibling of `.sl-today` rather than a child, so `.sl-today`'s own
 * `padding-bottom: 24px` never applied to it, and `.main-content:has(> .sl-today)` is
 * padding: 0. Measured: the card's bottom edge and the document's bottom edge were the
 * same pixel, so the suggestion chips sat flush against the end of the page with
 * nothing under them. */
main > .sl-ask:last-child { margin-bottom: var(--space-6); }

/* The Razorpay button wraps instead of clipping. The kit's `.btn` is nowrap at a fixed
 * height, and both slots it sits in are fixed widths -- the Team card's footer is 158px
 * at 1440 and the summary row squeezes its button to 101px at 390 -- so a label with a
 * price in it was cut to "₹4,999 with Razo". Measured after this rule: 0 clipped at
 * either width. Scoped to the attribute soil/web/static/razorpay_checkout.js keys on. */
.btn[data-razorpay-pay] {
  white-space: normal; height: auto; min-height: 40px; padding-top: 8px; padding-bottom: 8px;
  line-height: 1.25; text-align: center; justify-content: center; max-width: 100%;
}
.plan .pft .btn[data-razorpay-pay] {
  width: 100%; min-height: 44px; padding: 10px 14px; line-height: 1.4;
  text-wrap: balance;
}
.plan .pft [data-razorpay-status]:empty { display: none; }

/* One box per field, not two. Every field in the new design is a control inside a
 * `.inp` wrapper, and the kit draws the box AND the focus ring on the WRAPPER
 * (`.inp`, `.inp:focus-within`, section 4; its base reset is `input{border:0}`).
 * legacy.css loads on the same pages and its base rule --
 * `input:not([type=radio]):not([type=checkbox]), textarea, select` at 0,2,1 -- beats
 * that reset, so the control inside got its own 1px border, 8px radius, 12/16px padding,
 * card background and 44px height: a box inside the 40px box, at rest and focused, and
 * on focus legacy's 0,3,1 rule added a second ring on top. Seen as the doubled "Work
 * email" field. The wrapper owns the box and the ring; the control is seamless, which is
 * what `.ain input` already does for the Ask composer. 0,3,1 beats legacy's base,
 * 0,4,1 beats its :focus. font-size is left alone on purpose: `.af .inp input` (0,2,1)
 * sets 15px on the sign-in screens and must keep winning. scripts/ui_audit.py counts a
 * wrapper's :focus-within ring, so keyboard focus stays visible and measured. */
.inp :is(input, select, textarea):not([type="radio"]):not([type="checkbox"]) {
  border: 0; border-radius: 0; background: none; box-shadow: none; padding: 0; margin: 0;
  height: 100%; min-width: 0; outline: 0; color: inherit;
}
.inp :is(input, select, textarea):not([type="radio"]):not([type="checkbox"]):focus,
.inp :is(input, select, textarea):not([type="radio"]):not([type="checkbox"]):focus-visible {
  outline: none; box-shadow: none; border: 0;
}


/* ===================================================================
   DARK MODE FOR THE NEW DESIGN (section 4), from the tokens in
   docs/DESIGN_PATTERN.md "Dark mode" -- not a filter.

   Section 4 is design/kit/soil.css copied verbatim and may not be
   hand-edited, so everything dark the new design needs lives here.
   It is written the way sections 1-3 already switch theme, so ONE
   switch drives both sheets: theme.js puts data-theme="dark" on <html>
   for an explicit choice, and leaves the attribute off for "follow the
   computer", which @media (prefers-color-scheme: dark) then answers.
   Every rule below is therefore written twice, once per trigger --
   the same shape as the .sl-logo-img pair further up this section.

   The two triggers must also carry the SAME specificity, or the pair
   disagrees. `[data-theme="dark"]` is one attribute, (0,1,0);
   `:root:not([data-theme="light"])` is two, (0,2,0) -- and measured,
   that one extra class made the OS-preference copy of
   `:is(.btn) { background }` beat `.btn.dk`, so a page in dark mode
   had grey buttons where the explicit toggle drew black ones. The
   painted rules below use `:where(:root):not([data-theme="light"])`:
   `:where()` contributes nothing, so the pair is (0,1,0) either way
   and every rule sits exactly one class above the kit rule it
   restates -- close enough to beat it, not close enough to beat a
   kit rule that is more specific. The token blocks are the opposite
   case and keep the plain `:root:not(...)`: they have to outrank the
   kit's own `:root`, which is (0,1,0).

   Two halves:

   1. The kit's own tokens. The kit declares its palette as
      `:root { --ink; --t1..--t5; --line; --line2; --band; --sb; --pri;
      --ind }`, and that block is LATER in the file than section 1's
      `[data-theme="dark"]` block at equal specificity -- so section 4
      was overwriting --ink for the whole document, including the 38
      screens still drawn by sections 1-3 -- section 4's `body { color:
      var(--t1) }` is the whole document's inherited text colour, so
      measured, an unconverted card title in dark mode came out
      #1E2129 on a #0E1015 page, near-black on near-black. The blocks
      below are `:root[data-theme="dark"]` and
      `:root:not([data-theme="light"])`, both (0,2,0), which beats the
      kit's plain `:root` and fixes that as well.

      The kit's text scale has six rungs and the design pattern's dark
      table has four, so --t1/--t2 both land on body and --t4/--t5 both
      on faint. --line2 (the fainter divider) lands on the one Lines
      value the table gives. Those four collapses are the only places
      the dark design is coarser than the light one.

   2. The 635 places the kit paints a literal hex instead of using one
      of its own tokens. A literal cannot theme, so each one is
      re-stated here against a --kd-* token. The mapping is mechanical
      rather than per-rule taste: a text colour goes to the rung its
      lightness puts it in, a near-white fill to the page / card /
      raised / band surface its selector plays, a pale tint to its
      hue's 14% status tint, and every grey line to Lines. The primary
      family splits the way the table splits a status label: as a FILL
      it is the primary button, #6E70FA; as TEXT it is the lighter
      #A5A8F8, because #6E70FA on a #18191E card measures 4.48:1 and
      the lighter one 7:1. `:is()` groups the
      selectors that share a target; it carries the specificity of its
      most specific argument, so each group holds selectors of ONE
      specificity and every rule lands exactly where the same selector
      written out longhand would.

   What is deliberately NOT themed, and why, is listed at the end.

   Checked rather than assumed, with the kit's own shell.html and ten
   of its page files rendered in a headless browser: in LIGHT mode all
   3,745 elements compute the same eleven colour properties they did
   before this block existed, so nothing here reaches the light design;
   the two dark triggers agree on every one of those elements; and the
   text below 4.5:1 on a dark background drops from the kit's own 669
   elements in light to 25 in dark. Those 25 are listed in the report
   for this round -- all but four of them are the design pattern's own
   values.

   This half of the file is a SHIM and is meant to shrink. The moment
   design/kit/soil.css expresses its palette as its own custom
   properties, part 2 can be deleted outright and part 1 is all that
   is left.
   =================================================================== */

/* -- 1. The kit's palette, in dark ---------------------------------- */
:root[data-theme="dark"] {
  /* Text, titles / body / secondary / faint */
  --ink: #F3F4F6;
  --t1: #E4E6EA;
  --t2: #E4E6EA;
  --t3: #9EA2AC;
  --t4: #7D818C;
  --t5: #7D818C;
  /* Lines, and the fainter divider the dark table has no second rung for */
  --line: #2A2C33;
  --line2: #2A2C33;
  /* Table band, Menu */
  --band: #1B1D22;
  --sb: #17181C;
  /* Primary button, and its pressed value */
  --pri: #6E70FA;
  --ind: #5A5DF5;
}
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
  --ink: #F3F4F6;
  --t1: #E4E6EA;
  --t2: #E4E6EA;
  --t3: #9EA2AC;
  --t4: #7D818C;
  --t5: #7D818C;
  --line: #2A2C33;
  --line2: #2A2C33;
  --band: #1B1D22;
  --sb: #17181C;
  --pri: #6E70FA;
  --ind: #5A5DF5;
} }

/* -- 2a. The dark values the overrides below name -------------------
   Declared only in the dark blocks: every rule that reads one is
   itself behind a dark selector, so there is nothing for them to say
   in light. --kd-skel / --kd-skelshine / --kd-glow are the values
   sections 1-3 already use for the same three things, so the two
   sheets stay in step on them. */

:root[data-theme="dark"] {
  --kd-ink: #F3F4F6;
  --kd-body: #E4E6EA;
  --kd-sub: #9EA2AC;
  --kd-faint: #7D818C;
  --kd-page: #111216;
  --kd-menu: #17181C;
  --kd-card: #18191E;
  --kd-raise: #1E2026;
  --kd-line: #2A2C33;
  --kd-band: #1B1D22;
  --kd-navon: #E9EAEE;
  --kd-onnav: #111216;
  --kd-pri: #6E70FA;
  --kd-prihi: #5A5DF5;
  --kd-ok: #4ADE80;
  --kd-okbg: rgba(34,197,94,.14);
  --kd-warn: #FDBA74;
  --kd-warnbg: rgba(249,115,22,.14);
  --kd-bad: #FCA5A5;
  --kd-badbg: rgba(239,68,68,.14);
  --kd-info: #93C5FD;
  --kd-infobg: rgba(59,130,246,.14);
  --kd-vio: #A5A8F8;
  --kd-viobg: rgba(110,112,250,.14);
  --kd-glow: rgba(139,134,255,.22);
  --kd-skel: #22262E;
  --kd-skelshine: #2A2F38;
}
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
  --kd-ink: #F3F4F6;
  --kd-body: #E4E6EA;
  --kd-sub: #9EA2AC;
  --kd-faint: #7D818C;
  --kd-page: #111216;
  --kd-menu: #17181C;
  --kd-card: #18191E;
  --kd-raise: #1E2026;
  --kd-line: #2A2C33;
  --kd-band: #1B1D22;
  --kd-navon: #E9EAEE;
  --kd-onnav: #111216;
  --kd-pri: #6E70FA;
  --kd-prihi: #5A5DF5;
  --kd-ok: #4ADE80;
  --kd-okbg: rgba(34,197,94,.14);
  --kd-warn: #FDBA74;
  --kd-warnbg: rgba(249,115,22,.14);
  --kd-bad: #FCA5A5;
  --kd-badbg: rgba(239,68,68,.14);
  --kd-info: #93C5FD;
  --kd-infobg: rgba(59,130,246,.14);
  --kd-vio: #A5A8F8;
  --kd-viobg: rgba(110,112,250,.14);
  --kd-glow: rgba(139,134,255,.22);
  --kd-skel: #22262E;
  --kd-skelshine: #2A2F38;
} }

/* -- 2b. Every literal the kit paints, re-stated against a token -----
   In the kit's own source order, so where two selectors of equal
   specificity both match an element the later one still wins. */
[data-theme="dark"] :focus-visible { outline: 2px solid var(--kd-pri); }
[data-theme="dark"] .nv.on svg { color: var(--kd-onnav); }
[data-theme="dark"] .nv .nb.box { background: var(--kd-raise); }
[data-theme="dark"] .nv.on { background: var(--kd-navon); }
[data-theme="dark"] .nv.on { color: var(--kd-onnav); }
[data-theme="dark"] .nv.on .nb { color: var(--kd-onnav); }
[data-theme="dark"] .tm em.bad { color: var(--kd-bad); }
[data-theme="dark"] .tm em.ok { color: var(--kd-ok); }
[data-theme="dark"] .btn.pri { background: linear-gradient(180deg,var(--kd-pri),var(--kd-prihi)); }
[data-theme="dark"] .btn.pri:hover { background: var(--kd-prihi); }
[data-theme="dark"] .pl.neu { box-shadow: inset 0 0 0 1px var(--kd-line); }
[data-theme="dark"] .av.rg { box-shadow: 0 0 0 2px var(--kd-card); }
[data-theme="dark"] select.inp { background: var(--kd-raise) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%239EA2AC' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right 11px center; }
[data-theme="dark"] .rc.on>i { border: 5px solid var(--kd-pri); }
[data-theme="dark"] .sw.on { background: var(--kd-pri); }
[data-theme="dark"] .sg button.on { background: var(--kd-raise); }
[data-theme="dark"] .sg button.on { box-shadow: 0 1px 2px rgba(16,24,40,.08),0 0 0 1px var(--kd-line); }
[data-theme="dark"] .sg button.on { color: var(--kd-ink); }
[data-theme="dark"] details.ds .dsb { background: var(--kd-band); }
[data-theme="dark"] details.ds .dsb { border: 1px solid var(--kd-line); }
[data-theme="dark"] .emp .ei.ind { color: var(--kd-vio); }
[data-theme="dark"] .emp .ei.neu { background: var(--kd-band); }
[data-theme="dark"] .emp .ei.neu { color: var(--kd-sub); }
[data-theme="dark"] :is(.pop .ph div span, .srow .srch input::placeholder) { color: var(--kd-faint); }
[data-theme="dark"] .demo { border-bottom: 1px solid var(--kd-pri); }
[data-theme="dark"] .ac.odd { background: linear-gradient(180deg,var(--kd-viobg),rgba(110,112,250,.07)); }
[data-theme="dark"] .ac.crit { background: linear-gradient(180deg,var(--kd-badbg),rgba(239,68,68,.07)); }
[data-theme="dark"] .ac.risk { background: linear-gradient(180deg,var(--kd-warnbg),rgba(249,115,22,.07)); }
[data-theme="dark"] .afoot details.ds>summary { color: var(--kd-sub); }
[data-theme="dark"] .wci .tm { border-right: 1px solid var(--kd-line); }
[data-theme="dark"] .dsr summary { color: var(--kd-ink) !important; }
[data-theme="dark"] .hgo { background: linear-gradient(180deg,var(--kd-pri),var(--kd-prihi)); }
[data-theme="dark"] :is(.pop a:hover, .pqg button:hover) { background: var(--kd-line); }
[data-theme="dark"] .pqg button:hover { border-color: var(--kd-line); }
[data-theme="dark"] .ans { box-shadow: 0 0 0 4px var(--kd-glow); }
[data-theme="dark"] :is(.ain input::placeholder, .hin input::placeholder, .ii div span, .inp input::placeholder, .mny b small, .srch input::placeholder) { color: var(--kd-faint); }
[data-theme="dark"] .ev.sel { box-shadow: 0 0 0 2px var(--kd-card),0 0 0 4px var(--kd-pri); }
[data-theme="dark"] :is(.pop a svg, details.ds>summary) { color: var(--kd-sub); }
[data-theme="dark"] .wkh span.on b { background: var(--kd-pri); }
[data-theme="dark"] .evo { background: var(--kd-pri); }
[data-theme="dark"] :is(.vopt button.on, textarea.ta:focus) { box-shadow: 0 0 0 3px var(--kd-glow); }
[data-theme="dark"] :is(.dt svg:last-child, .pf span.e, .tdh2 .who span) { color: var(--kd-sub); }
[data-theme="dark"] :is(.cnm .lk, .ev.reg, .lg1.reg, .pl.blue, .tg.blue) { background: var(--kd-infobg); }
[data-theme="dark"] :is(.cnm .lk, .pl.blue, .tg.blue) { color: var(--kd-info); }
[data-theme="dark"] .cnm em { color: var(--kd-info); }
[data-theme="dark"] .gn.sel { box-shadow: 0 0 0 3px var(--kd-card),0 0 0 5px var(--kd-pri),0 6px 18px rgba(0,0,0,.5); }
[data-theme="dark"] .gav .av { box-shadow: 0 0 0 2px var(--kd-card),0 2px 6px rgba(16,24,40,.15); }
[data-theme="dark"] .gzb button+button { border-top: 1px solid var(--kd-line); }
[data-theme="dark"] .gi.sel { border-color: var(--kd-ink); }
[data-theme="dark"] .gi.sel { box-shadow: 0 0 0 1px var(--kd-line); }
[data-theme="dark"] :is(.ac.risk .rec, .emp .ei.ind, .mr.sel:hover, .tab.on .tc) { background: var(--kd-viobg); }
[data-theme="dark"] .btn.gh:hover { background: var(--kd-line); }
[data-theme="dark"] :is(.ideas button:hover, .vopt button.on) { background: var(--kd-viobg); }
[data-theme="dark"] :is(.ideas button, .mw button, .pqg button, .seg3 button, .vopt button, textarea.ta) { border: 1px solid var(--kd-line); }
[data-theme="dark"] :is(.cb2.on i, .ideas button:hover, .vopt button.on, textarea.ta:focus) { border-color: var(--kd-pri); }
[data-theme="dark"] .stp li::before { background: var(--kd-viobg); }
[data-theme="dark"] .stp li::before { color: var(--kd-vio); }
[data-theme="dark"] .ut { border-right: 1px solid var(--kd-line); }
[data-theme="dark"] :is(.big .l, .kv .k, .pdc .l, .pl.neu, .pop .pr2, .st2 .l, .ttr .nm) { color: var(--kd-ink); }
[data-theme="dark"] :is(.acn em, .cnm2>span, .cnm>span, .dbox em, .gi em, .kp em, .pct span, .rct span, .wka span, .wkh em, .wkn span) { color: var(--kd-faint); }
[data-theme="dark"] .tk b { background: var(--kd-pri); }
[data-theme="dark"] :is(.ac.odd, .btn.cn, .btn.pri, .btn.tdy, .gc.on, .inp:focus-within, .plan.cur, .rc.on) { border-color: var(--kd-pri); }
[data-theme="dark"] :is(.inp:focus-within, .plan.cur) { box-shadow: 0 0 0 3px var(--kd-glow); }
[data-theme="dark"] :is(.sw, .tk) { background: var(--kd-line); }
[data-theme="dark"] :is(body, html) { background: var(--kd-page); }
[data-theme="dark"] .aerr { background: var(--kd-badbg); }
[data-theme="dark"] .aerr { color: var(--kd-bad); }
[data-theme="dark"] :is(.aur .ac p, details.ds .dsb) { color: var(--kd-body); }
[data-theme="dark"] :is(.acts2 .fl, .ah .tx, .aic.neu, .apv .as, .arr .cb2, .big .s, .btn.gh, .ct .more, .emr .rsb, .it .ip, .nyr .rsb, .pdc .s, .row .rsb, .st .l, .st2 .s, .wci .tm) { color: var(--kd-sub); }
[data-theme="dark"] .stp2.now { box-shadow: 0 0 0 2px var(--kd-pri); }
[data-theme="dark"] :is(.cb2 i, .rc>i) { border: 1.5px solid var(--kd-line); }
[data-theme="dark"] :is(.cb2.on i, .pl.ind i, .stp2.now b, .tab.on::after) { background: var(--kd-pri); }
[data-theme="dark"] .skl i { background: linear-gradient(90deg,var(--kd-skel) 25%,var(--kd-skelshine) 50%,var(--kd-skel) 75%); }
[data-theme="dark"] :is(.ac.crit .rec, .btn.dg:hover, .emp .ei.bad) { background: var(--kd-badbg); }
[data-theme="dark"] .emp .ei.bad { color: var(--kd-bad); }
[data-theme="dark"] .prg i { background: linear-gradient(90deg,var(--kd-pri),var(--kd-prihi)); }
[data-theme="dark"] .bnr.ind { border: 1px solid var(--kd-pri); }
[data-theme="dark"] :is(.aic.ind, .band.mb, .bnr.ind, .btn.cn, .btn.tdy, .gc.on, .hc.odd, .lab.odd, .pl.ind, .rec .rh, .stp2.now, .tab.on, .tg.ind) { color: var(--kd-vio); }
[data-theme="dark"] :is(.aic.or, .bnr.warn, .dl.bad, .ev.risk, .hc.risk, .lab.risk, .lg1.risk, .pl.or, .pl.warn, .tg.or, .tg.yel) { background: var(--kd-warnbg); }
[data-theme="dark"] :is(.aic.or, .bnr.warn, .ct .ctr, .hc.risk, .lab.risk, .pl.or, .pl.warn, .tg.or, .tg.yel) { color: var(--kd-warn); }
[data-theme="dark"] :is(.aic.bad, .bnr.bad, .ev.crit, .hc.crit, .lab.crit, .lg1.crit, .pl.bad, .pl.rs, .tg.bad) { background: var(--kd-badbg); }
[data-theme="dark"] :is(.aic.neu, .bnr.neu, .ct .more, .dmn.neu, .pl.neu) { background: var(--kd-band); }
[data-theme="dark"] :is(.bnr.neu, .btn.dd, .dmn.neu) { color: var(--kd-body); }
[data-theme="dark"] .pdots i { background: var(--kd-line); }
[data-theme="dark"] .spin { border: 3px solid var(--kd-line); }
[data-theme="dark"] .spin { border-top-color: var(--kd-pri); }
[data-theme="dark"] :is(.aic.ok, .bnr.ok2, .dl.ok, .emp .ei, .hs.okk, .pl.gs, .pl.ok, .st .chip, .stp2.done, .tg.ok) { background: var(--kd-okbg); }
[data-theme="dark"] :is(.bnr.bad, .bnr.neu, .bnr.ok2, .bnr.warn) { border: 1px solid var(--kd-line); }
[data-theme="dark"] :is(.aic.ok, .bnr.ok2, .dl.ok, .emp .ei, .hs.okk, .pdc .n, .pl.gs, .pl.ok, .st .chip, .stp2.done, .tg.ok) { color: var(--kd-ok); }
[data-theme="dark"] :is(.btn:hover, .chb:hover, .kb:hover, .lr2:hover, .org:hover, .pr:hover, .scl:hover, .si:hover, .ssob:hover, .tab:hover, .tr:hover, .upr:hover) { background: var(--kd-line); }
[data-theme="dark"] :is(.aic.ind, .bnr.ind, .btn.cn, .btn.tdy, .gc.on, .hc.odd, .lab.odd, .mr.sel, .org.cur, .pl.ind, .rc.on, .stp2.now, .tab.on, .tg.ind, .wkc.on) { background: var(--kd-viobg); }
[data-theme="dark"] :is(.btn.dg, .nv:hover, .tm:hover) { background: var(--kd-raise); }
[data-theme="dark"] :is(.ac.crit, .ac.risk, .achip:hover, .btn.dg, .card.dz, .dmn.neu, .gc2:hover, .hs.okk, .qchip:hover, .tcd.best) { border-color: var(--kd-line); }
[data-theme="dark"] :is(.aic.bad, .bnr.bad, .btn.dg, .dl.bad, .dzr .rt, .hc.crit, .lab.crit, .pl.bad, .pl.rs, .tg.bad) { color: var(--kd-bad); }
[data-theme="dark"] :is(.dmn, .done, .up) { background: var(--kd-okbg); }
[data-theme="dark"] :is(.dmn, .done, .up) { color: var(--kd-ok); }
[data-theme="dark"] :is(.ans, .lmap) { border-color: var(--kd-pri); }
[data-theme="dark"] :is(.apv .ax, .chi .cd, .pf .ud, .pre .pd2, .wcr .wk3, .wh .e2) { color: var(--kd-faint); }
[data-theme="dark"] .sv { box-shadow: 0 0 0 3px var(--kd-card); }
[data-theme="dark"] :is(.ac p, .ck li, .fnd li, .nhq p, .plan li, .pqg button, .stp span, .wbox p) { color: var(--kd-body); }
[data-theme="dark"] :is(.big .n small, .bigr .ms span, .it .amt small, .kv .v small, .qm b.t4) { color: var(--kd-faint); }
[data-theme="dark"] :is(.btb, .hero, .prf, .wdo) { border: 1px solid var(--kd-pri); }
[data-theme="dark"] :is(.cb2 i, .ideas button, .mw button, .orl::after, .orl::before, .pqg button, .rc>i, .seg3 button, .shb i, .stp2 b, .vopt button) { background: var(--kd-raise); }
[data-theme="dark"] :is(.afoot2 a, .ah p, .bn span, .btb span, .cnts span, .cpr span, .ct span, .emp>span, .erc p, .ev span, .ftc p, .hero p, .inl span, .kp span, .lg svg, .lmap span, .mny span, .mr2 span, .nv svg, .qm span, .seg3 button, .sg button, .stp2 b, .tbl span, .tch span, .thk span, .upg>p) { color: var(--kd-sub); }
[data-theme="dark"] :is(.askc, .btb, .demo, .hero, .lmap, .oav, .prf, .rec, .stn, .wdo) { background: var(--kd-viobg); }
[data-theme="dark"] :is(.agn2, .demo, .ey, .ey3, .oav, .stn, .tn) { color: var(--kd-vio); }
[data-theme="dark"] :is(.alinks a, .demo button, .flr a, .moreb button, .obd a, .pka a, .wki2 b) { color: var(--kd-vio); }
[data-theme="dark"] :is(.anl li, .ev b, .gn b, .ideas button, .ii b, .mw b, .mw button, .pop a, .vopt button, .wki b, .wki2 span) { color: var(--kd-ink); }
[data-theme="dark"] .app.phone .pl0 { color: var(--kd-faint); }
[data-theme="dark"] :is(.chn::before, .wkl i) { background: var(--kd-band); }
[data-theme="dark"] :is(.obh, .shb, .snv) { border-bottom: 1px solid var(--kd-line); }
[data-theme="dark"] :is(.nyr, .pf, .sft) { border-top: 1px solid var(--kd-line); }
[data-theme="dark"] kbd { background: var(--kd-band); }
[data-theme="dark"] kbd { border: 1px solid var(--kd-line); }
[data-theme="dark"] kbd { color: var(--kd-sub); }
[data-theme="dark"] :is(.fp, .main, .obp, .pt, .site, .top) { background: var(--kd-page); }
[data-theme="dark"] :is(.hs, .srn, .wcn, .yel) { color: var(--kd-warn); }
[data-theme="dark"] :is(.achip, .ain, .av, .btn, .gsl, .gzb, .hin, .inp, .prg, .qchip, .si, .snd, .srch, .ssob, .stl2) { background: var(--kd-raise); }
[data-theme="dark"] :is(.card, .ct, .gc2, .gi, .plan, .pop, .rc, .shot, .tcd, .tile) { background: var(--kd-card); }
[data-theme="dark"] :is(.dbox, .fcp, .gc, .mhid, .rule, .sg, .shb, .srcc, .stp2, .tab, .tdet, .tg, .trm, .wki2) { background: var(--kd-band); }
[data-theme="dark"] :is(.acs, .agd, .age, .agf, .alinks, .arh, .asub, .bk, .c2, .c3, .cmh, .hsub, .lgt, .lnk, .mdv, .mono, .note, .nu, .obd, .ow, .own, .pbl, .pd, .pkh, .rule, .sn, .t3, .tab, .th, .tms, .tth, .wkf, .wki) { color: var(--kd-sub); }
[data-theme="dark"] .gwrap { background-color: var(--kd-card); }
[data-theme="dark"] .gwrap { background-image: radial-gradient(var(--kd-line) 1.1px,transparent 1.2px); }
[data-theme="dark"] :is(.achip, .aerr, .ain, .btn, .ct, .dmn, .gc, .gc2, .gi, .gzb, .hin, .hs, .inp, .mw, .pop, .pt, .qchip, .rc, .shot, .si, .srcc, .srch, .ssob, .tile, .wnote) { border: 1px solid var(--kd-line); }
[data-theme="dark"] :is(.hs, .mw, .nyr, .srn, .wbox, .wnote, .yel) { background: var(--kd-warnbg); }
[data-theme="dark"] :is(.askc, .wbox) { border-color: var(--kd-line); }
[data-theme="dark"] :is(.arn, .band, .btn, .cb2, .chi, .cnn, .drf, .dt, .fl, .gi, .lf, .me, .mn, .nm, .ol3, .rps, .scl, .si, .srow2, .ssob, .tl1, .ux, .wct, .wdl, .why3) { color: var(--kd-ink); }
[data-theme="dark"] :is(.afoot2, .agd2, .bc, .cap, .chv, .dl0, .e3, .erf, .ey2, .fnd0, .foot, .grc, .help, .ls, .mhid, .ms, .msrc, .mt2, .orl, .pn, .ppr, .qh, .sft, .ssoc, .stp2, .t4, .tl, .us, .ut) { color: var(--kd-faint); }
[data-theme="dark"] .app { background: linear-gradient(90deg,var(--kd-menu) 250px,var(--kd-page) 250px); }
[data-theme="dark"] :is(#p-today .sub, .achip, .eb, .gc, .gc2, .lgd, .lgp, .lt, .mw, .nv, .p, .pi, .prf, .qchip, .rec, .sfl, .snl, .srcc, .tdet, .tg, .tm, .trm, .ub, .wcr, .wnote) { color: var(--kd-body); }
[data-theme="dark"] :is(.u-32, .u-33, .u-92, .u-94) { background: var(--kd-pri) !important; }
[data-theme="dark"] .u-97 { background: var(--kd-badbg) !important; }
[data-theme="dark"] .u-100 { background: var(--kd-okbg) !important; }
[data-theme="dark"] :is(.u-101, .u-99) { background: var(--kd-warnbg) !important; }
[data-theme="dark"] :is(.u-102, .u-98) { background: var(--kd-infobg) !important; }
[data-theme="dark"] :is(.u-100, .u-101, .u-102, .u-97, .u-98, .u-99) { border-color: var(--kd-line) !important; }
[data-theme="dark"] :is(.u-109, .u-154, .u-159, .u-161, .u-35, .u-40) { color: var(--kd-body) !important; }
[data-theme="dark"] :is(.u-181, .u-36) { color: var(--kd-sub) !important; }
[data-theme="dark"] :is(.u-150, .u-151, .u-186, .u-76, .u-89, .u-90) { color: var(--kd-bad) !important; }
[data-theme="dark"] :is(.u-157, .u-187) { color: var(--kd-vio) !important; }
[data-theme="dark"] :is(.u-153, .u-188, .u-37, .u-72) { color: var(--kd-warn) !important; }
[data-theme="dark"] :is(.u-189, .u-73, .u-77, .u-85, .u-86, .u-87, .u-88) { color: var(--kd-ok) !important; }

/* The same set again, for "follow the computer". Identical rules; only
   the trigger differs. */
@media (prefers-color-scheme: dark) {
  :where(:root):not([data-theme="light"]) :focus-visible { outline: 2px solid var(--kd-pri); }
  :where(:root):not([data-theme="light"]) .nv.on svg { color: var(--kd-onnav); }
  :where(:root):not([data-theme="light"]) .nv .nb.box { background: var(--kd-raise); }
  :where(:root):not([data-theme="light"]) .nv.on { background: var(--kd-navon); }
  :where(:root):not([data-theme="light"]) .nv.on { color: var(--kd-onnav); }
  :where(:root):not([data-theme="light"]) .nv.on .nb { color: var(--kd-onnav); }
  :where(:root):not([data-theme="light"]) .tm em.bad { color: var(--kd-bad); }
  :where(:root):not([data-theme="light"]) .tm em.ok { color: var(--kd-ok); }
  :where(:root):not([data-theme="light"]) .btn.pri { background: linear-gradient(180deg,var(--kd-pri),var(--kd-prihi)); }
  :where(:root):not([data-theme="light"]) .btn.pri:hover { background: var(--kd-prihi); }
  :where(:root):not([data-theme="light"]) .pl.neu { box-shadow: inset 0 0 0 1px var(--kd-line); }
  :where(:root):not([data-theme="light"]) .av.rg { box-shadow: 0 0 0 2px var(--kd-card); }
  :where(:root):not([data-theme="light"]) select.inp { background: var(--kd-raise) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%239EA2AC' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right 11px center; }
  :where(:root):not([data-theme="light"]) .rc.on>i { border: 5px solid var(--kd-pri); }
  :where(:root):not([data-theme="light"]) .sw.on { background: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) .sg button.on { background: var(--kd-raise); }
  :where(:root):not([data-theme="light"]) .sg button.on { box-shadow: 0 1px 2px rgba(16,24,40,.08),0 0 0 1px var(--kd-line); }
  :where(:root):not([data-theme="light"]) .sg button.on { color: var(--kd-ink); }
  :where(:root):not([data-theme="light"]) details.ds .dsb { background: var(--kd-band); }
  :where(:root):not([data-theme="light"]) details.ds .dsb { border: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) .emp .ei.ind { color: var(--kd-vio); }
  :where(:root):not([data-theme="light"]) .emp .ei.neu { background: var(--kd-band); }
  :where(:root):not([data-theme="light"]) .emp .ei.neu { color: var(--kd-sub); }
  :where(:root):not([data-theme="light"]) :is(.pop .ph div span, .srow .srch input::placeholder) { color: var(--kd-faint); }
  :where(:root):not([data-theme="light"]) .demo { border-bottom: 1px solid var(--kd-pri); }
  :where(:root):not([data-theme="light"]) .ac.odd { background: linear-gradient(180deg,var(--kd-viobg),rgba(110,112,250,.07)); }
  :where(:root):not([data-theme="light"]) .ac.crit { background: linear-gradient(180deg,var(--kd-badbg),rgba(239,68,68,.07)); }
  :where(:root):not([data-theme="light"]) .ac.risk { background: linear-gradient(180deg,var(--kd-warnbg),rgba(249,115,22,.07)); }
  :where(:root):not([data-theme="light"]) .afoot details.ds>summary { color: var(--kd-sub); }
  :where(:root):not([data-theme="light"]) .wci .tm { border-right: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) .dsr summary { color: var(--kd-ink) !important; }
  :where(:root):not([data-theme="light"]) .hgo { background: linear-gradient(180deg,var(--kd-pri),var(--kd-prihi)); }
  :where(:root):not([data-theme="light"]) :is(.pop a:hover, .pqg button:hover) { background: var(--kd-line); }
  :where(:root):not([data-theme="light"]) .pqg button:hover { border-color: var(--kd-line); }
  :where(:root):not([data-theme="light"]) .ans { box-shadow: 0 0 0 4px var(--kd-glow); }
  :where(:root):not([data-theme="light"]) :is(.ain input::placeholder, .hin input::placeholder, .ii div span, .inp input::placeholder, .mny b small, .srch input::placeholder) { color: var(--kd-faint); }
  :where(:root):not([data-theme="light"]) .ev.sel { box-shadow: 0 0 0 2px var(--kd-card),0 0 0 4px var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.pop a svg, details.ds>summary) { color: var(--kd-sub); }
  :where(:root):not([data-theme="light"]) .wkh span.on b { background: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) .evo { background: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.vopt button.on, textarea.ta:focus) { box-shadow: 0 0 0 3px var(--kd-glow); }
  :where(:root):not([data-theme="light"]) :is(.dt svg:last-child, .pf span.e, .tdh2 .who span) { color: var(--kd-sub); }
  :where(:root):not([data-theme="light"]) :is(.cnm .lk, .ev.reg, .lg1.reg, .pl.blue, .tg.blue) { background: var(--kd-infobg); }
  :where(:root):not([data-theme="light"]) :is(.cnm .lk, .pl.blue, .tg.blue) { color: var(--kd-info); }
  :where(:root):not([data-theme="light"]) .cnm em { color: var(--kd-info); }
  :where(:root):not([data-theme="light"]) .gn.sel { box-shadow: 0 0 0 3px var(--kd-card),0 0 0 5px var(--kd-pri),0 6px 18px rgba(0,0,0,.5); }
  :where(:root):not([data-theme="light"]) .gav .av { box-shadow: 0 0 0 2px var(--kd-card),0 2px 6px rgba(16,24,40,.15); }
  :where(:root):not([data-theme="light"]) .gzb button+button { border-top: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) .gi.sel { border-color: var(--kd-ink); }
  :where(:root):not([data-theme="light"]) .gi.sel { box-shadow: 0 0 0 1px var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.ac.risk .rec, .emp .ei.ind, .mr.sel:hover, .tab.on .tc) { background: var(--kd-viobg); }
  :where(:root):not([data-theme="light"]) .btn.gh:hover { background: var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.ideas button:hover, .vopt button.on) { background: var(--kd-viobg); }
  :where(:root):not([data-theme="light"]) :is(.ideas button, .mw button, .pqg button, .seg3 button, .vopt button, textarea.ta) { border: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.cb2.on i, .ideas button:hover, .vopt button.on, textarea.ta:focus) { border-color: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) .stp li::before { background: var(--kd-viobg); }
  :where(:root):not([data-theme="light"]) .stp li::before { color: var(--kd-vio); }
  :where(:root):not([data-theme="light"]) .ut { border-right: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.big .l, .kv .k, .pdc .l, .pl.neu, .pop .pr2, .st2 .l, .ttr .nm) { color: var(--kd-ink); }
  :where(:root):not([data-theme="light"]) :is(.acn em, .cnm2>span, .cnm>span, .dbox em, .gi em, .kp em, .pct span, .rct span, .wka span, .wkh em, .wkn span) { color: var(--kd-faint); }
  :where(:root):not([data-theme="light"]) .tk b { background: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.ac.odd, .btn.cn, .btn.pri, .btn.tdy, .gc.on, .inp:focus-within, .plan.cur, .rc.on) { border-color: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.inp:focus-within, .plan.cur) { box-shadow: 0 0 0 3px var(--kd-glow); }
  :where(:root):not([data-theme="light"]) :is(.sw, .tk) { background: var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(body, html) { background: var(--kd-page); }
  :where(:root):not([data-theme="light"]) .aerr { background: var(--kd-badbg); }
  :where(:root):not([data-theme="light"]) .aerr { color: var(--kd-bad); }
  :where(:root):not([data-theme="light"]) :is(.aur .ac p, details.ds .dsb) { color: var(--kd-body); }
  :where(:root):not([data-theme="light"]) :is(.acts2 .fl, .ah .tx, .aic.neu, .apv .as, .arr .cb2, .big .s, .btn.gh, .ct .more, .emr .rsb, .it .ip, .nyr .rsb, .pdc .s, .row .rsb, .st .l, .st2 .s, .wci .tm) { color: var(--kd-sub); }
  :where(:root):not([data-theme="light"]) .stp2.now { box-shadow: 0 0 0 2px var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.cb2 i, .rc>i) { border: 1.5px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.cb2.on i, .pl.ind i, .stp2.now b, .tab.on::after) { background: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) .skl i { background: linear-gradient(90deg,var(--kd-skel) 25%,var(--kd-skelshine) 50%,var(--kd-skel) 75%); }
  :where(:root):not([data-theme="light"]) :is(.ac.crit .rec, .btn.dg:hover, .emp .ei.bad) { background: var(--kd-badbg); }
  :where(:root):not([data-theme="light"]) .emp .ei.bad { color: var(--kd-bad); }
  :where(:root):not([data-theme="light"]) .prg i { background: linear-gradient(90deg,var(--kd-pri),var(--kd-prihi)); }
  :where(:root):not([data-theme="light"]) .bnr.ind { border: 1px solid var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.aic.ind, .band.mb, .bnr.ind, .btn.cn, .btn.tdy, .gc.on, .hc.odd, .lab.odd, .pl.ind, .rec .rh, .stp2.now, .tab.on, .tg.ind) { color: var(--kd-vio); }
  :where(:root):not([data-theme="light"]) :is(.aic.or, .bnr.warn, .dl.bad, .ev.risk, .hc.risk, .lab.risk, .lg1.risk, .pl.or, .pl.warn, .tg.or, .tg.yel) { background: var(--kd-warnbg); }
  :where(:root):not([data-theme="light"]) :is(.aic.or, .bnr.warn, .ct .ctr, .hc.risk, .lab.risk, .pl.or, .pl.warn, .tg.or, .tg.yel) { color: var(--kd-warn); }
  :where(:root):not([data-theme="light"]) :is(.aic.bad, .bnr.bad, .ev.crit, .hc.crit, .lab.crit, .lg1.crit, .pl.bad, .pl.rs, .tg.bad) { background: var(--kd-badbg); }
  :where(:root):not([data-theme="light"]) :is(.aic.neu, .bnr.neu, .ct .more, .dmn.neu, .pl.neu) { background: var(--kd-band); }
  :where(:root):not([data-theme="light"]) :is(.bnr.neu, .btn.dd, .dmn.neu) { color: var(--kd-body); }
  :where(:root):not([data-theme="light"]) .pdots i { background: var(--kd-line); }
  :where(:root):not([data-theme="light"]) .spin { border: 3px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) .spin { border-top-color: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.aic.ok, .bnr.ok2, .dl.ok, .emp .ei, .hs.okk, .pl.gs, .pl.ok, .st .chip, .stp2.done, .tg.ok) { background: var(--kd-okbg); }
  :where(:root):not([data-theme="light"]) :is(.bnr.bad, .bnr.neu, .bnr.ok2, .bnr.warn) { border: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.aic.ok, .bnr.ok2, .dl.ok, .emp .ei, .hs.okk, .pdc .n, .pl.gs, .pl.ok, .st .chip, .stp2.done, .tg.ok) { color: var(--kd-ok); }
  :where(:root):not([data-theme="light"]) :is(.btn:hover, .chb:hover, .kb:hover, .lr2:hover, .org:hover, .pr:hover, .scl:hover, .si:hover, .ssob:hover, .tab:hover, .tr:hover, .upr:hover) { background: var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.aic.ind, .bnr.ind, .btn.cn, .btn.tdy, .gc.on, .hc.odd, .lab.odd, .mr.sel, .org.cur, .pl.ind, .rc.on, .stp2.now, .tab.on, .tg.ind, .wkc.on) { background: var(--kd-viobg); }
  :where(:root):not([data-theme="light"]) :is(.btn.dg, .nv:hover, .tm:hover) { background: var(--kd-raise); }
  :where(:root):not([data-theme="light"]) :is(.ac.crit, .ac.risk, .achip:hover, .btn.dg, .card.dz, .dmn.neu, .gc2:hover, .hs.okk, .qchip:hover, .tcd.best) { border-color: var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.aic.bad, .bnr.bad, .btn.dg, .dl.bad, .dzr .rt, .hc.crit, .lab.crit, .pl.bad, .pl.rs, .tg.bad) { color: var(--kd-bad); }
  :where(:root):not([data-theme="light"]) :is(.dmn, .done, .up) { background: var(--kd-okbg); }
  :where(:root):not([data-theme="light"]) :is(.dmn, .done, .up) { color: var(--kd-ok); }
  :where(:root):not([data-theme="light"]) :is(.ans, .lmap) { border-color: var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.apv .ax, .chi .cd, .pf .ud, .pre .pd2, .wcr .wk3, .wh .e2) { color: var(--kd-faint); }
  :where(:root):not([data-theme="light"]) .sv { box-shadow: 0 0 0 3px var(--kd-card); }
  :where(:root):not([data-theme="light"]) :is(.ac p, .ck li, .fnd li, .nhq p, .plan li, .pqg button, .stp span, .wbox p) { color: var(--kd-body); }
  :where(:root):not([data-theme="light"]) :is(.big .n small, .bigr .ms span, .it .amt small, .kv .v small, .qm b.t4) { color: var(--kd-faint); }
  :where(:root):not([data-theme="light"]) :is(.btb, .hero, .prf, .wdo) { border: 1px solid var(--kd-pri); }
  :where(:root):not([data-theme="light"]) :is(.cb2 i, .ideas button, .mw button, .orl::after, .orl::before, .pqg button, .rc>i, .seg3 button, .shb i, .stp2 b, .vopt button) { background: var(--kd-raise); }
  :where(:root):not([data-theme="light"]) :is(.afoot2 a, .ah p, .bn span, .btb span, .cnts span, .cpr span, .ct span, .emp>span, .erc p, .ev span, .ftc p, .hero p, .inl span, .kp span, .lg svg, .lmap span, .mny span, .mr2 span, .nv svg, .qm span, .seg3 button, .sg button, .stp2 b, .tbl span, .tch span, .thk span, .upg>p) { color: var(--kd-sub); }
  :where(:root):not([data-theme="light"]) :is(.askc, .btb, .demo, .hero, .lmap, .oav, .prf, .rec, .stn, .wdo) { background: var(--kd-viobg); }
  :where(:root):not([data-theme="light"]) :is(.agn2, .demo, .ey, .ey3, .oav, .stn, .tn) { color: var(--kd-vio); }
  :where(:root):not([data-theme="light"]) :is(.alinks a, .demo button, .flr a, .moreb button, .obd a, .pka a, .wki2 b) { color: var(--kd-vio); }
  :where(:root):not([data-theme="light"]) :is(.anl li, .ev b, .gn b, .ideas button, .ii b, .mw b, .mw button, .pop a, .vopt button, .wki b, .wki2 span) { color: var(--kd-ink); }
  :where(:root):not([data-theme="light"]) .app.phone .pl0 { color: var(--kd-faint); }
  :where(:root):not([data-theme="light"]) :is(.chn::before, .wkl i) { background: var(--kd-band); }
  :where(:root):not([data-theme="light"]) :is(.obh, .shb, .snv) { border-bottom: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.nyr, .pf, .sft) { border-top: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) kbd { background: var(--kd-band); }
  :where(:root):not([data-theme="light"]) kbd { border: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) kbd { color: var(--kd-sub); }
  :where(:root):not([data-theme="light"]) :is(.fp, .main, .obp, .pt, .site, .top) { background: var(--kd-page); }
  :where(:root):not([data-theme="light"]) :is(.hs, .srn, .wcn, .yel) { color: var(--kd-warn); }
  :where(:root):not([data-theme="light"]) :is(.achip, .ain, .av, .btn, .gsl, .gzb, .hin, .inp, .prg, .qchip, .si, .snd, .srch, .ssob, .stl2) { background: var(--kd-raise); }
  :where(:root):not([data-theme="light"]) :is(.card, .ct, .gc2, .gi, .plan, .pop, .rc, .shot, .tcd, .tile) { background: var(--kd-card); }
  :where(:root):not([data-theme="light"]) :is(.dbox, .fcp, .gc, .mhid, .rule, .sg, .shb, .srcc, .stp2, .tab, .tdet, .tg, .trm, .wki2) { background: var(--kd-band); }
  :where(:root):not([data-theme="light"]) :is(.acs, .agd, .age, .agf, .alinks, .arh, .asub, .bk, .c2, .c3, .cmh, .hsub, .lgt, .lnk, .mdv, .mono, .note, .nu, .obd, .ow, .own, .pbl, .pd, .pkh, .rule, .sn, .t3, .tab, .th, .tms, .tth, .wkf, .wki) { color: var(--kd-sub); }
  :where(:root):not([data-theme="light"]) .gwrap { background-color: var(--kd-card); }
  :where(:root):not([data-theme="light"]) .gwrap { background-image: radial-gradient(var(--kd-line) 1.1px,transparent 1.2px); }
  :where(:root):not([data-theme="light"]) :is(.achip, .aerr, .ain, .btn, .ct, .dmn, .gc, .gc2, .gi, .gzb, .hin, .hs, .inp, .mw, .pop, .pt, .qchip, .rc, .shot, .si, .srcc, .srch, .ssob, .tile, .wnote) { border: 1px solid var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.hs, .mw, .nyr, .srn, .wbox, .wnote, .yel) { background: var(--kd-warnbg); }
  :where(:root):not([data-theme="light"]) :is(.askc, .wbox) { border-color: var(--kd-line); }
  :where(:root):not([data-theme="light"]) :is(.arn, .band, .btn, .cb2, .chi, .cnn, .drf, .dt, .fl, .gi, .lf, .me, .mn, .nm, .ol3, .rps, .scl, .si, .srow2, .ssob, .tl1, .ux, .wct, .wdl, .why3) { color: var(--kd-ink); }
  :where(:root):not([data-theme="light"]) :is(.afoot2, .agd2, .bc, .cap, .chv, .dl0, .e3, .erf, .ey2, .fnd0, .foot, .grc, .help, .ls, .mhid, .ms, .msrc, .mt2, .orl, .pn, .ppr, .qh, .sft, .ssoc, .stp2, .t4, .tl, .us, .ut) { color: var(--kd-faint); }
  :where(:root):not([data-theme="light"]) .app { background: linear-gradient(90deg,var(--kd-menu) 250px,var(--kd-page) 250px); }
  :where(:root):not([data-theme="light"]) :is(#p-today .sub, .achip, .eb, .gc, .gc2, .lgd, .lgp, .lt, .mw, .nv, .p, .pi, .prf, .qchip, .rec, .sfl, .snl, .srcc, .tdet, .tg, .tm, .trm, .ub, .wcr, .wnote) { color: var(--kd-body); }
  :where(:root):not([data-theme="light"]) :is(.u-32, .u-33, .u-92, .u-94) { background: var(--kd-pri) !important; }
  :where(:root):not([data-theme="light"]) .u-97 { background: var(--kd-badbg) !important; }
  :where(:root):not([data-theme="light"]) .u-100 { background: var(--kd-okbg) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-101, .u-99) { background: var(--kd-warnbg) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-102, .u-98) { background: var(--kd-infobg) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-100, .u-101, .u-102, .u-97, .u-98, .u-99) { border-color: var(--kd-line) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-109, .u-154, .u-159, .u-161, .u-35, .u-40) { color: var(--kd-body) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-181, .u-36) { color: var(--kd-sub) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-150, .u-151, .u-186, .u-76, .u-89, .u-90) { color: var(--kd-bad) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-157, .u-187) { color: var(--kd-vio) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-153, .u-188, .u-37, .u-72) { color: var(--kd-warn) !important; }
  :where(:root):not([data-theme="light"]) :is(.u-189, .u-73, .u-77, .u-85, .u-86, .u-87, .u-88) { color: var(--kd-ok) !important; }
}

/* -- What section 3 deliberately leaves as the kit drew it ---------
 * Each is a case where a literal IS the right answer, for one of the two reasons
 * tests/test_css_theming.py's own allowlist gives: a surface or mark that is the
 * same in both themes, or a hue that carries the meaning.
 *
 * a mid-grey fill the four dark surfaces have no rung for (2):
 *   .gsl i {background}  .me {background}
 * a saturated hue line (severity, brand): the hue is the meaning (7):
 *   .btn.dgs {border-color}  .ev.crit {border-color}  .ev.reg {border-color}  
 *   .ev.risk {border-color}  .lg1.crit {border-color}  .lg1.reg {border-color}  
 *   .lg1.risk {border-color}
 * a saturated mark (dot, bar, severity disc, team colour): the hue is the meaning (49):
 *   .btn.dgs {background}  .ct .ctr i {background}  .dotlive {background}  
 *   .hs i {background}  .hs.okk i {background}  .pl.bad i {background}  
 *   .pl.blue i {background}  .pl.ok i {background}  .pl.or i {background}  
 *   .pl.warn i {background}  .stp2.done b {background}  .sv.bad {background}  
 *   .sv.ok {background}  .sv.or {background}  .tbl li::before {background}  
 *   .u-10 {background}  .u-11 {background}  .u-112 {background}  .u-113 {background}  
 *   .u-12 {background}  .u-13 {background}  .u-14 {background}  .u-15 {background}  
 *   .u-16 {background}  .u-17 {background}  .u-18 {background}  .u-19 {background}  
 *   .u-20 {background}  .u-21 {background}  .u-22 {background}  .u-23 {background}  
 *   .u-24 {background}  .u-26 {background}  .u-27 {background}  .u-28 {background}  
 *   .u-29 {background}  .u-30 {background}  .u-31 {background}  .u-5 {background}  
 *   .u-6 {background}  .u-60 {background}  .u-61 {background}  .u-62 {background}  
 *   .u-7 {background}  .u-8 {background}  .u-9 {background}  .u-93 {background}  
 *   .u-95 {background}  .u-96 {background}
 * a saturated shadow the kit keeps (1):
 *   .tcd.best {box-shadow}
 * a surface that is dark in both themes (1):
 *   .fpback {background}
 * a white glyph or ring on a fill that keeps its colour (2):
 *   .cb2.on i::after {border-bottom}  .cb2.on i::after {border-left}
 * dark in both themes, mockup-only, or a plate that is light in both (28):
 *   .aur p {color}  .aur {background}  .aur {color}  .btn.dk {background}  
 *   .btn.dk {border-color}  .btn.dk {color}  .btn.dk:hover {background}  
 *   .code2 {background}  .code2 {color}  .code3 {background}  .code3 {color}  
 *   .nv.on .nb.box {background}  .nv.on .nb.box {color}  .pl.neu i {background}  
 *   .scta p {color}  .scta {background}  .scta {color}  .seg3 button.on {background}  
 *   .seg3 button.on {border-color}  .seg3 button.on {color}  .stbar button {color}  
 *   .stbar button.on {background}  .stbar button.on {color}  .stbar {background}  
 *   .stbar>span {color}  .sw::after {background}  .toast {background}  
 *   .toast {color}
 * two literals in one declaration (2):
 *   .ev.sel {box-shadow: 0 0 0 2px #fff,0 0 0 4px #A5A8F8}  
 *   .gn.sel {box-shadow: 0 0 0 3px #fff,0 0 0 5px #A5A8F8,0 6px 18px rgba(16,24,40,.1)}
 * white text on a fill that stays saturated or dark (7):
 *   .btn.dgs {color}  .btn.ghl {color}  .btn.pri {color}  .fpback {color}  
 *   .stp2.done b {color}  .stp2.now b {color}  .wkh span.on b {color}
 *
 * The two mid-greys (.gsl i, a slider knob; .me, a mark plate) are the one real
 * gap: both are a fill that sits between the Raised and the Lines rung, and the
 * dark table has nothing between those two. Picking a value here would be
 * inventing one, so they need a decision in design/kit/soil.css instead.
 */


/* Soil's own mark inside the kit's wordmark. The kit draws the logo as type alone
   (`.lg b`, 30px/800); this product has a mark and keeps it, so the two sit together.
   `brand_mark` paints in currentColor, which the dark blocks above already move, so
   there is no dark rule and no second file. Gap only -- the type is the kit's. */
/* The brand anchor states its own colour. brand_mark draws every shape in
   currentColor, so an <a> that states nothing hands the mark the user-agent link blue --
   the exact failure tests/test_brand_mark_colour.py exists to catch. --ink is the token
   the dark blocks above already move, so one declaration covers both themes. */
.lgb { display: inline-flex; align-items: center; gap: 9px; text-decoration: none; color: var(--ink); }
.lgb svg { flex: none; }
/* `.lg svg` greys the hamburger beside the brand, and section 4 loads after this block,
   so at equal specificity it also greyed the mark -- measured #5B5E68 against the
   anchor's #0D0E1A. These two carry one extra class each so the mark inherits the
   anchor, and the dark pair outranks the `:is(... .lg svg ...)` rule in the dark block. */
.lg .lgb svg { color: inherit; }
[data-theme="dark"] .lg .lgb svg { color: inherit; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .lg .lgb svg { color: inherit; }
}
.lgb b { color: inherit; }
.lm { display: inline-flex; align-items: center; gap: 7px; }
.lm svg { flex: none; }


/* The active menu row in dark. DESIGN_PATTERN.md's table is explicit: the row is
   #E9EAEE with #111216 TEXT -- it is the one row that stays light while the menu goes
   dark, so its label has to go the other way with it. The generic dark rules paint
   every `.nv` label with the body rung, and a `:is(...)` list takes the specificity of
   its strongest argument, so the row's own colour lost and the label rendered #E4E6EA
   on #E9EAEE: 1.03:1, which is not dim, it is gone. Measured, not guessed.
   Stated on :root and last in section 3 so neither specificity nor order can lose it
   again, and repeated for the two triggers the rest of this sheet uses. */
:root[data-theme="dark"] .nv.on,
:root[data-theme="dark"] .nv.on > span,
:root[data-theme="dark"] .nv.on svg,
:root[data-theme="dark"] .nv.on .nb { color: var(--kd-onnav); }

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .nv.on,
  :root:not([data-theme="light"]) .nv.on > span,
  :root:not([data-theme="light"]) .nv.on svg,
  :root:not([data-theme="light"]) .nv.on .nb { color: var(--kd-onnav); }
}


/* ---- asked for by the redesign rounds, which may not edit shared files ----------- */

/* A meeting that already happened. The grids mark every finished block .ev.is-past and
   nothing styled it, so a 9am stand-up drew exactly like a 4pm one that has not run.
   Dim, never hide: it is still a fact about the day. (round 3) */
/* `opacity` here multiplied the text contrast down below the 4.5:1 floor, and a
   token cannot see that it happened -- which is the whole point of the a11y rule.
   A finished meeting is quieter by colour instead: the block loses its tint and
   the label drops one text rung, both still measured against the surface. */
.ev.is-past { background: var(--band); border-left-color: var(--line); }
.ev.is-past, .ev.is-past * { color: var(--t3); }
[data-theme="dark"] .ev.is-past { background: var(--kd-band); border-left-color: var(--kd-line); }
[data-theme="dark"] .ev.is-past, [data-theme="dark"] .ev.is-past * { color: var(--kd-sub); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .ev.is-past { background: var(--kd-band); border-left-color: var(--kd-line); }
  :root:not([data-theme="light"]) .ev.is-past,
  :root:not([data-theme="light"]) .ev.is-past * { color: var(--kd-sub); }
}

/* The kit's segmented trays style `button` only. Some of their options are real
   destinations -- List is another route, and Last/This/Next week carry a date -- and a
   link there keeps middle-click, a copyable URL and the back button, which
   tests/test_calendar_screen.py pins. So the anchor gets the button's box. (round 3) */
.sg a, .seg3 a {
  display: inline-flex; align-items: center; justify-content: center;
  gap: 6px; height: 28px; padding: 0 12px; border-radius: 7px;
  font: 600 12.5px/1 inherit; color: var(--t3); text-decoration: none;
}
/* Both sides are tokens. A literal background beside `color: var(--ink)` moves the
   fill and the text independently between themes, which is how one theme ends up
   unreadable -- and the dark half named --kd-raised, which does not exist (the
   token is --kd-raise), so the selected segment had no background in dark at all. */
.sg a.on, .seg3 a.on { background: var(--bg-surface); color: var(--ink); box-shadow: 0 1px 2px rgba(16,24,40,.08); }
[data-theme="dark"] .sg a.on, [data-theme="dark"] .seg3 a.on { background: var(--kd-raise); color: var(--kd-ink); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .sg a.on,
  :root:not([data-theme="light"]) .seg3 a.on { background: var(--kd-raise); color: var(--kd-ink); }
}

/* Company pace's sparkline. The kit draws it indigo; sparkline() strokes currentColor
   and the old sheet set that to --text-tertiary, so it came out grey. (round 2) */
.pc .spark { color: var(--kit-text-8c92f8); }
[data-theme="dark"] .pc .spark { color: var(--kit-text-8c92f8); }

/* One full-width card in a row of its own. The u-* set has no margin-bottom, so a
   standalone kit card between the greeting and the card rows had nothing to space it
   and had to share a half-width row. (round 2) */
.row1 { margin-bottom: 16px; }
.row1 > .card { width: 100%; }


/* The initials inside a gradient avatar. The colour was a fill="" attribute in the
   macro until tests/test_brand_mark.py caught it: that file bans a literal fill in
   markup, because the bug it was written for was a mark painted #0E1116 and then
   rendered 1.07:1 on the dark sidebar. The six .sl-av-* backgrounds are fixed tones
   that do NOT invert, so white is right in both themes -- but it belongs here, where a
   theme could reach it, not baked into the element. */
[class^="sl-av-"] text, [class*=" sl-av-"] text { fill: var(--kit-text-ffffff); }


/* The Ask field. `.ain` IS the white rounded box and `.snd` is a square inside it, but
   a real <input> and <button> here inherit legacy.css's own border, background and
   shadow, so each drew a second box and the send square sat outside the field. The kit
   uses a bare input and a <span>; this app needs a submit control, so the control keeps
   its semantics and loses its chrome. */
/* The `:not()` pair is not decoration: legacy.css styles inputs with
   `input:not([type="radio"]):not([type="checkbox"])`, which scores (0,2,1), and a plain
   `.ain input` at (0,1,1) lost to it even though this sheet loads second -- so the field
   drew its own border inside the one `.ain` already has, and the box appeared twice. */
.ain input:not([type="radio"]):not([type="checkbox"]) {
  border: 0; background: none; box-shadow: none; padding: 0; margin: 0;
  height: 100%; min-width: 0; outline: 0; color: inherit; font: inherit;
}
.ain input:not([type="radio"]):not([type="checkbox"]):focus {
  border: 0; box-shadow: none; outline: 0;
}
.ain > .snd { border: 0; padding: 0; cursor: pointer; flex: none; }
.ain > .snd:hover { background: var(--kit-surface-e4e7ee); }
[data-theme="dark"] .ain > .snd:hover { background: var(--kd-line); }
/* The field keeps the focus ring the rest of the app uses, moved to the box that is
   actually visible, so keyboard focus is not silently lost with the border. */
.ain:focus-within { border-color: var(--kit-line-a5a8f8); box-shadow: 0 0 0 3px var(--kit-line-eeeefe); }
[data-theme="dark"] .ain:focus-within { border-color: var(--kd-pri); box-shadow: 0 0 0 3px var(--kd-glow); }


/* A graph node can never leave the canvas. The kit positions each node with a `left`
   percentage and lets it size to its label, which is fine for the kit's own short
   examples -- a real item is called "APP-102 log out clears local drafts" and the node
   grew straight off the right edge. The label ellipsizes instead; the full text is
   already in the node's `title`, and the detail below the graph names it in full. */
.gwrap .gn { max-width: 28%; }
.gwrap .gn b {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
}
/* The person chip hangs off the node's top-right corner, so a node in the last column
   needs room for it too. */
.gwrap .gn:has(.gav) { max-width: 25%; }


/* A NAME COLUMN CANNOT COLLAPSE TO ONE LETTER.
   The customers table is `--cols: minmax(0,1fr) 96px 76px 112px 84px 16px`: five fixed
   tracks totalling 384px and one flexible one with a floor of ZERO. Narrow the canvas
   and the fixed tracks keep every pixel while the only column that carries meaning --
   the customer's name -- shrinks away, which is how "Crestline Health" became "C...".
   A floor on that track, and the row scrolls rather than erasing the name. Seen in
   production; not reproducible at the widths tested here, which is exactly why the fix
   is a floor and not a breakpoint. */
.lst .tth.u-91, .lst .tr.u-91, .tth.u-91, .tr.u-91 {
  --cols: minmax(170px, 1fr) 96px 76px 112px 84px 16px !important;
}

/* An identifier that has no friendlier name. A Google calendar is often only known by
   `family0009347...@group.calendar.google.com`, and that is the honest label -- so it
   ellipsizes inside its row instead of running past the card. The full value stays in
   the element's `title`, so nothing is lost, only wrapped. */
.row .rm { min-width: 0; }
.row .rt, .row .rsb {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
}
.row > .pl { flex: none; }


/* A ROW WITH ONE CARD IN IT IS ONE COLUMN WIDE.
   The kit's rows are fixed grids -- `.cards3` is three columns, `.r2e` is two -- because
   the mockup always has three warnings and always has two cards in a pair. A real
   workspace has one warning, or one card with no sibling, and the fixed track count then
   leaves two thirds of the row empty next to it. That empty space is the single thing
   this screen has been criticised for most.
   The grids now take their column count from what is actually in them. Nothing moves and
   nothing stretches beyond the row; the row simply stops reserving space for cards that
   do not exist. */
.cards3:has(> :first-child:last-child) { grid-template-columns: minmax(0, 1fr); }
.cards3:has(> :nth-child(2):last-child) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.r2e:has(> :first-child:last-child) { grid-template-columns: minmax(0, 1fr); }
.g2:has(> :first-child:last-child) { grid-template-columns: minmax(0, 1fr); }

/* The same for the hidden overflow row: `.cards3.hide` holds the warnings past the first
   three, and when Show reveals a single extra card it should not sit in a third of a row
   either. */
.cards3.hide:has(> :first-child:last-child) { grid-template-columns: minmax(0, 1fr); }


/* The setup strip: pills and their links on one line, wrapping if the card is narrow. */
/* The step strip. `.stp2` and `.stl2` are the kit's own; this only lays them out
   inside a card, where the kit draws them in an onboarding header. */
.stps { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 2px 18px 16px; }
.stps > .btn { margin-left: auto; }


/* The Ask card sits at the foot of nearly every screen and had nothing above it, so it
   butted straight into whatever card ended the page. The kit's rows carry their own
   16px bottom margin; this card is appended by the shell, outside any row, so it needs
   its own. `:not(:first-child)` keeps Today -- where Ask is the row's own content and
   already spaced -- from gaining a double gap. */
.askc:not(:first-child) { margin-top: 16px; }
.pz > .askc, main .askc { margin-bottom: 16px; }


/* A banner needs air under it. The kit draws banners as one thin line directly under the
   top bar, where the shell's own padding separates them; inside a page they land on top
   of whatever card follows -- "Slack stopped working" was touching the Ask hero. */
.pz .bnr, main .bnr { margin-bottom: 16px; }
.pz .bnr + .bnr { margin-top: -6px; }

/* The Ask page's hero and the page header above it. */
.pz > .hd + .askc, .pz > .hd + .card { margin-top: 16px; }


/* A card is as tall as what is in it. `.g2` and `.r2e` carry `align-items: start` in the
   kit and `.r2` / `.r3` do not, so in those two rows a grid item stretches to the tallest
   sibling: Work at risk ended at its last row and the card carried on for another 245px
   of nothing, because What changed beside it is longer. Nothing about the kit's own rows
   wants that -- the two that were written with it prove the intent -- so the other two
   get it as well. */
/* .r2 holds two cards of very different length (Work at risk against What changed), so
   a stretched card there draws 245px of nothing below its last row. .r3 holds three
   short cards of similar height, where level bottoms read as tidy rather than as a box
   bigger than its contents. */
.r2 { align-items: start; }
.r3 { align-items: stretch; }
.r3 > .card { display: flex; flex-direction: column; }


/* A change is at most two lines. The kit's rows are built for one -- `.wci` is
   `min-height: 50px` with `align-items: center`, and its own examples are "Leo merged
   PR #229" -- while a real commit summary reads "Release blockers, the design system
   port, and account deletion was merged" and wrapped to four. Eight of those made the
   card half as tall again as Work at risk beside it.
   Two lines, not one: cutting these at one line removes the half that says what actually
   happened. The full sentence is on the element's `title`, and View all goes to the page
   that carries every one of them untouched. */
.wcl .wct {
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; line-height: 1.35;
}
.wcl .wci { align-items: start; padding: 7px 0; min-height: 0; }
.wcl .wci > .tm, .wcl .wci > .wcm { padding-top: 1px; }


/* Company pulse: a repo is called nousonworktechnologies/kredme-card-data, and the row
   let it wrap under itself and run beneath its own status pill. The name takes one line
   and ellipsizes; the pill keeps its width because it is the shorter, fixed thing. */
/* Company pulse. `.pr` is a five-track grid and the name track is sized to the kit's
   own examples -- "Mobile", "Platform" -- so a real repo called
   nousonworktechnologies/kredme-card-data ran straight out of its 59px track and under
   the status pill beside it. The name track takes the leftover room and the name
   ellipsizes inside it; the pill, the sparkline and the chevron keep their fixed sizes
   because they are the things that must stay legible. */
.pr { grid-template-columns: 18px minmax(0, 1fr) auto 34px 14px; }
.pr > :nth-child(2) {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
}
.pr > .pl { white-space: nowrap; }


/* A team row is one line. DESIGN_PATTERN.md says it of the menu above it -- "Labels
   never wrap" -- and the same holds here: a real team is called
   "Nousonworktechnologies/Card Data" and wrapped to two lines, then ran past the
   sidebar. The dot keeps its size, the name ellipsizes, and the full name is already on
   the row's title. */
.sb .tm { min-width: 0; }
.sb .tm > i { flex: none; }
.sb .tm {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}


/* ---- REAL DATA IS LONGER THAN THE KIT'S EXAMPLES -------------------------------
   The kit is drawn with "Mobile", "Leo merged PR #229" and kartik@acme.com. This
   workspace has nousonworktechnologies/kredme-card-data-service and 56-character
   Google calendar ids, and the kit has no rule for a string longer than its own
   example -- so the text simply leaves its box and lands on whatever is beside it.
   Measured, not guessed: scripts render each page with realistic values and ask the
   browser which elements then overflow or collide.

   The shape is always the same. A flex row holds a label and something fixed next to
   it; the label has no `min-width: 0`, so it refuses to shrink below its content, and
   the fixed thing gets pushed out of the row. Below is that rule, applied to the kit's
   own row and header parts rather than to each page that uses them. */

/* A card heading and the action beside it. */
.ch, .sh, .shl { min-width: 0; }
.shl > h2, .ch > h2 { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.ch > .lnk, .sh > .lnk, .ch > .btn, .sh > .btn { flex: none; }

/* A status pill states a fixed, short thing. It never shrinks, and it never stretches
   the row it sits in. */
.pl { flex: none; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Agent rows: name, description and state. */
.agr, .agm, .agn { min-width: 0; }
.agn > *, .agm > *, .agr > * { min-width: 0; }
.agn > .pl, .agm > .pl { flex: none; }

/* A disclosure's summary wraps rather than running out of the card. */
details.ds > summary { min-width: 0; overflow-wrap: break-word; }

/* The five groups the audit named after the first pass. Same rule each time -- the text
   may shrink, the fixed thing beside it may not -- applied to the parts that carry it. */

/* 1. Page headers. A long title or workspace name pushed the header's own buttons out
      of the header. The title takes the room that is left and ellipsizes. */
.hd { min-width: 0; }
.hd > div:first-child { min-width: 0; }
.hd .hdr, .hd > .hdr { flex: none; }
.hd h1 { overflow: hidden; text-overflow: ellipsis; min-width: 0; }

/* 2. Row titles against the thing beside them -- a timestamp, a ticket key, a tag. */
.rt, .rm, .lr2, .mr2 { min-width: 0; }
.rt > a, .rt > span, .rt > b { min-width: 0; }
.rt > .tg, .rt > .mono, .rt > .tm, .rt > .pl { flex: none; }

/* 3. Disclosure bodies. "Why am I seeing this?" holds the longest prose on the screen,
      and its panel had no rule for text with nowhere to break. */
.dsb, details.ds .dsb { min-width: 0; overflow-wrap: break-word; }
details.ds, details.ds > summary { min-width: 0; }

/* 4. Source chips cite where a fact came from; there can be many, so they wrap. */
.srcs, .src { min-width: 0; }
.srcs { display: flex; flex-wrap: wrap; gap: 6px; }
.srcs > * { max-width: 100%; }

/* 5. Key-value lists: a long term wraps rather than widening the list past the card. */
.wcr, .kv { min-width: 0; }
.wcr > dt, .wcr > dd, .kv > dt, .kv > dd { min-width: 0; overflow-wrap: break-word; }

/* The generic half of the same rule. A flex or grid child defaults to
   `min-width: auto`, which means "never shrink below my content" -- that single default
   is what sends a long repo path through the pill beside it. Zero lets it shrink; it
   does not force anything to, so an element with a real width keeps it. Scoped to the
   page body, so the shell's own fixed furniture is untouched.
   `overflow-wrap: break-word` is for the strings with nowhere to break: a 56-character
   calendar id has no space in it, so without this it leaves the card whatever the
   min-width says. */
.pz .card, .pz .card *, .fp .card, .fp .card * { min-width: 0; }
.pz .card p, .pz .card span, .pz .card b, .pz .card em, .pz .card summary,
.fp .card p, .fp .card span, .fp .card b, .fp .card em, .fp .card summary {
  overflow-wrap: break-word;
}

/* Source chips wrap onto the next line instead of off the edge. */
.srcs { min-width: 0; flex-wrap: wrap; }
.srcs > .lnk { flex: none; }


/* WORK AT RISK: THE TITLE IS WHAT THE ROW IS ABOUT.
   The kit's tracks give Work 1.8fr and Owner 0.9fr, sized for "Android 3.2 release" and
   "Priya". A real row is "Import document reward terms and repair card linking for the
   settlement path" owned by "nousonworktechnologies", and in this card that left the
   title 183px -- clipped at two lines -- while the owner took 62px and was clipped too,
   so NEITHER could be read.
   The owner is already named by the avatar beside it and by the row's title attribute,
   so the owner's text yields and the work's title takes the room. Three lines, because
   a 76-character title does not fit in two at this width. Measured against a real title,
   not the demo's short ones -- that is why this needed fixing twice.

   TWO LINES, not three (Kartik, 11 Oct): three made the rows tall and ragged beside
   What changed, which is two. A title longer than two lines is cut, so the row now
   carries the whole title in its `title` attribute (home.html) -- the rule from
   QUESTIONS_FOR_KARTIK #13, "single-line text gets ellipsis plus title", applied to a
   clamp. Nothing is unreachable, it is one hover away. */
.tth.u-1, .ttr.u-1 {
  --cols: minmax(0, 1fr) 92px 64px 92px 96px !important;
}
.ttr.u-1 .nm { white-space: normal; min-width: 0; overflow: visible; text-overflow: clip; }
/* THE CLAMP IS ON THE INNER SPAN, NOT ON `.nm`. `.nm` is a flex item inside `.who`,
   and a flex item's `display` is BLOCKIFIED: `-webkit-box` computes to `flow-root`
   there, so -webkit-line-clamp never engages and the title simply wrapped to as many
   lines as it liked. Measured in the browser: display came back "flow-root" with the
   clamp set and ignored. legacy.css's `.ask-rail-q-text` hit this exact trap and
   solved it the same way. The full title is on `.nm`'s title attribute, so hover
   still gives all of it. */
.ttr.u-1 .nmt {
  display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2;
  -webkit-box-orient: vertical; overflow: hidden; line-height: 1.32;
  /* A belt-and-braces cap at two lines of line-height. The clamp above does the real
     work and supplies the "…"; this only guarantees the row height if -webkit-box is
     ever blockified out from under it (which is what happens when the clamp is put on
     `.nm` itself -- see the note above). 2 x 1.32. */
  max-height: 2.64em;
}
/* The owner cell shrinks to its avatar; the name shows only while it fits whole. */
.ttr.u-1 > .who:nth-child(2) { min-width: 0; }
.ttr.u-1 .ow {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  max-width: 96px; min-width: 0;
}
.ttr.u-1 { align-items: center; min-height: 54px; }

/* A ROW THAT FOLLOWS A CARD NEEDS THE GAP THE KIT USUALLY DRAWS BY HAND.
   `.card` carries no margin of its own -- the kit separates blocks with an explicit
   `<div class="gap">` (15px) -- and `.r2`/`.r3` set margin-BOTTOM only. So wherever a
   card is followed straight by a row with no spacer between them, the two touch and the
   only thing between them is their borders. On Today that is the calm state ("Nothing
   needs you today") sitting directly on Work at risk and What changed.

   Matched by adjacency on purpose: when a `.gap` IS present it becomes the adjacent
   sibling, this rule stops matching, and the screens that already space themselves by
   hand are untouched rather than double-spaced. */
.card + .r2, .card + .r3, .card + .cards3,
.cards3 + .r2, .cards3 + .r3 { margin-top: 15px; }

/* Work at risk gets its side padding back as content width. The kit's 18px gutter is
   drawn against four short columns; this card carries five, one of which is a work
   title that wraps to three lines, so every pixel of gutter is a pixel the title does
   not get. 12px still separates the row from the card edge -- it is a narrower gutter,
   not a missing one -- and the header moves with the rows so the heading stays aligned
   with the column beneath it. Scoped to this card by id: the same `.ttr` draws Track
   record and the team tables, which have room and should keep the kit's spacing. */
#inprogress-h .ch,
#inprogress-h .tth,
#inprogress-h .ttr { padding-left: 12px; padding-right: 12px; }


/* AN APP MARK IS NEVER INVERTED, SO THE SURFACE UNDER IT CHANGES.
   GitHub's mark is #1B1F23 and Linear's is #222326 -- near-black, drawn straight onto
   the #18191E card in dark mode, where they simply vanish. GitLab's orange survives, so
   half the rows showed a logo and half showed nothing.
   DESIGN_PATTERN.md is explicit that marks and photos are not inverted: recolouring
   someone's brand is worse than the bug. So the mark keeps its own colour and sits on a
   light plate, which is what the sheet already does for the Connections rows.
   Notion's mark is #fff and has the same problem the other way round on a white card,
   so the plate is a neutral one rather than a white one. */
[data-theme="dark"] img.app-logo {
  background: var(--kit-surface-f2f4f7); border-radius:var(--radius-sm); padding: 2px;
  box-sizing: border-box;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) img.app-logo {
    background: #F2F4F7; border-radius:var(--radius-sm); padding: 2px; box-sizing: border-box;
  }
}


/* The backtest example rows. `.sl-fcrow` centres its three cells, which is right while
   the title is one line and wrong the moment it is three: a 119px title left the verdict
   pill and the flagged date floating against its middle, reading as though they belonged
   to the middle line rather than to the row. They align to the first line now, and the
   rows get real separation instead of the 3px they had. */
/* THE "BEST FIRST" TAG SITS INSIDE ITS CARD ON A PHONE.
   `.tcd > .tg` is `position: absolute; top: -11px`, a corner tag deliberately
   straddling the card's top border. In the three-column desktop grid there is room
   above each card for it. Stacked one per row on a phone there is not: the tag rides
   up onto the card above and its own top is sliced off, so "Best first" reads with
   its ascenders cut. Reported from a real phone against production.

   In flow it cannot be clipped by anything and cannot overlap the card above. `.tcd`
   is already a flex column with a 12px gap, so the tag simply becomes the card's
   first row, and `align-self` keeps it chip-width rather than stretching. */
.fp.phone .tcd > .tg,
.app.phone .tcd > .tg { position: static; align-self: flex-start; }

/* THE "NEEDS YOU" ROW WRAPS ON A PHONE INSTEAD OF CRUSHING ITS OWN SENTENCE.
   `.nyr` is a flex row of three: the app mark, `.rm` (the title and the explanation)
   and `.ra` (the status pill plus its button). `.ra` is `flex-shrink: 0` and on
   Connections it can hold "Needs attention" next to "Choose projects" -- about 310px
   together. On a 390px phone that leaves `.rm` almost nothing, and a paragraph in a
   20px column breaks ONE WORD PER LINE: "Jira / is / connected / but / reads /
   nothing". Reported from a real phone against production.

   The fix is the kit's own idiom for this (`.app.phone .row { flex-wrap: wrap }`):
   let the row wrap and give the controls their own full-width line under the text,
   where they have room to sit side by side. Nothing is hidden and nothing shrinks. */
.app.phone .nyr { flex-wrap: wrap; row-gap: 12px; }
.app.phone .nyr > .rm { min-width: 0; }
.app.phone .nyr > .ra { flex: 1 1 100%; flex-wrap: wrap; }

/* THE TIME IN "WHAT CHANGED" SITS AT THE LEFT OF ITS OWN COLUMN.
   `.tm` is the SIDEBAR TEAM LINK's class -- `padding: 0 14px`, `gap: 14px`,
   `height: 42px`, `margin-bottom: 4px` -- and the kit reuses the same two letters for
   the time cell in a `.wci` row. `.wci .tm` overrides the font and the colour but
   never the padding, so the sidebar's 14px gutter cascaded in and pushed every
   timestamp off the left edge of its column, which is what made a column of times look
   ragged rather than aligned.

   The column also drops from 78px to 62px. "12:57 am" is the longest clock Soil
   prints and needs about 48px, so 62 holds it with the divider's breathing room and
   hands the other 16px to the line of text, which is the part worth reading. */
.wcl .wci > .tm {
  padding-left: 0; padding-right: 10px;
  margin-bottom: 0; height: auto; gap: 0;
}
.wcl .wci { grid-template-columns: 62px 36px minmax(0, 1fr); }

/* The source mark on "What needs you" was a 38px tile around a 22px logo -- at this
   page's zoom that is a ~56px square beside a 14.5px title, so the row read as an icon
   with some text next to it rather than a thing that needs you. 28px around a 17px
   mark keeps the tile's shadow and border legible while giving the width back to the
   title and the sentence under it, which is what a person is here to read.

   Scoped to `.apv`, and the template no longer carries `u-38`: that utility is still
   the right size for the bot tile on Custom agents, which is a tile in a row of its
   own rather than a mark in front of a paragraph. */
.apv > .tile { width: 28px; height: 28px; border-radius:var(--radius-md); }

/* THE WIDE ROW'S COLUMNS, AT A SPECIFICITY THAT ACTUALLY WINS.
   `.sl-fcrow-wide` (one class) sets its own three tracks at soil.css:3004, and
   `.sl-fcrow` (also one class) is redefined later at 3345 -- equal specificity, later
   wins, so the wide variant has been DEAD and every row has been laid out on the base
   148px/210px tracks. Measured on /org/demo/track-record: the computed template came
   back "264.708px 147.991px 209.996px" while the verdict pill needed 234px and the
   flagged-date needed 272px, so both overflowed their tracks and pushed the title into
   a narrow ragged column. Two classes here, so neither rule's position matters.

   The widths are not guessed and not read off a squeezed cell -- a cell that is
   already overflowing reports the width it was forced to, not the width it wants.
   Each column was sized, then CHECKED by how much its own text was still being cut
   (scrollWidth - clientWidth): at 132/148 the date was losing 22px and the verdict
   pill 6px, so they are 140 and 172. A flagged date is a measured fact and must never
   be shaved; the title is the one part here that can afford to wrap, so it takes
   whatever is left -- which matters most in the narrow card, where the whole grid has
   462px to divide.

   Fixed rather than max-content because every row is its OWN grid: content sizing
   would land each row's columns in a different place, which is the opposite of
   aligned. */
.sl-fcrow.sl-fcrow-wide {
  grid-template-columns: minmax(0, 1fr) 140px 172px;
  align-items: start; row-gap: 14px;
}
/* AND THE CELLS ARE BOUND TO THEIR OWN COLUMN.
   `.sl-fcrow-p` is `justify-self: start`, which sizes a grid item to its CONTENT and
   lets it overflow its track -- so the verdict pill rendered 234px wide inside a 124px
   column and printed itself straight across "Flagged 24 Aug 2026 · 8 days" in the
   column beside it. Setting the columns alone could never fix that; a track is not a
   clip. `max-width: 100%` is what actually holds an item inside its grid area. */
.sl-fcrow.sl-fcrow-wide > .sl-fcrow-p,
.sl-fcrow.sl-fcrow-wide > .sl-fcrow-d { max-width: 100%; min-width: 0; }
.sl-fcrow.sl-fcrow-wide > .sl-fcrow-p > * { max-width: 100%; }
/* The source chip sits on its own line, with room above it. `sl_src` renders inline
   and follows the title text directly, so after a title that wraps to three lines the
   chip butted straight against the last line with nothing between them -- two
   different things reading as one block. A chip is a citation for the title above it,
   not a continuation of it. */
.sl-fcrow.sl-fcrow-wide > .sl-fcrow-t > .sl-src { display: inline-flex; margin-top: 7px; }
@media (max-width: 640px) {
  /* The stacked phone layout has to be restated at the same two-class specificity, or
     the rule above would win there too and put three tracks on a 390px screen. */
  .sl-fcrow.sl-fcrow-wide { grid-template-columns: auto minmax(0, 1fr); }
}
.sl-fcrow.sl-fcrow-wide > .sl-fcrow-p,
.sl-fcrow.sl-fcrow-wide > .sl-fcrow-d { padding-top: 2px; }
.sl-fcrow.sl-fcrow-wide + .sl-fcrow.sl-fcrow-wide { margin-top: 6px; }

/* A LOGO IS NEVER SQUASHED. `.app-logo` carries width and height attributes, but it
   sits inside flex rows (`.who` on Work at risk, `.wcm` on What changed) whose other
   child is a work title of any length -- and a flex item defaults to flex-shrink:1, so
   the title simply took the logo's width. Measured on Today: the same 20px mark
   rendered at 16.4px, 19.8px, 21px, 22.6px and 30.5px in six consecutive rows, which is
   why GitHub "looks so small" next to GitLab -- it was in the row with the longest
   title, not drawn differently. The height was never squashed, so each mark was also
   quietly distorted. The text is what should give way; it already has `min-width: 0`
   and an ellipsis to do it with. */
.app-logo { flex: 0 0 auto; }

/* The two skeleton greys, named. The kit sets them as literal hex on `.skl i` and
   overrides that whole rule for dark, which is why `.skl i` is one of
   test_css_theming's own unthemeable-hex findings -- it lives in section 4 and cannot
   be fixed from here. Naming them lets anything added in section 3 shade correctly in
   both themes without repeating a literal, and the dark values are the kit's own
   --kd-skel pair so the two skeletons cannot drift apart. */
:root { --skel: #F1F2F4; --skel-shine: #E7E9EC; }
[data-theme="dark"] { --skel: #22262E; --skel-shine: #2A2F38; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) { --skel: #22262E; --skel-shine: #2A2F38; }
}

/* The prep-note skeleton on Today's meetings card. The notes arrive in a second pass
   (soil/web/routes.py's org_dashboard_meeting_notes), so the row needs a stand-in for
   ONE LINE OF QUIET TEXT sitting inside an inline `.wct`.

   It is NOT `.skl`: that is a flex column with 18px of padding meant to replace a whole
   card body, and it emits a <div> -- invalid inside `.wct`'s <span>, which the browser
   reparses straight back out of the row. This borrows `.skl i`'s shimmer and nothing
   else, and is sized to the notes it stands in for (they run 30-60 characters). */
.tmsk { height: 11px; width: 62%; max-width: 300px; border-radius: var(--radius-sm);
  background: linear-gradient(90deg, var(--skel) 25%, var(--skel-shine) 50%, var(--skel) 75%);
  background-size: 200% 100%; animation: shim 1.4s linear infinite; }
@media (prefers-reduced-motion: reduce) { .tmsk { animation: none; } }

/* Keep the reconnect action tall enough to read and click inside the compact banner. */
.bnr .btn { min-height: 36px; }

/* Client commitment workflow. */
.delivery-skip { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
.delivery-skip:focus { position: static; width: auto; height: auto; overflow: visible; clip-path: none; display: block; padding: 10px; }
.delivery .sh { flex-wrap: wrap; gap: 12px; align-items: start; }
.delivery .shl { flex: 1; min-width: 0; }
.delivery .sh h2 { white-space: normal; overflow: visible; text-overflow: clip; line-height: 1.5; }
.delivery .ta, .delivery .inp { background: var(--bg-surface); color: var(--ink); border-color: var(--line-control); }
.delivery .btn:not(.dk) { background: var(--bg-surface); color: var(--ink); border-color: var(--line-control); }
.delivery-public { margin: 0; padding: 0 28px 40px; background: var(--bg-page); }
.delivery-public-nav { display: flex; justify-content: space-between; align-items: center; gap: 20px; max-width: 1200px; margin: 0 auto; padding: 24px 0 32px; }
.delivery-public-nav .lgb { font-size: 28px; color: var(--ink); font-weight: 700; }
.delivery-public-nav nav { display: flex; gap: 20px; font-size: 13px; color: var(--text-2); }
@media (max-width: 480px) { .delivery-public { padding: 0 16px 30px; } .delivery-public-nav nav { gap: 12px; } }
.delivery { max-width: 1200px; margin: 0 auto; color: var(--ink); }
.delivery-header { display: flex; align-items: start; justify-content: space-between; gap: 24px; margin: 8px 0 24px; }
.delivery-header > div { min-width: 0; }
.delivery h1 { margin: 8px 0 10px; font-size: clamp(26px, 3vw, 34px); line-height: 1.2; font-weight: 650; letter-spacing: -.035em; overflow-wrap: anywhere; }
.delivery .sub { max-width: 680px; line-height: 1.6; }
.delivery .card { margin-bottom: 18px; min-width: 0; }
.delivery .card h2 { overflow-wrap: anywhere; }
.delivery .btn { max-width: 100%; }
.delivery-card-body { padding: 18px 22px 24px; line-height: 1.6; overflow-wrap: anywhere; }
.delivery-card-body > p:first-child { margin-top: 0; }
.delivery-notice { margin-bottom: 16px; padding: 14px 18px; border: 1px solid var(--line-card); border-radius: var(--radius-md); background: var(--bg-surface); line-height: 1.6; font-size: 13px; }
.delivery-notice a { color: var(--soil-violet); text-decoration: underline; text-underline-offset: 3px; }
.delivery-notice-error { border-color: var(--critical-card-line); }
.delivery-list .sh { padding-bottom: 16px; }
.delivery-row { display: grid; grid-template-columns: minmax(0, 1.8fr) minmax(0, 1fr) minmax(0, .8fr); gap: 24px; padding: 20px 22px; border-top: 1px solid var(--line-divider); align-items: center; color: inherit; }
.delivery-row:hover { background: var(--bg-hover); }
.delivery-row strong { font-size: 15px; line-height: 1.5; }
.delivery-row span { line-height: 1.6; }
.delivery-row > div { min-width: 0; overflow-wrap: anywhere; display: flex; flex-direction: column; gap: 5px; }
.delivery-row-main > span, .delivery-row-meta, .delivery-row-status > span:last-child { font-size: 12px; color: var(--text-2); }
.delivery-row-status { align-items: start; }
.delivery-empty { padding: 42px 28px; text-align: center; }
.delivery-empty h2 { font-size: 20px; margin: 0 0 12px; }
.delivery-empty p { max-width: 540px; margin: 0 auto 22px; line-height: 1.7; color: var(--text-2); }
.delivery-empty .delivery-actions { justify-content: center; }
.delivery-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 18px; }
.delivery-footnote { font-size: 12px; color: var(--text-2); line-height: 1.7; margin: 18px 0 0; }
.delivery-back { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-2); margin-bottom: 16px; }
.delivery-back svg { transform: rotate(180deg); }
.delivery-grid { display: grid; grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr); gap: 22px; align-items: start; }
.delivery-grid > * { min-width: 0; }
.delivery-reasons { margin: 0; padding-left: 20px; }
.delivery-reasons li + li { margin-top: 8px; }
.delivery-evidence { display: flex; align-items: center; gap: 14px; color: inherit; padding: 16px 0; border-bottom: 1px solid var(--line-divider); }
.delivery-evidence > span { display: flex; flex: 1; min-width: 0; flex-direction: column; gap: 5px; }
.delivery-evidence > span > span { font-size: 12px; color: var(--text-2); }
.delivery-history { list-style: none; padding: 0; margin: 0; }
.delivery-history li { position: relative; padding: 0 0 22px 18px; border-left: 2px solid var(--line-divider); }
.delivery-history li:last-child { padding-bottom: 0; }
.delivery-history span { display: block; font-size: 12px; color: var(--text-2); margin-top: 4px; }
.delivery-history p { font-size: 13px; margin: 8px 0 0; }
.delivery-form { display: grid; gap: 12px; }
.delivery-form label, .delivery-draft label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 6px; }
.delivery-form .inp { width: 100%; box-sizing: border-box; min-width: 0; }
.delivery-form .ta, .delivery-draft .ta { width: 100%; box-sizing: border-box; resize: vertical; }
.delivery-form-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 18px; margin-top: 8px; }
.delivery-form-grid > div { min-width: 0; }
.delivery-form-page { max-width: 820px; }
.delivery-disclosure { margin-top: 22px; }
.delivery-disclosure summary { cursor: pointer; font-size: 13px; font-weight: 600; padding: 8px 0; }
.delivery-disclosure .delivery-form { margin-top: 10px; }
.delivery-draft { margin-top: 22px; }
.delivery-candidate h2 { font-size: 18px; line-height: 1.5; margin: 14px 0 8px; }
.delivery-more > summary { cursor: pointer; list-style: none; }
.delivery-more > summary::-webkit-details-marker { display: none; }
.delivery-more[open] > summary { color: var(--soil-violet); }
.delivery-demo-steps { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 8px; margin: 0 0 24px; }
.delivery-demo-steps a { min-width: 0; border: 1px solid var(--line-card); border-radius: var(--radius-md); padding: 10px; color: var(--text-2); font-size: 11px; line-height: 1.5; display: flex; gap: 8px; align-items: center; }
.delivery-demo-steps .is-current { border-color: var(--soil-violet); color: var(--soil-violet); background: var(--bg-surface); }
.delivery-demo-steps b { font-size: 14px; }
.delivery-facts { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin: 0 0 24px; }
.delivery-facts dt { color: var(--text-2); font-size: 12px; }
.delivery-facts dd { margin: 5px 0 0; font-size: 14px; }
.delivery-demo-message { display: flex; align-items: start; gap: 14px; padding: 20px; background: var(--bg-hover); border: 1px solid var(--line-divider); border-radius: var(--radius-md); margin: 18px 0; }
.delivery-demo-message > div { min-width: 0; }
.delivery-demo-message strong { font-size: 13px; }
.delivery-demo-message blockquote { margin: 12px 0 0; font-size: 17px; font-weight: 500; }
.delivery-demo-message p { margin: 8px 0 0; }
.delivery a:focus-visible, .delivery-more summary:focus-visible { outline: 2px solid var(--soil-violet); outline-offset: 4px; }
@media (max-width: 800px) {
 .delivery-grid { grid-template-columns: minmax(0, 1fr); }
 .delivery-header { flex-direction: column; gap: 16px; }
 .delivery-row { grid-template-columns: minmax(0, 1fr) minmax(0, .8fr); gap: 14px; }
 .delivery-row-meta { grid-column: 1; }
 .delivery-row-status { grid-column: 2; grid-row: 1 / 3; }
 .delivery-demo-steps { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 480px) {
 .delivery-card-body { padding: 16px; }
 .delivery-form-grid, .delivery-facts { grid-template-columns: minmax(0, 1fr); }
 .delivery-row { padding: 18px 16px; gap: 10px; }
 .delivery-row strong { font-size: 14px; }
 .delivery-demo-message { padding: 14px; }
 .delivery .tabs { gap: 6px; }
 .delivery .tab { padding: 0 10px; font-size: 12px; }
 .delivery-empty { padding: 30px 18px; }
}

.delivery .sl-field { max-width: none; min-width: 0; }
.delivery .sl-field input { width: 100%; box-sizing: border-box; }
/* Primary mobile destinations remain touchable inside the viewport. */
@media (max-width: 900px) {
  .mobile-tabbar { grid-template-columns: repeat(7, minmax(64px, 1fr)); overflow-x: auto; }
  .mobile-tabbar .mobile-tab { min-height: 48px; }
}

.sb .nv .workspace-nav-label { white-space: normal; text-overflow: clip; line-height: 1.3; }

/* Keep billing management readable on a phone. */
.app.phone .bill .bt { flex-direction: column; }
.app.phone .bill .bt > form { align-self: stretch; }
.app.phone .bill .bt > form .btn { width: 100%; min-height: 44px; }

/* ===================================================================
   4. The new design  --  design/kit/soil.css, copied verbatim.
   Do not hand-edit below this line. Change design/kit/soil.css and
   re-copy it, or the next kit drop silently reverts the fix.
   Last so that where both sheets set the same property at the same
   specificity, the new design wins (REDESIGN_PROMPT round 1). The two
   sheets share no class names, so sections 1-3 keep serving the pages
   later rounds have not converted. The u-* classes at its end replace
   what were inline style="" attributes; the CSP sets style-src-attr 'none'.
   =================================================================== */
/* Soil design: the exact CSS of design/soil-app.html, in cascade order (later rules win).
   Fonts load from /static/fonts. Palette tokens follow the app theme. */
@font-face{font-family:"Inter";src:url("/static/fonts/InterVariable.ttf") format("truetype");font-weight:100 900;font-style:normal;font-display:swap}
@font-face{font-family:"JetBrains Mono";src:url("/static/fonts/JetBrainsMono-Variable.ttf") format("truetype");font-weight:100 800;font-style:normal;font-display:swap}



*{box-sizing:border-box;margin:0;padding:0}
:root{--ink:#0D0E1A;--t1:#1E2129;--t2:#3A3D48;--t3:#5E6170;--t4:#8A8D9A;--t5:#A3A6B2;--line:#E9EBEF;--line2:#F1F2F4;--band:#F7F8F9;--sb:#F3F4F6;--pri:#4A4CF7;--ind:#3C35E3}
/* Kit palette preserves light values; dark values follow semantic app tokens. */
:root {
  color-scheme: light;
  --radius-kit-nav: 11px;
  --radius-kit-card: 14px;
  --radius-kit-feature: 16px;
  --radius-kit-preview: 18px;
  --radius-kit-hero: 24px;
  --kit-line-0e121a: #0E121A;
  --kit-line-1a1c29: #1A1C29;
  --kit-line-1a1d2b: #1A1D2B;
  --kit-line-2b7cf6: #2B7CF6;
  --kit-line-4447f2: #4447F2;
  --kit-line-4a4cf7: #4A4CF7;
  --kit-line-5b5bf5: #5B5BF5;
  --kit-line-6366f1: #6366F1;
  --kit-line-a5a8f8: #A5A8F8;
  --kit-line-bdefd5: #BDEFD5;
  --kit-line-c0182b: #C0182B;
  --kit-line-c7dafb: #C7DAFB;
  --kit-line-c9c7fb: #C9C7FB;
  --kit-line-c9ccd4: #C9CCD4;
  --kit-line-cdd0d8: #CDD0D8;
  --kit-line-cfcdfb: #CFCDFB;
  --kit-line-cfe0fb: #CFE0FB;
  --kit-line-d5d8df: #D5D8DF;
  --kit-line-d5f0e1: #D5F0E1;
  --kit-line-e2e4ea: #E2E4EA;
  --kit-line-e3e4fd: #E3E4FD;
  --kit-line-e3e7fb: #E3E7FB;
  --kit-line-e4e6ea: #E4E6EA;
  --kit-line-e5243b: #E5243B;
  --kit-line-e6e5fd: #E6E5FD;
  --kit-line-e6e8ec: #E6E8EC;
  --kit-line-e9e8fd: #E9E8FD;
  --kit-line-e9ebef: #E9EBEF;
  --kit-line-eadfc9: #EADFC9;
  --kit-line-ebedf8: #EBEDF8;
  --kit-line-ecebfd: #ECEBFD;
  --kit-line-eceef1: #ECEEF1;
  --kit-line-eceef2: #ECEEF2;
  --kit-line-eceef5: #ECEEF5;
  --kit-line-eeeefe: #EEEEFE;
  --kit-line-eeeff1: #EEEFF1;
  --kit-line-eef0f3: #EEF0F3;
  --kit-line-eef5fe: #EEF5FE;
  --kit-line-f07a12: #F07A12;
  --kit-line-f0f1f3: #F0F1F3;
  --kit-line-f1f0fe: #F1F0FE;
  --kit-line-f1f2f4: #F1F2F4;
  --kit-line-f3c5ca: #F3C5CA;
  --kit-line-f3e3c8: #F3E3C8;
  --kit-line-f5f5ff: #F5F5FF;
  --kit-line-f6d5d9: #F6D5D9;
  --kit-line-f6dde4: #F6DDE4;
  --kit-line-f6e3c2: #F6E3C2;
  --kit-line-f6ebd3: #F6EBD3;
  --kit-line-f7cdd1: #F7CDD1;
  --kit-line-f7d3d6: #F7D3D6;
  --kit-line-f9ddb7: #F9DDB7;
  --kit-line-fac9cd: #FAC9CD;
  --kit-line-fad7b3: #FAD7B3;
  --kit-line-ffffff: #fff;
  --kit-surface-04bb6f: #04BB6F;
  --kit-surface-0e121a: #0E121A;
  --kit-surface-11907f: #11907F;
  --kit-surface-12141c: #12141C;
  --kit-surface-12b76a: #12B76A;
  --kit-surface-14162a: #14162A;
  --kit-surface-16a34a: #16A34A;
  --kit-surface-1763ef: #1763EF;
  --kit-surface-1a1d2b: #1A1D2B;
  --kit-surface-1f232c: #1F232C;
  --kit-surface-22b8a4: #22B8A4;
  --kit-surface-232c48: #232C48;
  --kit-surface-2881f0: #2881F0;
  --kit-surface-2b2e70: #2B2E70;
  --kit-surface-2c2e36: #2C2E36;
  --kit-surface-3d5ae8: #3D5AE8;
  --kit-surface-4447f2: #4447F2;
  --kit-surface-464df6: #464DF6;
  --kit-surface-4743f2: #4743F2;
  --kit-surface-4a39fc: #4A39FC;
  --kit-surface-4a4cf7: #4A4CF7;
  --kit-surface-5759fa: #5759FA;
  --kit-surface-5a55fa: #5A55FA;
  --kit-surface-5a63f3: #5A63F3;
  --kit-surface-5b7cfa: #5B7CFA;
  --kit-surface-5b7efb: #5B7EFB;
  --kit-surface-5e5efa: #5E5EFA;
  --kit-surface-6366f1: #6366F1;
  --kit-surface-6670f6: #6670F6;
  --kit-surface-6e66f8: #6E66F8;
  --kit-surface-6e73f9: #6E73F9;
  --kit-surface-86d6a9: #86D6A9;
  --kit-surface-a9b0f8: #A9B0F8;
  --kit-surface-b9732a: #B9732A;
  --kit-surface-b9bdc9: #B9BDC9;
  --kit-surface-c0182b: #C0182B;
  --kit-surface-c3c8fa: #C3C8FA;
  --kit-surface-c7c1e6: #C7C1E6;
  --kit-surface-c9ccd4: #C9CCD4;
  --kit-surface-d5d8df: #D5D8DF;
  --kit-surface-d7dafb: #D7DAFB;
  --kit-surface-d9dadf: #D9DADF;
  --kit-surface-dcdee3: #DCDEE3;
  --kit-surface-e0a04a: #E0A04A;
  --kit-surface-e1e0fd: #E1E0FD;
  --kit-surface-e31a2c: #E31A2C;
  --kit-surface-e3e4e8: #E3E4E8;
  --kit-surface-e3e5ea: #E3E5EA;
  --kit-surface-e4e7ee: #E4E7EE;
  --kit-surface-e5243b: #E5243B;
  --kit-surface-e6e8ec: #E6E8EC;
  --kit-surface-e7e9ec: #E7E9EC;
  --kit-surface-e9890f: #E9890F;
  --kit-surface-e9ebef: #E9EBEF;
  --kit-surface-e9ecff: #E9ECFF;
  --kit-surface-e9f8f0: #E9F8F0;
  --kit-surface-ea0726: #EA0726;
  --kit-surface-eaf3fe: #EAF3FE;
  --kit-surface-eaf8f0: #EAF8F0;
  --kit-surface-eafbf3: #EAFBF3;
  --kit-surface-eceef1: #ECEEF1;
  --kit-surface-eceef5: #ECEEF5;
  --kit-surface-edeef1: #EDEEF1;
  --kit-surface-ee0b1e: #EE0B1E;
  --kit-surface-eef0f3: #EEF0F3;
  --kit-surface-eef0f4: #EEF0F4;
  --kit-surface-eef4ff: #EEF4FF;
  --kit-surface-eef5fe: #EEF5FE;
  --kit-surface-efefff: #EFEFFF;
  --kit-surface-eff5fe: #EFF5FE;
  --kit-surface-f07a12: #F07A12;
  --kit-surface-f0f0fe: #F0F0FE;
  --kit-surface-f1f0fe: #F1F0FE;
  --kit-surface-f1f2f4: #F1F2F4;
  --kit-surface-f1f2fe: #F1F2FE;
  --kit-surface-f2f2ff: #F2F2FF;
  --kit-surface-f2f3f5: #F2F3F5;
  --kit-surface-f2f4f7: #F2F4F7;
  --kit-surface-f2fbf6: #F2FBF6;
  --kit-surface-f3b26b: #F3B26B;
  --kit-surface-f3f4f6: #F3F4F6;
  --kit-surface-f3f5ff: #F3F5FF;
  --kit-surface-f48721: #F48721;
  --kit-surface-f4f4ff: #F4F4FF;
  --kit-surface-f4f5f7: #F4F5F7;
  --kit-surface-f56700: #F56700;
  --kit-surface-f56c03: #F56C03;
  --kit-surface-f59e0b: #F59E0B;
  --kit-surface-f5f4ff: #F5F4FF;
  --kit-surface-f6f2ff: #F6F2FF;
  --kit-surface-f6f7f9: #F6F7F9;
  --kit-surface-f6f7fe: #F6F7FE;
  --kit-surface-f7f7ff: #F7F7FF;
  --kit-surface-f7f8fa: #F7F8FA;
  --kit-surface-f7f8ff: #F7F8FF;
  --kit-surface-f8f8ff: #F8F8FF;
  --kit-surface-f8f9fa: #F8F9FA;
  --kit-surface-f8f9fb: #F8F9FB;
  --kit-surface-f8f9fd: #F8F9FD;
  --kit-surface-f8f9ff: #F8F9FF;
  --kit-surface-f98207: #F98207;
  --kit-surface-fafafc: #FAFAFC;
  --kit-surface-fafaff: #FAFAFF;
  --kit-surface-fbeff4: #FBEFF4;
  --kit-surface-fbfbfc: #FBFBFC;
  --kit-surface-fbfbff: #FBFBFF;
  --kit-surface-fce7e8: #FCE7E8;
  --kit-surface-fcfcfd: #FCFCFD;
  --kit-surface-fd858e: #FD858E;
  --kit-surface-fdecec: #FDECEC;
  --kit-surface-fdedf0: #FDEDF0;
  --kit-surface-fdf0db: #FDF0DB;
  --kit-surface-fdf2f3: #FDF2F3;
  --kit-surface-feeeef: #FEEEEF;
  --kit-surface-fef3c7: #FEF3C7;
  --kit-surface-fef3e6: #FEF3E6;
  --kit-surface-fef5ea: #FEF5EA;
  --kit-surface-fef6ea: #FEF6EA;
  --kit-surface-ffe1e4: #FFE1E4;
  --kit-surface-fff1f3: #FFF1F3;
  --kit-surface-fff3e0: #FFF3E0;
  --kit-surface-fff3e8: #FFF3E8;
  --kit-surface-fff3f5: #FFF3F5;
  --kit-surface-fff5f5: #FFF5F5;
  --kit-surface-fff6ec: #FFF6EC;
  --kit-surface-fff8f9: #FFF8F9;
  --kit-surface-fff9ee: #FFF9EE;
  --kit-surface-fff9f0: #FFF9F0;
  --kit-surface-fffbf4: #FFFBF4;
  --kit-surface-fffcf6: #FFFCF6;
  --kit-surface-fffcf7: #FFFCF7;
  --kit-surface-ffffff: #fff;
  --kit-text-050412: #050412;
  --kit-text-0b0b25: #0B0B25;
  --kit-text-0ba85a: #0BA85A;
  --kit-text-0c0b1d: #0C0B1D;
  --kit-text-0e5e36: #0E5E36;
  --kit-text-0e7a45: #0E7A45;
  --kit-text-0e8f4e: #0E8F4E;
  --kit-text-12141c: #12141C;
  --kit-text-12a05c: #12A05C;
  --kit-text-159a5c: #159A5C;
  --kit-text-16181d: #16181D;
  --kit-text-1a1530: #1A1530;
  --kit-text-1a1c29: #1A1C29;
  --kit-text-1e2129: #1E2129;
  --kit-text-1e2228: #1E2228;
  --kit-text-1e9e62: #1E9E62;
  --kit-text-1f2133: #1F2133;
  --kit-text-1f2730: #1F2730;
  --kit-text-23252f: #23252F;
  --kit-text-232c48: #232C48;
  --kit-text-2370e0: #2370E0;
  --kit-text-24232a: #24232A;
  --kit-text-272450: #272450;
  --kit-text-292929: #292929;
  --kit-text-2a2d37: #2A2D37;
  --kit-text-2f323a: #2F323A;
  --kit-text-2f9e6a: #2F9E6A;
  --kit-text-2fa36b: #2FA36B;
  --kit-text-3a3d48: #3A3D48;
  --kit-text-3b3e55: #3B3E55;
  --kit-text-3c32a7: #3C32A7;
  --kit-text-3c35a0: #3C35A0;
  --kit-text-3c35e3: #3C35E3;
  --kit-text-3daa7a: #3DAA7A;
  --kit-text-3e9b74: #3E9B74;
  --kit-text-3f424c: #3F424C;
  --kit-text-494c52: #494C52;
  --kit-text-4b4e5c: #4B4E5C;
  --kit-text-4b4e66: #4B4E66;
  --kit-text-4c3cbc: #4C3CBC;
  --kit-text-4e5058: #4E5058;
  --kit-text-4e515c: #4E515C;
  --kit-text-4e5160: #4E5160;
  --kit-text-4f46e5: #4F46E5;
  --kit-text-515357: #515357;
  --kit-text-585a69: #585A69;
  --kit-text-5a48f2: #5A48F2;
  --kit-text-5b57f8: #5B57F8;
  --kit-text-5b5e68: #5B5E68;
  --kit-text-5c5e6b: #5C5E6B;
  --kit-text-5e5244: #5E5244;
  --kit-text-5e5efa: #5E5EFA;
  --kit-text-5e6170: #5E6170;
  --kit-text-68667b: #68667B;
  --kit-text-6b4a12: #6B4A12;
  --kit-text-6b6e78: #6B6E78;
  --kit-text-6e66f8: #6E66F8;
  --kit-text-6e7180: #6E7180;
  --kit-text-6e7182: #6E7182;
  --kit-text-7a6a55: #7A6A55;
  --kit-text-7a7d88: #7A7D88;
  --kit-text-7c7e87: #7C7E87;
  --kit-text-7d7b87: #7D7B87;
  --kit-text-83848f: #83848F;
  --kit-text-868688: #868688;
  --kit-text-8a5a1e: #8A5A1E;
  --kit-text-8a8d9a: #8A8D9A;
  --kit-text-8a8da0: #8A8DA0;
  --kit-text-8b8f9e: #8B8F9E;
  --kit-text-8c8f99: #8C8F99;
  --kit-text-8c92f8: #8C92F8;
  --kit-text-8d91a3: #8D91A3;
  --kit-text-8e90a0: #8E90A0;
  --kit-text-8f1d27: #8F1D27;
  --kit-text-92400e: #92400E;
  --kit-text-9594a1: #9594A1;
  --kit-text-9a5b12: #9A5B12;
  --kit-text-9a9daa: #9A9DAA;
  --kit-text-9ea2b0: #9EA2B0;
  --kit-text-9f1322: #9F1322;
  --kit-text-a16b30: #A16B30;
  --kit-text-a3a5b1: #A3A5B1;
  --kit-text-a3a6b2: #A3A6B2;
  --kit-text-a5a8f8: #A5A8F8;
  --kit-text-a8abb6: #A8ABB6;
  --kit-text-ab0d0e: #AB0D0E;
  --kit-text-b26a12: #B26A12;
  --kit-text-b4232f: #B4232F;
  --kit-text-b5630f: #B5630F;
  --kit-text-b7000d: #B7000D;
  --kit-text-b9bccb: #B9BCCB;
  --kit-text-c0182b: #C0182B;
  --kit-text-c2410c: #C2410C;
  --kit-text-c2414f: #C2414F;
  --kit-text-c25a06: #C25A06;
  --kit-text-c26a16: #C26A16;
  --kit-text-d5d8e1: #D5D8E1;
  --kit-text-d62142: #D62142;
  --kit-text-d63a44: #D63A44;
  --kit-text-d93645: #D93645;
  --kit-text-d94356: #D94356;
  --kit-text-e06106: #E06106;
  --kit-text-e2730e: #E2730E;
  --kit-text-e5243b: #E5243B;
  --kit-text-e5670c: #E5670C;
  --kit-text-e75333: #E75333;
  --kit-text-f2570c: #F2570C;
  --kit-text-ffffff: #fff;
}
:root[data-theme="dark"] {
  color-scheme: dark;
  --ink: #F3F4F6; --t1: #E4E6EA; --t2: #E4E6EA; --t3: #9EA2AC; --t4: #7D818C; --t5: #7D818C;
  --line: #2A2C33; --line2: #2A2C33; --band: #1B1D22; --sb: #17181C; --pri: #6E70FA; --ind: #5A5DF5;
  --kit-line-0e121a: var(--selected-line);
  --kit-line-1a1c29: var(--line-control);
  --kit-line-1a1d2b: var(--line-control);
  --kit-line-2b7cf6: var(--selected-line);
  --kit-line-4447f2: var(--selected-line);
  --kit-line-4a4cf7: var(--selected-line);
  --kit-line-5b5bf5: var(--selected-line);
  --kit-line-6366f1: var(--selected-line);
  --kit-line-a5a8f8: var(--line-control);
  --kit-line-bdefd5: var(--line-control);
  --kit-line-c0182b: var(--selected-line);
  --kit-line-c7dafb: var(--line-control);
  --kit-line-c9c7fb: var(--line-control);
  --kit-line-c9ccd4: var(--line-control);
  --kit-line-cdd0d8: var(--line-control);
  --kit-line-cfcdfb: var(--line-control);
  --kit-line-cfe0fb: var(--line-control);
  --kit-line-d5d8df: var(--line-control);
  --kit-line-d5f0e1: var(--line-control);
  --kit-line-e2e4ea: var(--line-control);
  --kit-line-e3e4fd: var(--line-control);
  --kit-line-e3e7fb: var(--line-control);
  --kit-line-e4e6ea: var(--line-control);
  --kit-line-e5243b: var(--selected-line);
  --kit-line-e6e5fd: var(--line-control);
  --kit-line-e6e8ec: var(--line-control);
  --kit-line-e9e8fd: var(--line-control);
  --kit-line-e9ebef: var(--line-control);
  --kit-line-eadfc9: var(--line-control);
  --kit-line-ebedf8: var(--line-control);
  --kit-line-ecebfd: var(--line-control);
  --kit-line-eceef1: var(--line-control);
  --kit-line-eceef2: var(--line-control);
  --kit-line-eceef5: var(--line-control);
  --kit-line-eeeefe: var(--line-control);
  --kit-line-eeeff1: var(--line-control);
  --kit-line-eef0f3: var(--line-control);
  --kit-line-eef5fe: var(--line-control);
  --kit-line-f07a12: var(--selected-line);
  --kit-line-f0f1f3: var(--line-control);
  --kit-line-f1f0fe: var(--line-control);
  --kit-line-f1f2f4: var(--line-control);
  --kit-line-f3c5ca: var(--line-control);
  --kit-line-f3e3c8: var(--line-control);
  --kit-line-f5f5ff: var(--line-control);
  --kit-line-f6d5d9: var(--line-control);
  --kit-line-f6dde4: var(--line-control);
  --kit-line-f6e3c2: var(--line-control);
  --kit-line-f6ebd3: var(--line-control);
  --kit-line-f7cdd1: var(--line-control);
  --kit-line-f7d3d6: var(--line-control);
  --kit-line-f9ddb7: var(--line-control);
  --kit-line-fac9cd: var(--line-control);
  --kit-line-fad7b3: var(--line-control);
  --kit-line-ffffff: var(--line-control);
  --kit-surface-04bb6f: #04bb6f;
  --kit-surface-0e121a: #0e121a;
  --kit-surface-11907f: #11907f;
  --kit-surface-12141c: #12141c;
  --kit-surface-12b76a: #12b76a;
  --kit-surface-14162a: #14162a;
  --kit-surface-16a34a: #16a34a;
  --kit-surface-1763ef: #1763ef;
  --kit-surface-1a1d2b: #1a1d2b;
  --kit-surface-1f232c: #1f232c;
  --kit-surface-22b8a4: #22b8a4;
  --kit-surface-232c48: #232c48;
  --kit-surface-2881f0: #2881f0;
  --kit-surface-2b2e70: #2b2e70;
  --kit-surface-2c2e36: #2c2e36;
  --kit-surface-3d5ae8: #3d5ae8;
  --kit-surface-4447f2: #4447f2;
  --kit-surface-464df6: #464df6;
  --kit-surface-4743f2: #4743f2;
  --kit-surface-4a39fc: #4a39fc;
  --kit-surface-4a4cf7: #4a4cf7;
  --kit-surface-5759fa: #5759fa;
  --kit-surface-5a55fa: #5a55fa;
  --kit-surface-5a63f3: #5a63f3;
  --kit-surface-5b7cfa: #5b7cfa;
  --kit-surface-5b7efb: #5b7efb;
  --kit-surface-5e5efa: #5e5efa;
  --kit-surface-6366f1: #6366f1;
  --kit-surface-6670f6: #6670f6;
  --kit-surface-6e66f8: #6e66f8;
  --kit-surface-6e73f9: #6e73f9;
  --kit-surface-86d6a9: #86d6a9;
  --kit-surface-a9b0f8: var(--unusual-tag-bg);
  --kit-surface-b9732a: #b9732a;
  --kit-surface-b9bdc9: var(--line-control);
  --kit-surface-c0182b: #c0182b;
  --kit-surface-c3c8fa: var(--unusual-tag-bg);
  --kit-surface-c7c1e6: var(--unusual-tag-bg);
  --kit-surface-c9ccd4: var(--bg-subtle);
  --kit-surface-d5d8df: var(--bg-subtle);
  --kit-surface-d7dafb: var(--unusual-tag-bg);
  --kit-surface-d9dadf: var(--bg-subtle);
  --kit-surface-dcdee3: var(--bg-subtle);
  --kit-surface-e0a04a: #e0a04a;
  --kit-surface-e1e0fd: var(--unusual-tag-bg);
  --kit-surface-e31a2c: #e31a2c;
  --kit-surface-e3e4e8: var(--bg-subtle);
  --kit-surface-e3e5ea: var(--bg-subtle);
  --kit-surface-e4e7ee: var(--bg-subtle);
  --kit-surface-e5243b: #e5243b;
  --kit-surface-e6e8ec: var(--bg-subtle);
  --kit-surface-e7e9ec: var(--bg-subtle);
  --kit-surface-e9890f: #e9890f;
  --kit-surface-e9ebef: var(--bg-subtle);
  --kit-surface-e9ecff: var(--info-bg);
  --kit-surface-e9f8f0: var(--ok-bg);
  --kit-surface-ea0726: #ea0726;
  --kit-surface-eaf3fe: var(--info-bg);
  --kit-surface-eaf8f0: var(--ok-bg);
  --kit-surface-eafbf3: var(--ok-bg);
  --kit-surface-eceef1: var(--bg-subtle);
  --kit-surface-eceef5: var(--info-bg);
  --kit-surface-edeef1: var(--bg-subtle);
  --kit-surface-ee0b1e: #ee0b1e;
  --kit-surface-eef0f3: var(--bg-subtle);
  --kit-surface-eef0f4: var(--bg-subtle);
  --kit-surface-eef4ff: var(--info-bg);
  --kit-surface-eef5fe: var(--info-bg);
  --kit-surface-efefff: var(--unusual-tag-bg);
  --kit-surface-eff5fe: var(--info-bg);
  --kit-surface-f07a12: #f07a12;
  --kit-surface-f0f0fe: var(--unusual-tag-bg);
  --kit-surface-f1f0fe: var(--unusual-tag-bg);
  --kit-surface-f1f2f4: var(--bg-subtle);
  --kit-surface-f1f2fe: var(--unusual-tag-bg);
  --kit-surface-f2f2ff: var(--unusual-tag-bg);
  --kit-surface-f2f3f5: var(--bg-subtle);
  --kit-surface-f2f4f7: var(--bg-subtle);
  --kit-surface-f2fbf6: var(--ok-bg);
  --kit-surface-f3b26b: #f3b26b;
  --kit-surface-f3f4f6: var(--bg-subtle);
  --kit-surface-f3f5ff: var(--info-bg);
  --kit-surface-f48721: #f48721;
  --kit-surface-f4f4ff: var(--unusual-tag-bg);
  --kit-surface-f4f5f7: var(--bg-subtle);
  --kit-surface-f56700: #f56700;
  --kit-surface-f56c03: #f56c03;
  --kit-surface-f59e0b: #f59e0b;
  --kit-surface-f5f4ff: var(--unusual-tag-bg);
  --kit-surface-f6f2ff: var(--unusual-tag-bg);
  --kit-surface-f6f7f9: var(--bg-surface);
  --kit-surface-f6f7fe: var(--info-bg);
  --kit-surface-f7f7ff: var(--unusual-tag-bg);
  --kit-surface-f7f8fa: var(--bg-surface);
  --kit-surface-f7f8ff: var(--info-bg);
  --kit-surface-f8f8ff: var(--unusual-tag-bg);
  --kit-surface-f8f9fa: var(--bg-surface);
  --kit-surface-f8f9fb: var(--info-bg);
  --kit-surface-f8f9fd: var(--info-bg);
  --kit-surface-f8f9ff: var(--info-bg);
  --kit-surface-f98207: #f98207;
  --kit-surface-fafafc: var(--unusual-tag-bg);
  --kit-surface-fafaff: var(--unusual-tag-bg);
  --kit-surface-fbeff4: var(--unusual-tag-bg);
  --kit-surface-fbfbfc: var(--bg-surface);
  --kit-surface-fbfbff: var(--unusual-tag-bg);
  --kit-surface-fce7e8: var(--bad-bg);
  --kit-surface-fcfcfd: var(--bg-surface);
  --kit-surface-fd858e: var(--bad-bg);
  --kit-surface-fdecec: var(--bad-bg);
  --kit-surface-fdedf0: var(--bad-bg);
  --kit-surface-fdf0db: var(--warn-bg);
  --kit-surface-fdf2f3: var(--bad-bg);
  --kit-surface-feeeef: var(--bad-bg);
  --kit-surface-fef3c7: var(--warn-bg);
  --kit-surface-fef3e6: var(--warn-bg);
  --kit-surface-fef5ea: var(--warn-bg);
  --kit-surface-fef6ea: var(--warn-bg);
  --kit-surface-ffe1e4: var(--bad-bg);
  --kit-surface-fff1f3: var(--bad-bg);
  --kit-surface-fff3e0: var(--warn-bg);
  --kit-surface-fff3e8: var(--warn-bg);
  --kit-surface-fff3f5: var(--bad-bg);
  --kit-surface-fff5f5: var(--bad-bg);
  --kit-surface-fff6ec: var(--warn-bg);
  --kit-surface-fff8f9: var(--bad-bg);
  --kit-surface-fff9ee: var(--warn-bg);
  --kit-surface-fff9f0: var(--warn-bg);
  --kit-surface-fffbf4: var(--warn-bg);
  --kit-surface-fffcf6: var(--warn-bg);
  --kit-surface-fffcf7: var(--warn-bg);
  --kit-surface-ffffff: var(--bg-surface);
  --kit-text-050412: var(--unusual-tag-ink);
  --kit-text-0b0b25: var(--unusual-tag-ink);
  --kit-text-0ba85a: var(--ok-ink);
  --kit-text-0c0b1d: var(--unusual-tag-ink);
  --kit-text-0e5e36: var(--ok-ink);
  --kit-text-0e7a45: var(--ok-ink);
  --kit-text-0e8f4e: var(--ok-ink);
  --kit-text-12141c: var(--ink);
  --kit-text-12a05c: var(--ok-ink);
  --kit-text-159a5c: var(--ok-ink);
  --kit-text-16181d: var(--ink);
  --kit-text-1a1530: var(--unusual-tag-ink);
  --kit-text-1a1c29: var(--ink);
  --kit-text-1e2129: var(--ink);
  --kit-text-1e2228: var(--ink);
  --kit-text-1e9e62: var(--ok-ink);
  --kit-text-1f2133: var(--ink);
  --kit-text-1f2730: var(--ink);
  --kit-text-23252f: var(--ink);
  --kit-text-232c48: var(--info-ink);
  --kit-text-2370e0: var(--info-ink);
  --kit-text-24232a: var(--ink);
  --kit-text-272450: var(--unusual-tag-ink);
  --kit-text-292929: var(--ink);
  --kit-text-2a2d37: var(--ink);
  --kit-text-2f323a: var(--ink);
  --kit-text-2f9e6a: var(--ok-ink);
  --kit-text-2fa36b: var(--ok-ink);
  --kit-text-3a3d48: var(--text-2);
  --kit-text-3b3e55: var(--text-2);
  --kit-text-3c32a7: var(--unusual-tag-ink);
  --kit-text-3c35a0: var(--unusual-tag-ink);
  --kit-text-3c35e3: var(--unusual-tag-ink);
  --kit-text-3daa7a: var(--ok-ink);
  --kit-text-3e9b74: var(--ok-ink);
  --kit-text-3f424c: var(--text-2);
  --kit-text-494c52: var(--text-2);
  --kit-text-4b4e5c: var(--text-2);
  --kit-text-4b4e66: var(--text-2);
  --kit-text-4c3cbc: var(--unusual-tag-ink);
  --kit-text-4e5058: var(--text-2);
  --kit-text-4e515c: var(--text-2);
  --kit-text-4e5160: var(--text-2);
  --kit-text-4f46e5: var(--unusual-tag-ink);
  --kit-text-515357: var(--text-2);
  --kit-text-585a69: var(--text-2);
  --kit-text-5a48f2: var(--unusual-tag-ink);
  --kit-text-5b57f8: var(--unusual-tag-ink);
  --kit-text-5b5e68: var(--text-2);
  --kit-text-5c5e6b: var(--text-2);
  --kit-text-5e5244: var(--text-2);
  --kit-text-5e5efa: var(--unusual-tag-ink);
  --kit-text-5e6170: var(--text-2);
  --kit-text-68667b: var(--text-muted);
  --kit-text-6b4a12: var(--warn-ink);
  --kit-text-6b6e78: var(--text-muted);
  --kit-text-6e66f8: var(--unusual-tag-ink);
  --kit-text-6e7180: var(--text-muted);
  --kit-text-6e7182: var(--text-muted);
  --kit-text-7a6a55: var(--text-2);
  --kit-text-7a7d88: var(--text-muted);
  --kit-text-7c7e87: var(--text-muted);
  --kit-text-7d7b87: var(--text-muted);
  --kit-text-83848f: var(--text-muted);
  --kit-text-868688: var(--text-muted);
  --kit-text-8a5a1e: var(--warn-ink);
  --kit-text-8a8d9a: var(--text-muted);
  --kit-text-8a8da0: var(--text-muted);
  --kit-text-8b8f9e: var(--text-muted);
  --kit-text-8c8f99: var(--text-muted);
  --kit-text-8c92f8: var(--unusual-tag-ink);
  --kit-text-8d91a3: var(--text-muted);
  --kit-text-8e90a0: var(--text-muted);
  --kit-text-8f1d27: var(--bad-ink);
  --kit-text-92400e: var(--warn-ink);
  --kit-text-9594a1: var(--text-muted);
  --kit-text-9a5b12: var(--warn-ink);
  --kit-text-9a9daa: var(--text-muted);
  --kit-text-9ea2b0: var(--text-muted);
  --kit-text-9f1322: var(--bad-ink);
  --kit-text-a16b30: var(--warn-ink);
  --kit-text-a3a5b1: var(--text-muted);
  --kit-text-a3a6b2: var(--text-muted);
  --kit-text-a5a8f8: var(--unusual-tag-ink);
  --kit-text-a8abb6: var(--text-muted);
  --kit-text-ab0d0e: var(--bad-ink);
  --kit-text-b26a12: var(--warn-ink);
  --kit-text-b4232f: var(--bad-ink);
  --kit-text-b5630f: var(--warn-ink);
  --kit-text-b7000d: var(--bad-ink);
  --kit-text-b9bccb: var(--text-muted);
  --kit-text-c0182b: var(--bad-ink);
  --kit-text-c2410c: var(--warn-ink);
  --kit-text-c2414f: var(--bad-ink);
  --kit-text-c25a06: var(--warn-ink);
  --kit-text-c26a16: var(--warn-ink);
  --kit-text-d5d8e1: var(--text-muted);
  --kit-text-d62142: var(--bad-ink);
  --kit-text-d63a44: var(--bad-ink);
  --kit-text-d93645: var(--bad-ink);
  --kit-text-d94356: var(--bad-ink);
  --kit-text-e06106: var(--warn-ink);
  --kit-text-e2730e: var(--warn-ink);
  --kit-text-e5243b: var(--bad-ink);
  --kit-text-e5670c: var(--warn-ink);
  --kit-text-e75333: var(--bad-ink);
  --kit-text-f2570c: var(--warn-ink);
  --kit-text-ffffff: #FFFFFF;
}
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
  color-scheme: dark;
  --ink: #F3F4F6; --t1: #E4E6EA; --t2: #E4E6EA; --t3: #9EA2AC; --t4: #7D818C; --t5: #7D818C;
  --line: #2A2C33; --line2: #2A2C33; --band: #1B1D22; --sb: #17181C; --pri: #6E70FA; --ind: #5A5DF5;
  --kit-line-0e121a: var(--selected-line);
  --kit-line-1a1c29: var(--line-control);
  --kit-line-1a1d2b: var(--line-control);
  --kit-line-2b7cf6: var(--selected-line);
  --kit-line-4447f2: var(--selected-line);
  --kit-line-4a4cf7: var(--selected-line);
  --kit-line-5b5bf5: var(--selected-line);
  --kit-line-6366f1: var(--selected-line);
  --kit-line-a5a8f8: var(--line-control);
  --kit-line-bdefd5: var(--line-control);
  --kit-line-c0182b: var(--selected-line);
  --kit-line-c7dafb: var(--line-control);
  --kit-line-c9c7fb: var(--line-control);
  --kit-line-c9ccd4: var(--line-control);
  --kit-line-cdd0d8: var(--line-control);
  --kit-line-cfcdfb: var(--line-control);
  --kit-line-cfe0fb: var(--line-control);
  --kit-line-d5d8df: var(--line-control);
  --kit-line-d5f0e1: var(--line-control);
  --kit-line-e2e4ea: var(--line-control);
  --kit-line-e3e4fd: var(--line-control);
  --kit-line-e3e7fb: var(--line-control);
  --kit-line-e4e6ea: var(--line-control);
  --kit-line-e5243b: var(--selected-line);
  --kit-line-e6e5fd: var(--line-control);
  --kit-line-e6e8ec: var(--line-control);
  --kit-line-e9e8fd: var(--line-control);
  --kit-line-e9ebef: var(--line-control);
  --kit-line-eadfc9: var(--line-control);
  --kit-line-ebedf8: var(--line-control);
  --kit-line-ecebfd: var(--line-control);
  --kit-line-eceef1: var(--line-control);
  --kit-line-eceef2: var(--line-control);
  --kit-line-eceef5: var(--line-control);
  --kit-line-eeeefe: var(--line-control);
  --kit-line-eeeff1: var(--line-control);
  --kit-line-eef0f3: var(--line-control);
  --kit-line-eef5fe: var(--line-control);
  --kit-line-f07a12: var(--selected-line);
  --kit-line-f0f1f3: var(--line-control);
  --kit-line-f1f0fe: var(--line-control);
  --kit-line-f1f2f4: var(--line-control);
  --kit-line-f3c5ca: var(--line-control);
  --kit-line-f3e3c8: var(--line-control);
  --kit-line-f5f5ff: var(--line-control);
  --kit-line-f6d5d9: var(--line-control);
  --kit-line-f6dde4: var(--line-control);
  --kit-line-f6e3c2: var(--line-control);
  --kit-line-f6ebd3: var(--line-control);
  --kit-line-f7cdd1: var(--line-control);
  --kit-line-f7d3d6: var(--line-control);
  --kit-line-f9ddb7: var(--line-control);
  --kit-line-fac9cd: var(--line-control);
  --kit-line-fad7b3: var(--line-control);
  --kit-line-ffffff: var(--line-control);
  --kit-surface-04bb6f: #04bb6f;
  --kit-surface-0e121a: #0e121a;
  --kit-surface-11907f: #11907f;
  --kit-surface-12141c: #12141c;
  --kit-surface-12b76a: #12b76a;
  --kit-surface-14162a: #14162a;
  --kit-surface-16a34a: #16a34a;
  --kit-surface-1763ef: #1763ef;
  --kit-surface-1a1d2b: #1a1d2b;
  --kit-surface-1f232c: #1f232c;
  --kit-surface-22b8a4: #22b8a4;
  --kit-surface-232c48: #232c48;
  --kit-surface-2881f0: #2881f0;
  --kit-surface-2b2e70: #2b2e70;
  --kit-surface-2c2e36: #2c2e36;
  --kit-surface-3d5ae8: #3d5ae8;
  --kit-surface-4447f2: #4447f2;
  --kit-surface-464df6: #464df6;
  --kit-surface-4743f2: #4743f2;
  --kit-surface-4a39fc: #4a39fc;
  --kit-surface-4a4cf7: #4a4cf7;
  --kit-surface-5759fa: #5759fa;
  --kit-surface-5a55fa: #5a55fa;
  --kit-surface-5a63f3: #5a63f3;
  --kit-surface-5b7cfa: #5b7cfa;
  --kit-surface-5b7efb: #5b7efb;
  --kit-surface-5e5efa: #5e5efa;
  --kit-surface-6366f1: #6366f1;
  --kit-surface-6670f6: #6670f6;
  --kit-surface-6e66f8: #6e66f8;
  --kit-surface-6e73f9: #6e73f9;
  --kit-surface-86d6a9: #86d6a9;
  --kit-surface-a9b0f8: var(--unusual-tag-bg);
  --kit-surface-b9732a: #b9732a;
  --kit-surface-b9bdc9: var(--line-control);
  --kit-surface-c0182b: #c0182b;
  --kit-surface-c3c8fa: var(--unusual-tag-bg);
  --kit-surface-c7c1e6: var(--unusual-tag-bg);
  --kit-surface-c9ccd4: var(--bg-subtle);
  --kit-surface-d5d8df: var(--bg-subtle);
  --kit-surface-d7dafb: var(--unusual-tag-bg);
  --kit-surface-d9dadf: var(--bg-subtle);
  --kit-surface-dcdee3: var(--bg-subtle);
  --kit-surface-e0a04a: #e0a04a;
  --kit-surface-e1e0fd: var(--unusual-tag-bg);
  --kit-surface-e31a2c: #e31a2c;
  --kit-surface-e3e4e8: var(--bg-subtle);
  --kit-surface-e3e5ea: var(--bg-subtle);
  --kit-surface-e4e7ee: var(--bg-subtle);
  --kit-surface-e5243b: #e5243b;
  --kit-surface-e6e8ec: var(--bg-subtle);
  --kit-surface-e7e9ec: var(--bg-subtle);
  --kit-surface-e9890f: #e9890f;
  --kit-surface-e9ebef: var(--bg-subtle);
  --kit-surface-e9ecff: var(--info-bg);
  --kit-surface-e9f8f0: var(--ok-bg);
  --kit-surface-ea0726: #ea0726;
  --kit-surface-eaf3fe: var(--info-bg);
  --kit-surface-eaf8f0: var(--ok-bg);
  --kit-surface-eafbf3: var(--ok-bg);
  --kit-surface-eceef1: var(--bg-subtle);
  --kit-surface-eceef5: var(--info-bg);
  --kit-surface-edeef1: var(--bg-subtle);
  --kit-surface-ee0b1e: #ee0b1e;
  --kit-surface-eef0f3: var(--bg-subtle);
  --kit-surface-eef0f4: var(--bg-subtle);
  --kit-surface-eef4ff: var(--info-bg);
  --kit-surface-eef5fe: var(--info-bg);
  --kit-surface-efefff: var(--unusual-tag-bg);
  --kit-surface-eff5fe: var(--info-bg);
  --kit-surface-f07a12: #f07a12;
  --kit-surface-f0f0fe: var(--unusual-tag-bg);
  --kit-surface-f1f0fe: var(--unusual-tag-bg);
  --kit-surface-f1f2f4: var(--bg-subtle);
  --kit-surface-f1f2fe: var(--unusual-tag-bg);
  --kit-surface-f2f2ff: var(--unusual-tag-bg);
  --kit-surface-f2f3f5: var(--bg-subtle);
  --kit-surface-f2f4f7: var(--bg-subtle);
  --kit-surface-f2fbf6: var(--ok-bg);
  --kit-surface-f3b26b: #f3b26b;
  --kit-surface-f3f4f6: var(--bg-subtle);
  --kit-surface-f3f5ff: var(--info-bg);
  --kit-surface-f48721: #f48721;
  --kit-surface-f4f4ff: var(--unusual-tag-bg);
  --kit-surface-f4f5f7: var(--bg-subtle);
  --kit-surface-f56700: #f56700;
  --kit-surface-f56c03: #f56c03;
  --kit-surface-f59e0b: #f59e0b;
  --kit-surface-f5f4ff: var(--unusual-tag-bg);
  --kit-surface-f6f2ff: var(--unusual-tag-bg);
  --kit-surface-f6f7f9: var(--bg-surface);
  --kit-surface-f6f7fe: var(--info-bg);
  --kit-surface-f7f7ff: var(--unusual-tag-bg);
  --kit-surface-f7f8fa: var(--bg-surface);
  --kit-surface-f7f8ff: var(--info-bg);
  --kit-surface-f8f8ff: var(--unusual-tag-bg);
  --kit-surface-f8f9fa: var(--bg-surface);
  --kit-surface-f8f9fb: var(--info-bg);
  --kit-surface-f8f9fd: var(--info-bg);
  --kit-surface-f8f9ff: var(--info-bg);
  --kit-surface-f98207: #f98207;
  --kit-surface-fafafc: var(--unusual-tag-bg);
  --kit-surface-fafaff: var(--unusual-tag-bg);
  --kit-surface-fbeff4: var(--unusual-tag-bg);
  --kit-surface-fbfbfc: var(--bg-surface);
  --kit-surface-fbfbff: var(--unusual-tag-bg);
  --kit-surface-fce7e8: var(--bad-bg);
  --kit-surface-fcfcfd: var(--bg-surface);
  --kit-surface-fd858e: var(--bad-bg);
  --kit-surface-fdecec: var(--bad-bg);
  --kit-surface-fdedf0: var(--bad-bg);
  --kit-surface-fdf0db: var(--warn-bg);
  --kit-surface-fdf2f3: var(--bad-bg);
  --kit-surface-feeeef: var(--bad-bg);
  --kit-surface-fef3c7: var(--warn-bg);
  --kit-surface-fef3e6: var(--warn-bg);
  --kit-surface-fef5ea: var(--warn-bg);
  --kit-surface-fef6ea: var(--warn-bg);
  --kit-surface-ffe1e4: var(--bad-bg);
  --kit-surface-fff1f3: var(--bad-bg);
  --kit-surface-fff3e0: var(--warn-bg);
  --kit-surface-fff3e8: var(--warn-bg);
  --kit-surface-fff3f5: var(--bad-bg);
  --kit-surface-fff5f5: var(--bad-bg);
  --kit-surface-fff6ec: var(--warn-bg);
  --kit-surface-fff8f9: var(--bad-bg);
  --kit-surface-fff9ee: var(--warn-bg);
  --kit-surface-fff9f0: var(--warn-bg);
  --kit-surface-fffbf4: var(--warn-bg);
  --kit-surface-fffcf6: var(--warn-bg);
  --kit-surface-fffcf7: var(--warn-bg);
  --kit-surface-ffffff: var(--bg-surface);
  --kit-text-050412: var(--unusual-tag-ink);
  --kit-text-0b0b25: var(--unusual-tag-ink);
  --kit-text-0ba85a: var(--ok-ink);
  --kit-text-0c0b1d: var(--unusual-tag-ink);
  --kit-text-0e5e36: var(--ok-ink);
  --kit-text-0e7a45: var(--ok-ink);
  --kit-text-0e8f4e: var(--ok-ink);
  --kit-text-12141c: var(--ink);
  --kit-text-12a05c: var(--ok-ink);
  --kit-text-159a5c: var(--ok-ink);
  --kit-text-16181d: var(--ink);
  --kit-text-1a1530: var(--unusual-tag-ink);
  --kit-text-1a1c29: var(--ink);
  --kit-text-1e2129: var(--ink);
  --kit-text-1e2228: var(--ink);
  --kit-text-1e9e62: var(--ok-ink);
  --kit-text-1f2133: var(--ink);
  --kit-text-1f2730: var(--ink);
  --kit-text-23252f: var(--ink);
  --kit-text-232c48: var(--info-ink);
  --kit-text-2370e0: var(--info-ink);
  --kit-text-24232a: var(--ink);
  --kit-text-272450: var(--unusual-tag-ink);
  --kit-text-292929: var(--ink);
  --kit-text-2a2d37: var(--ink);
  --kit-text-2f323a: var(--ink);
  --kit-text-2f9e6a: var(--ok-ink);
  --kit-text-2fa36b: var(--ok-ink);
  --kit-text-3a3d48: var(--text-2);
  --kit-text-3b3e55: var(--text-2);
  --kit-text-3c32a7: var(--unusual-tag-ink);
  --kit-text-3c35a0: var(--unusual-tag-ink);
  --kit-text-3c35e3: var(--unusual-tag-ink);
  --kit-text-3daa7a: var(--ok-ink);
  --kit-text-3e9b74: var(--ok-ink);
  --kit-text-3f424c: var(--text-2);
  --kit-text-494c52: var(--text-2);
  --kit-text-4b4e5c: var(--text-2);
  --kit-text-4b4e66: var(--text-2);
  --kit-text-4c3cbc: var(--unusual-tag-ink);
  --kit-text-4e5058: var(--text-2);
  --kit-text-4e515c: var(--text-2);
  --kit-text-4e5160: var(--text-2);
  --kit-text-4f46e5: var(--unusual-tag-ink);
  --kit-text-515357: var(--text-2);
  --kit-text-585a69: var(--text-2);
  --kit-text-5a48f2: var(--unusual-tag-ink);
  --kit-text-5b57f8: var(--unusual-tag-ink);
  --kit-text-5b5e68: var(--text-2);
  --kit-text-5c5e6b: var(--text-2);
  --kit-text-5e5244: var(--text-2);
  --kit-text-5e5efa: var(--unusual-tag-ink);
  --kit-text-5e6170: var(--text-2);
  --kit-text-68667b: var(--text-muted);
  --kit-text-6b4a12: var(--warn-ink);
  --kit-text-6b6e78: var(--text-muted);
  --kit-text-6e66f8: var(--unusual-tag-ink);
  --kit-text-6e7180: var(--text-muted);
  --kit-text-6e7182: var(--text-muted);
  --kit-text-7a6a55: var(--text-2);
  --kit-text-7a7d88: var(--text-muted);
  --kit-text-7c7e87: var(--text-muted);
  --kit-text-7d7b87: var(--text-muted);
  --kit-text-83848f: var(--text-muted);
  --kit-text-868688: var(--text-muted);
  --kit-text-8a5a1e: var(--warn-ink);
  --kit-text-8a8d9a: var(--text-muted);
  --kit-text-8a8da0: var(--text-muted);
  --kit-text-8b8f9e: var(--text-muted);
  --kit-text-8c8f99: var(--text-muted);
  --kit-text-8c92f8: var(--unusual-tag-ink);
  --kit-text-8d91a3: var(--text-muted);
  --kit-text-8e90a0: var(--text-muted);
  --kit-text-8f1d27: var(--bad-ink);
  --kit-text-92400e: var(--warn-ink);
  --kit-text-9594a1: var(--text-muted);
  --kit-text-9a5b12: var(--warn-ink);
  --kit-text-9a9daa: var(--text-muted);
  --kit-text-9ea2b0: var(--text-muted);
  --kit-text-9f1322: var(--bad-ink);
  --kit-text-a16b30: var(--warn-ink);
  --kit-text-a3a5b1: var(--text-muted);
  --kit-text-a3a6b2: var(--text-muted);
  --kit-text-a5a8f8: var(--unusual-tag-ink);
  --kit-text-a8abb6: var(--text-muted);
  --kit-text-ab0d0e: var(--bad-ink);
  --kit-text-b26a12: var(--warn-ink);
  --kit-text-b4232f: var(--bad-ink);
  --kit-text-b5630f: var(--warn-ink);
  --kit-text-b7000d: var(--bad-ink);
  --kit-text-b9bccb: var(--text-muted);
  --kit-text-c0182b: var(--bad-ink);
  --kit-text-c2410c: var(--warn-ink);
  --kit-text-c2414f: var(--bad-ink);
  --kit-text-c25a06: var(--warn-ink);
  --kit-text-c26a16: var(--warn-ink);
  --kit-text-d5d8e1: var(--text-muted);
  --kit-text-d62142: var(--bad-ink);
  --kit-text-d63a44: var(--bad-ink);
  --kit-text-d93645: var(--bad-ink);
  --kit-text-d94356: var(--bad-ink);
  --kit-text-e06106: var(--warn-ink);
  --kit-text-e2730e: var(--warn-ink);
  --kit-text-e5243b: var(--bad-ink);
  --kit-text-e5670c: var(--warn-ink);
  --kit-text-e75333: var(--bad-ink);
  --kit-text-f2570c: var(--warn-ink);
  --kit-text-ffffff: #FFFFFF;
} }

html,body{background:var(--kit-surface-ffffff)}
body{font-family:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:14px;color:var(--t1);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-feature-settings:"cv11","ss01";font-optical-sizing:none;line-height:1.4}
a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit;color:inherit}button{background:none;border:0;cursor:pointer}input{outline:none;border:0;background:none;min-width:0}
svg{display:block;flex-shrink:0}
:focus-visible{outline:2px solid var(--kit-line-6366f1);outline-offset:2px;border-radius:var(--radius-md)}
.num{font-variant-numeric:tabular-nums}
/* ---------- shell (1280px canvas) ---------- */
.app{display:grid;grid-template-columns:250px minmax(0,1fr);min-height:100vh;width:1280px;background:linear-gradient(90deg,var(--kit-surface-f3f4f6) 250px,var(--kit-surface-ffffff) 250px)}
.sb{background:var(--sb);padding:22px 14px 16px;display:flex;flex-direction:column;position:sticky;top:0;height:100vh;overflow-y:auto;scrollbar-width:none}.sb::-webkit-scrollbar{display:none}.sb>*{flex-shrink:0}
.lg{display:flex;align-items:center;gap:18px;padding:0 12px;height:44px}.lg svg{color:var(--kit-text-5b5e68)}.lg b{font-size:30px;font-weight:800;letter-spacing:-.045em;color:var(--ink)}
.sb nav{margin-top:26px}
.nv{display:flex;align-items:center;gap:19px;height:44px;padding:0 14px;border-radius:var(--radius-kit-nav);font-size:16.5px;font-weight:500;color:var(--kit-text-4e515c);margin-bottom:4px;transition:background .15s}
.nv svg{color:var(--kit-text-6b6e78)}.nv:hover{background:var(--kit-surface-e9ebef)}.nv.on{background:var(--kit-surface-2c2e36);color:var(--kit-text-ffffff);box-shadow:0 1px 2px rgba(16,17,26,.25)}.nv.on svg{color:var(--kit-text-ffffff)}
.nv .nb{margin-left:auto;font-size:14px;font-weight:600;color:var(--t1)}.nv .nb.box{min-width:24px;height:24px;border-radius:7px;background:var(--kit-surface-e3e4e8);display:inline-flex;align-items:center;justify-content:center;font-size:12.5px;font-weight:700}
.nv.on .nb{color:var(--kit-text-ffffff)}.nv.on .nb.box{background:var(--kit-surface-d9dadf);color:var(--kit-text-1e2129)}
.tl{margin-top:26px;padding:0 14px 8px;font-size:11.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--kit-text-8c8f99)}
.tm{display:flex;align-items:center;gap:14px;height:42px;padding:0 14px;margin-bottom:4px;border-radius:var(--radius-lg);font-size:16px;font-weight:500;color:var(--kit-text-2f323a)}.tm:hover{background:var(--kit-surface-e9ebef)}
.tm i{width:11px;height:11px;border-radius:50%;display:block;flex-shrink:0}.tm em{margin-left:auto;font-style:normal;font-size:13px;font-weight:500;display:none}.tm em.bad{color:var(--kit-text-c2414f)}.tm em.ok{color:var(--kit-text-3e9b74)}
.ct{display:block;margin:22px 4px 0;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e6e8ec);border-radius:var(--radius-kit-card);padding:14px 16px 16px;box-shadow:0 1px 2px rgba(16,24,40,.03)}
.ct span{display:block;font-size:13.5px;color:var(--kit-text-5e6170)}.ct b{display:block;font-size:15px;font-weight:700;color:var(--t1);margin-top:1px}
.ct .lr{display:flex;align-items:center;gap:12px;margin-top:12px}.ct .more{width:30px;height:30px;border-radius:var(--radius-md);background:var(--kit-surface-f1f2f4);display:inline-flex;align-items:center;justify-content:center;font-size:12.5px;font-weight:600;color:var(--kit-text-5e6170)}
.pf{margin-top:auto;display:flex;align-items:center;gap:12px;padding:16px 10px 2px;border-top:1px solid var(--kit-line-e4e6ea)}.pf b{display:block;font-size:15px;font-weight:700;color:var(--t1)}.pf span.e{display:block;font-size:13px;color:var(--kit-text-6e7180)}.pf .ud{margin-left:auto;color:var(--kit-text-8a8d9a)}
.me{border-radius:50%;background:var(--kit-surface-c7c1e6);color:var(--kit-text-1a1530);font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}
.main{min-width:0;background:var(--kit-surface-ffffff)}
.top{height:88px;display:flex;align-items:center;gap:20px;padding:0 40px 0 38px;background:var(--kit-surface-ffffff);position:sticky;top:0;z-index:5}
.srch{flex:0 1 672px;height:46px;display:flex;align-items:center;gap:12px;padding:0 12px 0 16px;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e4e6ea);border-radius:var(--radius-xl);box-shadow:0 1px 2px rgba(16,24,40,.04)}
.srch input{flex:1;font-size:16px;color:var(--t1)}.srch input::placeholder{color:var(--kit-text-9a9daa)}
kbd{font:600 12px/1 Inter,sans-serif;color:var(--kit-text-7a7d88);border:1px solid var(--kit-line-e4e6ea);border-radius:var(--radius-sm);background:var(--kit-surface-f8f9fa);width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center}
.dt{margin-left:auto;display:flex;align-items:center;gap:9px;font-size:16px;font-weight:600;color:var(--kit-text-16181d);white-space:nowrap}.dt svg:last-child{color:var(--kit-text-6e7180)}
.ham,.lm,.back{display:none}
.page{display:none;padding:19px 40px 56px 38px}.page.show{display:block}
.pz{animation:in .25s ease both}@keyframes in{from{opacity:0;transform:translateY(3px)}to{opacity:1;transform:none}}
/* ---------- content base (scaled per page by .pz zoom) ---------- */
h1{font-size:26px;font-weight:800;letter-spacing:-.02em;line-height:1.15;color:var(--ink)}
.sub{font-size:14px;color:var(--t3);margin-top:6px;line-height:1.4}
.hd{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:24px}.hdr{display:flex;align-items:center;gap:12px;flex-shrink:0}
.card{background:var(--kit-surface-ffffff);border:1px solid var(--line);border-radius:var(--radius-kit-card);box-shadow:0 1px 2px rgba(16,24,40,.04),0 1px 3px rgba(16,24,40,.03)}
.lst{overflow:hidden}
.btn{height:40px;padding:0 16px;border-radius:var(--radius-lg);font-size:13.5px;font-weight:500;display:inline-flex;align-items:center;gap:8px;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e4e6ea);color:var(--kit-text-2a2d37);white-space:nowrap;box-shadow:0 1px 2px rgba(16,24,40,.04);transition:background .15s}
.btn:hover{background:var(--kit-surface-f8f9fa)}.btn.dd{padding:0 12px 0 14px;gap:9px;color:var(--kit-text-3a3d48)}
.btn.pri{background:linear-gradient(180deg,var(--kit-surface-5759fa),var(--kit-surface-4447f2));border-color:var(--kit-line-4447f2);color:var(--kit-text-ffffff);font-weight:600;font-size:14.5px;padding:0 20px;box-shadow:inset 0 1px 0 rgba(255,255,255,.18),0 1px 2px rgba(68,71,242,.3),0 4px 12px rgba(68,71,242,.18)}.btn.pri:hover{background:var(--kit-surface-4447f2)}
.btn.dk{background:var(--kit-surface-0e121a);border-color:var(--kit-line-0e121a);color:var(--kit-text-ffffff);font-weight:600;box-shadow:0 1px 2px rgba(14,18,26,.25)}.btn.dk:hover{background:var(--kit-surface-1f232c)}
.btn.sm{height:32px;padding:0 12px;font-size:13px}
.btn.ib{width:40px;padding:0;justify-content:center}
.lnk{font-size:13.5px;font-weight:500;color:var(--kit-text-6e7180);display:inline-flex;align-items:center;gap:5px;white-space:nowrap}.lnk:hover{color:var(--ink)}
.chv{color:var(--kit-text-9a9daa);display:flex;justify-content:flex-end}
.pl{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 10px 0 9px;border-radius:7px;font-size:12.5px;font-weight:500;white-space:nowrap;flex-shrink:0}
.pl i{width:6px;height:6px;border-radius:50%;background:currentColor;display:block;flex-shrink:0}
.pl.ok{background:var(--kit-surface-eaf8f0);color:var(--kit-text-0e8f4e)}.pl.ok i{background:var(--kit-surface-12b76a)}
.pl.warn{background:var(--kit-surface-fff3e8);color:var(--kit-text-c26a16)}.pl.warn i{background:var(--kit-surface-f48721)}
.pl.or{background:var(--kit-surface-fef5ea);color:var(--kit-text-e06106)}.pl.or i{background:var(--kit-surface-f56700)}
.pl.bad{background:var(--kit-surface-fdecec);color:var(--kit-text-c0182b)}.pl.bad i{background:var(--kit-surface-e31a2c)}
.pl.blue{background:var(--kit-surface-eaf3fe);color:var(--kit-text-2370e0)}.pl.blue i{background:var(--kit-surface-2881f0)}
.pl.ind{background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc)}
.pl.neu{background:var(--kit-surface-f6f7f9);color:var(--kit-text-232c48);box-shadow:inset 0 0 0 1px var(--kit-line-eceef2)}.pl.neu i{background:var(--kit-surface-232c48)}
.pl.gs{background:var(--kit-surface-e9f8f0);color:var(--kit-text-1e9e62)}.pl.rs{background:var(--kit-surface-fce7e8);color:var(--kit-text-d94356)}
.av{border-radius:50%;overflow:hidden;display:inline-flex;flex-shrink:0;background:var(--kit-surface-eef0f3)}.av.rg{box-shadow:0 0 0 2px var(--kit-line-ffffff)}
.avs{display:inline-flex}.avs .av{margin-left:-8px}.avs .av:first-child{margin-left:0}
.done{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border-radius:9px;background:var(--kit-surface-eaf8f0);color:var(--kit-text-0e8f4e);font-size:13px;font-weight:600;white-space:nowrap}
.mk{flex-shrink:0}
.tile{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-eef0f3);border-radius:var(--radius-lg);box-shadow:0 2px 6px rgba(16,24,40,.07)}
.toast{position:fixed;left:50%;bottom:28px;transform:translate(-50%,16px);background:var(--kit-surface-0e121a);color:var(--kit-text-ffffff);font-size:14px;font-weight:500;padding:11px 16px;border-radius:var(--radius-lg);opacity:0;pointer-events:none;transition:all .22s;z-index:50;box-shadow:0 8px 24px rgba(16,17,20,.2)}.toast.show{opacity:1;transform:translate(-50%,0)}
/* stat tiles */
.stg{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:15px}
.st{padding:17px 18px 16px;min-height:110px}.st .l{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--kit-text-5e6170);font-weight:400}.st .n{display:flex;align-items:baseline;gap:8px;font-size:24px;font-weight:700;letter-spacing:-.02em;color:var(--ink);margin-top:11px;line-height:1.1}.st .s{font-size:11.5px;font-weight:600;margin-top:9px;display:flex;align-items:center;gap:4px}
.st .chip{font-size:11px;font-weight:600;color:var(--kit-text-1e9e62);background:var(--kit-surface-e9f8f0);border-radius:var(--radius-sm);padding:2px 6px;letter-spacing:0;display:inline-flex;align-items:center;gap:3px;white-space:nowrap}
/* tables */
.th{display:grid;grid-template-columns:var(--cols);gap:12px;align-items:center;height:40px;padding:0 16px;background:var(--band);font-size:12.5px;font-weight:500;color:var(--kit-text-6e7182);border-bottom:1px solid var(--line2)}
.tr{display:grid;grid-template-columns:var(--cols);gap:12px;align-items:center;min-height:54px;padding:0 16px;border-top:1px solid var(--line2);font-size:14px}.th+.tr{border-top:0}.tr:hover{background:var(--kit-surface-fbfbfc)}
.who{display:flex;align-items:center;gap:12px;min-width:0}.nm{font-weight:600;color:var(--kit-text-1e2228);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.c2{color:var(--kit-text-5c5e6b);font-weight:500}.c3{color:var(--kit-text-68667b)}
.srow{display:flex;gap:12px;margin:15px 0}.srow .srch{flex:1;height:40px;border-radius:var(--radius-lg);font-size:13px;padding:0 12px 0 14px}.srow .srch input{font-size:12.5px}.srow .srch input::placeholder{color:var(--kit-text-a3a5b1)}
/* tabs */
.tabs{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:15px}
.tab{height:34px;padding:0 16px;border-radius:9px;font-size:13.5px;font-weight:500;color:var(--kit-text-6e7182);background:var(--kit-surface-f4f5f7);display:inline-flex;align-items:center;gap:8px;position:relative}
.tab:hover{background:var(--kit-surface-edeef1)}.tab.on{background:var(--kit-surface-f1f0fe);color:var(--kit-text-3c35e3);font-weight:600}.tab.on::after{content:'';position:absolute;left:10px;right:10px;bottom:0;height:2px;border-radius:2px;background:var(--kit-surface-6e73f9)}
/* list rows */
.lr2{display:grid;grid-template-columns:var(--cols);gap:16px;align-items:center;padding:0 22px;border-top:1px solid var(--line2)}.lr2:first-child{border-top:0}.lr2:hover{background:var(--kit-surface-fbfbfc)}
.band{height:30px;display:flex;align-items:center;padding:0 14px;background:var(--band);font-size:13.5px;font-weight:600;color:var(--kit-text-23252f);border-top:1px solid var(--line2);border-bottom:1px solid var(--line2)}.band:first-child{border-top:0}

/* ===================== v9 shared parts (same look as v8) ===================== */
.stg.c3{grid-template-columns:repeat(3,minmax(0,1fr))}.stg.c2{grid-template-columns:repeat(2,minmax(0,1fr))}
.gap{height:15px}.stack>*+*{margin-top:15px}
.sh{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px 12px}
.shl{display:flex;align-items:center;gap:9px;min-width:0;flex-wrap:wrap}.sh h2{font-size:16px;font-weight:700;letter-spacing:-.015em;color:var(--ink)}
.sn{font-size:13px;color:var(--kit-text-6e7180)}.cbd{padding:0 18px 16px}.cbd>.p:first-child{margin-top:0}
.p{font-size:13.5px;line-height:1.55;color:var(--kit-text-3a3d48)}.p+.p{margin-top:8px}.p b{color:var(--ink);font-weight:600}
.t3{color:var(--kit-text-5e6170)}.t4{color:var(--kit-text-8a8d9a)}.fs12{font-size:12px}.fs13{font-size:13px}
.mono{font-family:"JetBrains Mono",ui-monospace,Menlo,monospace;font-size:12px;color:var(--kit-text-6e7180);letter-spacing:0}
.ey{font-family:"JetBrains Mono",ui-monospace,Menlo,monospace;font-size:11.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--kit-text-6e66f8)}
.tg{display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 8px;border-radius:var(--radius-sm);font-size:12px;font-weight:500;background:var(--kit-surface-f2f3f5);color:var(--kit-text-4b4e5c);white-space:nowrap;flex-shrink:0}
.tg.blue{background:var(--kit-surface-eaf3fe);color:var(--kit-text-2370e0)}.tg.ind{background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc)}.tg.or{background:var(--kit-surface-fef5ea);color:var(--kit-text-c25a06)}.tg.ok{background:var(--kit-surface-eaf8f0);color:var(--kit-text-0e8f4e)}.tg.bad{background:var(--kit-surface-fdecec);color:var(--kit-text-c0182b)}.tg.yel{background:var(--kit-surface-fef3c7);color:var(--kit-text-92400e)}
.srcc{display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 8px 0 6px;border-radius:var(--radius-sm);background:var(--kit-surface-f4f5f7);border:1px solid var(--kit-line-eceef1);font-size:11.5px;font-weight:500;color:var(--kit-text-4b4e5c);white-space:nowrap;vertical-align:middle;margin:0 2px}
/* rows */
.row{display:flex;align-items:center;gap:14px;padding:13px 18px;border-top:1px solid var(--line2)}.sh+.row,.row:first-child{border-top:0}
.row .rm{flex:1;min-width:0}.row .rt{font-size:14px;font-weight:600;color:var(--t1)}.row .rsb{font-size:12.5px;color:var(--kit-text-7a7d88);margin-top:2px;line-height:1.45}
.row .ra{display:flex;align-items:center;gap:8px;flex-shrink:0}
.kv{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:12px 18px;border-top:1px solid var(--line2);font-size:13.5px}.sh+.kv{border-top:0}
.kv .k{color:var(--kit-text-2a2d37);font-weight:500;display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}.kv .v{text-align:right;font-weight:700;color:var(--ink);white-space:nowrap}.kv .v small{display:block;font-size:11.5px;font-weight:400;color:var(--kit-text-8a8d9a);margin-top:1px}
/* big number card */
.big{padding:18px 20px 18px}.big .l{font-size:13.5px;font-weight:600;color:var(--kit-text-2a2d37);display:flex;align-items:center;gap:8px}.big .n{font-size:30px;font-weight:800;letter-spacing:-.03em;color:var(--ink);margin-top:6px;line-height:1.1}
.big .n small{font-size:14px;font-weight:500;color:var(--kit-text-8a8d9a);margin-left:6px;letter-spacing:0}.big .s{font-size:13px;color:var(--kit-text-6e7180);margin-top:6px;line-height:1.5}
.bigr{display:flex;align-items:flex-end;justify-content:space-between;gap:16px}.bigr>div:first-child{flex:1;min-width:0}.bigr .ms{display:flex;gap:22px;flex-shrink:0}.bigr .ms span{white-space:nowrap}.bigr .ms div{text-align:right}.bigr .ms b{display:block;font-size:17px;font-weight:700;color:var(--ink)}.bigr .ms span{font-size:12px;color:var(--kit-text-8a8d9a)}
/* forms */
.fg{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px 16px}.fg .full{grid-column:1/-1}
.fl{display:block;font-size:12.5px;font-weight:600;color:var(--kit-text-2a2d37);margin-bottom:6px}
.inp{display:flex;align-items:center;gap:8px;width:100%;height:40px;padding:0 12px;border:1px solid var(--kit-line-e4e6ea);border-radius:var(--radius-lg);background:var(--kit-surface-ffffff);font-size:13.5px;color:var(--t1);box-shadow:0 1px 2px rgba(16,24,40,.04)}
.inp input{flex:1;font-size:13.5px;height:100%}.inp input::placeholder{color:var(--kit-text-a3a6b2)}.inp:focus-within{border-color:var(--kit-line-a5a8f8);box-shadow:0 0 0 3px var(--kit-line-eeeefe)}
select.inp{appearance:none;-webkit-appearance:none;cursor:pointer;padding-right:34px;background:var(--kit-surface-ffffff) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%238A8D99' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right 11px center;outline:none}
.inp.mono2 input{font-family:"JetBrains Mono",ui-monospace,monospace;font-size:12.5px}
textarea.ta{display:block;width:100%;min-height:86px;padding:11px 13px;border:1px solid var(--kit-line-e4e6ea);border-radius:var(--radius-lg);font-size:13.5px;line-height:1.5;resize:vertical;outline:none;box-shadow:0 1px 2px rgba(16,24,40,.04)}textarea.ta:focus{border-color:var(--kit-line-a5a8f8);box-shadow:0 0 0 3px var(--kit-line-eeeefe)}
.help{font-size:12px;color:var(--kit-text-8a8d9a);margin-top:6px;line-height:1.45}
.ctl{display:flex;gap:8px;align-items:center}.ctl>.inp,.ctl>select{flex:1;min-width:0}
.rcs{display:flex;flex-direction:column;gap:8px}.rc{display:flex;align-items:center;gap:11px;padding:9px 12px;border:1px solid var(--kit-line-e9ebef);border-radius:var(--radius-lg);cursor:pointer;background:var(--kit-surface-ffffff)}
.rc>i{width:16px;height:16px;border-radius:50%;border:1.5px solid var(--kit-line-c9ccd4);flex-shrink:0;background:var(--kit-surface-ffffff)}.rc.on{border-color:var(--kit-line-cfcdfb);background:var(--kit-surface-f8f8ff)}.rc.on>i{border:5px solid var(--kit-line-4a4cf7)}
.rct b{display:block;font-size:13.5px;font-weight:600;color:var(--t1)}.rct span{display:block;font-size:12px;color:var(--kit-text-8a8d9a);margin-top:1px}
.cbs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:11px 14px}.cb2{display:flex;align-items:center;gap:9px;font-size:13.5px;color:var(--kit-text-2a2d37);cursor:pointer;user-select:none}
.cb2 i{width:17px;height:17px;border-radius:5px;border:1.5px solid var(--kit-line-c9ccd4);flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--kit-surface-ffffff)}
.cb2.on i{background:var(--kit-surface-4a4cf7);border-color:var(--kit-line-4a4cf7)}.cb2.on i::after{content:'';width:8px;height:4px;border-left:2px solid var(--kit-line-ffffff);border-bottom:2px solid var(--kit-line-ffffff);transform:rotate(-45deg) translate(1px,-1px)}
.sw{width:36px;height:21px;border-radius:var(--radius-full);background:var(--kit-surface-d5d8df);position:relative;flex-shrink:0;cursor:pointer;transition:background .15s}
.sw::after{content:'';position:absolute;left:2.5px;top:2.5px;width:16px;height:16px;border-radius:50%;background:var(--kit-surface-ffffff);box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform .15s}.sw.on{background:var(--kit-surface-4a4cf7)}.sw.on::after{transform:translateX(15px)}
.sg{display:inline-flex;gap:3px;padding:3px;background:var(--kit-surface-f2f3f5);border-radius:var(--radius-lg);flex-shrink:0}.sg button{height:30px;padding:0 13px;border-radius:var(--radius-md);font-size:13px;font-weight:500;color:var(--kit-text-6e7182);display:inline-flex;align-items:center;gap:7px;white-space:nowrap}
.sg.full{display:flex;width:100%}.sg.full button{flex:1;justify-content:center;padding:0 6px}
.sg button.on{background:var(--kit-surface-ffffff);color:var(--kit-text-1e2129);font-weight:600;box-shadow:0 1px 2px rgba(16,24,40,.08),0 0 0 1px var(--kit-line-e6e8ec)}
/* disclosure */
details.ds>summary{list-style:none;display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:500;color:var(--kit-text-5e6170);cursor:pointer;user-select:none}details.ds>summary::-webkit-details-marker{display:none}
details.ds>summary:hover{color:var(--ink)}details.ds>summary svg{transition:transform .15s}details.ds[open]>summary svg{transform:rotate(90deg)}
details.ds .dsb{margin-top:8px;font-size:13px;color:var(--kit-text-4e5160);line-height:1.55;padding:11px 13px;background:var(--kit-surface-f8f9fa);border:1px solid var(--kit-line-f0f1f3);border-radius:var(--radius-lg)}
/* empty state */
.emp{display:flex;flex-direction:column;align-items:center;text-align:center;padding:20px 20px 24px}.emp .ei{width:36px;height:36px;border-radius:50%;background:var(--kit-surface-eaf8f0);color:var(--kit-text-0e8f4e);display:flex;align-items:center;justify-content:center;margin-bottom:10px}
.emp .ei.ind{background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc)}.emp .ei.neu{background:var(--kit-surface-f2f3f5);color:var(--kit-text-6e7180)}.emp b{font-size:14.5px;font-weight:700;color:var(--ink)}.emp>span{font-size:13px;color:var(--kit-text-7a7d88);margin-top:4px;max-width:440px;line-height:1.5}
/* item blocks (money, flags, leaks) */
.it{padding:16px 18px;border-top:1px solid var(--line2)}.sh+.it{border-top:0}.it .ih{display:flex;align-items:flex-start;justify-content:space-between;gap:14px}
.it .i1{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:14.5px;font-weight:700;color:var(--ink);letter-spacing:-.01em}
.it .amt{text-align:right;font-size:15px;font-weight:700;color:var(--ink);white-space:nowrap}.it .amt small{display:block;font-size:11.5px;font-weight:400;color:var(--kit-text-8a8d9a);margin-top:1px}
.it .ip{font-size:13px;color:var(--kit-text-5e6170);line-height:1.5;margin-top:6px}.it .ip+.ip{margin-top:2px}.it details.ds{margin-top:8px}
.acts2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;margin-top:12px}.acts2 .fl{margin-bottom:5px;font-weight:500;color:var(--kit-text-6e7180);font-size:12px}
.acts2 .ctl .btn{height:40px;flex-shrink:0}
.moreb{display:flex;justify-content:center;padding:12px;border-top:1px solid var(--line2)}.moreb button{font-size:13px;font-weight:600;color:var(--kit-text-4f46e5);display:inline-flex;align-items:center;gap:6px}
.hide{display:none!important}
/* two columns */
.g2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:15px;align-items:start}.g3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:15px;align-items:start}
.side{display:grid;grid-template-columns:minmax(0,1fr) 250px;gap:18px;align-items:start}.side>div>*+*{margin-top:15px}
/* approvals */
.apv{display:flex;align-items:flex-start;gap:14px;padding:15px 18px;border-top:1px solid var(--line2)}.sh+.apv{border-top:0}.apv .am2{flex:1;min-width:0}
.apv .at{font-size:14.5px;font-weight:700;color:var(--ink)}.apv .as{font-size:13px;color:var(--kit-text-5e6170);margin-top:3px;line-height:1.45}.apv .ax{font-size:12px;color:var(--kit-text-8a8d9a);margin-top:5px}
.apv .ab{display:flex;gap:8px;flex-shrink:0;align-items:center}.apv .tgs{display:flex;gap:6px;margin-bottom:7px;flex-wrap:wrap}
/* timeline (time column + mark + text) */
.tln .upr{min-height:46px}.tln .ux{white-space:normal}
/* top bar additions */
.hs{display:inline-flex;align-items:center;gap:8px;height:38px;padding:0 13px;border-radius:var(--radius-lg);border:1px solid var(--kit-line-f3e3c8);background:var(--kit-surface-fff9f0);font-size:14px;font-weight:600;color:var(--kit-text-9a5b12);white-space:nowrap;cursor:pointer;flex-shrink:0}.hs i{width:8px;height:8px;border-radius:50%;background:var(--kit-surface-f59e0b)}
.hs.okk{border-color:var(--kit-line-d5f0e1);background:var(--kit-surface-f2fbf6);color:var(--kit-text-0e7a45)}.hs.okk i{background:var(--kit-surface-12b76a)}
.mew{position:relative}.mew>.me{cursor:pointer}
.pop{position:absolute;z-index:40;width:262px;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e6e8ec);border-radius:var(--radius-kit-card);box-shadow:0 12px 32px rgba(16,24,40,.14),0 2px 6px rgba(16,24,40,.06);padding:8px;display:none;text-align:left}
.pop.open{display:block}.pop .ph{display:flex;align-items:center;gap:11px;padding:8px 8px 12px;border-bottom:1px solid var(--line2);margin-bottom:6px}.pop .ph b{display:block;font-size:14px;font-weight:700;color:var(--ink)}.pop .ph div span{display:block;font-size:12px;color:var(--kit-text-8a8d9a)}
.pop a,.pop .pr2{display:flex;align-items:center;gap:10px;height:38px;padding:0 9px;border-radius:9px;font-size:13.5px;font-weight:500;color:var(--kit-text-2a2d37);cursor:pointer}.pop a:hover{background:var(--kit-surface-f4f5f7)}.pop a svg{color:var(--kit-text-6e7180)}
.pop .pr2{justify-content:space-between;cursor:default}.pop .pr2 .sg button{height:26px;padding:0 8px}.pop hr{border:0;border-top:1px solid var(--line2);margin:6px 0}
.pop.pp-tr{right:0;top:58px}.pop.pp-bl{left:4px;bottom:64px}
.pf{position:relative;cursor:pointer}
/* menu rows: icon gap kept, long labels stay on one line */
.nv{gap:0}.nv>svg{margin-right:19px}.nv>span:not(.nb){white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;padding-right:8px}
/* sidebar money label spacing */
.tl.mt0{margin-top:18px}
.bk{display:inline-flex;align-items:center;gap:4px;font-size:13px;font-weight:500;color:var(--kit-text-6e7180);margin:-6px 0 8px}.bk:hover{color:var(--ink)}
.tln .upr{grid-template-columns:88px 40px minmax(0,1fr)}
.srch{min-width:0}.srch input{width:100%}
.ct .ctr{display:flex;align-items:center;gap:7px;margin-top:11px;font-size:12px;color:var(--kit-text-9a5b12)}.ct .ctr i{width:7px;height:7px;border-radius:50%;background:var(--kit-surface-f59e0b);display:block}
/* demo line */
.demo{display:flex;align-items:center;gap:10px;height:34px;padding:0 38px;background:var(--kit-surface-f5f4ff);border-bottom:1px solid var(--kit-line-ecebfd);font-size:13px;color:var(--kit-text-4c3cbc)}.demo b{font-weight:600}.demo a{text-decoration:underline;font-weight:600}.demo button{margin-left:auto;color:var(--kit-text-6e66f8)}

/* ---------- Today ---------- */
.tdh{margin-bottom:20px} .eb{font-family:"JetBrains Mono",ui-monospace,Menlo,monospace;font-size:16.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--kit-text-515357);font-weight:500;margin-bottom:6px}
.h1r{display:flex;align-items:center;gap:16px;flex-wrap:wrap}h1.hx{font-size:32px;letter-spacing:-.02em}
.hcs{display:inline-flex;gap:10px}.hc{display:inline-flex;align-items:center;gap:8px;height:35px;padding:0 14px 0 10px;border-radius:var(--radius-lg);font-size:14.5px;font-weight:600}
.hc.crit{background:var(--kit-surface-fdedf0);color:var(--kit-text-b7000d)}.hc.risk{background:var(--kit-surface-fff3e0);color:var(--kit-text-a16b30)}.hc.odd{background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc)}
#p-today .sub{font-size:16px;color:var(--kit-text-494c52);margin-top:8px}
.cards3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-bottom:16px}
.ac{border-radius:var(--radius-kit-feature);border:1px solid;padding:17px 18px 17px;display:flex;flex-direction:column}
.ac.crit{background:linear-gradient(180deg,var(--kit-surface-fff3f5),var(--kit-surface-fff8f9));border-color:var(--kit-line-f6dde4)}.ac.risk{background:linear-gradient(180deg,var(--kit-surface-fff9ee),var(--kit-surface-fffcf7));border-color:var(--kit-line-f6ebd3)}.ac.odd{background:linear-gradient(180deg,var(--kit-surface-f3f5ff),var(--kit-surface-f8f9ff));border-color:var(--kit-line-e3e7fb)}
.tag{display:flex;align-items:center;gap:10px;margin-bottom:12px}.lab{display:inline-flex;align-items:center;gap:7px;height:27px;padding:0 10px 0 7px;border-radius:7px;font-family:"JetBrains Mono",ui-monospace,monospace;font-size:12px;font-weight:700;letter-spacing:.07em;text-transform:uppercase}
.lab.crit{background:var(--kit-surface-ffe1e4);color:var(--kit-text-ab0d0e)}.lab.risk{background:var(--kit-surface-fdf0db);color:var(--kit-text-b5630f)}.lab.odd{background:var(--kit-surface-e9ecff);color:var(--kit-text-3c32a7)}
.age{font-size:13px;color:var(--kit-text-7c7e87)}.am{margin-left:auto}
.ac h3{font-size:15.5px;font-weight:700;letter-spacing:-.015em;line-height:1.3;color:var(--ink)}.ac p{font-size:13.5px;color:var(--kit-text-4e5058);line-height:1.5;margin-top:6px}
.rec{margin-top:12px;background:var(--kit-surface-f2f2ff);border-radius:var(--radius-lg);padding:10px 12px 11px;font-size:13px;color:var(--kit-text-4e5058);line-height:1.45;flex:1}.rec .rh{display:flex;align-items:center;gap:6px;color:var(--kit-text-5a48f2);font-weight:600;font-size:13px;margin-bottom:3px}
.ac.crit .rec{background:var(--kit-surface-fbeff4)}.ac.risk .rec{background:var(--kit-surface-f6f2ff)}
.acts{display:flex;gap:10px;margin-top:14px}.acts .btn{height:38px}
.r2{display:grid;grid-template-columns:minmax(0,1.65fr) minmax(0,1fr);gap:16px;margin-bottom:16px}
.r3{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,1.2fr);gap:16px;margin-bottom:16px}
.ch{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px 12px}.chl{display:flex;align-items:center;gap:9px}.ch h2{font-size:17.5px;font-weight:700;letter-spacing:-.02em;color:var(--ink)}.note{font-size:13.5px;color:var(--kit-text-5e6170)}
.tth{display:grid;grid-template-columns:var(--cols);gap:6px;white-space:nowrap;padding:0 18px 9px;font-size:12px;font-weight:500;color:var(--kit-text-83848f);border-bottom:1px solid var(--line2)}
.ttr{display:grid;grid-template-columns:var(--cols);gap:6px;align-items:center;min-height:45px;padding:0 18px;border-top:1px solid var(--line2);font-size:12.5px}.ttr .pl{height:22px;font-size:11.5px;padding:0 8px 0 7px}.tth+.ttr{border-top:0}
.ttr .nm{font-weight:500;color:var(--kit-text-292929)}.ow{font-size:12px;color:var(--kit-text-7d7b87);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wcl{padding:0 18px 8px}.wci{display:grid;grid-template-columns:78px 36px minmax(0,1fr);align-items:center;min-height:50px;border-top:1px solid var(--line2)}.wci:first-child{border-top:0}
.wci .tm{font-size:11.5px;color:var(--kit-text-868688);align-self:stretch;display:flex;align-items:center;border-right:1px solid var(--kit-line-eef0f3)}.wcm{display:flex;justify-content:center}.wct{font-size:13.5px;font-weight:500;color:var(--kit-text-24232a);line-height:1.35;padding-left:6px}
.agr{display:flex;align-items:center;gap:12px;padding:12px 18px;border-top:1px solid var(--line2)}.agm{flex:1;min-width:0}.agn{display:flex;align-items:center;gap:8px}.agn b{font-size:14px;font-weight:700;color:var(--t1)}.agn .pl{margin-left:auto}.agd{font-size:12.5px;color:var(--kit-text-6e7180);margin-top:3px}
.pr{display:grid;grid-template-columns:18px minmax(0,1fr) auto 40px 16px;gap:12px;align-items:center;min-height:44px;padding:0 18px;border-top:1px solid var(--line2);font-size:14px;font-weight:500;cursor:pointer}.pr:hover{background:var(--kit-surface-fbfbfc)}
.mbs{display:inline-flex;align-items:flex-end;gap:2px;height:16px}.mbs i{display:block;width:4px;border-radius:1px}
.ach{padding:16px 18px 16px}.ach h2{font-size:15.5px;font-weight:700;color:var(--ink)}.acb{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-top:12px}
.acn{display:flex;align-items:center;gap:10px}.acn b{font-size:36px;font-weight:800;letter-spacing:-.045em;line-height:1;color:var(--ink)}.acn em{display:block;font-style:normal;font-size:11.5px;color:var(--kit-text-8a8d9a);margin-top:3px}
.up{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:600;color:var(--kit-text-1e9e62);background:var(--kit-surface-e9f8f0);border-radius:var(--radius-sm);padding:2px 7px}
.acs{font-size:12.5px;color:var(--kit-text-5e6170);margin-top:14px;padding-top:12px;border-top:1px solid var(--line2)}.abars{display:inline-flex;align-items:flex-end;gap:3px;height:46px}.abars i{display:block;width:7px;border-radius:2px 2px 1px 1px}
.askc{background:var(--kit-surface-f8f9fd);border-color:var(--kit-line-eceef5);padding:18px 20px 18px}.ah{display:flex;align-items:center;gap:14px}.ah h2{font-size:19px;font-weight:800;letter-spacing:-.025em;color:var(--ink)}.ah p{font-size:13px;color:var(--kit-text-6e7180);margin-top:2px}.ah .tx{margin-left:auto;display:flex;align-items:center;gap:10px;font-size:13px;color:var(--kit-text-6e7180)}
.ain{display:flex;align-items:center;gap:10px;height:46px;margin-top:14px;padding:0 7px 0 16px;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e6e8ec);border-radius:var(--radius-xl);box-shadow:0 1px 2px rgba(16,24,40,.04)}.ain input{flex:1;font-size:14.5px}.ain input::placeholder{color:var(--kit-text-9a9daa)}
.snd{width:34px;height:34px;border-radius:9px;background:var(--kit-surface-eef0f4);display:flex;align-items:center;justify-content:center}
.achips{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px}.achip{height:34px;padding:0 14px;border-radius:var(--radius-full);border:1px solid var(--kit-line-e6e8ec);background:var(--kit-surface-ffffff);font-size:13px;font-weight:500;color:var(--kit-text-3f424c);display:inline-flex;align-items:center;gap:8px}.achip:hover{border-color:var(--kit-line-cdd0d8)}
/* ---------- Ask ---------- */
.hero{background:var(--kit-surface-f6f7fe);border:1px solid var(--kit-line-ebedf8);border-radius:var(--radius-kit-feature);padding:34px 32px 34px;text-align:center;display:flex;flex-direction:column;align-items:center;margin-bottom:16px}
.hero h2{font-size:19px;font-weight:700;letter-spacing:-.02em;color:var(--ink);margin-top:12px}.hero p{font-size:13.5px;color:var(--kit-text-6e7182);margin-top:6px}
.hin{display:flex;align-items:center;gap:10px;width:100%;max-width:620px;height:48px;margin-top:22px;padding:0 7px 0 16px;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e4e6ea);border-radius:var(--radius-xl);box-shadow:0 1px 3px rgba(16,24,40,.06)}.hin input{flex:1;font-size:14px}.hin input::placeholder{color:var(--kit-text-8a8da0)}
.hgo{width:34px;height:34px;border-radius:9px;background:linear-gradient(180deg,var(--kit-surface-5a55fa),var(--kit-surface-4743f2));display:flex;align-items:center;justify-content:center;box-shadow:0 1px 2px rgba(71,67,242,.35)}
.qrow{display:flex;gap:10px;justify-content:center;margin-top:12px;flex-wrap:wrap}.qrow:first-of-type{margin-top:16px}
.qchip{height:36px;padding:0 14px;border-radius:var(--radius-full);border:1px solid var(--kit-line-e6e8ec);background:var(--kit-surface-ffffff);font-size:13.5px;color:var(--kit-text-4b4e66);display:inline-flex;align-items:center;gap:9px;box-shadow:0 1px 2px rgba(16,24,40,.03)}.qchip:hover{border-color:var(--kit-line-cdd0d8)}
.pq{padding:18px 18px 18px}.pq h2{font-size:17px;font-weight:700;color:var(--ink)}.pqg{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:14px}
.pqg button{display:flex;align-items:center;gap:10px;height:40px;padding:0 14px;border:1px solid var(--kit-line-eef0f3);border-radius:var(--radius-lg);background:var(--kit-surface-ffffff);font-size:13.5px;color:var(--kit-text-3b3e55);text-align:left}.pqg button:hover{background:var(--kit-surface-fafafc);border-color:var(--kit-line-e2e4ea)}
/* ---------- Teams ---------- */
.tmr{min-height:74px}.tn{font-size:15.5px;font-weight:700;color:var(--kit-text-0b0b25)}.tmr .c2,.tmr .num{font-size:15px}
/* ---------- Agents ---------- */
.agl{min-height:88px}.agn2{font-size:14.5px;font-weight:700;color:var(--kit-text-050412)}.agd2{font-size:13px;color:var(--kit-text-8b8f9e);margin-top:4px}
.agl .pl{height:26px;font-size:12.5px;padding:0 11px 0 10px}.agl .pl i{width:7px;height:7px}
.kb{width:30px;height:30px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center}.kb:hover{background:var(--kit-surface-f3f4f6)}
/* ---------- Track ---------- */
.chh{display:flex;align-items:center;justify-content:space-between;padding:18px 20px 4px}.chh h2{font-size:15.5px;font-weight:700;color:var(--ink)}
.lgd{display:flex;gap:18px;font-size:13px;color:var(--kit-text-3a3d48)}.lgd span{display:flex;align-items:center;gap:7px}.lgd i{width:11px;height:11px;border-radius:3px;display:block}
/* ---------- Updates ---------- */
.upr{display:grid;grid-template-columns:60px 46px minmax(0,1fr);align-items:center;min-height:50px;border-top:1px solid var(--line2);cursor:pointer}.band+.upr{border-top:0}.upr:hover{background:var(--kit-surface-fbfbfc)}
.ut{align-self:stretch;display:flex;align-items:center;padding-left:14px;font-size:13.5px;color:var(--kit-text-9ea2b0);border-right:1px solid var(--kit-line-eeeff1)}.um{display:flex;justify-content:center}
.ux{font-size:14px;font-weight:500;color:var(--kit-text-1f2133);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.us{font-size:13px;color:var(--kit-text-9594a1);margin-top:2px}
/* ---------- Connections ---------- */
.cnr{min-height:54px}.cnn{font-size:15px;font-weight:700;color:var(--kit-text-1f2730)}.cnr .pl{height:24px;font-size:12.5px;padding:0 10px}.ls{font-size:13px;color:var(--kit-text-8e90a0);white-space:nowrap}
.btn.cn{height:30px;padding:0 12px;border-radius:9px;background:var(--kit-surface-f0f0fe);border-color:var(--kit-line-e6e5fd);color:var(--kit-text-5b57f8);font-weight:600;font-size:13px;box-shadow:none;flex-direction:row-reverse}.cnr>span:last-child{display:flex}
/* ---------- Graph ---------- */
.gch{display:flex;gap:10px;margin-bottom:12px;flex-wrap:wrap}.gc{height:38px;padding:0 16px;border-radius:var(--radius-xl);background:var(--kit-surface-f8f9fb);border:1px solid var(--kit-line-eef0f3);font-size:13.5px;font-weight:500;color:var(--kit-text-3f424c);display:inline-flex;align-items:center;gap:9px}
.gc i{width:9px;height:9px;border-radius:50%;display:block}.gc.on{background:var(--kit-surface-f1f2fe);border-color:var(--kit-line-e3e4fd);color:var(--kit-text-5e5efa);font-weight:600}
.gwrap{position:relative;height:476px;border-radius:var(--radius-kit-card);background-color:var(--kit-surface-ffffff);background-image:radial-gradient(var(--kit-surface-e3e5ea) 1.1px,transparent 1.2px);background-size:22px 22px;overflow:hidden}
.gwrap svg.edges{position:absolute;inset:0;width:100%;height:100%}
.gn{position:absolute;transform:translate(-50%,-50%);display:inline-flex;align-items:center;gap:10px;height:46px;padding:0 22px 0 10px;border-radius:var(--radius-full);border:1.5px solid;box-shadow:0 4px 14px rgba(16,24,40,.07);white-space:nowrap;cursor:pointer}
.gn b{font-size:14.5px;font-weight:700;color:var(--kit-text-1a1c29);letter-spacing:-.01em}.gav{position:absolute;top:-31px;right:-14px}.gav.r{top:50%;right:-40px;transform:translateY(-50%)}.gav .av{box-shadow:0 0 0 2px var(--kit-line-ffffff),0 2px 6px rgba(16,24,40,.15)}
.gz{position:absolute;right:14px;bottom:14px;display:flex;flex-direction:column;align-items:center;gap:10px}.gsl{width:5px;height:64px;border-radius:3px;background:var(--kit-surface-e6e8ec);position:relative}.gsl i{position:absolute;left:-1px;right:-1px;top:6px;height:22px;border-radius:3px;background:var(--kit-surface-b9bdc9)}
.gzb{display:flex;flex-direction:column;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e6e8ec);border-radius:var(--radius-lg);box-shadow:0 1px 3px rgba(16,24,40,.06);overflow:hidden}.gzb button{width:34px;height:32px;display:flex;align-items:center;justify-content:center}.gzb button+button{border-top:1px solid var(--kit-line-eef0f3)}
/* ---------- Customers ---------- */
#p-customers .tr{min-height:54px;gap:8px}#p-customers .th{gap:8px}#p-customers .tr .pl{height:27px;font-size:13px;padding:0 11px 0 10px}
/* ---------- Meetings ---------- */
.mtb{display:flex;align-items:center;gap:10px;margin:-6px 0 16px}.mtb .btn{height:34px}.mtb .btn.ib{width:34px}.btn.tdy{background:var(--kit-surface-f1f0fe);border-color:var(--kit-line-e9e8fd);color:var(--kit-text-6e66f8);font-weight:600;box-shadow:none}
.mtr{margin-left:auto;display:flex;align-items:center;gap:10px}.seg3{display:flex;gap:6px}.seg3 button{height:34px;padding:0 16px;border-radius:9px;border:1px solid var(--kit-line-e4e6ea);background:var(--kit-surface-ffffff);font-size:13.5px;font-weight:500;color:var(--kit-text-585a69)}.seg3 button.on{background:var(--kit-surface-1a1d2b);border-color:var(--kit-line-1a1d2b);color:var(--kit-text-ffffff)}
.mgrid{display:grid;grid-template-columns:minmax(0,1fr) 232px;gap:22px;align-items:start}.mcol>*+*{margin-top:14px}
.band.mb{height:32px;font-size:14px;color:var(--kit-text-0c0b1d)}.mr{min-height:66px;cursor:pointer}.mt2{font-size:12.5px;color:var(--kit-text-a8abb6)}.mn{font-size:13.5px;font-weight:600;color:var(--kit-text-1a1c29)}.ms{font-size:12.5px;color:var(--kit-text-8b8f9e);margin-top:3px}
.mr .pl{height:26px;padding:0 10px;gap:6px;font-weight:600}
.rp{padding:16px 16px 14px}.rp h2{font-size:16px;font-weight:700;color:var(--ink);letter-spacing:-.015em}.rps{font-size:14px;font-weight:500;color:var(--kit-text-1a1c29);margin:8px 0 6px}
.ii{display:flex;align-items:center;gap:11px;padding:7px 0}.ii b{display:block;font-size:12.5px;font-weight:600;color:var(--kit-text-1a1c29)}.ii div span{display:block;font-size:11.5px;color:var(--kit-text-8b8f9e)}
.ci{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.ci.sq{border-radius:7px}
.pi{display:flex;align-items:center;gap:10px;padding:7px 0;font-size:12.5px;color:var(--kit-text-3a3d48)}.rp h2+.pi{margin-top:8px}
.si{display:flex;align-items:center;gap:9px;width:100%;height:34px;padding:0 11px;border:1px solid var(--kit-line-e9ebef);border-radius:9px;background:var(--kit-surface-ffffff);font-size:12.5px;color:var(--kit-text-272450);margin-top:8px;text-align:left}.si:hover{background:var(--kit-surface-fafafc)}
/* ---------- Settings ---------- */
.bill{padding:22px 26px 24px}.bt{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.cp{font-size:15.5px;font-weight:600;color:var(--ink)}.pro{font-size:21px;font-weight:700;color:var(--ink);margin-top:6px;letter-spacing:-.02em}
.pd{font-size:13px;color:var(--kit-text-6e7182);margin-top:6px}.pp{font-size:17px;font-weight:700;color:var(--ink);margin-top:12px}.pn{font-size:13px;color:var(--kit-text-8b8f9e);margin-top:4px}
.ug{margin-top:28px}.ug h3{font-size:17px;font-weight:700;color:var(--ink)}.ub{display:grid;grid-template-columns:160px minmax(0,1fr) 120px;gap:20px;align-items:center;height:38px;font-size:14px;color:var(--kit-text-3a3d48)}.ug h3+.ub{margin-top:8px}
.tk{height:7px;border-radius:var(--radius-full);background:var(--kit-surface-dcdee3);overflow:hidden}.tk b{display:block;height:100%;border-radius:var(--radius-full);background:var(--kit-surface-464df6)}.ub .num{text-align:right}

/* ---------- Today (v8) ---------- */
.tdh{margin-bottom:20px} .eb{font-family:"JetBrains Mono",ui-monospace,Menlo,monospace;font-size:16.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--kit-text-515357);font-weight:500;margin-bottom:6px}
.h1r{display:flex;align-items:center;gap:16px;flex-wrap:wrap}h1.hx{font-size:32px;letter-spacing:-.02em}
.hcs{display:inline-flex;gap:10px}.hc{display:inline-flex;align-items:center;gap:8px;height:35px;padding:0 14px 0 10px;border-radius:var(--radius-lg);font-size:14.5px;font-weight:600}
.hc.crit{background:var(--kit-surface-fdedf0);color:var(--kit-text-b7000d)}.hc.risk{background:var(--kit-surface-fff3e0);color:var(--kit-text-a16b30)}.hc.odd{background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc)}
#p-today .sub{font-size:16px;color:var(--kit-text-494c52);margin-top:8px}
.cards3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-bottom:16px}
.ac{border-radius:var(--radius-kit-feature);border:1px solid;padding:17px 18px 14px;display:flex;flex-direction:column}
.ac.crit{background:linear-gradient(180deg,var(--kit-surface-fff3f5),var(--kit-surface-fff8f9));border-color:var(--kit-line-f6dde4)}.ac.risk{background:linear-gradient(180deg,var(--kit-surface-fff9ee),var(--kit-surface-fffcf7));border-color:var(--kit-line-f6ebd3)}.ac.odd{background:linear-gradient(180deg,var(--kit-surface-f3f5ff),var(--kit-surface-f8f9ff));border-color:var(--kit-line-e3e7fb)}
.tag{display:flex;align-items:center;gap:10px;margin-bottom:12px}.lab{display:inline-flex;align-items:center;gap:7px;height:27px;padding:0 10px 0 7px;border-radius:7px;font-family:"JetBrains Mono",ui-monospace,monospace;font-size:12px;font-weight:700;letter-spacing:.07em;text-transform:uppercase}
.lab.crit{background:var(--kit-surface-ffe1e4);color:var(--kit-text-ab0d0e)}.lab.risk{background:var(--kit-surface-fdf0db);color:var(--kit-text-b5630f)}.lab.odd{background:var(--kit-surface-e9ecff);color:var(--kit-text-3c32a7)}
.age{font-size:13px;color:var(--kit-text-7c7e87)}.am{margin-left:auto}
.ac h3{font-size:15.5px;font-weight:700;letter-spacing:-.015em;line-height:1.3;color:var(--ink)}.ac p{font-size:13.5px;color:var(--kit-text-4e5058);line-height:1.5;margin-top:6px}
.rec{margin-top:12px;background:var(--kit-surface-f2f2ff);border-radius:var(--radius-lg);padding:10px 12px 11px;font-size:13px;color:var(--kit-text-4e5058);line-height:1.45;flex:1}.rec .rh{display:flex;align-items:center;gap:6px;color:var(--kit-text-5a48f2);font-weight:600;font-size:13px;margin-bottom:3px}
.ac.crit .rec{background:var(--kit-surface-fbeff4)}.ac.risk .rec{background:var(--kit-surface-f6f2ff)}
.acts{display:flex;gap:10px;margin-top:14px}.acts .btn{height:38px}
.afoot{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-top:12px;padding-top:10px;border-top:1px solid rgba(16,24,40,.06)}
.afoot details.ds{flex:1;min-width:0}.afoot details.ds>summary{font-size:12.5px;color:var(--kit-text-6e7180);white-space:nowrap}.afoot .dsb{font-size:12.5px;background:rgba(255,255,255,.75)}
.nu{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 9px;border-radius:7px;font-size:12.5px;font-weight:500;color:var(--kit-text-6e7180);flex-shrink:0}.nu:hover{background:rgba(16,24,40,.05);color:var(--ink)}
.mw{display:flex;align-items:center;gap:10px;margin:-4px 0 16px;padding:10px 14px;border:1px solid var(--kit-line-f6ebd3);border-radius:var(--radius-xl);background:var(--kit-surface-fffcf6);font-size:13.5px;color:var(--kit-text-5e5244)}
.mw b{color:var(--kit-text-2a2d37)}.mw button{margin-left:auto;height:30px;padding:0 13px;border-radius:var(--radius-md);border:1px solid var(--kit-line-eadfc9);background:var(--kit-surface-ffffff);font-size:13px;font-weight:600;color:var(--kit-text-2a2d37);flex-shrink:0}
#tw2{margin-top:-4px}
.r2{display:grid;grid-template-columns:minmax(0,1.65fr) minmax(0,1fr);gap:16px;margin-bottom:16px}
.r2e{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;margin-bottom:16px;align-items:start}
.r3{display:grid;grid-template-columns:minmax(0,1.12fr) minmax(0,1fr) minmax(0,1.08fr);gap:16px;margin-bottom:16px}
.ch{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px 12px}.chl{display:flex;align-items:center;gap:9px}.ch h2{font-size:17.5px;font-weight:700;letter-spacing:-.02em;color:var(--ink)}.note{font-size:13.5px;color:var(--kit-text-5e6170)}
.tth{display:grid;grid-template-columns:var(--cols);gap:6px;white-space:nowrap;padding:0 18px 9px;font-size:12px;font-weight:500;color:var(--kit-text-83848f);border-bottom:1px solid var(--line2)}
.ttr{display:grid;grid-template-columns:var(--cols);gap:6px;align-items:center;min-height:45px;padding:0 18px;border-top:1px solid var(--line2);font-size:12.5px}.ttr .pl{height:22px;font-size:11.5px;padding:0 8px 0 7px}.tth+.ttr{border-top:0}
.ttr .nm{font-weight:500;color:var(--kit-text-292929)}.ow{font-size:12px;color:var(--kit-text-7d7b87);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wcl{padding:0 18px 8px}.wci{display:grid;grid-template-columns:78px 36px minmax(0,1fr);align-items:center;min-height:50px;border-top:1px solid var(--line2)}.wci:first-child{border-top:0}
.wci .tm{font-size:11.5px;color:var(--kit-text-868688);align-self:stretch;display:flex;align-items:center;border-right:1px solid var(--kit-line-eef0f3)}.wcm{display:flex;justify-content:center}.wct{font-size:13.5px;font-weight:500;color:var(--kit-text-24232a);line-height:1.35;padding-left:6px}
.tmi{cursor:pointer;padding:6px 0}.tmi .wct b{font-weight:600}.tms{display:block;font-size:12.5px;font-weight:400;color:var(--kit-text-6e7180);margin-top:2px}
.agr{display:flex;align-items:center;gap:12px;padding:12px 18px;border-top:1px solid var(--line2)}.agm{flex:1;min-width:0}.agn{display:flex;align-items:center;gap:8px}.agn b{font-size:14px;font-weight:700;color:var(--t1)}.agn .pl{margin-left:auto}.agd{font-size:12.5px;color:var(--kit-text-6e7180);margin-top:3px}
.agf{font-size:12.5px;color:var(--kit-text-6e7180);padding:11px 18px 13px;border-top:1px solid var(--line2)}
.pr{display:grid;grid-template-columns:18px minmax(0,1fr) auto 34px 14px;gap:10px;align-items:center;min-height:44px;padding:0 18px;border-top:1px solid var(--line2);font-size:14px;font-weight:500;cursor:pointer}.pr:hover{background:var(--kit-surface-fbfbfc)}
.mbs{display:inline-flex;align-items:flex-end;gap:2px;height:16px}.mbs i{display:block;width:4px;border-radius:1px}
.ach{padding:16px 18px 16px}.ach h2{font-size:15.5px;font-weight:700;color:var(--ink)}.acb{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-top:12px}
.acn{display:flex;align-items:center;gap:10px}.acn b{font-size:36px;font-weight:800;letter-spacing:-.045em;line-height:1;color:var(--ink)}.acn em{display:block;font-style:normal;font-size:11.5px;color:var(--kit-text-8a8d9a);margin-top:3px}
.up{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:600;color:var(--kit-text-1e9e62);background:var(--kit-surface-e9f8f0);border-radius:var(--radius-sm);padding:2px 7px}
.acs{font-size:12.5px;color:var(--kit-text-5e6170);margin-top:14px;padding-top:12px;border-top:1px solid var(--line2)}.abars{display:inline-flex;align-items:flex-end;gap:3px;height:46px}.abars i{display:block;width:7px;border-radius:2px 2px 1px 1px}
.askc{background:var(--kit-surface-f8f9fd);border-color:var(--kit-line-eceef5);padding:18px 20px 18px}.ah{display:flex;align-items:center;gap:14px}.ah h2{font-size:19px;font-weight:800;letter-spacing:-.025em;color:var(--ink)}.ah p{font-size:13px;color:var(--kit-text-6e7180);margin-top:2px}.ah .tx{margin-left:auto;display:flex;align-items:center;gap:10px;font-size:13px;color:var(--kit-text-6e7180)}
.ain{display:flex;align-items:center;gap:10px;height:46px;margin-top:14px;padding:0 7px 0 16px;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e6e8ec);border-radius:var(--radius-xl);box-shadow:0 1px 2px rgba(16,24,40,.04)}.ain input{flex:1;font-size:14.5px}.ain input::placeholder{color:var(--kit-text-9a9daa)}
.snd{width:34px;height:34px;border-radius:9px;background:var(--kit-surface-eef0f4);display:flex;align-items:center;justify-content:center}
.achips{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px}.achip{height:34px;padding:0 14px;border-radius:var(--radius-full);border:1px solid var(--kit-line-e6e8ec);background:var(--kit-surface-ffffff);font-size:13px;font-weight:500;color:var(--kit-text-3f424c);display:inline-flex;align-items:center;gap:8px}.achip:hover{border-color:var(--kit-line-cdd0d8)}
/* money cards on Today */
.mny{padding:0 18px 12px}.mny b{display:block;font-size:28px;font-weight:800;letter-spacing:-.03em;color:var(--ink);line-height:1.15}.mny b small{font-size:13px;font-weight:500;color:var(--kit-text-8a8d9a);margin-left:6px;letter-spacing:0}.mny span{display:block;font-size:13px;color:var(--kit-text-6e7180);margin-top:4px}
.mr2{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:11px 18px;border-top:1px solid var(--line2);font-size:13px}.mr2 b{display:block;font-size:13.5px;font-weight:600;color:var(--t1)}.mr2 span{display:block;color:var(--kit-text-7a7d88);margin-top:2px;line-height:1.45}.mr2 em{font-style:normal;font-weight:700;color:var(--ink);white-space:nowrap;font-size:13.5px}
.cf{padding:11px 18px 13px;border-top:1px solid var(--line2)}
.pcg{display:grid;grid-template-columns:1fr 1fr}.pc{padding:12px 18px 14px;border-top:1px solid var(--line2)}.pc:nth-child(odd){border-right:1px solid var(--line2)}
.pct b{display:block;font-size:13.5px;font-weight:600;color:var(--t1)}.pct span{display:block;font-size:12px;color:var(--kit-text-8a8d9a)}.pcv{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:6px}.pcv em{font-style:normal;font-size:24px;font-weight:800;letter-spacing:-.03em;color:var(--ink)}
.dl{display:inline-flex;align-items:center;gap:5px;margin-top:6px;height:22px;padding:0 8px;border-radius:var(--radius-sm);font-size:11.5px;font-weight:600}.dl.bad{background:var(--kit-surface-fff3e8);color:var(--kit-text-c2410c)}.dl.ok{background:var(--kit-surface-e9f8f0);color:var(--kit-text-1e9e62)}.dl0{display:inline-block;margin-top:9px;font-size:11.5px;color:var(--kit-text-8a8d9a)}
/* ---------- Waiting on you ---------- */
.foot{font-size:12.5px;color:var(--kit-text-8a8d9a);margin-top:14px}
.dsl{padding:0 18px 8px}.dsr{padding:11px 0;border-top:1px solid var(--line2)}.dsr:first-child{border-top:0}.dsr summary{font-size:13.5px!important;color:var(--kit-text-2a2d37)!important}
/* ---------- Ask ---------- */
.hero{background:var(--kit-surface-f6f7fe);border:1px solid var(--kit-line-ebedf8);border-radius:var(--radius-kit-feature);padding:34px 32px 34px;text-align:center;display:flex;flex-direction:column;align-items:center;margin-bottom:16px}
.hero h2{font-size:19px;font-weight:700;letter-spacing:-.02em;color:var(--ink);margin-top:12px}.hero p{font-size:13.5px;color:var(--kit-text-6e7182);margin-top:6px}
.hin{display:flex;align-items:center;gap:10px;width:100%;max-width:620px;height:48px;margin-top:22px;padding:0 7px 0 16px;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e4e6ea);border-radius:var(--radius-xl);box-shadow:0 1px 3px rgba(16,24,40,.06)}.hin input{flex:1;font-size:14px}.hin input::placeholder{color:var(--kit-text-8a8da0)}
.hgo{width:34px;height:34px;border-radius:9px;background:linear-gradient(180deg,var(--kit-surface-5a55fa),var(--kit-surface-4743f2));display:flex;align-items:center;justify-content:center;box-shadow:0 1px 2px rgba(71,67,242,.35);cursor:pointer}
.qrow{display:flex;gap:10px;justify-content:center;margin-top:12px;flex-wrap:wrap}.qrow:first-of-type{margin-top:16px}
.qchip{height:36px;padding:0 14px;border-radius:var(--radius-full);border:1px solid var(--kit-line-e6e8ec);background:var(--kit-surface-ffffff);font-size:13.5px;color:var(--kit-text-4b4e66);display:inline-flex;align-items:center;gap:9px;box-shadow:0 1px 2px rgba(16,24,40,.03)}.qchip:hover{border-color:var(--kit-line-cdd0d8)}
.pq{padding:18px 18px 18px}.pq h2{font-size:17px;font-weight:700;color:var(--ink)}.pqg{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:14px}
.pqg button{display:flex;align-items:center;gap:10px;height:40px;padding:0 14px;border:1px solid var(--kit-line-eef0f3);border-radius:var(--radius-lg);background:var(--kit-surface-ffffff);font-size:13.5px;color:var(--kit-text-3b3e55);text-align:left}.pqg button:hover{background:var(--kit-surface-fafafc);border-color:var(--kit-line-e2e4ea)}
.ans{margin-bottom:16px;padding:18px 20px 16px;border-color:var(--kit-line-e3e4fd);box-shadow:0 0 0 4px var(--kit-line-f5f5ff)}.anh{display:flex;align-items:center;gap:10px}.anh h2{font-size:16.5px;font-weight:700;color:var(--ink);letter-spacing:-.015em}.anh .tg{margin-left:auto}
.anl{margin:12px 0 0 20px;display:flex;flex-direction:column;gap:9px}.anl li{font-size:14px;line-height:1.55;color:var(--kit-text-2a2d37);padding-left:4px}.anl li span{margin-right:4px}
.anf{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:14px;padding-top:14px;border-top:1px solid var(--line2)}
.qg{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-top:1px solid var(--line2)}.qcol{padding:14px 18px 16px}.qcol+.qcol{border-left:1px solid var(--line2)}
.qh{font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--kit-text-8a8d9a);margin-bottom:6px}.qi{padding:10px 0;border-top:1px solid var(--line2)}.qh+.qi{border-top:0}
.qi b{display:block;font-size:13.5px;font-weight:600;color:var(--t1);line-height:1.4}.qi .mono{display:block;margin:5px 0 9px}
.srow2 .tg{justify-self:start}.srow2{display:grid;grid-template-columns:130px minmax(0,1fr) auto;gap:14px;align-items:center;padding:12px 18px;border-top:1px solid var(--line2);font-size:13.5px;color:var(--kit-text-2a2d37)}.sh+.srow2{border-top:0}
.srn{display:flex;align-items:flex-start;gap:9px;padding:12px 18px 14px;border-top:1px solid var(--line2);font-size:12.5px;color:var(--kit-text-8a5a1e);background:var(--kit-surface-fffcf6);line-height:1.5}
/* ---------- Meetings (v8 + prep, day and week views) ---------- */
.mtb{display:flex;align-items:center;gap:10px;margin:-6px 0 16px}.mtb .btn{height:34px}.mtb .btn.ib{width:34px}.btn.tdy{background:var(--kit-surface-f1f0fe);border-color:var(--kit-line-e9e8fd);color:var(--kit-text-6e66f8);font-weight:600;box-shadow:none}
.mtr{margin-left:auto;display:flex;align-items:center;gap:10px}.seg3{display:flex;gap:6px}.seg3 button{height:34px;padding:0 16px;border-radius:9px;border:1px solid var(--kit-line-e4e6ea);background:var(--kit-surface-ffffff);font-size:13.5px;font-weight:500;color:var(--kit-text-585a69)}.seg3 button.on{background:var(--kit-surface-1a1d2b);border-color:var(--kit-line-1a1d2b);color:var(--kit-text-ffffff)}
.mgrid{display:grid;grid-template-columns:minmax(0,1fr) 232px;gap:22px;align-items:start}.mcol>*+*{margin-top:14px}
.band.mb{height:32px;font-size:14px;color:var(--kit-text-0c0b1d)}.mr{min-height:66px;cursor:pointer}.mr.sel{background:var(--kit-surface-f7f7ff)}.mr.sel:hover{background:var(--kit-surface-f4f4ff)}.mt2{font-size:12.5px;color:var(--kit-text-a8abb6)}.mn{font-size:13.5px;font-weight:600;color:var(--kit-text-1a1c29)}.ms{font-size:12.5px;color:var(--kit-text-8b8f9e);margin-top:3px}
.mr .pl{height:26px;padding:0 10px;gap:6px;font-weight:600}
.mhid{font-size:12.5px;color:var(--kit-text-8b8f9e);padding:11px 16px;border-top:1px solid var(--line2);background:var(--kit-surface-fcfcfd)}
.rp{padding:16px 16px 14px}.rp h2{font-size:16px;font-weight:700;color:var(--ink);letter-spacing:-.015em}.rps{font-size:14px;font-weight:500;color:var(--kit-text-1a1c29);margin:8px 0 6px}
.ii{display:flex;align-items:center;gap:11px;padding:7px 0}.ii b{display:block;font-size:12.5px;font-weight:600;color:var(--kit-text-1a1c29)}.ii div span{display:block;font-size:11.5px;color:var(--kit-text-8b8f9e)}
.ci{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.ci.sq{border-radius:7px}
.pi{display:flex;align-items:center;gap:10px;padding:7px 0;font-size:12.5px;color:var(--kit-text-3a3d48)}.rp h2+.pi{margin-top:8px}
.si{display:flex;align-items:center;gap:9px;width:100%;min-height:34px;padding:7px 11px;border:1px solid var(--kit-line-e9ebef);border-radius:9px;background:var(--kit-surface-ffffff);font-size:12.5px;color:var(--kit-text-272450);margin-top:8px;text-align:left}.si:hover{background:var(--kit-surface-fafafc)}
.md{padding:14px 15px 14px}.mdh{display:flex;align-items:center;justify-content:space-between;gap:8px}.md h3{font-size:15px;font-weight:700;color:var(--ink);margin-top:10px;letter-spacing:-.01em;line-height:1.3}
.mdv{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--kit-text-5e6170);margin-top:5px}.mdb{display:flex;gap:7px;margin-top:11px}.mdb .btn{height:32px;padding:0 11px;font-size:12.5px}
.md .ey{margin:15px 0 7px;font-size:10.5px}.wh{display:flex;align-items:flex-start;gap:9px;padding:5px 0}.wh b{display:block;font-size:12.5px;font-weight:600;color:var(--t1)}.wh .e2{display:block;font-size:11.5px;color:var(--kit-text-8a8d9a);word-break:break-all}.wh .tg{margin-top:4px;height:20px;font-size:11px}
.fnd{margin:0 0 0 15px;display:flex;flex-direction:column;gap:6px}.fnd li{font-size:12.5px;color:var(--kit-text-3a3d48);line-height:1.5}.fnd .srcc{height:19px;font-size:10.5px}.fnd0{font-size:12px;color:var(--kit-text-8a8d9a);line-height:1.5}
.lt{font-size:12.5px;color:var(--kit-text-3a3d48);line-height:1.5;margin-bottom:10px}.e3{display:block;font-size:11px;color:var(--kit-text-a3a6b2);margin-top:1px;line-height:1.35}.msrc{font-size:11.5px;color:var(--kit-text-a3a6b2);margin-top:10px}
.bc{margin-left:auto;font-size:12.5px;font-weight:500;color:var(--kit-text-8a8d9a)}.ev.sel{box-shadow:0 0 0 2px var(--kit-line-ffffff),0 0 0 4px var(--kit-line-a5a8f8)}
.wkn2{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid var(--line2)}.wkn2 b{display:block;font-size:15px;font-weight:700;color:var(--ink)}.wkn2 .t4{font-size:12.5px}.md details.ds>summary{font-size:12px}
.mv .vw{display:none}.mv.v-week .mgrid{display:none}.mv.v-week .vw{display:block}.mv .vd{display:none}.mv.v-day .vd{display:block}.mv.v-day .vl{display:none}
.wk{--n:5}.wkh{display:grid;grid-template-columns:52px repeat(var(--n),minmax(0,1fr));border-bottom:1px solid var(--line2);background:var(--band)}
.wkh span{display:flex;flex-direction:column;align-items:center;padding:8px 0 7px;border-left:1px solid var(--line2)}.wkh span:first-child{border-left:0}.wkh em{font-style:normal;font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--kit-text-8a8d9a)}.wkh b{font-size:16px;font-weight:700;color:var(--ink)}
.wkh span.on b{background:var(--kit-surface-4a4cf7);color:var(--kit-text-ffffff);border-radius:50%;width:28px;height:28px;display:flex;align-items:center;justify-content:center;font-size:14px;margin-top:2px}
.wkb{position:relative;display:grid;grid-template-columns:52px repeat(var(--n),minmax(0,1fr));padding:10px 0 12px}.wkl{position:absolute;left:52px;right:0;top:10px}.wkl i{position:absolute;left:0;right:0;height:1px;background:var(--kit-surface-f1f2f4)}
.wka{position:relative}.wka span{position:absolute;right:9px;transform:translateY(-50%);font-size:10.5px;color:var(--kit-text-9a9daa);white-space:nowrap}
.wkc{position:relative;border-left:1px solid var(--line2)}.wkc.on{background:var(--kit-surface-fbfbff)}
.ev{position:absolute;left:3px;right:3px;border-radius:7px;padding:4px 7px;border-left:3px solid;overflow:hidden;cursor:pointer;font-size:11.5px;line-height:1.3}.ev b{display:block;font-weight:600;color:var(--kit-text-1a1c29);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:8px}.ev span{display:block;color:var(--kit-text-6e7180);font-size:10.5px}
.ev.crit{background:var(--kit-surface-fff1f3);border-color:var(--kit-line-e5243b)}.ev.risk{background:var(--kit-surface-fff6ec);border-color:var(--kit-line-f07a12)}.ev.reg{background:var(--kit-surface-eef4ff);border-color:var(--kit-line-2b7cf6)}
.evo{position:absolute;right:5px;top:6px;width:7px;height:7px;border-radius:50%;background:var(--kit-surface-6e66f8);display:inline-block}
.wkf{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:11px 16px;border-top:1px solid var(--line2);font-size:12.5px;color:var(--kit-text-5e6170)}.wkf span{display:inline-flex;align-items:center;gap:6px;position:relative}.wkf .evo{position:static}
.lg1{width:10px;height:10px;border-radius:3px;display:inline-block;border-left:3px solid}.lg1.crit{background:var(--kit-surface-fff1f3);border-color:var(--kit-line-e5243b)}.lg1.risk{background:var(--kit-surface-fff6ec);border-color:var(--kit-line-f07a12)}.lg1.reg{background:var(--kit-surface-eef4ff);border-color:var(--kit-line-2b7cf6)}
.vd .wkb{grid-template-columns:52px minmax(0,1fr)}.vd .wkh{grid-template-columns:52px minmax(0,1fr)}.vd .ev b{font-size:12.5px}.vd .ev span{font-size:11.5px}
/* ---------- Find a time ---------- */
.wbox{display:flex;align-items:flex-start;gap:14px;padding:16px 18px;border-color:var(--kit-line-f6e3c2);background:var(--kit-surface-fffbf4)}.wbox b{display:block;font-size:14.5px;font-weight:700;color:var(--ink)}.wbox p{font-size:13px;color:var(--kit-text-5e5244);line-height:1.5;margin-top:4px}.wbox .btn{flex-shrink:0;margin-left:auto}
.vopt{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.vopt button{display:flex;align-items:center;justify-content:center;gap:8px;height:42px;border:1px solid var(--kit-line-e4e6ea);border-radius:var(--radius-lg);background:var(--kit-surface-ffffff);font-size:13px;font-weight:500;color:var(--kit-text-2a2d37);white-space:nowrap}
.vopt button.on{border-color:var(--kit-line-a5a8f8);background:var(--kit-surface-f7f7ff);box-shadow:0 0 0 3px var(--kit-line-eeeefe);font-weight:600}.vopt button.dis{opacity:.55}
.dbox{width:42px;height:44px;border-radius:var(--radius-lg);background:var(--kit-surface-f4f5f7);display:flex;flex-direction:column;align-items:center;justify-content:center;flex-shrink:0}.dbox b{font-size:15px;font-weight:800;line-height:1;color:var(--ink)}.dbox em{font-style:normal;font-size:10.5px;color:var(--kit-text-8a8d9a);margin-top:2px}
.own{padding:12px 18px;border-top:1px solid var(--line2);display:flex;flex-direction:column;gap:3px;font-size:12.5px;color:var(--kit-text-5e6170)}.own b{font-size:13.5px;color:var(--t1);font-weight:600}.own .btn{margin-top:7px;align-self:flex-start}.own .mono{font-size:11.5px;word-break:break-all}

/* ---------- Teams: each team ---------- */
.tmr{min-height:74px;cursor:pointer}.tn{font-size:15.5px;font-weight:700;color:var(--kit-text-0b0b25)}.tmr .c2,.tmr .num{font-size:15px}
.tdh2{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:4px 0 15px}.tdh2 h2{font-size:20px;font-weight:800;letter-spacing:-.02em;color:var(--ink)}.tdh2 .who span{display:block;font-size:12.5px;color:var(--kit-text-7a7d88);margin-top:1px}
.wk2{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;border-top:1px solid var(--line2)}.sh+.wk2{border-top:0}.wk2 .pl{margin-top:4px}
.wkn{display:flex;align-items:baseline;gap:8px}.wkn b{font-size:14px;font-weight:700;color:var(--t1)}.wkn span{font-size:12px;color:var(--kit-text-8a8d9a)}
.wki{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:5px;font-size:12.5px;color:var(--kit-text-7a7d88)}.wki b{font-weight:600;color:var(--kit-text-2a2d37)}.wki .mono{font-size:11.5px}
.pst{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:13px 18px;border-top:1px solid var(--line2)}
.rel{display:flex;gap:22px;flex-wrap:wrap;padding:0 18px 16px}
/* ---------- Customers ---------- */
#p-customers .tr{min-height:58px;gap:8px}#p-customers .th{gap:8px}#p-customers .tr .pl{height:27px;font-size:13px;padding:0 11px 0 10px}
.cn1{display:flex;align-items:center;gap:7px;min-width:0}.cnm .lk{flex-shrink:0;font-style:normal;font-size:11px;font-weight:600;color:var(--kit-text-2370e0);background:var(--kit-surface-eaf3fe);border-radius:5px;padding:1px 6px}
.cnm{display:flex;flex-direction:column;min-width:0}.cnm>span{font-size:11.5px;color:var(--kit-text-8a8d9a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}.cnm em{font-style:normal;color:var(--kit-text-2370e0);font-weight:500}
.cap{font-size:12.5px;color:var(--kit-text-8a8d9a);margin-top:12px}
/* ---------- Work graph ---------- */
.gch{display:flex;gap:10px;margin-bottom:12px;flex-wrap:wrap}.gc{height:38px;padding:0 16px;border-radius:var(--radius-xl);background:var(--kit-surface-f8f9fb);border:1px solid var(--kit-line-eef0f3);font-size:13.5px;font-weight:500;color:var(--kit-text-3f424c);display:inline-flex;align-items:center;gap:9px}
.gc i{width:9px;height:9px;border-radius:50%;display:block}.gc.on{background:var(--kit-surface-f1f2fe);border-color:var(--kit-line-e3e4fd);color:var(--kit-text-5e5efa);font-weight:600}
.gwrap{position:relative;height:476px;border-radius:var(--radius-kit-card);background-color:var(--kit-surface-ffffff);background-image:radial-gradient(var(--kit-surface-e3e5ea) 1.1px,transparent 1.2px);background-size:22px 22px;overflow:hidden}
.gwrap svg.edges{position:absolute;inset:0;width:100%;height:100%}
.gn{position:absolute;transform:translate(-50%,-50%);display:inline-flex;align-items:center;gap:10px;height:46px;padding:0 22px 0 10px;border-radius:var(--radius-full);border:1.5px solid;box-shadow:0 4px 14px rgba(16,24,40,.07);white-space:nowrap;cursor:pointer;transition:box-shadow .15s}
.gn:hover{box-shadow:0 6px 18px rgba(16,24,40,.12)}.gn.sel{box-shadow:0 0 0 3px var(--kit-line-ffffff),0 0 0 5px var(--kit-line-a5a8f8),0 6px 18px rgba(16,24,40,.1)}
.gn b{font-size:14.5px;font-weight:700;color:var(--kit-text-1a1c29);letter-spacing:-.01em}.gav{position:absolute;top:-31px;right:-14px}.gav.r{top:50%;right:-40px;transform:translateY(-50%)}.gav .av{box-shadow:0 0 0 2px var(--kit-line-ffffff),0 2px 6px rgba(16,24,40,.15)}
.gz{position:absolute;right:14px;bottom:14px;display:flex;flex-direction:column;align-items:center;gap:10px}.gsl{width:5px;height:64px;border-radius:3px;background:var(--kit-surface-e6e8ec);position:relative}.gsl i{position:absolute;left:-1px;right:-1px;top:6px;height:22px;border-radius:3px;background:var(--kit-surface-b9bdc9)}
.gzb{display:flex;flex-direction:column;background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-e6e8ec);border-radius:var(--radius-lg);box-shadow:0 1px 3px rgba(16,24,40,.06);overflow:hidden}.gzb button{width:34px;height:32px;display:flex;align-items:center;justify-content:center}.gzb button+button{border-top:1px solid var(--kit-line-eef0f3)}
.grc{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px;font-size:12.5px;color:var(--kit-text-8a8d9a)}.grc>span{margin-right:2px}
.gc2{height:28px;padding:0 11px;border-radius:var(--radius-md);border:1px solid var(--kit-line-eceef1);background:var(--kit-surface-ffffff);font-size:12.5px;font-weight:500;color:var(--kit-text-3f424c)}.gc2:hover{border-color:var(--kit-line-d5d8df)}
.gcols{display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.4fr) minmax(0,1fr);gap:14px}
.ey2{font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--kit-text-8a8d9a);margin-bottom:8px}
.gi{display:flex;align-items:flex-start;gap:9px;padding:8px 10px;border:1px solid var(--kit-line-eef0f3);border-radius:var(--radius-lg);margin-bottom:7px;font-size:12.5px;color:var(--kit-text-2a2d37);background:var(--kit-surface-ffffff)}
.gi>div{min-width:0;display:flex;flex-direction:column;gap:5px}.gi .pl{height:21px;font-size:11px;align-self:flex-start}.gi em{font-style:normal;font-size:11.5px;color:var(--kit-text-8a8d9a)}
.gi.sel{border-color:var(--kit-line-1a1c29);box-shadow:0 0 0 1px var(--kit-line-1a1c29)}.gi span{line-height:1.35}
.wl{padding:7px 0;border-top:1px solid var(--line2)}.wl:first-child{border-top:0;padding-top:0}

/* ---------- Agents ---------- */
.agl{min-height:88px}.agn2{font-size:14.5px;font-weight:700;color:var(--kit-text-050412)}.agd2{font-size:13px;color:var(--kit-text-8b8f9e);margin-top:4px}
.agl .pl{height:26px;font-size:12.5px;padding:0 11px 0 10px}.agl .pl i{width:7px;height:7px}
.kb{width:30px;height:30px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center}.kb:hover{background:var(--kit-surface-f3f4f6)}
.tc{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:18px;padding:0 5px;border-radius:5px;background:rgba(16,24,40,.07);font-size:11.5px;font-weight:600}
.tab.on .tc{background:var(--kit-surface-e1e0fd)}
.btn.gh{border-color:transparent;box-shadow:none;color:var(--kit-text-6e7180);background:transparent}.btn.gh:hover{background:var(--kit-surface-f4f5f7);color:var(--ink)}
.fl2 .ra .btn{height:32px}
.ideas{display:flex;flex-direction:column;gap:8px}.ideas button{text-align:left;padding:9px 12px;border:1px solid var(--kit-line-e9ebef);border-radius:var(--radius-lg);background:var(--kit-surface-ffffff);font-size:13px;color:var(--kit-text-2a2d37);line-height:1.45}.ideas button:hover{border-color:var(--kit-line-cfcdfb);background:var(--kit-surface-f8f8ff)}
.stp{list-style:none;counter-reset:s;padding:0 18px 6px}.stp li{counter-increment:s;display:grid;grid-template-columns:26px 150px minmax(0,1fr);gap:10px;align-items:center;padding:10px 0;border-top:1px solid var(--line2);font-size:13.5px}.stp li:first-child{border-top:0}
.stp li::before{content:counter(s);width:24px;height:24px;border-radius:50%;background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc);font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center}.stp b{font-weight:600;color:var(--t1)}.stp span{color:var(--kit-text-3a3d48)}
.arh{display:grid;grid-template-columns:minmax(0,1fr) 120px 84px;gap:12px;padding:9px 18px;background:var(--band);font-size:12px;font-weight:500;color:var(--kit-text-6e7182);border-top:1px solid var(--line2);border-bottom:1px solid var(--line2)}
.arr{display:grid;grid-template-columns:18px minmax(0,1fr) 120px 84px;gap:12px;align-items:center;padding:7px 18px;border-top:1px solid var(--line2);font-size:13.5px}.arh+.arr{border-top:0}
.arh span:first-child{padding-left:0}.arn{color:var(--kit-text-2a2d37)}.inp.sm2{height:32px;font-size:12.5px;padding-left:10px}.arr .cb2{font-size:12.5px;color:var(--kit-text-6e7180)}
.arh{grid-template-columns:minmax(0,1fr) 120px 84px}.arh span:first-child{margin-left:0}
/* ---------- Track record ---------- */
.chh{display:flex;align-items:center;justify-content:space-between;padding:18px 20px 4px}.chh h2{font-size:15.5px;font-weight:700;color:var(--ink)}
.lgd{display:flex;gap:18px;font-size:13px;color:var(--kit-text-3a3d48)}.lgd span{display:flex;align-items:center;gap:7px}.lgd i{width:11px;height:11px;border-radius:3px;display:block}
.kp{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-top:1px solid var(--line2)}.kp div{padding:13px 16px 15px;border-left:1px solid var(--line2)}.kp div:first-child{border-left:0}
.kp span{display:block;font-size:12px;color:var(--kit-text-5e6170)}.kp b{display:block;font-size:21px;font-weight:800;letter-spacing:-.02em;color:var(--ink);margin-top:6px}.kp em{display:block;font-style:normal;font-size:11.5px;color:var(--kit-text-8a8d9a);margin-top:3px;line-height:1.4}
.pre{display:flex;align-items:flex-start;gap:12px;padding:12px 18px;border-top:1px solid var(--line2)}.pre .pd2{width:46px;flex-shrink:0;font-size:12.5px;color:var(--kit-text-8a8d9a);padding-top:2px}.pre .pm{padding-top:1px}.pre .rm{flex:1;min-width:0}.pre .rt{font-size:13.5px;font-weight:600;color:var(--t1)}
#plist .pre:first-child{border-top:0}.every-tabs{padding:0 18px}
.bn{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;margin:14px 0 10px}.bn div{padding:10px 12px;border:1px solid var(--line);border-radius:var(--radius-lg)}.bn b{display:block;font-size:19px;font-weight:800;color:var(--ink)}.bn span{display:block;font-size:11.5px;color:var(--kit-text-6e7180);margin-top:2px;line-height:1.35}
.pdc{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:18px 20px}.pdc .l{font-size:13.5px;font-weight:600;color:var(--kit-text-2a2d37)}.pdc .n{font-size:28px;font-weight:800;letter-spacing:-.03em;color:var(--kit-text-12a05c);margin-top:4px}.pdc .s{font-size:12.5px;color:var(--kit-text-6e7180);margin-top:4px;line-height:1.5;max-width:440px}.pdc .btn{flex-shrink:0}
/* ---------- Soil paid for itself ---------- */
.srcs{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}.srcs .srcc{margin:0}.dd2{padding:6px 0;border-top:1px solid var(--line2)}.dd2:first-child{border-top:0;padding-top:0}.dd2 b{font-weight:800}
/* ---------- Updates ---------- */
.upr{display:grid;grid-template-columns:60px 46px minmax(0,1fr);align-items:center;min-height:50px;border-top:1px solid var(--line2);cursor:pointer}.band+.upr{border-top:0}.upr:hover{background:var(--kit-surface-fbfbfc)}
.ut{align-self:stretch;display:flex;align-items:center;padding-left:14px;font-size:13.5px;color:var(--kit-text-9ea2b0);border-right:1px solid var(--kit-line-eeeff1)}.um{display:flex;justify-content:center}
.ux{font-size:14px;font-weight:500;color:var(--kit-text-1f2133);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.us{font-size:13px;color:var(--kit-text-9594a1);margin-top:2px}
.drf{padding:20px 22px 20px;font-size:14px;line-height:1.6;color:var(--kit-text-2a2d37)}.drf h4{font-size:14px;font-weight:700;color:var(--ink);margin:16px 0 6px}.drf ul{margin-left:18px}.drf li{margin:3px 0}
.yel{background:var(--kit-surface-fef3c7);color:var(--kit-text-92400e);border-radius:5px;padding:1px 6px;font-weight:600}.big2{font-size:22px;font-weight:800;padding:2px 8px}
.st2{padding:15px 16px 14px}.st2 .l{font-size:13px;font-weight:600;color:var(--kit-text-2a2d37)}.st2 .n{font-size:24px;font-weight:800;letter-spacing:-.03em;color:var(--ink);margin-top:6px;line-height:1.15}.st2 .s{font-size:12px;color:var(--kit-text-6e7180);margin-top:5px;line-height:1.4}

/* ---------- Connections ---------- */
.cnr{min-height:58px}.cnn{font-size:15px;font-weight:700;color:var(--kit-text-1f2730)}.cnr .pl{height:24px;font-size:12.5px;padding:0 10px}.ls{font-size:13px;color:var(--kit-text-8e90a0);white-space:nowrap}
.btn.cn{height:30px;padding:0 12px;border-radius:9px;background:var(--kit-surface-f0f0fe);border-color:var(--kit-line-e6e5fd);color:var(--kit-text-5b57f8);font-weight:600;font-size:13px;box-shadow:none;flex-direction:row-reverse}.cnr>span:last-child{display:flex}
.cnm2{display:flex;flex-direction:column;min-width:0}.cnm2>span{font-size:12px;color:var(--kit-text-8a8d9a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chb{width:24px;height:24px;border-radius:7px;display:flex;align-items:center;justify-content:center}.chb:hover{background:var(--kit-surface-f3f4f6)}
.tdet{padding:0 22px 14px 68px;font-size:13px;color:var(--kit-text-4e5160);line-height:1.5;background:var(--kit-surface-fcfcfd)}.tdet p{padding-top:2px}.tda{display:flex;gap:8px;margin-top:9px}
.nyr{display:flex;align-items:flex-start;gap:14px;padding:14px 18px;border-top:1px solid var(--kit-line-f6ebd3);background:var(--kit-surface-fffcf6)}.sh+.nyr{border-top:0}.nyr .rm{flex:1;min-width:0}.nyr .rt{font-size:14px;font-weight:700;color:var(--t1)}.nyr .rsb{font-size:12.5px;color:var(--kit-text-7a6a55);margin-top:2px;line-height:1.45}.nyr .ra{display:flex;align-items:center;gap:8px;flex-shrink:0}
.wcr{display:grid;grid-template-columns:110px minmax(0,1fr);gap:10px;align-items:start;padding:9px 18px;font-size:13.5px;color:var(--kit-text-3a3d48)}.wcr .wk3{font-size:12.5px;color:var(--kit-text-8a8d9a);padding-top:2px}.wcr b{font-weight:700;color:var(--ink)}.wcv{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.wcn{flex-basis:100%;font-size:12.5px;color:var(--kit-text-b26a12)}
.ol2{margin-left:18px}.ol2 li{margin:2px 0}
/* ---------- Settings ---------- */
.bill{padding:22px 26px 24px}.bt{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.cp{font-size:15.5px;font-weight:600;color:var(--ink)}.pro{font-size:21px;font-weight:700;color:var(--ink);margin-top:6px;letter-spacing:-.02em}
.pd{font-size:13px;color:var(--kit-text-6e7182);margin-top:6px;max-width:360px;line-height:1.5}.pp{font-size:17px;font-weight:700;color:var(--ink);margin-top:12px}.pn{font-size:13px;color:var(--kit-text-8b8f9e);margin-top:4px}
.ug{margin-top:28px}.ug h3{font-size:17px;font-weight:700;color:var(--ink)}.ub{display:grid;grid-template-columns:160px minmax(0,1fr) 120px;gap:20px;align-items:center;height:38px;font-size:14px;color:var(--kit-text-3a3d48)}.ug h3+.ub{margin-top:8px}
.tk{height:7px;border-radius:var(--radius-full);background:var(--kit-surface-dcdee3);overflow:hidden}.tk b{display:block;height:100%;border-radius:var(--radius-full);background:var(--kit-surface-464df6)}.ub .num{text-align:right}
.plans{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.plan{display:flex;flex-direction:column;padding:16px 16px 16px;border:1px solid var(--line);border-radius:var(--radius-kit-card);background:var(--kit-surface-ffffff)}
.plan.cur{border-color:var(--kit-line-c9c7fb);box-shadow:0 0 0 3px var(--kit-line-f1f0fe)}.plan h3{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:15.5px;font-weight:700;color:var(--ink)}
.ppr{margin-top:8px;font-size:12.5px;color:var(--kit-text-8a8d9a)}.ppr b{font-size:19px;font-weight:800;color:var(--ink);letter-spacing:-.02em}.pbl{font-size:12.5px;color:var(--kit-text-5e6170);margin-top:6px;line-height:1.45}
.plan ul{list-style:none;margin:10px 0 12px;display:flex;flex-direction:column;gap:6px}.plan li{display:flex;gap:7px;font-size:12.5px;color:var(--kit-text-3a3d48);line-height:1.45}.plan li svg{margin-top:2px}.pft{margin-top:auto}
.rol{display:flex;align-items:center;gap:10px;height:40px}
.card.dz{border-color:var(--kit-line-f6d5d9)}.dzr{border:0}.dzr .rt{color:var(--kit-text-b4232f)}.btn.dg{border-color:var(--kit-line-f3c5ca);color:var(--kit-text-c0182b);background:var(--kit-surface-ffffff)}.btn.dg:hover{background:var(--kit-surface-fdf2f3)}
.cbs.c7{grid-template-columns:repeat(7,auto);justify-content:start;gap:10px 18px}
.tbl{list-style:none;margin-top:8px;display:flex;flex-direction:column;gap:8px}.tbl li{position:relative;padding-left:16px;font-size:13px;line-height:1.45}.tbl li::before{content:'';position:absolute;left:2px;top:6px;width:7px;height:7px;border-radius:50%;background:var(--kit-surface-e31a2c)}
.tbl b{display:block;font-weight:600;color:var(--t1)}.tbl span{color:var(--kit-text-6e7180)}
.emr{display:flex;align-items:flex-start;gap:16px;padding:14px 18px;border-top:1px solid var(--line2)}.sh+.emr{border-top:0}.emr .rm{flex:1;min-width:0}.emr .rt{font-size:14px;font-weight:600}.emr .rsb{font-size:12.5px;color:var(--kit-text-5e6170);margin-top:2px;line-height:1.45}
.emx{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:5px}.emr .sw{margin-top:2px}
/* ---------- Money pages ---------- */
.fg3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.inp.fil{gap:10px;padding-left:5px}.inp.fil .btn{height:30px}

/* ---------- full pages (outside the menu) ---------- */
.fp{display:none;width:1280px;background:var(--kit-surface-ffffff);position:relative}.fp.show{display:block}body.full .app{display:none}
.stbar{position:fixed;left:50%;bottom:18px;transform:translateX(-50%);z-index:80;display:none;align-items:center;gap:4px;padding:5px;background:var(--kit-surface-12141c);border-radius:var(--radius-xl);box-shadow:0 10px 30px rgba(0,0,0,.28);font-size:12.5px;max-width:calc(100vw - 24px);overflow-x:auto}
.stbar.on{display:flex}.stbar>span{color:var(--kit-text-8d91a3);padding:0 8px 0 6px;white-space:nowrap;font-weight:600}.stbar button{height:28px;padding:0 10px;border-radius:var(--radius-md);color:var(--kit-text-d5d8e1);font-weight:500;white-space:nowrap}.stbar button.on{background:var(--kit-surface-ffffff);color:var(--kit-text-12141c);font-weight:600}
.fpback{position:fixed;left:14px;bottom:18px;z-index:80;display:none;align-items:center;gap:6px;height:34px;padding:0 12px;border-radius:var(--radius-lg);background:var(--kit-surface-12141c);color:var(--kit-text-ffffff);font-size:12.5px;font-weight:600;box-shadow:0 10px 30px rgba(0,0,0,.28)}body.full .fpback{display:inline-flex}
/* auth */
.au{display:grid;grid-template-columns:600px 680px;min-height:inherit}
.aul{display:flex;flex-direction:column;padding:36px 72px 28px}.awm{font-size:28px;font-weight:800;letter-spacing:-.045em;color:var(--ink)}
.afm{width:100%;max-width:404px;margin:auto 0;padding:40px 0}.afm h1{font-size:30px;font-weight:800;letter-spacing:-.025em;line-height:1.15}
.asub{font-size:15px;color:var(--kit-text-5e6170);margin-top:8px;line-height:1.5}.asub b{color:var(--ink)}
.sso{display:flex;flex-direction:column;gap:10px;margin-top:26px}
.ssob{display:flex;align-items:center;justify-content:center;gap:10px;height:46px;border:1px solid var(--kit-line-e4e6ea);border-radius:var(--radius-kit-nav);background:var(--kit-surface-ffffff);font-size:15px;font-weight:600;color:var(--kit-text-1e2129);box-shadow:0 1px 2px rgba(16,24,40,.04)}.ssob:hover{background:var(--kit-surface-f8f9fa)}
.ssob.dis{color:var(--text-muted);cursor:not-allowed}.ssoc{font-size:12px;color:var(--kit-text-8a8d9a);text-align:center;margin-top:-3px}
.orl{display:flex;align-items:center;gap:12px;margin:20px 0 4px;font-size:12.5px;color:var(--kit-text-9a9daa)}.orl::before,.orl::after{content:'';flex:1;height:1px;background:var(--kit-surface-eceef1)}
.af{margin-top:14px}.af .fl{font-size:13px}.af .inp{height:46px;border-radius:var(--radius-kit-nav)}.af .inp input{font-size:15px}
.flr{display:flex;justify-content:space-between;align-items:baseline}.flr a{font-size:13px;color:var(--kit-text-4f46e5);font-weight:600}
.btn.wide{width:100%;justify-content:center;height:46px;font-size:15px;margin-top:18px;border-radius:var(--radius-kit-nav)}.btn[disabled]{color:var(--text-muted);cursor:not-allowed}
.alinks{display:flex;flex-direction:column;gap:9px;margin-top:18px;font-size:14px;color:var(--kit-text-5e6170)}.alinks a{color:var(--kit-text-4f46e5);font-weight:600}
.dmn{display:flex;align-items:center;gap:10px;margin-top:10px;padding:10px 12px;border-radius:var(--radius-kit-nav);background:var(--kit-surface-f2fbf6);border:1px solid var(--kit-line-d5f0e1);font-size:13px;color:var(--kit-text-0e5e36);line-height:1.4}
.dmn.neu{background:var(--kit-surface-f8f9fa);border-color:var(--kit-line-eceef1);color:var(--kit-text-3a3d48)}.dmn b{font-weight:600}.dmn a{margin-left:auto;font-weight:600;color:inherit;text-decoration:underline;white-space:nowrap}
.aerr{display:flex;gap:10px;align-items:flex-start;padding:12px 14px;border-radius:var(--radius-kit-nav);background:var(--kit-surface-fdecec);border:1px solid var(--kit-line-f7cdd1);color:var(--kit-text-9f1322);font-size:13.5px;line-height:1.45;margin-top:18px}
.afoot2{font-size:12.5px;color:var(--kit-text-8a8d9a);display:flex;gap:14px;flex-wrap:wrap}.afoot2 a{color:var(--kit-text-5e6170);text-decoration:underline}
.aic{width:52px;height:52px;border-radius:50%;display:flex;align-items:center;justify-content:center}.aic.ind{background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc)}.aic.ok{background:var(--kit-surface-eaf8f0);color:var(--kit-text-0e8f4e)}.aic.neu{background:var(--kit-surface-f2f3f5);color:var(--kit-text-5e6170)}.aic.or{background:var(--kit-surface-fef5ea);color:var(--kit-text-c25a06)}.aic.bad{background:var(--kit-surface-fdecec);color:var(--kit-text-c0182b)}
.abtns{display:flex;gap:10px;margin-top:22px}.abtns .btn{height:44px;padding:0 20px}
.aur{background:radial-gradient(900px 520px at 85% -5%,var(--kit-surface-2b2e70) 0%,rgba(43,46,112,0) 62%),linear-gradient(180deg,var(--kit-surface-14162a),var(--kit-surface-0e121a));color:var(--kit-text-ffffff);padding:72px 64px 48px;display:flex;flex-direction:column}
.ey3{font-family:"JetBrains Mono",ui-monospace,monospace;font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--kit-text-a5a8f8)}
.aur h2{font-size:32px;font-weight:800;letter-spacing:-.025em;margin-top:12px;line-height:1.18;max-width:480px}.aur p{color:var(--kit-text-b9bccb);font-size:15px;margin-top:12px;line-height:1.55;max-width:470px}
.aur .ac p{color:var(--kit-text-4e5058);max-width:none;font-size:13.5px;margin-top:6px}.aur .ac{margin-top:30px;max-width:440px;box-shadow:0 24px 60px rgba(0,0,0,.4)}.btn.ghl{background:transparent;border-color:rgba(255,255,255,.28);color:var(--kit-text-ffffff);box-shadow:none}.btn.ghl:hover{background:rgba(255,255,255,.08)}
/* onboarding */
.obp{min-height:inherit;background:var(--kit-surface-ffffff)}.obh{height:76px;display:flex;align-items:center;gap:24px;padding:0 40px;border-bottom:1px solid var(--kit-line-f1f2f4)}.obh .awm{font-size:26px;width:220px}
.steps{display:flex;align-items:center;gap:10px;margin:0 auto}.obd{width:220px;text-align:right;font-size:13.5px;color:var(--kit-text-6e7180)}.obd a{color:var(--kit-text-4f46e5);font-weight:600}
.stp2{display:inline-flex;align-items:center;gap:8px;height:34px;padding:0 14px 0 6px;border-radius:var(--radius-full);font-size:14px;font-weight:600;background:var(--kit-surface-f4f5f7);color:var(--kit-text-8a8d9a)}
.stp2 b{width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;background:var(--kit-surface-e3e5ea);color:var(--kit-text-6e7180)}
.stp2.done{background:var(--kit-surface-eaf8f0);color:var(--kit-text-0e8f4e)}.stp2.done b{background:var(--kit-surface-12b76a);color:var(--kit-text-ffffff)}.stp2.now{background:var(--kit-surface-f1f0fe);color:var(--kit-text-3c35e3);box-shadow:0 0 0 2px var(--kit-line-cfcdfb)}.stp2.now b{background:var(--kit-surface-4a4cf7);color:var(--kit-text-ffffff)}
.stl2{width:28px;height:2px;background:var(--kit-surface-e6e8ec);border-radius:2px;display:block}
.obc{max-width:780px;margin:0 auto;padding:46px 0 90px}.obc h1{font-size:30px;font-weight:800;letter-spacing:-.025em}.obc>div>h1+.asub,.obc .asub{margin-bottom:22px}
.obn{max-width:440px;margin:30px auto 0}.obf{display:flex;align-items:center;gap:16px;margin-top:22px}.obf .btn{height:44px;padding:0 20px;font-size:14.5px}
.tcg{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.tcd{position:relative;border:1px solid var(--line);border-radius:var(--radius-kit-card);padding:16px 16px 14px;background:var(--kit-surface-ffffff);display:flex;flex-direction:column;gap:12px}
.tcd.best{border-color:var(--kit-line-cfe0fb);box-shadow:0 0 0 3px var(--kit-line-eef5fe)}.tcd>.tg{position:absolute;top:-11px;left:14px}
.tch{display:flex;gap:11px;align-items:flex-start}.tch b{display:block;font-size:14.5px;font-weight:700;color:var(--t1)}.tch span{display:block;font-size:12.5px;color:var(--kit-text-7a7d88);margin-top:2px;line-height:1.4}
.tcf{margin-top:auto}.tcs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.pkh{display:flex;justify-content:space-between;align-items:center;padding:12px 18px;background:var(--band);border-bottom:1px solid var(--line2);font-size:13px;color:var(--kit-text-5e6170)}.pkh b{color:var(--ink)}.pka a{color:var(--kit-text-4f46e5);font-weight:600}
.pkr{display:flex;align-items:center;gap:14px;padding:12px 18px;border-top:1px solid var(--line2)}.pkh+.pkr{border-top:0}.pkr .rm{flex:1;min-width:0}.pkr .cb2 i{margin:0}.inp.sm3{width:170px;height:34px;font-size:13px}.inp.sm3 input{font-size:13px}
.rdg{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:15px;align-items:start}.rdr{display:flex;justify-content:space-between;align-items:center;padding:11px 18px;border-top:1px solid var(--line2)}.sh+.rdr{border-top:0}
.pl.ind{background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc)}.pl.ind i{background:var(--kit-surface-6e66f8)}.pl.live i{animation:pulse 1.2s ease-in-out infinite}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.25}}
.skl{display:flex;flex-direction:column;gap:9px;padding:6px 18px 18px}.skl i{display:block;height:11px;border-radius:var(--radius-sm);background:linear-gradient(90deg,var(--kit-surface-f1f2f4) 25%,var(--kit-surface-e7e9ec) 50%,var(--kit-surface-f1f2f4) 75%);background-size:200% 100%;animation:shim 1.4s linear infinite}@keyframes shim{to{background-position:-200% 0}}
.dotlive{width:8px;height:8px;border-radius:50%;background:var(--kit-surface-12b76a);animation:pulse 1.2s ease-in-out infinite}
.lfd{padding:0 18px 12px}.lf{display:grid;grid-template-columns:72px minmax(0,1fr);gap:10px;padding:8px 0;border-top:1px solid var(--line2);font-size:13.5px;color:var(--kit-text-2a2d37)}.lf:first-child{border-top:0}
.cnts{display:grid;grid-template-columns:repeat(3,1fr);padding:0 18px 16px;gap:10px}.cnts b{display:block;font-size:22px;font-weight:800;color:var(--ink)}.cnts span{font-size:12.5px;color:var(--kit-text-6e7180)}
.code2{display:flex;flex-direction:column;gap:6px;margin:0 auto;max-width:520px;padding:12px 14px;border-radius:var(--radius-lg);background:var(--kit-surface-0e121a);color:var(--kit-text-d5d8e1);font-family:"JetBrains Mono",ui-monospace,monospace;font-size:12.5px}
.fwr{display:flex;align-items:center;gap:14px;padding:14px 18px;border-top:1px solid var(--line2)}.fwr:first-child{border-top:0}.fwr .lab{flex-shrink:0;width:92px;justify-content:center}.fwr .rm{flex:1;min-width:0}
.btb{display:flex;align-items:center;gap:14px;margin-top:15px;padding:16px 18px;border-radius:var(--radius-kit-card);background:var(--kit-surface-f6f7fe);border:1px solid var(--kit-line-ebedf8)}.btb b{display:block;font-size:14.5px;color:var(--ink);line-height:1.4}.btb span{display:block;font-size:12.5px;color:var(--kit-text-6e7180);margin-top:3px}.btb .lnk{margin-left:auto;flex-shrink:0}
.wnote{display:flex;gap:10px;align-items:flex-start;margin-top:16px;padding:12px 14px;border-radius:var(--radius-kit-nav);background:var(--kit-surface-fffbf4);border:1px solid var(--kit-line-f6e3c2);font-size:13.5px;color:var(--kit-text-5e5244);line-height:1.45}
/* error page */
.erp{min-height:inherit;display:flex;flex-direction:column;padding:36px 48px}.erc{max-width:460px;margin:120px auto 0;text-align:center;display:flex;flex-direction:column;align-items:center}
.aic.big3{width:68px;height:68px}.emp .ei.bad{background:var(--kit-surface-fdecec);color:var(--kit-text-c0182b)}.erc h1{font-size:30px;font-weight:800;letter-spacing:-.025em;margin-top:20px}.erc p{font-size:15.5px;color:var(--kit-text-5e6170);margin:10px 0 24px;line-height:1.55}.erc .btn{height:44px;padding:0 22px;font-size:14.5px}
.erf{margin:auto auto 0;font-size:12.5px;color:var(--kit-text-a3a6b2);max-width:520px;text-align:center;padding-top:60px}
/* states page */
.pad2{padding:0 18px 16px}.ctr2{display:flex;justify-content:center;padding:0 0 20px}.rule{font-size:12.5px;color:var(--kit-text-6e7180);padding:12px 18px 14px;border-top:1px solid var(--line2);background:var(--kit-surface-fcfcfd);line-height:1.5}
.thk{display:flex;gap:12px;padding:16px 18px}.thk b{display:block;font-size:14.5px;color:var(--ink)}.thk span{display:block;font-size:12.5px;color:var(--kit-text-6e7180);margin-top:2px}.thk>div{flex:1}
.prg{height:6px;border-radius:var(--radius-full);background:var(--kit-surface-eceef5);margin-top:10px;overflow:hidden}.prg i{display:block;height:100%;border-radius:var(--radius-full);background:linear-gradient(90deg,var(--kit-surface-6366f1),var(--kit-surface-4447f2))}
.inl{display:flex;align-items:center;gap:12px;padding:13px 16px}.inl>div{flex:1;min-width:0}.inl b{display:block;font-size:14px;color:var(--ink)}.inl span{display:block;font-size:12.5px;color:var(--kit-text-6e7180);margin-top:2px}
.bnr{display:flex;align-items:center;gap:10px;min-height:40px;padding:6px 10px 6px 14px;border-radius:var(--radius-lg);font-size:13px;line-height:1.4}.bnr>span{flex:1}.bnr a{font-weight:600;text-decoration:underline}
.bnr.ind{background:var(--kit-surface-f5f4ff);color:var(--kit-text-3c35a0);border:1px solid var(--kit-line-ecebfd)}.bnr.warn{background:var(--kit-surface-fffbf4);color:var(--kit-text-6b4a12);border:1px solid var(--kit-line-f6e3c2)}.bnr.bad{background:var(--kit-surface-fff5f5);color:var(--kit-text-8f1d27);border:1px solid var(--kit-line-f7d3d6)}.bnr.neu{background:var(--kit-surface-f8f9fa);color:var(--kit-text-3a3d48);border:1px solid var(--kit-line-eceef1)}
.bnr .btn{height:30px}
/* all screens */
.scg{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border-top:1px solid var(--line2)}.scl{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 18px;font-size:14px;font-weight:500;color:var(--kit-text-2a2d37);border-bottom:1px solid var(--line2)}
.scl:nth-child(odd){border-right:1px solid var(--line2)}.scl:hover{background:var(--kit-surface-fafafc)}
/* phone */
.fp.phone{width:auto}.fp.phone .au{grid-template-columns:1fr}.fp.phone .aur{display:none}.fp.phone .aul{padding:22px 20px}.fp.phone .afm{padding:24px 0}
.fp.phone .obh{padding:0 16px;gap:10px;height:auto;min-height:64px;flex-wrap:wrap}.fp.phone .obh .awm{width:auto}.fp.phone .obd{display:none}.fp.phone .steps{order:3;width:100%;justify-content:center;padding-bottom:10px}
.fp.phone .stp2{font-size:12px;padding:0 10px 0 4px}.fp.phone .stl2{width:12px}.fp.phone .obc{padding:22px 16px 60px}.fp.phone .tcg,.fp.phone .rdg{grid-template-columns:1fr}.fp.phone .pkr{flex-wrap:wrap}.fp.phone .inp.sm3{width:100%}
.fp.phone .erp{padding:22px 20px}.fp.phone .erc{margin-top:60px}.fp.phone .btb{flex-wrap:wrap}

/* ---------- focus pages (consent, workspaces, MCP) ---------- */
.fcp{min-height:inherit;background:var(--kit-surface-f7f8fa);display:flex;flex-direction:column}.fch{display:flex;align-items:center;gap:16px;height:76px;padding:0 40px}.fch .awm{font-size:26px}
.fcc{width:560px;margin:24px auto 80px;zoom:1.15}.fcc.wide{width:900px}
.cns{padding:30px 36px 28px;text-align:center}.cns h1{font-size:26px;font-weight:800;letter-spacing:-.02em;margin-top:18px}.cns .asub{margin-top:8px}
.pair{display:flex;align-items:center;justify-content:center;gap:14px}.pt{width:56px;height:56px;border-radius:var(--radius-kit-feature);background:var(--kit-surface-ffffff);border:1px solid var(--kit-line-eef0f3);box-shadow:0 4px 14px rgba(16,24,40,.08);display:flex;align-items:center;justify-content:center}
.pdots{display:flex;gap:5px}.pdots i{width:5px;height:5px;border-radius:50%;background:var(--kit-surface-c9ccd4);display:block}
.cnb{text-align:left;margin-top:22px}.cnb h3,.h3s{font-size:13px;font-weight:700;color:var(--ink);margin:16px 0 8px;display:flex;align-items:center;gap:8px}.cnb h3:first-child{margin-top:0}
.ck{list-style:none;display:flex;flex-direction:column;gap:8px}.ck li{display:flex;gap:9px;align-items:flex-start;font-size:13.5px;color:var(--kit-text-3a3d48);line-height:1.45}.ck li svg{margin-top:2px}.ck.two{display:grid;grid-template-columns:1fr 1fr;text-align:left;margin:16px 0 6px}
.cpr{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:10px 0;border-top:1px solid var(--line2)}.cpr b{display:block;font-size:13.5px;font-weight:600;color:var(--t1)}.cpr span{display:block;font-size:12.5px;color:var(--kit-text-7a7d88);margin-top:1px}
.cpr.r2p{padding:12px 18px}.sh+.cpr{border-top:0}
.cnf{display:flex;justify-content:flex-end;gap:10px;margin-top:22px}.cnf .btn{height:42px;padding:0 18px}
.spin{width:34px;height:34px;border-radius:50%;border:3px solid var(--kit-line-e6e8ec);border-top-color:var(--kit-line-4a4cf7);margin:22px auto 6px;animation:sp 0.9s linear infinite}@keyframes sp{to{transform:rotate(360deg)}}
.why3{text-align:left;margin:16px 0 0 20px;display:flex;flex-direction:column;gap:8px;font-size:14px;color:var(--kit-text-2a2d37);line-height:1.5}
.bnr.ok2{background:var(--kit-surface-f2fbf6);color:var(--kit-text-0e5e36);border:1px solid var(--kit-line-d5f0e1)}
.code3{margin:0;padding:14px 16px;border-radius:var(--radius-lg);background:var(--kit-surface-0e121a);color:var(--kit-text-d5d8e1);font-family:"JetBrains Mono",ui-monospace,monospace;font-size:12.5px;line-height:1.55;overflow-x:auto;white-space:pre}
.tcg.c4{grid-template-columns:repeat(4,minmax(0,1fr));margin-top:20px}
.lmap{display:flex;align-items:center;gap:18px;margin-top:16px;padding:18px 20px;background:var(--kit-surface-f6f7fe);border-color:var(--kit-line-ebedf8)}.lmap>div{flex:1}.lmap b{display:block;font-size:15px;color:var(--ink)}.lmap span{display:block;font-size:13px;color:var(--kit-text-6e7180);margin-top:2px}
.seat{margin-top:14px}.orgl{margin-top:14px;border:1px solid var(--line);border-radius:var(--radius-xl);overflow:hidden}.org{display:flex;align-items:center;gap:12px;padding:12px 14px;border-top:1px solid var(--line2)}.org:first-child{border-top:0}.org .rm{flex:1;min-width:0}.org .rt{font-size:15px;font-weight:600;color:var(--ink);display:flex;align-items:center;gap:8px}.org .rsb{font-size:13px;color:var(--kit-text-8a8d9a);margin-top:3px}.org:hover{background:var(--kit-surface-fafafc)}.org.cur{background:var(--kit-surface-fafaff)}.org .rm{flex:1}
.oav{width:40px;height:40px;flex-shrink:0;border-radius:var(--radius-kit-nav);background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc);font-weight:800;font-size:14px;letter-spacing:.02em;display:flex;align-items:center;justify-content:center}.oav.blue{background:linear-gradient(135deg,var(--kit-surface-5b7cfa),var(--kit-surface-3d5ae8));color:var(--kit-text-ffffff)}.oav.teal{background:linear-gradient(135deg,var(--kit-surface-22b8a4),var(--kit-surface-11907f));color:var(--kit-text-ffffff)}.oav.amber{background:linear-gradient(135deg,var(--kit-surface-e0a04a),var(--kit-surface-b9732a));color:var(--kit-text-ffffff)}.org{padding:14px 16px!important}.org .orr{display:flex;align-items:center;gap:10px;flex-shrink:0}.oop{display:inline-flex;align-items:center;gap:5px;font-size:13.5px;font-weight:600;color:var(--kit-text-9a9daa);transition:color .15s}.org:hover .oop{color:var(--kit-text-4c3cbc)}.org .orr .tg{min-width:64px;justify-content:center}.org .orr>:last-child{min-width:104px;justify-content:flex-end}.org.cur{background:var(--kit-surface-f7f8ff);box-shadow:inset 3px 0 0 var(--kit-line-5b5bf5)}.ogl{font-family:'MonoV','JetBrains Mono',monospace;font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--kit-text-8a8d9a);margin:22px 0 -4px}.fcc.ogw{width:680px}.ogc{padding:34px 36px 26px!important;text-align:left!important}.ogc h1,.ogc .asub{text-align:left!important}.org .rsb{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ogi{width:46px;height:46px;margin-bottom:16px}.ogf{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:22px;padding-top:18px;border-top:1px solid var(--line2);font-size:13px;color:var(--kit-text-8a8d9a);line-height:1.45}.ogf .btn{flex-shrink:0}.fct{margin-left:auto;display:flex;align-items:center;gap:16px;font-size:13.5px;color:var(--kit-text-6e7180)}.fct b{color:var(--ink);font-weight:600}.fp.phone .fcc.ogw{width:auto;margin:10px 16px 60px;zoom:1}.fp.phone .org .orr>:last-child{min-width:0}.fp.phone .oop{display:none}.fp.phone .org .rsb{white-space:normal}.fp.phone .ogc{padding:24px 18px 20px!important}.fp.phone .ogf{flex-direction:column;align-items:stretch}.fp.phone .fct>span{display:none}.fp.phone .org .tg{display:none}
.btn.dgs{background:var(--kit-surface-c0182b);border-color:var(--kit-line-c0182b);color:var(--kit-text-ffffff)}
.upg{padding:34px 40px 28px;text-align:center;max-width:620px;margin:0 auto}.upg .aic{margin:0 auto}.upg h2{font-size:22px;font-weight:800;margin-top:14px;color:var(--ink)}.upg>p{font-size:14px;color:var(--kit-text-5e6170);margin-top:6px}
.fp.phone .fcc,.fp.phone .fcc.wide{width:auto;margin:10px 16px 60px}.fp.phone .fch{padding:0 16px}.fp.phone .cns{padding:22px 18px}.fp.phone .tcg.c4{grid-template-columns:1fr 1fr}.fp.phone .lmap{flex-wrap:wrap}
.app.phone .ck.two{grid-template-columns:1fr}

/* ---------- the full warning ---------- */
.wh2{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;margin-bottom:20px}.wh2 h1{margin-top:6px}.wh2 .sub{max-width:640px}
.chn{padding:2px 18px 14px;position:relative}.chi{display:grid;grid-template-columns:62px 14px minmax(0,1fr);gap:10px;align-items:flex-start;padding:8px 0;font-size:13.5px;color:var(--kit-text-2a2d37);position:relative}
.chi .cd{font-size:12px;color:var(--kit-text-8a8d9a);padding-top:1px}.chi>div{display:flex;flex-wrap:wrap;align-items:center;gap:6px;line-height:1.45}
.sv{width:10px;height:10px;border-radius:50%;margin-top:4px;display:block;box-shadow:0 0 0 3px var(--kit-line-ffffff)}.sv.bad{background:var(--kit-surface-e5243b)}.sv.or{background:var(--kit-surface-f07a12)}.sv.ok{background:var(--kit-surface-12b76a)}
.chn::before{content:'';position:absolute;left:94px;top:14px;bottom:20px;width:2px;background:var(--kit-surface-f1f2f4)}.chn.sm{padding:6px 0 0}.chn.sm::before{left:76px}
.try{padding:12px 18px;border-top:1px solid var(--line2)}.sh+.try{border-top:0}.trh{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.trh b{font-size:14px;color:var(--t1)}.trh .pl{margin-left:auto}
.trm{margin-top:8px;padding:10px 12px;border-radius:var(--radius-lg);background:var(--kit-surface-f8f9fa);font-size:13px;color:var(--kit-text-3a3d48);line-height:1.45}
.rc.dis{color:var(--text-muted);cursor:not-allowed}.wdo{margin-top:14px;padding:12px 14px;border-radius:var(--radius-xl);background:var(--kit-surface-f6f7fe);border:1px solid var(--kit-line-ebedf8)}.wdl{display:flex;gap:9px;align-items:flex-start;font-size:13px;color:var(--kit-text-2a2d37);margin-top:8px;line-height:1.45}.wdl svg{margin-top:2px}
.btn.wide2{width:100%;justify-content:center;margin-top:14px;height:42px}
/* ---------- replay, guide, quality ---------- */
.ol3{margin:0 18px 16px 38px;display:flex;flex-direction:column;gap:8px;font-size:13.5px;color:var(--kit-text-2a2d37);line-height:1.5}
.nhq{padding:16px 18px}.nhq b{display:block;font-size:15px;color:var(--ink)}.nhq p{font-size:13.5px;color:var(--kit-text-3a3d48);line-height:1.55;margin-top:6px}
.qg5{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.qm{display:flex;flex-direction:column;gap:6px;padding:16px 18px}.qm span{font-size:13px;color:var(--kit-text-5e6170)}.qm b{font-size:24px;font-weight:800;color:var(--ink);letter-spacing:-.02em}.qm b.t4{font-size:17px;color:var(--kit-text-8a8d9a)}.qm .pl{align-self:flex-start}
/* ---------- public site ---------- */
.site{background:var(--kit-surface-ffffff)}.snv{display:flex;align-items:center;gap:30px;height:80px;padding:0 64px;border-bottom:1px solid var(--kit-line-f1f2f4);position:sticky;top:0;background:rgba(255,255,255,.92);backdrop-filter:blur(8px);z-index:5}
.snl{display:flex;gap:26px;font-size:15px;font-weight:500;color:var(--kit-text-3a3d48)}.snl a:hover{color:var(--ink)}.snr{margin-left:auto;display:flex;align-items:center;gap:20px}
.hro{padding:76px 64px 40px;text-align:center}.hro h1{font-size:56px;font-weight:800;letter-spacing:-.035em;line-height:1.05;max-width:880px;margin:14px auto 0;color:var(--ink)}
.hro.sm h1{font-size:44px}.prf{display:inline-flex;gap:10px;align-items:center;margin-top:22px;padding:10px 16px;border-radius:var(--radius-xl);background:var(--kit-surface-f6f7fe);border:1px solid var(--kit-line-ebedf8);font-size:14.5px;color:var(--kit-text-3a3d48);text-align:left}.prf b{color:var(--ink)}.hsub{font-size:19px;color:var(--kit-text-5e6170);line-height:1.55;max-width:700px;margin:18px auto 0}.hct{display:flex;gap:12px;justify-content:center;margin-top:28px}.hct .btn{height:48px;padding:0 22px;font-size:15px}
.shot{margin:48px auto 0;max-width:1000px;border-radius:var(--radius-kit-preview);border:1px solid var(--kit-line-e6e8ec);box-shadow:0 30px 80px rgba(16,24,40,.14);overflow:hidden;text-align:left;background:var(--kit-surface-ffffff)}
.shb{display:flex;gap:6px;padding:12px 14px;background:var(--kit-surface-f7f8fa);border-bottom:1px solid var(--kit-line-eef0f3)}.shb i{width:10px;height:10px;border-radius:50%;background:var(--kit-surface-e3e5ea);display:block}
.shc{padding:26px 30px 30px}.shc h3{font-size:26px;font-weight:800;letter-spacing:-.02em;margin:4px 0 18px}.cards3.sm{margin:0}.cards3.sm .ac h3{font-size:15px;margin:0}
.ssec{padding:56px 64px 0;max-width:1180px;margin:0 auto}.ssec h2{font-size:34px;font-weight:800;letter-spacing:-.025em;margin:8px 0 24px;color:var(--ink)}
.ftc{padding:22px 22px 24px}.ftc b{display:block;font-size:17px;color:var(--ink);margin-top:14px}.ftc p{font-size:14.5px;color:var(--kit-text-5e6170);line-height:1.55;margin-top:6px}
.stn{width:36px;height:36px;border-radius:var(--radius-lg);background:var(--kit-surface-efefff);color:var(--kit-text-4c3cbc);font-weight:800;display:flex;align-items:center;justify-content:center}
.tlr{display:flex;flex-wrap:wrap;gap:10px}.tl1{display:inline-flex;align-items:center;gap:9px;height:46px;padding:0 16px;border:1px solid var(--line);border-radius:var(--radius-xl);font-size:15px;font-weight:600;color:var(--kit-text-2a2d37)}
.wkl2{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:12px}.wki2{padding:18px;border-radius:var(--radius-kit-card);background:var(--kit-surface-f7f8fa)}.wki2 b{display:block;font-family:"JetBrains Mono",monospace;font-size:13px;color:var(--kit-text-4c3cbc);letter-spacing:.1em;text-transform:uppercase}.wki2 span{display:block;font-size:14.5px;color:var(--kit-text-2a2d37);margin-top:8px;line-height:1.5}
.cmpt{font-size:15px}.cmh,.cmr{display:grid;grid-template-columns:1.1fr 1fr 1fr;gap:16px;padding:14px 22px;border-top:1px solid var(--line2)}.cmh{background:var(--band);font-weight:600;color:var(--kit-text-6e7182);font-size:13px;border-top:0}.cmr>span:first-child{font-weight:600;color:var(--t1)}
.scta{margin:64px 64px 0;padding:56px;border-radius:var(--radius-kit-hero);text-align:center;color:var(--kit-text-ffffff);background:radial-gradient(700px 360px at 80% 0%,var(--kit-surface-2b2e70) 0%,rgba(43,46,112,0) 62%),linear-gradient(180deg,var(--kit-surface-14162a),var(--kit-surface-0e121a))}
.scta h2{font-size:38px;font-weight:800;letter-spacing:-.025em}.scta p{color:var(--kit-text-b9bccb);font-size:17px;margin-top:10px}
.sft{display:flex;align-items:center;gap:28px;flex-wrap:wrap;padding:40px 64px 48px;margin-top:56px;border-top:1px solid var(--kit-line-f1f2f4);font-size:13.5px;color:var(--kit-text-8a8d9a)}.sft .awm{font-size:22px}.sfl{display:flex;gap:20px;color:var(--kit-text-3a3d48)}.sft>span{margin-left:auto}
.lgw{max-width:1040px;margin:0 auto;padding:56px 64px 0}.lgw h1{font-size:44px;font-weight:800;letter-spacing:-.03em;margin:8px 0 6px}
.lgg{display:grid;grid-template-columns:220px minmax(0,1fr);gap:48px;margin-top:36px}.lgt{display:flex;flex-direction:column;gap:10px;font-size:14px;color:var(--kit-text-5e6170);position:sticky;top:100px;align-self:start}
.lgg h2{font-size:22px;font-weight:700;margin:28px 0 10px;color:var(--ink)}.lgg h2:first-child{margin-top:0}.lgp{font-size:16px;color:var(--kit-text-3a3d48);line-height:1.7}
/* phone */
.pl0{display:none;font-style:normal}.app.phone .pl0{display:inline;color:var(--kit-text-8a8d9a);font-weight:400}
.app.phone .wh2{flex-wrap:wrap}.app.phone .qg5{grid-template-columns:1fr}.app.phone .chn::before{display:none}
.fp.phone .fcc{zoom:1}.fp.phone .snv{padding:0 16px;gap:12px}.fp.phone .snl{display:none}.fp.phone .hro{padding:40px 18px 20px}.fp.phone .hro h1{font-size:34px}.fp.phone .hsub{font-size:16px}
.fp.phone .hct{flex-wrap:wrap}.fp.phone .ssec{padding:36px 18px 0}.fp.phone .ssec h2{font-size:26px}.fp.phone .g3,.fp.phone .wkl2,.fp.phone .plans,.fp.phone .lgg,.fp.phone .cards3{grid-template-columns:1fr}
.fp.phone .scta{margin:40px 16px 0;padding:32px 20px}.fp.phone .sft{padding:28px 18px}.fp.phone .lgw{padding:32px 18px 0}.fp.phone .cmh,.fp.phone .cmr{grid-template-columns:1fr;gap:4px}.fp.phone .shc{padding:16px}.fp.phone .shc h3{font-size:19px}
.fp.phone .tr{display:flex;flex-wrap:wrap;gap:6px 12px;padding:12px 14px}.fp.phone .th{display:none}

.app.phone{width:auto;grid-template-columns:minmax(0,1fr)}
.app.phone .sb{position:fixed;left:0;top:0;bottom:0;width:280px;height:100vh;transform:translateX(-102%);transition:transform .22s ease;z-index:30;overflow:auto}
.app.phone.menu .sb{transform:none;box-shadow:0 10px 40px rgba(16,17,20,.22)}
.app.phone .back{position:fixed;inset:0;background:rgba(16,17,20,.32);z-index:25}.app.phone:not(.menu) .back{display:none}
.app.phone .ham{display:flex;width:36px;height:36px;align-items:center;justify-content:center;margin-left:-6px}.app.phone .lm{display:block;font-size:22px;font-weight:800;letter-spacing:-.045em}
.app.phone .top{height:60px;padding:0 14px;gap:10px}.app.phone .srch{height:40px;flex:1}.app.phone .srch kbd,.app.phone .dt{display:none}.app.phone .top .me{width:36px!important;height:36px!important;font-size:14px!important}
.app.phone .hs{width:38px;padding:0;justify-content:center;font-size:0;gap:0}.app.phone .pop.pp-tr{top:46px}
.app.phone .page{padding:14px 16px 48px}.app.phone .pz{zoom:1!important}
.app.phone .hd{flex-wrap:wrap}.app.phone .hdr{flex-wrap:wrap}
.app.phone .cards3,.app.phone .r2,.app.phone .r2e,.app.phone .r3,.app.phone .mgrid,.app.phone .pqg,.app.phone .g2,.app.phone .g3,.app.phone .side,.app.phone .fg,.app.phone .qg,.app.phone .pcg,.app.phone .acts2,.app.phone .plans,.app.phone .gcols{grid-template-columns:minmax(0,1fr)!important}
.app.phone .stg,.app.phone .stg.c3{grid-template-columns:1fr 1fr}.app.phone .cbs{grid-template-columns:1fr 1fr}.app.phone .vopt{grid-template-columns:1fr 1fr}
.app.phone .th{display:none}.app.phone .tr,.app.phone .lr2,.app.phone .ttr{display:flex;flex-wrap:wrap;gap:8px 12px;padding:12px 14px}.app.phone .tr>.who:first-child,.app.phone .ttr>.who:first-child{flex:1 1 100%}.app.phone .chv{display:none}
.app.phone .tth{display:none}.app.phone .gwrap{overflow-x:auto}.app.phone .gwrap>*{min-width:0}
.app.phone .mtb{flex-wrap:wrap}.app.phone .ub{grid-template-columns:1fr;gap:6px;height:auto;padding:8px 0}
.app.phone .wk{overflow-x:auto}.app.phone .wkh,.app.phone .wkb{min-width:560px}.app.phone .vd .wkh,.app.phone .vd .wkb{min-width:0}
.app.phone .apv,.app.phone .row,.app.phone .kv,.app.phone .mw,.app.phone .wbox,.app.phone .it .ih,.app.phone .bigr,.app.phone .anf{flex-wrap:wrap}.app.phone .apv .ab{width:100%}
.app.phone .srow2{grid-template-columns:1fr;gap:6px}.app.phone .qcol+.qcol{border-left:0;border-top:1px solid var(--line2)}.app.phone .pc:nth-child(odd){border-right:0}
.app.phone .afoot{flex-wrap:wrap}.app.phone .bigr{flex-direction:column;align-items:flex-start}.app.phone .bigr .ms div{text-align:left}.app.phone .it .amt{text-align:left}.app.phone .mr{flex-wrap:nowrap!important}

/* ---------- kit classes in place of style attributes (the CSP forbids style attributes) ----------
   !important keeps the same strength an inline style had. pz-NNN is the page content zoom. */
svg.ic{flex-shrink:0}.pz-100{zoom:1.0}.pz-120{zoom:1.2}.pz-125{zoom:1.25}.pz-140{zoom:1.4}.pz-145{zoom:1.45}.pz-150{zoom:1.5}.pz-155{zoom:1.55}
.u-1{--cols:minmax(0,1.8fr) minmax(0,.9fr) 62px 94px 98px!important}
.u-2{gap:10px!important}
.u-3{gap:8px!important}
.u-4{margin-top:16px!important}
.u-5{height:6px!important;background:var(--kit-surface-86d6a9)!important}
.u-6{height:8px!important;background:var(--kit-surface-86d6a9)!important}
.u-7{height:9px!important;background:var(--kit-surface-86d6a9)!important}
.u-8{height:11px!important;background:var(--kit-surface-16a34a)!important}
.u-9{height:12px!important;background:var(--kit-surface-16a34a)!important}
.u-10{height:14px!important;background:var(--kit-surface-16a34a)!important}
.u-11{height:12px!important;background:var(--kit-surface-f3b26b)!important}
.u-12{height:10px!important;background:var(--kit-surface-f3b26b)!important}
.u-13{height:8px!important;background:var(--kit-surface-f3b26b)!important}
.u-14{height:6px!important;background:var(--kit-surface-e9890f)!important}
.u-15{height:5px!important;background:var(--kit-surface-e9890f)!important}
.u-16{height:4px!important;background:var(--kit-surface-e9890f)!important}
.u-17{height:7px!important;background:var(--kit-surface-86d6a9)!important}
.u-18{height:10px!important;background:var(--kit-surface-86d6a9)!important}
.u-19{height:13px!important;background:var(--kit-surface-16a34a)!important}
.u-20{height:5px!important;background:var(--kit-surface-86d6a9)!important}
.u-21{height:10px!important;background:var(--kit-surface-16a34a)!important}
.u-22{height:11px!important;background:var(--kit-surface-f3b26b)!important}
.u-23{height:9px!important;background:var(--kit-surface-f3b26b)!important}
.u-24{height:8px!important;background:var(--kit-surface-e9890f)!important}
.u-25{cursor:pointer!important}
.u-26{height:38%!important;background:var(--kit-surface-d7dafb)!important}
.u-27{height:52%!important;background:var(--kit-surface-d7dafb)!important}
.u-28{height:45%!important;background:var(--kit-surface-d7dafb)!important}
.u-29{height:62%!important;background:var(--kit-surface-c3c8fa)!important}
.u-30{height:56%!important;background:var(--kit-surface-c3c8fa)!important}
.u-31{height:74%!important;background:var(--kit-surface-a9b0f8)!important}
.u-32{height:88%!important;background:var(--kit-surface-6670f6)!important}
.u-33{height:100%!important;background:var(--kit-surface-5a63f3)!important}
.u-34{width:34px!important;height:34px!important}
.u-35{color:var(--kit-text-3a3d48)!important}
.u-36{color:var(--kit-text-6e7180)!important}
.u-37{color:var(--kit-text-f2570c)!important}
.u-38{width:38px!important;height:38px!important}
.u-39{margin-top:8px!important}
.u-40{color:var(--kit-text-3a3d48)!important;font-size:13.5px!important;margin:0!important}
.u-41{--cols:46px 30px minmax(0,1fr) 104px 18px!important}
.u-42{min-width:0!important}
.u-43{--n:1!important}
.u-44{top:0px!important}
.u-45{top:40px!important}
.u-46{top:80px!important}
.u-47{top:120px!important}
.u-48{top:160px!important}
.u-49{top:200px!important}
.u-50{top:240px!important}
.u-51{top:280px!important}
.u-52{top:320px!important}
.u-53{top:360px!important}
.u-54{height:360px!important}
.u-55{top:0px!important;height:27px!important}
.u-56{top:40px!important;height:37px!important}
.u-57{top:100px!important;height:18px!important}
.u-58{top:200px!important;height:37px!important}
.u-59{top:280px!important;height:37px!important}
.u-60{background:var(--kit-surface-f56c03)!important}
.u-61{background:var(--kit-surface-ea0726)!important}
.u-62{background:var(--kit-surface-1763ef)!important}
.u-63{--n:5!important}
.u-64{top:20px!important;height:18px!important}
.u-65{top:260px!important;height:27px!important}
.u-66{top:0px!important;height:37px!important}
.u-67{top:80px!important;height:18px!important}
.u-68{top:160px!important;height:57px!important}
.u-69{top:240px!important;height:27px!important}
.u-70{margin-top:15px!important}
.u-71{margin-left:auto!important}
.u-72{color:var(--kit-text-e5670c)!important}
.u-73{color:var(--kit-text-12a05c)!important}
.u-74{height:15px!important}
.u-75{--cols:minmax(0,1.25fr) minmax(0,1fr) 92px 70px 74px 18px!important}
.u-76{color:var(--kit-text-e75333)!important;font-weight:600!important}
.u-77{color:var(--kit-text-2f9e6a)!important;font-weight:600!important}
.u-78{gap:12px!important}
.u-79{padding-top:12px!important;border-top:1px solid var(--line2)!important}
.u-80{margin:0!important}
.u-81{padding-top:11px!important;border-top:1px solid var(--line2)!important}
.u-82{font-size:12px!important}
.u-83{font-size:13.5px!important}
.u-84{padding-top:14px!important}
.u-85{color:var(--kit-text-0ba85a)!important}
.u-86{color:var(--kit-text-2fa36b)!important}
.u-87{color:var(--kit-text-0e8f4e)!important}
.u-88{color:var(--kit-text-3daa7a)!important}
.u-89{color:var(--kit-text-e5243b)!important}
.u-90{color:var(--kit-text-d62142)!important}
.u-91{--cols:minmax(0,1fr) 96px 76px 112px 84px 16px!important}
.u-92{background:var(--kit-surface-5e5efa)!important}
.u-93{background:var(--kit-surface-ee0b1e)!important}
.u-94{background:var(--kit-surface-4a39fc)!important}
.u-95{background:var(--kit-surface-f98207)!important}
.u-96{background:var(--kit-surface-04bb6f)!important}
.u-97{left:34.3%!important;top:26.5%!important;background:var(--kit-surface-feeeef)!important;border-color:var(--kit-line-fac9cd)!important}
.u-98{left:71.5%!important;top:19.5%!important;background:var(--kit-surface-eff5fe)!important;border-color:var(--kit-line-c7dafb)!important}
.u-99{left:24.6%!important;top:57.5%!important;background:var(--kit-surface-fef6ea)!important;border-color:var(--kit-line-f9ddb7)!important}
.u-100{left:82.0%!important;top:50.5%!important;background:var(--kit-surface-eafbf3)!important;border-color:var(--kit-line-bdefd5)!important}
.u-101{left:54.5%!important;top:73.0%!important;background:var(--kit-surface-fef3e6)!important;border-color:var(--kit-line-fad7b3)!important}
.u-102{left:79.0%!important;top:88.5%!important;background:var(--kit-surface-eef5fe)!important;border-color:var(--kit-line-c7dafb)!important}
.u-103{margin:10px 0 0!important}
.u-104{width:40px!important;height:40px!important}
.u-105{text-decoration:underline!important}
.u-106{--cols:minmax(0,1fr) auto 30px!important}
.u-107{gap:18px!important}
.u-108{width:44px!important;height:44px!important;border-radius:var(--radius-xl)}
.u-109{color:var(--kit-text-4b4e5c)!important;margin-right:6px!important}
.u-110{margin-top:12px!important}
.u-111{margin:10px 0 12px!important}
.u-112{background:var(--kit-surface-5b7efb)!important}
.u-113{background:var(--kit-surface-fd858e)!important}
.u-114{padding:6px 20px 14px 10px!important}
.u-115{display:block!important;overflow:visible!important}
.u-116{padding:0 18px!important}
.u-117{min-width:74px!important;text-align:right!important}
.u-118{margin-top:4px!important}
.u-119{padding-bottom:12px!important}
.u-120{border-top:0!important;padding-top:2px!important}
.u-121{font-weight:500!important;white-space:normal!important}
.u-122{margin:14px 0 6px!important}
.u-123{padding:10px 0!important;border-top:1px solid var(--line2)!important}
.u-124{margin-top:6px!important}
.u-125{text-align:right!important}
.u-126{font-size:15px!important}
.u-127{display:block!important;margin:0!important}
.u-128{--cols:30px minmax(0,1fr) 110px 200px 18px!important}
.u-129{--cols:30px minmax(0,1fr) auto!important}
.u-130{padding:0 18px!important;margin:-4px 0 6px!important}
.u-131{align-items:flex-start!important}
.u-132{margin-top:10px!important}
.u-133{margin-top:14px!important}
.u-134{border:0!important}
.u-135{padding:14px 0 0!important;border:0!important}
.u-136{margin:12px 0 6px!important}
.u-137{margin-top:12px!important;max-width:440px!important}
.u-138{padding:0 18px 8px!important}
.u-139{margin-left:6px!important}
.u-140{width:75%!important}
.u-141{width:96%!important}
.u-142{font-weight:600!important}
.u-143{grid-template-columns:minmax(0,1fr) 290px!important;margin-top:15px!important}
.u-144{padding:0 18px 6px!important}
.u-145{padding:0 18px 16px!important}
.u-146{margin:16px 0 8px!important}
.u-147{grid-template-columns:minmax(0,1fr) 262px!important}
.u-148{margin-top:0!important}
.u-149{margin-top:10px!important;padding-top:10px!important;border-top:1px solid var(--line2)!important}
.u-150{color:var(--kit-text-c2410c)!important}
.u-151{color:var(--kit-text-d93645)!important}
.u-152{font-weight:500!important}
.u-153{color:var(--kit-text-92400e)!important}
.u-154{font-weight:500!important;color:var(--kit-text-3a3d48)!important}
.u-155{margin-top:2px!important}
.u-156{grid-template-columns:minmax(0,1fr) 300px!important}
.u-157{color:var(--kit-text-4c3cbc)!important}
.u-158{text-align:center!important}
.u-159{width:70px!important;color:var(--kit-text-4b4e5c)!important}
.u-160{--cols:minmax(0,1fr) 110px 110px 120px!important}
.u-161{color:var(--kit-text-4b4e5c)!important}
.u-162{height:36px!important;max-width:280px!important}
.u-163{padding:16px 0 0!important;border:0!important}
.u-164{grid-template-columns:120px minmax(0,1fr) 90px!important}
.u-165{justify-content:center!important}
.u-166{padding:16px 18px!important}
.u-167{width:70%!important}
.u-168{width:85%!important}
.u-169{width:55%!important}
.u-170{margin-top:22px!important}
.u-171{margin-top:18px!important}
.u-172{font-size:13.5px!important;color:var(--t1)!important}
.u-173{display:flex!important;justify-content:center!important;padding-bottom:22px!important}
.u-174{color:var(--t1)!important;font-size:13px!important}
.u-175{width:60%!important}
.u-176{text-align:center!important;margin:-10px 0 18px!important}
.u-177{height:18px!important}
.u-178{font-size:30px!important;font-weight:800!important;letter-spacing:-.025em!important;margin-top:6px!important}
.u-179{width:18%!important}
.u-180{margin:-12px 0 20px!important;color:var(--kit-text-5e6170)!important}
.u-181{padding:14px 18px!important}
.u-182{--cols:180px minmax(0,1fr) minmax(0,1fr)!important}
.u-183{padding-top:16px!important}
.u-184{margin:16px 0 0!important}
.u-185{color:var(--kit-text-d63a44)!important}
.u-186{color:var(--kit-text-4f46e5)!important}
.u-187{color:var(--kit-text-e2730e)!important}
.u-188{color:var(--kit-text-159a5c)!important}
