/* Generated from the unmodified DS019 source; local Google Fonts, no external requests. */
/* =============================================================
   SOUL — design-tokens.css
   The single source of truth. Colors, type, spacing, radii,
   motion, depth. Every preview card and UI-kit component reads
   from here — introduce no value that is not declared below.

   Base: monochrome over near-black. One green accent. Two signal
   hues (magenta = bad, amber = warning flag). Nothing else.
   ============================================================= */

/* ---------- Webfonts ----------------------------------------- */
/* Montserrat — display/accent headings (600).
   Inter — body, UI, labels, navigation (variable axis for 490 / 540).
   Barlow Semi Condensed — every numeric: metrics, latency, IDs, kbd
   chips. A condensed, DIN-2014-style industrial face with a PLAIN
   open zero (no dot, no slash) and TIGHT decimals. It is PROPORTIONAL,
   not monospace — digit columns are kept aligned with
   font-variant-numeric: tabular-nums, which gives equal-width digits
   WITHOUT handing the decimal point its own cell (so "1.42" stays
   tight, no gap after the dot).
   JetBrains Mono — machine source the operator reads and edits verbatim
   (mermaid diagram source, JSON/YAML, logs, shell, diffs). ONE weight, 400.
   Never numerics — those stay Barlow. Ligatures are switched OFF in the
   .t-code role: in mermaid source `-->` is a token the operator edits
   character by character, and a ligature hides where the caret is.
   Rubik Glitch / Rubik — SOUL wordmark only, nowhere else. */
/* vietnamese */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpvgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXd4qqOEo.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpvgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXdoqqOEo.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpvgxjLBV1hqnzfr-F8sEYMB0Yybp0mudRXeIqq.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfi6m_CGslu50.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfi6m_CWslu50.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfi6m_B2sl.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfp66_CGslu50.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfp66_CWslu50.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfp66_B2sl.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfw6-_CGslu50.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfw6-_CWslu50.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Barlow Semi Condensed';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/mvp/soul/fonts/wlpigxjLBV1hqnzfr-F8sEYMB0Yybp0mudRfw6-_B2sl.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTN1OVgaY.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTPlOVgaY.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTOVOVgaY.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTNVOVgaY.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTNFOVgaY.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTOlOV.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* vietnamese */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* vietnamese */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* vietnamese */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/mvp/soul/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-ro-FUkU1Z4Y.woff2) format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-ro-FWkU1Z4Y.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-ro-FU0U1Z4Y.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* hebrew */
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-ro-FVUU1Z4Y.woff2) format('woff2');
  unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
}
/* latin-ext */
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-ro-FWUU1Z4Y.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url(/mvp/soul/fonts/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-ro-FV0U1.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Rubik Glitch';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/qkBSXv8b_srFRYQVYrDKh9ZfkiTGCNg.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Rubik Glitch';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/qkBSXv8b_srFRYQVYrDKh9ZfmyTGCNg.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* hebrew */
@font-face {
  font-family: 'Rubik Glitch';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/qkBSXv8b_srFRYQVYrDKh9ZfnSTGCNg.woff2) format('woff2');
  unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
}
/* latin-ext */
@font-face {
  font-family: 'Rubik Glitch';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/qkBSXv8b_srFRYQVYrDKh9ZfkSTGCNg.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Rubik Glitch';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/mvp/soul/fonts/qkBSXv8b_srFRYQVYrDKh9ZfnyTG.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}


:root {
  /* ---------- Core canvas ----------------------------------- */
  --canvas:        #030303;                  /* near-black primary background */
  --surface-1:     rgba(17, 17, 19, 0.92);   /* main panels and cards */
  --surface-2:     rgba(32, 32, 34, 0.92);   /* elevated cards, modals, popovers */

  /* ---------- Borders / dividers ---------------------------- */
  /* One hue — #494950 — at three alphas. Never tinted. */
  --border-10:     rgba(73, 73, 80, 0.10);   /* in-card divider */
  --border-22:     rgba(73, 73, 80, 0.22);   /* card edge (default) */
  --border-35:     rgba(73, 73, 80, 0.35);   /* emphasized edge — selected row, active tab. NOT a focus indicator. */

  /* ---------- Focus ring ------------------------------------ */
  /* The one focus indicator. Monochrome white — never takes a hue.
     7.8:1 on --canvas, so it clears WCAG 2.2 1.4.11 (3:1) on every
     surface in the system. Border alpha does NOT change on focus. */
  --focus-ring:    rgba(255, 255, 255, 0.62);

  /* ---------- Text — one opacity scale, one naming ---------- */
  /* The only text-opacity scale in the system. Ceiling .96. */
  --text-primary:   rgba(255, 255, 255, 0.96);   /* headlines, primary copy */
  --text-secondary: rgba(255, 255, 255, 0.62);   /* body, metadata — 7.8:1 on canvas */
  --text-muted:     rgba(255, 255, 255, 0.46);   /* body hints — 4.6:1 min passing */
  /* The two tiers below are BELOW every WCAG text threshold (1.69:1 and
     1.41:1 on canvas). They never carry information. Legal uses: a truly
     disabled control, and pure decoration (rules, ticks, watermarks).
     Never a timestamp, size, ID, count, label, or any readable value —
     not even at rest behind a hover-reveal. */
  --text-ghosted:   rgba(255, 255, 255, 0.20);   /* disabled controls only */
  --text-faint:     rgba(255, 255, 255, 0.15);   /* pure decoration only */

  /* ---------- Accent — the single green, defined once ------- */
  /* The system's single neon accent — its only bright hue.
     Reserved for the LIVE signal: the pulse dot and the live chart tip.
     Never on buttons, never decorative. */
  --accent:        #2CFE48;

  /* ---------- Status grammar — four states + warning flag --- */
  /* Four states: LIVE / DONE / QUEUED / BLOCKED. WARNING is NOT a
     fifth state — it is an amber flag that can ride on a LIVE item.
     PULSE is the differentiator: LIVE is the bright accent and
     always pulses; DONE is a dimmed, desaturated green and never
     moves. */
  /* NO STATUS COLOUR EVER FILLS AN AREA. There is no --status-live-soft,
     --status-done-soft, --status-blocked-soft or --status-warning-soft, and
     none is coming. Every state is carried by a monochrome Lucide glyph, a
     10px uppercase label and — for LIVE alone — the pulsing dot. */
  --status-live:         var(--accent);              /* LIVE — running now, pulsing dot */
  --status-done:         #45A35C;                    /* DONE — muted steady green, no pulse */
  --status-queued:       rgba(255, 255, 255, 0.48);  /* QUEUED — waiting. 4.9:1 on --canvas, passes small text */
  --status-blocked:      #FF3D8B;                    /* BLOCKED — error / critical / failed */
  --status-warning:      #FFB020;                    /* WARNING flag — amber dot / thin flag on a LIVE item (not a state). Glyph and label only — never a fill, never an edge. */

  /* ---------- Type families --------------------------------- */
  --font-display:  "Montserrat", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
  --font-sans:     "Inter", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
  --font-numeric:  "Barlow Semi Condensed", "Inter", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
  /* Source text only — never a value, never a number. See .t-code below. */
  --font-mono:     "JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", "Liberation Mono", monospace;
  /* Wordmark only — never running text, UI, or numerics. */
  --font-wordmark: "Rubik Glitch", "Rubik", system-ui, sans-serif;

  /* ---------- Type weights ---------------------------------- */
  --weight-body:     490;   /* @kind font */   /* Inter — between regular and medium */
  --weight-strong:   540;   /* @kind font */   /* Inter — between medium and semibold */
  --weight-display:  600;   /* @kind font */   /* Montserrat — display headings */
  /* One mono weight, and only one. A source listing has no bold: emphasis
     inside code is carried by text opacity, never by a second cut. On
     #030303 light-on-dark irradiation already thickens the stem, so 400 is
     what 500 looks like elsewhere — 500 blocks up at 12px. */
  --weight-mono:     400;   /* @kind font */   /* JetBrains Mono — the only cut we load */

  /* ---------- Type scale ------------------------------------ */
  --display-size:    24px;
  --display-lh:      1.2;   /* @kind other */
  --display-track:   -0.025em;

  --title-size:      16px;
  --title-lh:        1.4;   /* @kind other */
  --title-track:     -0.006em;

  --body-size:       14.3px;
  --body-lh:         1.65;   /* @kind other */
  --body-track:      -0.006em;

  --small-size:      13.3px;
  --small-lh:        1.65;   /* @kind other */

  --label-size:      10px;
  --label-lh:        1.4;   /* @kind other */
  --label-track:     0.05em;

  /* Screen-register extensions — existing kit practice, tokenized. */
  --headline-size:    28px;      /* console screen h1 — Inter 540, NOT Montserrat */
  --headline-track:   -0.022em;
  --sheet-title-size: 20px;      /* sheet / modal h2 */
  --metric-size:      28px;      /* metric value — Barlow, tabular-nums */
  --metric-lg:        44px;      /* hero chart value — Barlow, tabular-nums */
  --metric-track:     -0.01em;   /* трек для --metric-size и --metric-lg: Barlow на крупном кегле */
  --chip-size:        11px;      /* chips, badges, small counters */
  --micro-size:       12px;      /* micro copy, step metadata, tab labels */

  /* Mono / source setting. 12px, one step BELOW the 13.3px it sits next to:
     monospace carries a fixed advance, so a mono line at equal nominal size
     runs wider and reads a size larger than Inter beside it. JetBrains Mono's
     tall lowercase is what makes the step down safe — at 12px on --canvas its
     x-height still lands between Inter 13.3 and Inter 12. Leading 1.6 (19.2px
     pitch): mermaid source is an indentation ladder read vertically, so it
     needs more air than the 1.4 of a numeric row and less than the 1.65 of
     prose, which would break the block into loose lines. */
  --mono-size:        12px;
  --mono-lh:          1.6;   /* @kind other */

  /* ---------- Spacing scale --------------------------------- */
  --space-1:  6px;
  --space-2:  12px;
  --space-3:  18px;
  --space-4:  24px;
  --space-5:  32px;
  --space-6:  48px;

  /* ---------- Radii (signature) ----------------------------- */
  --radius-card:    24px;   /* primary cards / surfaces */
  --radius-nested:  12px;   /* nested elements (button, input) */
  --radius-pill:    999px;  /* chips, badges, circular controls */
  --radius-micro:   2px;    /* dense data graphics ONLY: timeline segments, bars — never UI containers */
  /* Never 4 / 6 / 8. No sharp corners. */

  /* ---------- Depth (no box-shadow) ------------------------- */
  --blur-light:   blur(16px);   /* @kind other */
  --blur-sticky:  blur(24px);   /* @kind other */   /* sticky top/bottom bars over --canvas-veil */
  --blur-panel:   blur(32px);   /* @kind other */
  --blur-heavy:   blur(48px);   /* @kind other */

  /* ---------- Self-emission — the one legal glow ------------ */
  /* LIVE glow everywhere; the critical twin is CHARTS-ONLY (live tip). */
  --glow-live:       0 0 24px rgba(44, 254, 72, 0.35);    /* @kind other */
  --glow-critical:   0 0 24px rgba(255, 61, 139, 0.35);   /* @kind other */   /* charts live-tip only */

  /* ---------- Cursor glow — a light source, not a tint ------- */
  /* Курсорное свечение карточек. Не самосвечение элемента и не
     заливка ховера: это внешний источник света под содержимым.
     Размер НЕ фиксирован: слой шире карточки на --glow-cursor-spread
     с каждой стороны, градиент берёт farthest-corner от слоя, а
     --glow-cursor-reach задаёт дальний стоп. Стопы — 0 / 18% / 45%, как в
     исходном эффекте; reach вместе с множителем 0.40 в среднем
     стопе и есть ручка размера, если понадобится крутить дальше.
     Видимое пятно — 51–57% ширины карточки по уверенно видимому
     порогу (альфа 0.05), одна и та же доля на любом размере —
     замерено от плашки 217×180 до карточки 1950×1060. Фиксированный
     радиус этого не умеет: 240px на плашке превью — 68% ширины,
     на карточке пайплайна — 9%.
     Пик 0.18: до текста доходит 0.163, поэтому на светящейся
     карточке живёт --text-secondary (5.68:1 при пороге 4.5), а
     --text-muted не живёт: он проваливается ниже порога. */
  --glow-cursor-peak:   rgba(255, 255, 255, 0.18);
  --glow-cursor-mid:    rgba(255, 255, 255, 0.08);
  --glow-cursor-spread: 40%;   /* @kind other */   /* вынос слоя за край карточки */
  --glow-cursor-reach:  45%;   /* @kind other */   /* дальний стоп градиента — ручка размера пятна */

  /* ---------- Control height — one line for every control ---- */
  /* Высота поля ввода, кнопки, чипа и любого контрола в один ряд.
     36 = 1px рамки + --space-1 + строка --small-size × --small-lh
     (21.945) + --space-1 + 1px рамки, округлённо. Контрол задаёт
     min-height и центрует содержимое, а не набирает высоту
     отступами: тогда разный кегль внутри не меняет габарит. */
  --control-h: 36px;   /* @kind other */

  /* ---------- Motion ---------------------------------------- */
  --ease-out:     cubic-bezier(0.22, 1, 0.36, 1);   /* @kind other */
  --ease-sheet:   cubic-bezier(0.16, 1, 0.3, 1);   /* @kind other */
  --motion-100:   100ms;   /* @kind other */   /* tab switch, small UI change */
  --motion-150:   150ms;   /* @kind other */   /* hover / focus reveal */
  --motion-200:   200ms;   /* @kind other */   /* live metric tick (fade-swap) */
  --motion-300:   300ms;   /* @kind other */   /* sheet, modal, page enter */
  /* Legacy aliases — same four durations, kept for existing components. */
  --dur-tab:      var(--motion-100);   /* @kind other */
  --dur-hover:    var(--motion-150);   /* @kind other */
  --dur-tick:     var(--motion-200);   /* @kind other */
  --dur-sheet:    var(--motion-300);   /* @kind other */
  /* Pulse rhythm — one beat for every LIVE pulse; the accelerated
     critical rhythm belongs to the charts-only critical live tip. */
  --pulse-duration:          2s;     /* @kind other */
  --pulse-duration-critical: 0.9s;   /* @kind other */
  /* Skeleton / loading breathe — deliberately off the LIVE beat so a
     loading screen never reads as "running now". */
  --skeleton-duration:       3.2s;   /* @kind other */

  /* ---------- Hover-reveal pattern -------------------------- */
  /* Rest opacity for revealed secondary controls. Above the old 0.15,
     which was invisible rather than quiet. Reveal is for REDUNDANT
     affordances only — never the sole carrier of a value. */
  --reveal-rest:    0.32;   /* @kind other */
  --reveal-active:  1;   /* @kind other */
  /* Row-level hover wash — the ceiling. Brighter, or on non-row elements: forbidden. */
  --hover-row:      rgba(255, 255, 255, 0.03);

  /* ---------- Charts ----------------------------------------- */
  --chart-grid:      rgba(255, 255, 255, 0.08);   /* 0.5px, off by default */
  --chart-fill-top:  rgba(255, 255, 255, 0.10);   /* area gradient top */
  /* Warning threshold dash. Role: this line is the mandatory redundant
     carrier for coloured data fills — "the bar crossed the dash" must read
     without colour — so its own contrast can never drop below the 3:1
     non-text threshold (WCAG 2.2 §1.4.11). At 0.40 it measures 3.69:1 on
     --canvas, 3.82:1 on --surface-1, 3.78:1 on --surface-2. (At the former
     0.30 it failed all three: 2.50 / 2.66 / 2.71.) Floor is 0.38; stays one
     step below --chart-axis 0.48 so the service-graphic hierarchy holds. */
  --chart-threshold: rgba(255, 255, 255, 0.40);
  --chart-axis:      rgba(255, 255, 255, 0.48);   /* chart service graphics: x tick labels AND the hover crosshair. Same alpha as --status-queued, passes small text. Never 0.40. */

  /* Data-graphic fills — the ONLY fills in the system. Legal on bars,
     segments, areas and coverage strips, where the colour IS the measured
     value. Never on a container (card, panel, chip, row, banner, tooltip).
     Why 0.70 and not solid: solid #FF3D8B sits at almost the same lightness
     as a neutral white bar — 1.34:1 between them — so a filled bar differs
     mainly in hue, which nearly vanishes for an operator with a colour-
     vision deficiency. At 0.70 the bar reads 3.29:1 against the card
     surface (clears the 3:1 non-text threshold) and 2.33:1 against the
     neighbouring neutral bar — twice the separation of solid. No alpha
     clears 3:1 in BOTH directions, so colour here is always a redundant
     signal: a threshold line is always drawn alongside, and "the bar
     crossed the dash" reads without colour at all. */
  --data-blocked: rgba(255, 61, 139, 0.70);
  --data-warning: rgba(255, 176, 32, 0.70);

  /* ---------- Veils & edges ---------------------------------- */
  --canvas-veil:  rgba(3, 3, 3, 0.72);   /* top/bottom bars, scrims, chart-label backings */
  /* No --edge-live. A LIVE item wears the ordinary card edge; the pulse
     dot and the radio glyph carry the signal. */
}

/* =============================================================
   Base typography
   ============================================================= */
html, body {
  background: var(--canvas);
  color: var(--text-primary);
  font-family: var(--font-sans);
  font-size: var(--body-size);
  font-weight: var(--weight-body);
  line-height: var(--body-lh);
  letter-spacing: var(--body-track);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* Form elements inherit the system type — never UA styles. Closes the
   "black native select on #030303" class of production bugs. */
input, select, textarea, button {
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
}
select option { background: #111113; color: rgba(255, 255, 255, 0.96); }
input::placeholder, textarea::placeholder { color: var(--text-muted); }

/* =============================================================
   Semantic type roles
   ============================================================= */
.t-display, h1.t {
  font-family: var(--font-display);
  font-size: var(--display-size);
  font-weight: var(--weight-display);
  line-height: var(--display-lh);
  letter-spacing: var(--display-track);
  color: var(--text-primary);
}

.t-title, h2.t, h3.t {
  font-family: var(--font-sans);
  font-size: var(--title-size);
  font-weight: var(--weight-strong);
  line-height: var(--title-lh);
  letter-spacing: var(--title-track);
  color: var(--text-primary);
}

.t-body, p.t {
  font-family: var(--font-sans);
  font-size: var(--body-size);
  font-weight: var(--weight-body);
  line-height: var(--body-lh);
  letter-spacing: var(--body-track);
  color: var(--text-secondary);
}

.t-small {
  font-family: var(--font-sans);
  font-size: var(--small-size);
  font-weight: var(--weight-body);
  line-height: var(--small-lh);
  color: var(--text-secondary);
}

.t-label {
  font-family: var(--font-sans);
  font-size: var(--label-size);
  font-weight: var(--weight-strong);
  line-height: var(--label-lh);
  letter-spacing: var(--label-track);
  text-transform: uppercase;
  color: var(--text-secondary);
}

/* Numerics — every metric, latency, ID, kbd. Condensed DIN-style face,
   proportional + tabular figures so columns align and decimals stay tight. */
.t-numeric, .t-metric {
  font-family: var(--font-numeric);
  font-size: var(--small-size);
  font-weight: var(--weight-body);
  line-height: 1.4;
  letter-spacing: 0;
  color: var(--text-primary);
  font-variant-numeric: tabular-nums;
}

/* Source text — the ONE monospace role. Legal only where whitespace and
   column position carry meaning: mermaid source, JSON/YAML, log lines,
   stack traces, shell commands, file paths, diffs, and inline token names.
   Illegal on every value the UI presents as a value — metrics, latency,
   token counts, run IDs, kbd chips. Those are Barlow, always. The test is
   not "does it look technical", it is "would collapsing the whitespace lose
   information". The old .t-mono alias pointed at Barlow and is gone; use
   .t-numeric for numbers and .t-code for source. */
.t-code, code, pre, samp {
  font-family: var(--font-mono);
  font-size: var(--mono-size);
  font-weight: var(--weight-mono);
  line-height: var(--mono-lh);
  letter-spacing: 0;
  color: var(--text-secondary);
  font-variant-numeric: normal;              /* mono is already tabular */
  font-feature-settings: "liga" 0, "calt" 0; /* --> stays three characters */
  tab-size: 2;
}
pre, pre.t-code { white-space: pre; overflow-x: auto; margin: 0; }
code { color: var(--text-primary); }
pre code { font-size: inherit; color: inherit; }

/* =============================================================
   Signature: white-to-transparent text gradient
   Use sparingly — one per screen.
   ============================================================= */
.t-fade {
  background: linear-gradient(90deg,
    rgba(255, 255, 255, 0.96) 0%,
    rgba(255, 255, 255, 0.96) 35%,
    rgba(255, 255, 255, 0.20) 100%);
  -webkit-background-clip: text;
          background-clip: text;
  -webkit-text-fill-color: transparent;
          color: transparent;
}

/* =============================================================
   Surface primitives
   ============================================================= */
.surface-1 {
  background: var(--surface-1);
  backdrop-filter: var(--blur-panel);
  -webkit-backdrop-filter: var(--blur-panel);
  border: 1px solid var(--border-22);
  border-radius: var(--radius-card);
}

.surface-2 {
  background: var(--surface-2);
  backdrop-filter: var(--blur-panel);
  -webkit-backdrop-filter: var(--blur-panel);
  border: 1px solid var(--border-35);
  border-radius: var(--radius-card);
}

.divider {
  height: 1px;
  background: var(--border-22);
  border: 0;
}

/* =============================================================
   Hover-reveal utility
   ============================================================= */
.reveal-group .reveal {
  opacity: var(--reveal-rest);
  transition: opacity var(--dur-hover) var(--ease-out);
}
.reveal-group:hover .reveal,
.reveal-group:focus-within .reveal,
.reveal-group .reveal:focus-within {
  opacity: var(--reveal-active);
}

/* =============================================================
   Cursor glow — карточки. Слой лежит НАД фоном карточки и ПОД
   всем её содержимым за счёт z-index:-1 внутри собственного
   контекста наложения: трогать z-index у детей не нужно.
   ============================================================= */
.glow-card {
  position: relative;
  isolation: isolate;
  overflow: hidden;          /* обрезает свечение по --radius-card */
}
.glow-card::before {
  content: "";
  position: absolute;
  inset: calc(-1 * var(--glow-cursor-spread));
  z-index: -1;
  pointer-events: none;
  opacity: 0;
  background: radial-gradient(
    circle
    at var(--glow-cursor-x, 50%) var(--glow-cursor-y, 50%),
    var(--glow-cursor-peak)   0%,
    var(--glow-cursor-mid)    calc(var(--glow-cursor-reach) * 0.40),
    rgba(255, 255, 255, 0)    var(--glow-cursor-reach));
  filter: var(--blur-heavy);
  transition: opacity var(--dur-tick) var(--ease-out);
}
@media (hover: hover) and (pointer: fine) {
  .glow-card:hover::before { opacity: 1; will-change: opacity; }
}
@media (prefers-reduced-motion: reduce) {
  .glow-card::before { content: none; }
}

/* =============================================================
   Rows own the hover. Внутри .rows-zone свечение карточки гаснет:
   два механизма не спорят за одно движение курсора. Строка —
   более точный ответ, чем подсветка всей плашки.
   ============================================================= */
.rows-zone .row {
  transition: background var(--dur-hover) var(--ease-out);
}
.rows-zone .row:hover {
  background: var(--hover-row);
}
@media (hover: hover) and (pointer: fine) {
  .glow-card:has(.rows-zone:hover)::before { opacity: 0; }
}

/* =============================================================
   Focus — one monochrome ring, system-wide. Keyboard only.
   ============================================================= */
:focus-visible {
  outline: 1px solid var(--focus-ring);
  outline-offset: 2px;
}

/* Status type modifiers */
.is-inactive { color: var(--text-ghosted); }
.is-active   { color: var(--text-primary); font-weight: var(--weight-strong); }

/* =============================================================
   Reduced motion — kill movement, keep the signal.
   The LIVE dot stays visible statically; nothing disappears.
   ============================================================= */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}
