/*
 * GeneOps brand — distributable stylesheet.
 *
 * DO NOT EDIT THIS FILE DIRECTLY. Edit the sources under
 * app/assets/stylesheets/canonical/ or .../provisional/ and run
 * scripts/build-css.sh to regenerate.
 *
 * Source of truth: Figma file tOzBDGYo4PbpYMSKFoXwk5.
 * Token export:    docs/figma-export/
 */

@import url("https://fonts.googleapis.com/css2?family=DM+Mono:wght@500&family=DM+Sans:wght@400;500;600;700&family=Source+Sans+3:wght@400;600&display=swap");

/* ============================================================== */
/* canonical/ — Mikael-derived design system */
/* ============================================================== */

/* --- canonical/settings/tokens-primitive.css --- */
/*
 * Primitive tokens — Layer 1.
 *
 * Raw values exactly as exported from Mikael's Figma file via the
 * Design Tokens Manager plugin (2026-05-19). The export lives at
 * `docs/figma-export/` and is the source of truth.
 *
 * Naming convention mirrors Figma:
 *   `Color/Pink/600`          -> `--color-pink-600`
 *   `Spacing/16`              -> `--spacing-16`
 *   `Corner Radius/lg`        -> `--corner-radius-lg`
 *   `font/Size/14`            -> `--font-size-14`
 *
 * Transparency variants from the export use `_NN%` in Figma; here they
 * become `-NN` suffixes (e.g. `Color/grey/950_50%` -> `--color-grey-950-50`).
 *
 * Nothing in the FORMAL section is invented. Values outside the formal
 * export — gene-attribute fills, ad-hoc widths, derived stroke weights —
 * sit in a clearly labeled AD-HOC section at the bottom and are flagged
 * in NOTES.md for Mikael's review.
 */

:root {

  /* =====================================================================
     FORMAL TOKENS — from Mikael's Core.Core.tokens.json (2026-05-19)
     ===================================================================== */

  /* ---------- White ---------- */
  --color-white-solid: #ffffff;
  --color-white-0-2:   #ffffff01;  /* `Color/white/0.2%` — near-transparent overlay */

  /* ---------- Greyscale ramp (full 11-step) ---------- */
  --color-grey-50:  #fafafa;
  --color-grey-100: #f4f4f6;
  --color-grey-200: #e1e1e5;
  --color-grey-300: #c4c4ca;
  --color-grey-400: #9a9aa2;
  --color-grey-500: #6a6a71;
  --color-grey-600: #505058;
  --color-grey-700: #3f3f46;
  --color-grey-800: #26262b;
  --color-grey-900: #1f1f23;
  --color-grey-950: #17171c;

  /* Transparency aliases used by `Background/Button-Base` in both themes */
  --color-grey-50-50:  #fafafa80;
  --color-grey-50-0:   #fafafa00;
  --color-grey-950-50: #17171c80;
  --color-grey-950-0:  #17171c00;

  /* ---------- Brand Orange (full 11-step) ---------- */
  --color-orange-50:  #fff6f2;
  --color-orange-100: #ffe9db;
  --color-orange-200: #ffd1b4;
  --color-orange-300: #ffb182;
  --color-orange-400: #ff8b4a;
  --color-orange-500: #ff6b24;
  --color-orange-600: #ff5005;  /* primary brand orange */
  --color-orange-700: #cd3c01;
  --color-orange-800: #912901;
  --color-orange-900: #5b1901;
  --color-orange-950: #360e01;

  /* ---------- Brand Pink (full 11-step) ---------- */
  --color-pink-50:  #fff0f7;
  --color-pink-100: #ffdbee;
  --color-pink-200: #ffb6de;
  --color-pink-300: #ff86c7;
  --color-pink-400: #ff51a5;
  --color-pink-500: #ff2d8b;
  --color-pink-600: #ff0f6f;   /* primary brand pink */
  --color-pink-700: #cc0352;
  --color-pink-800: #8f0239;
  --color-pink-900: #5a0124;
  --color-pink-950: #350115;

  /* ---------- Brand Gradient ----------
     From `color.styles.tokens.json`: 90° linear (= CSS `to right`),
     Pink/600 → Orange/600, with a hover variant Orange/600 → Pink/500. */
  --brand-gradient:       linear-gradient(to right, var(--color-pink-600), var(--color-orange-600));
  --brand-gradient-hover: linear-gradient(to right, var(--color-orange-600), var(--color-pink-500));

  /* ---------- Type families ---------- */
  --font-family-display: "DM Sans", system-ui, sans-serif;
  --font-family-body:    "Source Sans 3", system-ui, sans-serif;
  --font-family-mono:    "DM Mono", ui-monospace, monospace;

  /* ---------- Type weights ---------- */
  --font-weight-400: 400;
  --font-weight-500: 500;
  --font-weight-600: 600;
  --font-weight-700: 700;

  /* ---------- Letter spacing ---------- */
  --font-letter-spacing-tight:  -0.5px;
  --font-letter-spacing-normal: 0;
  --font-letter-spacing-wide:   0.5px;
  --font-letter-spacing-wider:  2px;

  /* ---------- Type sizes ---------- */
  --font-size-12:  12px;
  --font-size-14:  14px;
  --font-size-16:  16px;
  --font-size-18:  18px;
  --font-size-20:  20px;
  --font-size-24:  24px;
  --font-size-32:  32px;
  --font-size-60:  60px;
  --font-size-100: 100px;

  /* ---------- Spacing scale ---------- */
  --spacing-0:  0;
  --spacing-2:  2px;
  --spacing-4:  4px;
  --spacing-8:  8px;
  --spacing-12: 12px;
  --spacing-16: 16px;
  --spacing-24: 24px;
  --spacing-32: 32px;
  --spacing-48: 48px;
  --spacing-80: 80px;

  /* ---------- Corner radius ---------- */
  --corner-radius-xs:   4px;
  --corner-radius-sm:   8px;
  --corner-radius-md:   16px;
  --corner-radius-lg:   32px;
  --corner-radius-full: 9999px;

  /* ---------- Stroke weight ---------- */
  --stroke-weight-0-5: 0.5px;
  --stroke-weight-1:   1px;
  --stroke-weight-2:   2px;

  /* ---------- Layout widths ---------- */
  --width-740:  740px;
  --width-1296: 1296px;

  /* =====================================================================
     AD-HOC VALUES — NOT in Mikael's formal variable export
     ---------------------------------------------------------------------
     These were captured by the original per-node Figma extraction and are
     still referenced by demo/landing markup and a few utility classes.
     They are NOT design-system tokens — they're ad-hoc fills/measurements
     from individual frames. Flagged in NOTES.md for Mikael's review: keep,
     promote to formal tokens, or remove.
     ===================================================================== */

  /* Gene-attribute palette — five hue families used in light-frame fills.
     Not part of Mikael's variable collection. NOTES.md #3 / #4. */
  --color-spring-green-30:    #009966;
  --color-spring-green-37:    #00bc7d;
  --color-spring-green-42:    #00d492;
  --color-spring-green-15-40: #004f3b66;
  --color-spring-green-15-60: #004f3b99;

  --color-cyan-24:    #00786f;
  --color-cyan-29:    #009689;
  --color-cyan-42:    #00d5be;
  --color-cyan-9-40:  #002c2266;
  --color-cyan-10-40: #022f2e66;
  --color-cyan-18-30: #0b4f4a4d;
  --color-cyan-37-20: #00bba733;

  --color-azure-66:    #51a2ff;
  --color-azure-33-40: #1c398e66;

  --color-violet-76:    #a684ff;
  --color-violet-35-40: #4d179a66;

  /* Ad-hoc gene-attribute oranges (lowercase `color/orange/...` in Figma,
     distinct from brand Orange above). Numeric suffixes don't collide
     today, but the namespace conflation is risky. NOTES.md #4. */
  --color-orange-gene-50:    #ffba00;
  --color-orange-gene-25-40: #7b330666;

  /* Convenience black — not in the variable export, used by some
     monochrome SVG overlays. */
  --color-black-solid: #000000;

  /* Derived widths used by demo/landing — half-card derivations from the
     1296px container with various gutter assumptions. Not formal tokens. */
  --width-320:  320px;
  --width-584:  584px;  /* (1296 - 2*48 - 32) / 2 */
  --width-672:  672px;
  --width-896:  896px;

}

/* --- canonical/settings/tokens-semantic.css --- */
/*
 * Semantic tokens — Layer 2.
 *
 * Role-based names (Background/Surface 1, Text/Primary, etc.) mapped to
 * primitives. Two themes — dark (default, GeneOps brand) and light —
 * straight from Mikael's `Color.Dark.tokens.json` and
 * `Color.Light.tokens.json` (see docs/figma-export/).
 *
 * Theme selection:
 *   <html>                       -> dark theme (default)
 *   <html class="theme-light">   -> light theme
 *   <html class="theme-dark">    -> explicit dark
 *
 * Every value here comes from the export. Nothing invented.
 */

:root,
.theme-dark {
  /* ---------- Background ---------- */
  --background-base:        var(--color-grey-950);     /* #17171c */
  --background-surface-1:   var(--color-grey-900);     /* #1f1f23 */
  --background-surface-2:   var(--color-grey-800);     /* #26262b */
  --background-hover:       var(--color-grey-700);     /* #3f3f46 */
  --background-button-base: var(--color-grey-950-50);  /* #17171c80 */

  /* ---------- Text ---------- */
  --text-primary:     var(--color-grey-50);    /* #fafafa */
  --text-secondary:   var(--color-grey-400);   /* #9a9aa2 */
  --text-tertiary:    var(--color-grey-500);   /* #6a6a71 */
  --text-disabled:    var(--color-grey-700);   /* #3f3f46 */
  --text-light:       var(--color-grey-50);    /* #fafafa */
  --text-hover:       var(--color-grey-200);   /* #e1e1e5 */
  --text-protective:  #7c86ff;                 /* literal in Mikael's export */
  --text-risk-factor: var(--color-orange-600); /* #ff5005 */

  /* ---------- Border ---------- */
  --border-strong:  var(--color-grey-500);   /* #6a6a71 */
  --border-default: var(--color-grey-700);   /* #3f3f46 */
  --border-subtle:  var(--color-grey-800);   /* #26262b */

  /* ---------- Symbol ---------- */
  --symbol-default:  var(--color-grey-400);   /* #9a9aa2 */
  --symbol-hover:    var(--color-grey-200);   /* #e1e1e5 */
  --symbol-disabled: var(--color-grey-600);   /* #505058 */
  --symbol-strong:   var(--color-grey-50);    /* #fafafa */
  --symbol-light:    var(--color-grey-50);    /* #fafafa */

  /* ---------- Effect ---------- */
  --effect-button-shadow: var(--color-pink-800);  /* #8f0239 */
}

.theme-light {
  /* ---------- Background ---------- */
  --background-base:        var(--color-grey-50);    /* #fafafa */
  --background-surface-1:   var(--color-grey-100);   /* #f4f4f6 */
  --background-surface-2:   var(--color-grey-200);   /* #e1e1e5 */
  --background-hover:       var(--color-grey-300);   /* #c4c4ca */
  --background-button-base: var(--color-grey-50-50); /* #fafafa80 */

  /* ---------- Text ---------- */
  --text-primary:     var(--color-grey-950);   /* #17171c */
  --text-secondary:   var(--color-grey-500);   /* #6a6a71 */
  --text-tertiary:    var(--color-grey-400);   /* #9a9aa2 */
  --text-disabled:    var(--color-grey-200);   /* #e1e1e5 */
  --text-light:       var(--color-grey-50);    /* #fafafa */
  --text-hover:       var(--color-grey-700);   /* #3f3f46 */
  --text-protective:  #7c86ff;                 /* literal in Mikael's export */
  --text-risk-factor: var(--color-orange-600); /* #ff5005 */

  /* ---------- Border ---------- */
  --border-strong:  var(--color-grey-500);   /* #6a6a71 */
  --border-default: var(--color-grey-300);   /* #c4c4ca */
  --border-subtle:  var(--color-grey-200);   /* #e1e1e5 */

  /* ---------- Symbol ---------- */
  --symbol-default:  var(--color-grey-500);   /* #6a6a71 */
  --symbol-hover:    var(--color-grey-700);   /* #3f3f46 */
  --symbol-disabled: var(--color-grey-400);   /* #9a9aa2 */
  --symbol-strong:   var(--color-grey-950);   /* #17171c */
  --symbol-light:    var(--color-grey-50);    /* #fafafa */

  /* ---------- Effect ---------- */
  --effect-button-shadow: var(--color-pink-200);  /* #ffb6de */
}

/* --- canonical/objects/layout.css --- */
/*
 * Layout objects — Layer 2 (ITCSS objects).
 *
 * Token-bound structural primitives: container, section, stacks,
 * rows, clusters, grids, measures, alignment, padding/margin shorthands,
 * borders, and small reset helpers. No color decisions beyond
 * border-subtle. Mikael-derived.
 */

/* ---------- Container ---------- */
/* Figma frame: centered 1296px container with 48px side padding. */
.container {
  width: 100%;
  max-width: var(--width-1296);
  margin-inline: auto;
  padding-inline: var(--spacing-48);
  box-sizing: border-box;
}

/* ---------- Section spacing ---------- */
.section { padding-block: var(--spacing-80); }
.section--tight { padding-block: var(--spacing-48); }

/* ---------- Surface card ---------- */
/* Figma "Background+Border" treatment: surface-1 fill, 32px padding, lg radius. */
.surface-card {
  background-color: var(--background-surface-1);
  padding: var(--spacing-32);
  border-radius: var(--corner-radius-lg);
}
.surface-card--unpadded { padding: 0; overflow: hidden; }
.surface-card--padded-48 { padding: var(--spacing-48); }
.surface-card--surface-2 { background-color: var(--background-surface-2); }

/* ---------- Vertical stacks ---------- */
.stack { display: flex; flex-direction: column; align-items: flex-start; }
.stack-2  { display: flex; flex-direction: column; gap: var(--spacing-2); }
.stack-4  { display: flex; flex-direction: column; gap: var(--spacing-4); }
.stack-8  { display: flex; flex-direction: column; gap: var(--spacing-8); }
.stack-12 { display: flex; flex-direction: column; gap: var(--spacing-12); }
.stack-16 { display: flex; flex-direction: column; gap: var(--spacing-16); }
.stack-24 { display: flex; flex-direction: column; gap: var(--spacing-24); }
.stack-32 { display: flex; flex-direction: column; gap: var(--spacing-32); }
.stack-48 { display: flex; flex-direction: column; gap: var(--spacing-48); }
.stack-80 { display: flex; flex-direction: column; gap: var(--spacing-80); }

.stack-center { align-items: center; }

/* ---------- Horizontal clusters (wrap) ---------- */
.cluster-4  { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-4); }
.cluster-8  { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-8); }
.cluster-12 { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-12); }
.cluster-16 { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-16); }
.cluster-24 { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-24); }
.cluster-32 { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-32); }

/* ---------- Horizontal rows (no wrap) ---------- */
.row-8  { display: flex; align-items: center; gap: var(--spacing-8); }
.row-12 { display: flex; align-items: center; gap: var(--spacing-12); }
.row-16 { display: flex; align-items: center; gap: var(--spacing-16); }
.row-24 { display: flex; align-items: center; gap: var(--spacing-24); }
.row-32 { display: flex; align-items: center; gap: var(--spacing-32); }
.row-48 { display: flex; align-items: center; gap: var(--spacing-48); }
.row-between { justify-content: space-between; }
.row-end     { justify-content: flex-end; }
.row-grow > * { flex: 1 1 0; min-width: 0; }

/* ---------- Grids ---------- */
.grid-2-32 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--spacing-32); }
.grid-3-32 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--spacing-32); }
.grid-4-32 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--spacing-32); }
.grid-2-16 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--spacing-16); }

/* ---------- Width constraints (formal Figma widths) ---------- */
.measure-740  { max-width: var(--width-740);  width: 100%; }
.measure-1296 { max-width: var(--width-1296); width: 100%; }

/* ---------- Text alignment + transform ---------- */
.text-center  { text-align: center; }
.text-left    { text-align: left; }
.text-right   { text-align: right; }
.uppercase    { text-transform: uppercase; }
.normal-case  { text-transform: none; }
.no-underline { text-decoration: none; }

/* ---------- Flex item alignment ---------- */
.items-start    { align-items: flex-start; }
.items-center   { align-items: center; }
.items-baseline { align-items: baseline; }
.justify-center { justify-content: center; }
.self-start     { align-self: flex-start; }
.self-center    { align-self: center; }
.grow           { flex: 1 0 0; min-width: 0; }

/* ---------- Position ---------- */
.relative { position: relative; }

/* ---------- Reset ---------- */
.list-reset { list-style: none; padding-left: 0; }
.mx-auto    { margin-inline: auto; }

/* ---------- Padding shorthands ---------- */
.pt-8   { padding-top:    var(--spacing-8); }
.pt-12  { padding-top:    var(--spacing-12); }
.pb-32  { padding-bottom: var(--spacing-32); }
.pl-32  { padding-left:   var(--spacing-32); }
.padded-16   { padding: var(--spacing-16); }
.padded-24   { padding: var(--spacing-24); }
.padded-48   { padding: var(--spacing-48); }

/* Single-line text truncation. min-width: 0 so it can shrink inside flex. */
.truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

/* ---------- Margin shorthands ---------- */
.mt-2   { margin-top: var(--spacing-2); }

/* ---------- Border helpers ---------- */
.bordered-left { border-left: var(--stroke-weight-1) solid var(--border-subtle); }

/* --- canonical/objects/typography.css --- */
/*
 * Typography composites — Layer 3.
 *
 * One class per Figma typography composite (Headline/xxl, Body/md, etc.).
 * Class names mirror the Figma name verbatim, lowercased with `/` and
 * spaces converted to `-`.
 *
 * Values come straight from Mikael's `text.styles.tokens.json` export.
 * Line-heights are unit-less ratios matching the export's percentages
 * (100% -> 1, 115% -> 1.15, 125% -> 1.25, 133% -> 1.33).
 */

/* Universal border-box — without this, padding on full-width elements
 * (like .site-footer) overflows the viewport. */
*, *::before, *::after { box-sizing: border-box; }

body {
  margin: 0;
  background-color: var(--background-base);
  color: var(--text-primary);
  font-family: var(--font-family-body);
  font-size: var(--font-size-16);
  line-height: 1.25;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* Sticky footer: paired with `.site-footer { margin-top: auto }` so
     the footer sits at the viewport bottom on short pages and just
     under the last section on long ones. */
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

/* Margin reset: the design system controls vertical rhythm via stack/
   gap tokens, not UA defaults. */
h1, h2, h3, h4, h5, h6,
p, blockquote, figure,
ul, ol, dl, dd { margin: 0; }
ul, ol { padding-left: 0; }

/* Links inherit color and decoration from their surroundings — the
   design system styles links explicitly via .link-inline / .button etc. */
a {
  color: inherit;
  text-decoration: inherit;
}

/* Buttons strip UA chrome by default so any <button> can be styled as
   a card/toggle/tab without fighting the OS look. The brand .button
   class re-applies its own appearance on top. */
button {
  background-color: transparent;
  background-image: none;
  border: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  cursor: pointer;
}

/* Form controls inherit theme colors so dark mode doesn't render UA-default
   black text on transparent inputs. Component styles (.form-input etc.)
   re-apply specific surfaces on top. */
input, textarea, select {
  font: inherit;
  color: var(--text-primary);
  background-color: transparent;
}
input::placeholder, textarea::placeholder { color: var(--text-tertiary); }

/* Element-level heading defaults so unclassed <h1>–<h6> render correctly
   without per-page declarations. Override with the .headline-* composites
   or component CSS when a stronger visual is needed. */
h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-family-display);
  color: var(--text-primary);
}
h1 { font-size: var(--font-size-32); font-weight: var(--font-weight-700); line-height: 1.15; }
h2 { font-size: var(--font-size-24); font-weight: var(--font-weight-700); line-height: 1.25; }
h3 { font-size: var(--font-size-18); font-weight: var(--font-weight-600); line-height: 1.4; }
h4 { font-size: var(--font-size-16); font-weight: var(--font-weight-600); line-height: 1.4; }
h5 { font-size: var(--font-size-14); font-weight: var(--font-weight-600); line-height: 1.4; }
h6 { font-size: var(--font-size-12); font-weight: var(--font-weight-600); line-height: 1.4; text-transform: uppercase; letter-spacing: 0.05em; }

/* Surface cards that host an absolutely-positioned anchor element
   (pills like "Early bird pricing", "Example", "Full access") need
   a positioning context. */
.surface-card:has(> .card-anchor) {
  position: relative;
}

/* ---------- Headline ---------- */
/* .headline-xxl scales 100 → 60 → 32 per Mikael 2026-05-19 so the hero
   headline doesn't clip on narrow viewports. Figma defines only the
   100px desktop value; breakpoints chosen to match the page's other
   reflow points (≤1024 tablet, ≤640 mobile). */
.headline-xxl {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-700);
  font-size: var(--font-size-100);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-tight);
}
@media (max-width: 1024px) {
  .headline-xxl { font-size: var(--font-size-60); }
}
@media (max-width: 640px) {
  .headline-xxl { font-size: var(--font-size-32); }
}
.headline-xl {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-700);
  font-size: var(--font-size-60);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-tight);
}
.headline-lg {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-700);
  font-size: var(--font-size-32);
  line-height: 1.15;
  letter-spacing: var(--font-letter-spacing-tight);
}
.headline-md {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-700);
  font-size: var(--font-size-24);
  line-height: 1.15;
  letter-spacing: var(--font-letter-spacing-tight);
}
.headline-sm {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-700);
  font-size: var(--font-size-20);
  line-height: 1.15;
  letter-spacing: var(--font-letter-spacing-tight);
}
.headline-xs {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-14);
  line-height: 1.15;
  letter-spacing: var(--font-letter-spacing-normal);
}

/* ---------- Subtitle ---------- */
.subtitle-lg {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-500);
  font-size: var(--font-size-24);
  line-height: 1.33;
  letter-spacing: 0;
}
.subtitle-md {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-500);
  font-size: var(--font-size-20);
  line-height: 1.33;
  letter-spacing: 0;
}

/* ---------- Body ---------- */
.body-lg {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-400);
  font-size: var(--font-size-18);
  line-height: 1.25;
  letter-spacing: var(--font-letter-spacing-normal);
}
.body-lg-bold {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-18);
  line-height: 1.25;
  letter-spacing: var(--font-letter-spacing-normal);
}
.body-md {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-400);
  font-size: var(--font-size-16);
  line-height: 1.25;
  letter-spacing: var(--font-letter-spacing-normal);
}
.body-md-bold {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-16);
  line-height: 1.25;
  letter-spacing: var(--font-letter-spacing-normal);
}
.body-sm {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-400);
  font-size: var(--font-size-14);
  line-height: 1;
  letter-spacing: 0;
}
.body-sm-bold {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-14);
  line-height: 1;
  letter-spacing: 0;
}

/* ---------- Label (uppercase) ---------- */
.label-md {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-16);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-wider);
  text-transform: uppercase;
}
.label-sm {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-14);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-wider);
  text-transform: uppercase;
}
.label-xs {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-12);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-wide);
  text-transform: uppercase;
}

/* ---------- Data (mono) ---------- */
.data-sm {
  font-family: var(--font-family-mono);
  font-weight: var(--font-weight-500);
  font-size: var(--font-size-12);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-normal);
}

/* --- canonical/utilities/icons.css --- */
/*
 * Icons — Layer 3 (ITCSS utilities).
 *
 * Generic mask-based icon primitive. The SVG is loaded as a CSS mask,
 * the element's `background-color` (set to currentColor) shows through,
 * so the icon follows the parent's color including hover/theme flips.
 *
 * Five icons exist as formal Figma components: chevron-right, check,
 * ai, task, change. The remaining icons are Mikael-blessed per
 * docs/answers-from-mikael.md ("keep the existing icons") and treated
 * as part of the system.
 */

.icon {
  display: inline-block;
  flex-shrink: 0;
  width: var(--spacing-24);
  height: var(--spacing-24);
  background-color: currentColor;
  -webkit-mask-position: center;
          mask-position: center;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-size: contain;
          mask-size: contain;
}
.icon--12 { width: var(--spacing-12); height: var(--spacing-12); }
.icon--16 { width: var(--spacing-16); height: var(--spacing-16); }
.icon--20 { width: 20px;              height: 20px; }
.icon--24 { width: var(--spacing-24); height: var(--spacing-24); }
.icon--28 { width: 28px;              height: 28px; }

/* ---------- Formal Figma component icons (5) ---------- */
.icon-task          { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE0LjQ5NjEgMlYxVjFWMlpNOS40OTYwOSAyVjFWMVYyWk05LjQ5NjA5IDVWNlY2VjVaTTE0LjQ5NjEgNVY2VjZWNVpNMTkuMTE3MSA0LjM2MkwxOC40MDk0IDUuMDY4NTZMMTguNDEwOCA1LjA2OTkxTDE5LjExNzEgNC4zNjJaTTE5LjExNzEgMjEuMTIxTDE4LjQxMDQgMjAuNDEzNUwxOC40MDk2IDIwLjQxNDNMMTkuMTE3MSAyMS4xMjFaTTQuODc1MDkgNC4zNjJMNS41ODE4IDUuMDY5NTFMNS41ODI3NSA1LjA2ODU2TDQuODc1MDkgNC4zNjJaTTguNDk2MDkgMTJMNy43ODgwNyAxMi43MDYyQzcuOTg2NTQgMTIuOTA1MiA4LjI1OTYgMTMuMDExNSA4LjU0MDM3IDEyLjk5OUM4LjgyMTE1IDEyLjk4NjYgOS4wODM3MyAxMi44NTY1IDkuMjYzODIgMTIuNjQwOEw4LjQ5NjA5IDEyWk04LjYyNTA5IDE4QzkuMTc3MzggMTggOS42MjUwOSAxNy41NTIzIDkuNjI1MDkgMTdDOS42MjUwOSAxNi40NDc3IDkuMTc3MzggMTYgOC42MjUwOSAxNlYxN1YxOFpNOC41MDAwOSAxNkM3Ljk0NzgxIDE2IDcuNTAwMDkgMTYuNDQ3NyA3LjUwMDA5IDE3QzcuNTAwMDkgMTcuNTUyMyA3Ljk0NzgxIDE4IDguNTAwMDkgMThWMTdWMTZaTTE0LjQ5NjEgMlYxSDkuNDk2MDlWMlYzSDE0LjQ5NjFWMlpNOS40OTYwOSAyVjFDOC44MzMwNSAxIDguMTk3MTcgMS4yNjMzOSA3LjcyODMzIDEuNzMyMjNMOC40MzU0MyAyLjQzOTM0TDkuMTQyNTQgMy4xNDY0NUM5LjIzNjMxIDMuMDUyNjggOS4zNjM0OSAzIDkuNDk2MDkgM1YyWk04LjQzNTQzIDIuNDM5MzRMNy43MjgzMyAxLjczMjIzQzcuMjU5NDkgMi4yMDEwNyA2Ljk5NjA5IDIuODM2OTYgNi45OTYwOSAzLjVINy45OTYwOUg4Ljk5NjA5QzguOTk2MDkgMy4zNjczOSA5LjA0ODc3IDMuMjQwMjIgOS4xNDI1NCAzLjE0NjQ1TDguNDM1NDMgMi40MzkzNFpNNy45OTYwOSAzLjVINi45OTYwOUM2Ljk5NjA5IDQuMTYzMDQgNy4yNTk0OSA0Ljc5ODkzIDcuNzI4MzMgNS4yNjc3N0w4LjQzNTQzIDQuNTYwNjZMOS4xNDI1NCAzLjg1MzU1QzkuMDQ4NzcgMy43NTk3OCA4Ljk5NjA5IDMuNjMyNjEgOC45OTYwOSAzLjVINy45OTYwOVpNOC40MzU0MyA0LjU2MDY2TDcuNzI4MzMgNS4yNjc3N0M4LjE5NzE3IDUuNzM2NjEgOC44MzMwNSA2IDkuNDk2MDkgNlY1VjRDOS4zNjM0OSA0IDkuMjM2MzEgMy45NDczMiA5LjE0MjU0IDMuODUzNTVMOC40MzU0MyA0LjU2MDY2Wk05LjQ5NjA5IDVWNkgxNC40OTYxVjVWNEg5LjQ5NjA5VjVaTTE0LjQ5NjEgNVY2QzE1LjE1OTEgNiAxNS43OTUgNS43MzY2MSAxNi4yNjM5IDUuMjY3NzdMMTUuNTU2OCA0LjU2MDY2TDE0Ljg0OTYgMy44NTM1NUMxNC43NTU5IDMuOTQ3MzIgMTQuNjI4NyA0IDE0LjQ5NjEgNFY1Wk0xNS41NTY4IDQuNTYwNjZMMTYuMjYzOSA1LjI2Nzc3QzE2LjczMjcgNC43OTg5MyAxNi45OTYxIDQuMTYzMDQgMTYuOTk2MSAzLjVIMTUuOTk2MUgxNC45OTYxQzE0Ljk5NjEgMy42MzI2MSAxNC45NDM0IDMuNzU5NzggMTQuODQ5NiAzLjg1MzU1TDE1LjU1NjggNC41NjA2NlpNMTUuOTk2MSAzLjVIMTYuOTk2MUMxNi45OTYxIDIuODM2OTYgMTYuNzMyNyAyLjIwMTA3IDE2LjI2MzkgMS43MzIyM0wxNS41NTY4IDIuNDM5MzRMMTQuODQ5NiAzLjE0NjQ1QzE0Ljk0MzQgMy4yNDAyMiAxNC45OTYxIDMuMzY3MzkgMTQuOTk2MSAzLjVIMTUuOTk2MVpNMTUuNTU2OCAyLjQzOTM0TDE2LjI2MzkgMS43MzIyM0MxNS43OTUgMS4yNjMzOSAxNS4xNTkxIDEgMTQuNDk2MSAxVjJWM0MxNC42Mjg3IDMgMTQuNzU1OSAzLjA1MjY4IDE0Ljg0OTYgMy4xNDY0NUwxNS41NTY4IDIuNDM5MzRaTTE1Ljk5NjEgMy41TDE1Ljk2NTkgNC40OTk1NEMxNy41MzUyIDQuNTQ3MDEgMTguMDc2MiA0LjczNDgxIDE4LjQwOTQgNS4wNjg1NkwxOS4xMTcxIDQuMzYyTDE5LjgyNDggMy42NTU0NEMxOC44NzYgMi43MDUxOSAxNy41NjUgMi41NDY5OSAxNi4wMjYzIDIuNTAwNDZMMTUuOTk2MSAzLjVaTTE5LjExNzEgNC4zNjJMMTguNDEwOCA1LjA2OTkxQzE4LjYzMzUgNS4yOTIxNCAxOC44MDEgNS42MTg2NSAxOC44OTYgNi4zMjQyMkMxOC45OTUgNy4wNTg3MSAxOC45OTcxIDguMDM5NjggMTguOTk3MSA5LjQ4MkgxOS45OTcxSDIwLjk5NzFDMjAuOTk3MSA4LjA5NjMyIDIwLjk5OTIgNi45NTYyOSAyMC44NzgxIDYuMDU3MjhDMjAuNzUzMiA1LjEyOTM1IDIwLjQ4MDcgNC4zMDk4NiAxOS44MjM0IDMuNjU0MDlMMTkuMTE3MSA0LjM2MlpNMTkuOTk3MSA5LjQ4MkgxOC45OTcxVjE2SDE5Ljk5NzFIMjAuOTk3MVY5LjQ4MkgxOS45OTcxWk0xOS45OTcxIDE2SDE4Ljk5NzFDMTguOTk3MSAxNy40NDIzIDE4Ljk5NSAxOC40MjMzIDE4Ljg5NiAxOS4xNTc5QzE4LjgwMSAxOS44NjM2IDE4LjYzMzUgMjAuMTkwNiAxOC40MTA0IDIwLjQxMzVMMTkuMTE3MSAyMS4xMjFMMTkuODIzOCAyMS44Mjg1QzIwLjQ4MDcgMjEuMTcyNCAyMC43NTMyIDIwLjM1MjkgMjAuODc4MSAxOS40MjQ4QzIwLjk5OTIgMTguNTI1NyAyMC45OTcxIDE3LjM4NTcgMjAuOTk3MSAxNkgxOS45OTcxWk0xOS4xMTcxIDIxLjEyMUwxOC40MDk2IDIwLjQxNDNDMTguMTg3NSAyMC42MzY3IDE3Ljg2MDcgMjAuODA0MSAxNy4xNTQ3IDIwLjg5OUMxNi40MTk5IDIwLjk5NzkgMTUuNDM4OSAyMSAxMy45OTcxIDIxVjIyVjIzQzE1LjM4MjMgMjMgMTYuNTIyMiAyMy4wMDIxIDE3LjQyMTMgMjIuODgxMkMxOC4zNDkgMjIuNzU2NCAxOS4xNjg3IDIyLjQ4NDMgMTkuODI0NiAyMS44Mjc3TDE5LjExNzEgMjEuMTIxWk0xMy45OTcxIDIyVjIxSDkuOTk3MDlWMjJWMjNIMTMuOTk3MVYyMlpNOS45OTcwOSAyMlYyMUM4LjU1MzggMjEgNy41NzIyMyAyMC45OTc5IDYuODM3MzggMjAuODk5QzYuMTMxMzMgMjAuODA0MSA1LjgwNDc2IDIwLjYzNjcgNS41ODI2IDIwLjQxNDNMNC44NzUwOSAyMS4xMjFMNC4xNjc1OCAyMS44Mjc3QzQuODIzNDIgMjIuNDg0MyA1LjY0Mjg2IDIyLjc1NjQgNi41NzA4MSAyMi44ODEyQzcuNDY5OTYgMjMuMDAyMSA4LjYxMDM5IDIzIDkuOTk3MDkgMjNWMjJaTTQuODc1MDkgMjEuMTIxTDUuNTgyNiAyMC40MTQzQzUuMzU5OTIgMjAuMTkxNCA1LjE5MjQ3IDE5Ljg2MzkgNS4wOTc0IDE5LjE1NzlDNC45OTg0NyAxOC40MjMyIDQuOTk2MDkgMTcuNDQyMSA0Ljk5NjA5IDE2SDMuOTk2MDlIMi45OTYwOUMyLjk5NjA5IDE3LjM4NTkgMi45OTQyMiAxOC41MjU4IDMuMTE1MjkgMTkuNDI0OEMzLjI0MDIyIDIwLjM1MjYgMy41MTIyNyAyMS4xNzE2IDQuMTY3NTggMjEuODI3N0w0Ljg3NTA5IDIxLjEyMVpNMy45OTYwOSAxNkg0Ljk5NjA5VjkuNDgzSDMuOTk2MDlIMi45OTYwOVYxNkgzLjk5NjA5Wk0zLjk5NjA5IDkuNDgzSDQuOTk2MDlDNC45OTYwOSA4LjA0MDczIDQuOTk4MjIgNy4wNTkzOSA1LjA5NzA1IDYuMzI0NTRDNS4xOTIwMiA1LjYxODM2IDUuMzU5NDQgNS4yOTE2MSA1LjU4MTggNS4wNjk1MUw0Ljg3NTA5IDQuMzYyTDQuMTY4MzkgMy42NTQ0OUMzLjUxMTc0IDQuMzEwMzkgMy4yMzk2NyA1LjEzMDE0IDMuMTE0ODkgNi4wNTc5NkMyLjk5Mzk3IDYuOTU3MTEgMi45OTYwOSA4LjA5NzI3IDIuOTk2MDkgOS40ODNIMy45OTYwOVpNNC44NzUwOSA0LjM2Mkw1LjU4Mjc1IDUuMDY4NTZDNS45MTU5NCA0LjczNDg1IDYuNDU3ODQgNC41NDcwMSA4LjAyNjM0IDQuNDk5NTRMNy45OTYwOSAzLjVMNy45NjU4NCAyLjUwMDQ2QzYuNDI4MzQgMi41NDY5OSA1LjExNjI1IDIuNzA1MTUgNC4xNjc0NCAzLjY1NTQ0TDQuODc1MDkgNC4zNjJaTTcgMTAuNUw2LjI5MTk3IDExLjIwNjJMNy43ODgwNyAxMi43MDYyTDguNDk2MDkgMTJMOS4yMDQxMiAxMS4yOTM4TDcuNzA4MDMgOS43OTM4Mkw3IDEwLjVaTTguNDk2MDkgMTJMOS4yNjM4MiAxMi42NDA4TDExLjc2NzcgOS42NDA3N0wxMSA5TDEwLjIzMjMgOC4zNTkyM0w3LjcyODM2IDExLjM1OTJMOC40OTYwOSAxMlpNMTMgMTdWMThIMTdWMTdWMTZIMTNWMTdaTTEzIDExVjEySDE3VjExVjEwSDEzVjExWk04LjYyNTA5IDE3VjE2SDguNTAwMDlWMTdWMThIOC42MjUwOVYxN1pNOC43NTAwOSAxN0g3Ljc1MDA5QzcuNzUwMDkgMTYuODAxMSA3LjgyOTExIDE2LjYxMDMgNy45Njk3NiAxNi40Njk3TDguNjc2ODcgMTcuMTc2OEw5LjM4Mzk4IDE3Ljg4MzlDOS42MTg0IDE3LjY0OTUgOS43NTAwOSAxNy4zMzE1IDkuNzUwMDkgMTdIOC43NTAwOVpNOC42NzY4NyAxNy4xNzY4TDcuOTY5NzYgMTYuNDY5N0M4LjExMDQyIDE2LjMyOSA4LjMwMTE4IDE2LjI1IDguNTAwMDkgMTYuMjVWMTcuMjVWMTguMjVDOC44MzE2MSAxOC4yNSA5LjE0OTU2IDE4LjExODMgOS4zODM5OCAxNy44ODM5TDguNjc2ODcgMTcuMTc2OFpNOC41MDAwOSAxNy4yNVYxNi4yNUM4LjY5OSAxNi4yNSA4Ljg4OTc3IDE2LjMyOSA5LjAzMDQyIDE2LjQ2OTdMOC4zMjMzMiAxNy4xNzY4TDcuNjE2MjEgMTcuODgzOUM3Ljg1MDYzIDE4LjExODMgOC4xNjg1OCAxOC4yNSA4LjUwMDA5IDE4LjI1VjE3LjI1Wk04LjMyMzMyIDE3LjE3NjhMOS4wMzA0MiAxNi40Njk3QzkuMTcxMDggMTYuNjEwMyA5LjI1MDA5IDE2LjgwMTEgOS4yNTAwOSAxN0g4LjI1MDA5SDcuMjUwMDlDNy4yNTAwOSAxNy4zMzE1IDcuMzgxNzkgMTcuNjQ5NSA3LjYxNjIxIDE3Ljg4MzlMOC4zMjMzMiAxNy4xNzY4Wk04LjI1MDA5IDE3SDkuMjUwMDlDOS4yNTAwOSAxNy4xOTg5IDkuMTcxMDggMTcuMzg5NyA5LjAzMDQyIDE3LjUzMDNMOC4zMjMzMiAxNi44MjMyTDcuNjE2MjEgMTYuMTE2MUM3LjM4MTc5IDE2LjM1MDUgNy4yNTAwOSAxNi42Njg1IDcuMjUwMDkgMTdIOC4yNTAwOVpNOC4zMjMzMiAxNi44MjMyTDkuMDMwNDIgMTcuNTMwM0M4Ljg4OTc3IDE3LjY3MSA4LjY5OSAxNy43NSA4LjUwMDA5IDE3Ljc1VjE2Ljc1VjE1Ljc1QzguMTY4NTggMTUuNzUgNy44NTA2MyAxNS44ODE3IDcuNjE2MjEgMTYuMTE2MUw4LjMyMzMyIDE2LjgyMzJaTTguNTAwMDkgMTYuNzVWMTcuNzVDOC4zMDExOCAxNy43NSA4LjExMDQyIDE3LjY3MSA3Ljk2OTc2IDE3LjUzMDNMOC42NzY4NyAxNi44MjMyTDkuMzgzOTggMTYuMTE2MUM5LjE0OTU2IDE1Ljg4MTcgOC44MzE2MSAxNS43NSA4LjUwMDA5IDE1Ljc1VjE2Ljc1Wk04LjY3Njg3IDE2LjgyMzJMNy45Njk3NiAxNy41MzAzQzcuODI5MTEgMTcuMzg5NyA3Ljc1MDA5IDE3LjE5ODkgNy43NTAwOSAxN0g4Ljc1MDA5SDkuNzUwMDlDOS43NTAwOSAxNi42Njg1IDkuNjE4NCAxNi4zNTA1IDkuMzgzOTggMTYuMTE2MUw4LjY3Njg3IDE2LjgyMzJaIiBmaWxsPSJjdXJyZW50Q29sb3IiLz4KPC9zdmc+Cg==");          mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE0LjQ5NjEgMlYxVjFWMlpNOS40OTYwOSAyVjFWMVYyWk05LjQ5NjA5IDVWNlY2VjVaTTE0LjQ5NjEgNVY2VjZWNVpNMTkuMTE3MSA0LjM2MkwxOC40MDk0IDUuMDY4NTZMMTguNDEwOCA1LjA2OTkxTDE5LjExNzEgNC4zNjJaTTE5LjExNzEgMjEuMTIxTDE4LjQxMDQgMjAuNDEzNUwxOC40MDk2IDIwLjQxNDNMMTkuMTE3MSAyMS4xMjFaTTQuODc1MDkgNC4zNjJMNS41ODE4IDUuMDY5NTFMNS41ODI3NSA1LjA2ODU2TDQuODc1MDkgNC4zNjJaTTguNDk2MDkgMTJMNy43ODgwNyAxMi43MDYyQzcuOTg2NTQgMTIuOTA1MiA4LjI1OTYgMTMuMDExNSA4LjU0MDM3IDEyLjk5OUM4LjgyMTE1IDEyLjk4NjYgOS4wODM3MyAxMi44NTY1IDkuMjYzODIgMTIuNjQwOEw4LjQ5NjA5IDEyWk04LjYyNTA5IDE4QzkuMTc3MzggMTggOS42MjUwOSAxNy41NTIzIDkuNjI1MDkgMTdDOS42MjUwOSAxNi40NDc3IDkuMTc3MzggMTYgOC42MjUwOSAxNlYxN1YxOFpNOC41MDAwOSAxNkM3Ljk0NzgxIDE2IDcuNTAwMDkgMTYuNDQ3NyA3LjUwMDA5IDE3QzcuNTAwMDkgMTcuNTUyMyA3Ljk0NzgxIDE4IDguNTAwMDkgMThWMTdWMTZaTTE0LjQ5NjEgMlYxSDkuNDk2MDlWMlYzSDE0LjQ5NjFWMlpNOS40OTYwOSAyVjFDOC44MzMwNSAxIDguMTk3MTcgMS4yNjMzOSA3LjcyODMzIDEuNzMyMjNMOC40MzU0MyAyLjQzOTM0TDkuMTQyNTQgMy4xNDY0NUM5LjIzNjMxIDMuMDUyNjggOS4zNjM0OSAzIDkuNDk2MDkgM1YyWk04LjQzNTQzIDIuNDM5MzRMNy43MjgzMyAxLjczMjIzQzcuMjU5NDkgMi4yMDEwNyA2Ljk5NjA5IDIuODM2OTYgNi45OTYwOSAzLjVINy45OTYwOUg4Ljk5NjA5QzguOTk2MDkgMy4zNjczOSA5LjA0ODc3IDMuMjQwMjIgOS4xNDI1NCAzLjE0NjQ1TDguNDM1NDMgMi40MzkzNFpNNy45OTYwOSAzLjVINi45OTYwOUM2Ljk5NjA5IDQuMTYzMDQgNy4yNTk0OSA0Ljc5ODkzIDcuNzI4MzMgNS4yNjc3N0w4LjQzNTQzIDQuNTYwNjZMOS4xNDI1NCAzLjg1MzU1QzkuMDQ4NzcgMy43NTk3OCA4Ljk5NjA5IDMuNjMyNjEgOC45OTYwOSAzLjVINy45OTYwOVpNOC40MzU0MyA0LjU2MDY2TDcuNzI4MzMgNS4yNjc3N0M4LjE5NzE3IDUuNzM2NjEgOC44MzMwNSA2IDkuNDk2MDkgNlY1VjRDOS4zNjM0OSA0IDkuMjM2MzEgMy45NDczMiA5LjE0MjU0IDMuODUzNTVMOC40MzU0MyA0LjU2MDY2Wk05LjQ5NjA5IDVWNkgxNC40OTYxVjVWNEg5LjQ5NjA5VjVaTTE0LjQ5NjEgNVY2QzE1LjE1OTEgNiAxNS43OTUgNS43MzY2MSAxNi4yNjM5IDUuMjY3NzdMMTUuNTU2OCA0LjU2MDY2TDE0Ljg0OTYgMy44NTM1NUMxNC43NTU5IDMuOTQ3MzIgMTQuNjI4NyA0IDE0LjQ5NjEgNFY1Wk0xNS41NTY4IDQuNTYwNjZMMTYuMjYzOSA1LjI2Nzc3QzE2LjczMjcgNC43OTg5MyAxNi45OTYxIDQuMTYzMDQgMTYuOTk2MSAzLjVIMTUuOTk2MUgxNC45OTYxQzE0Ljk5NjEgMy42MzI2MSAxNC45NDM0IDMuNzU5NzggMTQuODQ5NiAzLjg1MzU1TDE1LjU1NjggNC41NjA2NlpNMTUuOTk2MSAzLjVIMTYuOTk2MUMxNi45OTYxIDIuODM2OTYgMTYuNzMyNyAyLjIwMTA3IDE2LjI2MzkgMS43MzIyM0wxNS41NTY4IDIuNDM5MzRMMTQuODQ5NiAzLjE0NjQ1QzE0Ljk0MzQgMy4yNDAyMiAxNC45OTYxIDMuMzY3MzkgMTQuOTk2MSAzLjVIMTUuOTk2MVpNMTUuNTU2OCAyLjQzOTM0TDE2LjI2MzkgMS43MzIyM0MxNS43OTUgMS4yNjMzOSAxNS4xNTkxIDEgMTQuNDk2MSAxVjJWM0MxNC42Mjg3IDMgMTQuNzU1OSAzLjA1MjY4IDE0Ljg0OTYgMy4xNDY0NUwxNS41NTY4IDIuNDM5MzRaTTE1Ljk5NjEgMy41TDE1Ljk2NTkgNC40OTk1NEMxNy41MzUyIDQuNTQ3MDEgMTguMDc2MiA0LjczNDgxIDE4LjQwOTQgNS4wNjg1NkwxOS4xMTcxIDQuMzYyTDE5LjgyNDggMy42NTU0NEMxOC44NzYgMi43MDUxOSAxNy41NjUgMi41NDY5OSAxNi4wMjYzIDIuNTAwNDZMMTUuOTk2MSAzLjVaTTE5LjExNzEgNC4zNjJMMTguNDEwOCA1LjA2OTkxQzE4LjYzMzUgNS4yOTIxNCAxOC44MDEgNS42MTg2NSAxOC44OTYgNi4zMjQyMkMxOC45OTUgNy4wNTg3MSAxOC45OTcxIDguMDM5NjggMTguOTk3MSA5LjQ4MkgxOS45OTcxSDIwLjk5NzFDMjAuOTk3MSA4LjA5NjMyIDIwLjk5OTIgNi45NTYyOSAyMC44NzgxIDYuMDU3MjhDMjAuNzUzMiA1LjEyOTM1IDIwLjQ4MDcgNC4zMDk4NiAxOS44MjM0IDMuNjU0MDlMMTkuMTE3MSA0LjM2MlpNMTkuOTk3MSA5LjQ4MkgxOC45OTcxVjE2SDE5Ljk5NzFIMjAuOTk3MVY5LjQ4MkgxOS45OTcxWk0xOS45OTcxIDE2SDE4Ljk5NzFDMTguOTk3MSAxNy40NDIzIDE4Ljk5NSAxOC40MjMzIDE4Ljg5NiAxOS4xNTc5QzE4LjgwMSAxOS44NjM2IDE4LjYzMzUgMjAuMTkwNiAxOC40MTA0IDIwLjQxMzVMMTkuMTE3MSAyMS4xMjFMMTkuODIzOCAyMS44Mjg1QzIwLjQ4MDcgMjEuMTcyNCAyMC43NTMyIDIwLjM1MjkgMjAuODc4MSAxOS40MjQ4QzIwLjk5OTIgMTguNTI1NyAyMC45OTcxIDE3LjM4NTcgMjAuOTk3MSAxNkgxOS45OTcxWk0xOS4xMTcxIDIxLjEyMUwxOC40MDk2IDIwLjQxNDNDMTguMTg3NSAyMC42MzY3IDE3Ljg2MDcgMjAuODA0MSAxNy4xNTQ3IDIwLjg5OUMxNi40MTk5IDIwLjk5NzkgMTUuNDM4OSAyMSAxMy45OTcxIDIxVjIyVjIzQzE1LjM4MjMgMjMgMTYuNTIyMiAyMy4wMDIxIDE3LjQyMTMgMjIuODgxMkMxOC4zNDkgMjIuNzU2NCAxOS4xNjg3IDIyLjQ4NDMgMTkuODI0NiAyMS44Mjc3TDE5LjExNzEgMjEuMTIxWk0xMy45OTcxIDIyVjIxSDkuOTk3MDlWMjJWMjNIMTMuOTk3MVYyMlpNOS45OTcwOSAyMlYyMUM4LjU1MzggMjEgNy41NzIyMyAyMC45OTc5IDYuODM3MzggMjAuODk5QzYuMTMxMzMgMjAuODA0MSA1LjgwNDc2IDIwLjYzNjcgNS41ODI2IDIwLjQxNDNMNC44NzUwOSAyMS4xMjFMNC4xNjc1OCAyMS44Mjc3QzQuODIzNDIgMjIuNDg0MyA1LjY0Mjg2IDIyLjc1NjQgNi41NzA4MSAyMi44ODEyQzcuNDY5OTYgMjMuMDAyMSA4LjYxMDM5IDIzIDkuOTk3MDkgMjNWMjJaTTQuODc1MDkgMjEuMTIxTDUuNTgyNiAyMC40MTQzQzUuMzU5OTIgMjAuMTkxNCA1LjE5MjQ3IDE5Ljg2MzkgNS4wOTc0IDE5LjE1NzlDNC45OTg0NyAxOC40MjMyIDQuOTk2MDkgMTcuNDQyMSA0Ljk5NjA5IDE2SDMuOTk2MDlIMi45OTYwOUMyLjk5NjA5IDE3LjM4NTkgMi45OTQyMiAxOC41MjU4IDMuMTE1MjkgMTkuNDI0OEMzLjI0MDIyIDIwLjM1MjYgMy41MTIyNyAyMS4xNzE2IDQuMTY3NTggMjEuODI3N0w0Ljg3NTA5IDIxLjEyMVpNMy45OTYwOSAxNkg0Ljk5NjA5VjkuNDgzSDMuOTk2MDlIMi45OTYwOVYxNkgzLjk5NjA5Wk0zLjk5NjA5IDkuNDgzSDQuOTk2MDlDNC45OTYwOSA4LjA0MDczIDQuOTk4MjIgNy4wNTkzOSA1LjA5NzA1IDYuMzI0NTRDNS4xOTIwMiA1LjYxODM2IDUuMzU5NDQgNS4yOTE2MSA1LjU4MTggNS4wNjk1MUw0Ljg3NTA5IDQuMzYyTDQuMTY4MzkgMy42NTQ0OUMzLjUxMTc0IDQuMzEwMzkgMy4yMzk2NyA1LjEzMDE0IDMuMTE0ODkgNi4wNTc5NkMyLjk5Mzk3IDYuOTU3MTEgMi45OTYwOSA4LjA5NzI3IDIuOTk2MDkgOS40ODNIMy45OTYwOVpNNC44NzUwOSA0LjM2Mkw1LjU4Mjc1IDUuMDY4NTZDNS45MTU5NCA0LjczNDg1IDYuNDU3ODQgNC41NDcwMSA4LjAyNjM0IDQuNDk5NTRMNy45OTYwOSAzLjVMNy45NjU4NCAyLjUwMDQ2QzYuNDI4MzQgMi41NDY5OSA1LjExNjI1IDIuNzA1MTUgNC4xNjc0NCAzLjY1NTQ0TDQuODc1MDkgNC4zNjJaTTcgMTAuNUw2LjI5MTk3IDExLjIwNjJMNy43ODgwNyAxMi43MDYyTDguNDk2MDkgMTJMOS4yMDQxMiAxMS4yOTM4TDcuNzA4MDMgOS43OTM4Mkw3IDEwLjVaTTguNDk2MDkgMTJMOS4yNjM4MiAxMi42NDA4TDExLjc2NzcgOS42NDA3N0wxMSA5TDEwLjIzMjMgOC4zNTkyM0w3LjcyODM2IDExLjM1OTJMOC40OTYwOSAxMlpNMTMgMTdWMThIMTdWMTdWMTZIMTNWMTdaTTEzIDExVjEySDE3VjExVjEwSDEzVjExWk04LjYyNTA5IDE3VjE2SDguNTAwMDlWMTdWMThIOC42MjUwOVYxN1pNOC43NTAwOSAxN0g3Ljc1MDA5QzcuNzUwMDkgMTYuODAxMSA3LjgyOTExIDE2LjYxMDMgNy45Njk3NiAxNi40Njk3TDguNjc2ODcgMTcuMTc2OEw5LjM4Mzk4IDE3Ljg4MzlDOS42MTg0IDE3LjY0OTUgOS43NTAwOSAxNy4zMzE1IDkuNzUwMDkgMTdIOC43NTAwOVpNOC42NzY4NyAxNy4xNzY4TDcuOTY5NzYgMTYuNDY5N0M4LjExMDQyIDE2LjMyOSA4LjMwMTE4IDE2LjI1IDguNTAwMDkgMTYuMjVWMTcuMjVWMTguMjVDOC44MzE2MSAxOC4yNSA5LjE0OTU2IDE4LjExODMgOS4zODM5OCAxNy44ODM5TDguNjc2ODcgMTcuMTc2OFpNOC41MDAwOSAxNy4yNVYxNi4yNUM4LjY5OSAxNi4yNSA4Ljg4OTc3IDE2LjMyOSA5LjAzMDQyIDE2LjQ2OTdMOC4zMjMzMiAxNy4xNzY4TDcuNjE2MjEgMTcuODgzOUM3Ljg1MDYzIDE4LjExODMgOC4xNjg1OCAxOC4yNSA4LjUwMDA5IDE4LjI1VjE3LjI1Wk04LjMyMzMyIDE3LjE3NjhMOS4wMzA0MiAxNi40Njk3QzkuMTcxMDggMTYuNjEwMyA5LjI1MDA5IDE2LjgwMTEgOS4yNTAwOSAxN0g4LjI1MDA5SDcuMjUwMDlDNy4yNTAwOSAxNy4zMzE1IDcuMzgxNzkgMTcuNjQ5NSA3LjYxNjIxIDE3Ljg4MzlMOC4zMjMzMiAxNy4xNzY4Wk04LjI1MDA5IDE3SDkuMjUwMDlDOS4yNTAwOSAxNy4xOTg5IDkuMTcxMDggMTcuMzg5NyA5LjAzMDQyIDE3LjUzMDNMOC4zMjMzMiAxNi44MjMyTDcuNjE2MjEgMTYuMTE2MUM3LjM4MTc5IDE2LjM1MDUgNy4yNTAwOSAxNi42Njg1IDcuMjUwMDkgMTdIOC4yNTAwOVpNOC4zMjMzMiAxNi44MjMyTDkuMDMwNDIgMTcuNTMwM0M4Ljg4OTc3IDE3LjY3MSA4LjY5OSAxNy43NSA4LjUwMDA5IDE3Ljc1VjE2Ljc1VjE1Ljc1QzguMTY4NTggMTUuNzUgNy44NTA2MyAxNS44ODE3IDcuNjE2MjEgMTYuMTE2MUw4LjMyMzMyIDE2LjgyMzJaTTguNTAwMDkgMTYuNzVWMTcuNzVDOC4zMDExOCAxNy43NSA4LjExMDQyIDE3LjY3MSA3Ljk2OTc2IDE3LjUzMDNMOC42NzY4NyAxNi44MjMyTDkuMzgzOTggMTYuMTE2MUM5LjE0OTU2IDE1Ljg4MTcgOC44MzE2MSAxNS43NSA4LjUwMDA5IDE1Ljc1VjE2Ljc1Wk04LjY3Njg3IDE2LjgyMzJMNy45Njk3NiAxNy41MzAzQzcuODI5MTEgMTcuMzg5NyA3Ljc1MDA5IDE3LjE5ODkgNy43NTAwOSAxN0g4Ljc1MDA5SDkuNzUwMDlDOS43NTAwOSAxNi42Njg1IDkuNjE4NCAxNi4zNTA1IDkuMzgzOTggMTYuMTE2MUw4LjY3Njg3IDE2LjgyMzJaIiBmaWxsPSJjdXJyZW50Q29sb3IiLz4KPC9zdmc+Cg=="); }
.icon-ai            { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyIDZMMTIuODg4MyA1LjU0MDcxQzEyLjcxNjYgNS4yMDg1OCAxMi4zNzM5IDUgMTIgNUMxMS42MjYxIDUgMTEuMjgzNCA1LjIwODU4IDExLjExMTcgNS41NDA3MUwxMiA2Wk0xMy4wMjI1IDcuOTc3NTJMMTIuMTM0MiA4LjQzNjgxQzEyLjIyOTMgOC42MjA3OSAxMi4zNzkyIDguNzcwNjkgMTIuNTYzMiA4Ljg2NTgxTDEzLjAyMjUgNy45Nzc1MlpNMTUgOUwxNS40NTkzIDkuODg4MjlDMTUuNzkxNCA5LjcxNjU2IDE2IDkuMzczOSAxNiA5QzE2IDguNjI2MSAxNS43OTE0IDguMjgzNDQgMTUuNDU5MyA4LjExMTcxTDE1IDlaTTEzLjAyMjUgMTAuMDIyNUwxMi41NjMyIDkuMTM0MTlDMTIuMzc5MiA5LjIyOTMxIDEyLjIyOTMgOS4zNzkyMSAxMi4xMzQyIDkuNTYzMTlMMTMuMDIyNSAxMC4wMjI1Wk0xMiAxMkwxMS4xMTE3IDEyLjQ1OTNDMTEuMjgzNCAxMi43OTE0IDExLjYyNjEgMTMgMTIgMTNDMTIuMzczOSAxMyAxMi43MTY2IDEyLjc5MTQgMTIuODg4MyAxMi40NTkzTDEyIDEyWk0xMC45Nzc1IDEwLjAyMjVMMTEuODY1OCA5LjU2MzE5QzExLjc3MDcgOS4zNzkyMSAxMS42MjA4IDkuMjI5MzEgMTEuNDM2OCA5LjEzNDE5TDEwLjk3NzUgMTAuMDIyNVpNOSA5TDguNTQwNzEgOC4xMTE3MUM4LjIwODU4IDguMjgzNDQgOCA4LjYyNjEgOCA5QzggOS4zNzM5IDguMjA4NTggOS43MTY1NiA4LjU0MDcxIDkuODg4MjlMOSA5Wk0xMC45Nzc1IDcuOTc3NTJMMTEuNDM2OCA4Ljg2NTgxQzExLjYyMDggOC43NzA2OSAxMS43NzA3IDguNjIwNzkgMTEuODY1OCA4LjQzNjgxTDEwLjk3NzUgNy45Nzc1MlpNMjEgMTJIMjBDMjAgMTYuNDE4MyAxNi40MTgzIDIwIDEyIDIwVjIxVjIyQzE3LjUyMjggMjIgMjIgMTcuNTIyOCAyMiAxMkgyMVpNMTIgMjFWMjBDNy41ODE3MiAyMCA0IDE2LjQxODMgNCAxMkgzSDJDMiAxNy41MjI4IDYuNDc3MTUgMjIgMTIgMjJWMjFaTTMgMTJINEM0IDcuNTgxNzIgNy41ODE3MiA0IDEyIDRWM1YyQzYuNDc3MTUgMiAyIDYuNDc3MTUgMiAxMkgzWk0xMiAzVjRDMTYuNDE4MyA0IDIwIDcuNTgxNzIgMjAgMTJIMjFIMjJDMjIgNi40NzcxNSAxNy41MjI4IDIgMTIgMlYzWk0xMiAxNVYxNkMxNC4yOTA1IDE2IDE2LjIyNzQgMTcuMDY2OSAxNy4yMzQ2IDE4LjU1OTRMMTguMDYzNSAxOEwxOC44OTI0IDE3LjQ0MDZDMTcuNDc5IDE1LjM0NjMgMTQuODkxNCAxNCAxMiAxNFYxNVpNNS45MzY0OCAxOEw2Ljc2NTM3IDE4LjU1OTRDNy43NzI2MiAxNy4wNjY5IDkuNzA5NDYgMTYgMTIgMTZWMTVWMTRDOS4xMDg1NiAxNCA2LjUyMDk5IDE1LjM0NjMgNS4xMDc1OCAxNy40NDA2TDUuOTM2NDggMThaTTEyIDZMMTEuMTExNyA2LjQ1OTI5TDEyLjEzNDIgOC40MzY4MUwxMy4wMjI1IDcuOTc3NTJMMTMuOTEwOCA3LjUxODI0TDEyLjg4ODMgNS41NDA3MUwxMiA2Wk0xMy4wMjI1IDcuOTc3NTJMMTIuNTYzMiA4Ljg2NTgxTDE0LjU0MDcgOS44ODgyOUwxNSA5TDE1LjQ1OTMgOC4xMTE3MUwxMy40ODE4IDcuMDg5MjRMMTMuMDIyNSA3Ljk3NzUyWk0xNSA5TDE0LjU0MDcgOC4xMTE3MUwxMi41NjMyIDkuMTM0MTlMMTMuMDIyNSAxMC4wMjI1TDEzLjQ4MTggMTAuOTEwOEwxNS40NTkzIDkuODg4MjlMMTUgOVpNMTMuMDIyNSAxMC4wMjI1TDEyLjEzNDIgOS41NjMxOUwxMS4xMTE3IDExLjU0MDdMMTIgMTJMMTIuODg4MyAxMi40NTkzTDEzLjkxMDggMTAuNDgxOEwxMy4wMjI1IDEwLjAyMjVaTTEyIDEyTDEyLjg4ODMgMTEuNTQwN0wxMS44NjU4IDkuNTYzMTlMMTAuOTc3NSAxMC4wMjI1TDEwLjA4OTIgMTAuNDgxOEwxMS4xMTE3IDEyLjQ1OTNMMTIgMTJaTTEwLjk3NzUgMTAuMDIyNUwxMS40MzY4IDkuMTM0MTlMOS40NTkyOSA4LjExMTcxTDkgOUw4LjU0MDcxIDkuODg4MjlMMTAuNTE4MiAxMC45MTA4TDEwLjk3NzUgMTAuMDIyNVpNOSA5TDkuNDU5MjkgOS44ODgyOUwxMS40MzY4IDguODY1ODFMMTAuOTc3NSA3Ljk3NzUyTDEwLjUxODIgNy4wODkyNEw4LjU0MDcxIDguMTExNzFMOSA5Wk0xMC45Nzc1IDcuOTc3NTJMMTEuODY1OCA4LjQzNjgxTDEyLjg4ODMgNi40NTkyOUwxMiA2TDExLjExMTcgNS41NDA3MUwxMC4wODkyIDcuNTE4MjRMMTAuOTc3NSA3Ljk3NzUyWiIgZmlsbD0iY3VycmVudENvbG9yIi8+Cjwvc3ZnPgo=");            mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyIDZMMTIuODg4MyA1LjU0MDcxQzEyLjcxNjYgNS4yMDg1OCAxMi4zNzM5IDUgMTIgNUMxMS42MjYxIDUgMTEuMjgzNCA1LjIwODU4IDExLjExMTcgNS41NDA3MUwxMiA2Wk0xMy4wMjI1IDcuOTc3NTJMMTIuMTM0MiA4LjQzNjgxQzEyLjIyOTMgOC42MjA3OSAxMi4zNzkyIDguNzcwNjkgMTIuNTYzMiA4Ljg2NTgxTDEzLjAyMjUgNy45Nzc1MlpNMTUgOUwxNS40NTkzIDkuODg4MjlDMTUuNzkxNCA5LjcxNjU2IDE2IDkuMzczOSAxNiA5QzE2IDguNjI2MSAxNS43OTE0IDguMjgzNDQgMTUuNDU5MyA4LjExMTcxTDE1IDlaTTEzLjAyMjUgMTAuMDIyNUwxMi41NjMyIDkuMTM0MTlDMTIuMzc5MiA5LjIyOTMxIDEyLjIyOTMgOS4zNzkyMSAxMi4xMzQyIDkuNTYzMTlMMTMuMDIyNSAxMC4wMjI1Wk0xMiAxMkwxMS4xMTE3IDEyLjQ1OTNDMTEuMjgzNCAxMi43OTE0IDExLjYyNjEgMTMgMTIgMTNDMTIuMzczOSAxMyAxMi43MTY2IDEyLjc5MTQgMTIuODg4MyAxMi40NTkzTDEyIDEyWk0xMC45Nzc1IDEwLjAyMjVMMTEuODY1OCA5LjU2MzE5QzExLjc3MDcgOS4zNzkyMSAxMS42MjA4IDkuMjI5MzEgMTEuNDM2OCA5LjEzNDE5TDEwLjk3NzUgMTAuMDIyNVpNOSA5TDguNTQwNzEgOC4xMTE3MUM4LjIwODU4IDguMjgzNDQgOCA4LjYyNjEgOCA5QzggOS4zNzM5IDguMjA4NTggOS43MTY1NiA4LjU0MDcxIDkuODg4MjlMOSA5Wk0xMC45Nzc1IDcuOTc3NTJMMTEuNDM2OCA4Ljg2NTgxQzExLjYyMDggOC43NzA2OSAxMS43NzA3IDguNjIwNzkgMTEuODY1OCA4LjQzNjgxTDEwLjk3NzUgNy45Nzc1MlpNMjEgMTJIMjBDMjAgMTYuNDE4MyAxNi40MTgzIDIwIDEyIDIwVjIxVjIyQzE3LjUyMjggMjIgMjIgMTcuNTIyOCAyMiAxMkgyMVpNMTIgMjFWMjBDNy41ODE3MiAyMCA0IDE2LjQxODMgNCAxMkgzSDJDMiAxNy41MjI4IDYuNDc3MTUgMjIgMTIgMjJWMjFaTTMgMTJINEM0IDcuNTgxNzIgNy41ODE3MiA0IDEyIDRWM1YyQzYuNDc3MTUgMiAyIDYuNDc3MTUgMiAxMkgzWk0xMiAzVjRDMTYuNDE4MyA0IDIwIDcuNTgxNzIgMjAgMTJIMjFIMjJDMjIgNi40NzcxNSAxNy41MjI4IDIgMTIgMlYzWk0xMiAxNVYxNkMxNC4yOTA1IDE2IDE2LjIyNzQgMTcuMDY2OSAxNy4yMzQ2IDE4LjU1OTRMMTguMDYzNSAxOEwxOC44OTI0IDE3LjQ0MDZDMTcuNDc5IDE1LjM0NjMgMTQuODkxNCAxNCAxMiAxNFYxNVpNNS45MzY0OCAxOEw2Ljc2NTM3IDE4LjU1OTRDNy43NzI2MiAxNy4wNjY5IDkuNzA5NDYgMTYgMTIgMTZWMTVWMTRDOS4xMDg1NiAxNCA2LjUyMDk5IDE1LjM0NjMgNS4xMDc1OCAxNy40NDA2TDUuOTM2NDggMThaTTEyIDZMMTEuMTExNyA2LjQ1OTI5TDEyLjEzNDIgOC40MzY4MUwxMy4wMjI1IDcuOTc3NTJMMTMuOTEwOCA3LjUxODI0TDEyLjg4ODMgNS41NDA3MUwxMiA2Wk0xMy4wMjI1IDcuOTc3NTJMMTIuNTYzMiA4Ljg2NTgxTDE0LjU0MDcgOS44ODgyOUwxNSA5TDE1LjQ1OTMgOC4xMTE3MUwxMy40ODE4IDcuMDg5MjRMMTMuMDIyNSA3Ljk3NzUyWk0xNSA5TDE0LjU0MDcgOC4xMTE3MUwxMi41NjMyIDkuMTM0MTlMMTMuMDIyNSAxMC4wMjI1TDEzLjQ4MTggMTAuOTEwOEwxNS40NTkzIDkuODg4MjlMMTUgOVpNMTMuMDIyNSAxMC4wMjI1TDEyLjEzNDIgOS41NjMxOUwxMS4xMTE3IDExLjU0MDdMMTIgMTJMMTIuODg4MyAxMi40NTkzTDEzLjkxMDggMTAuNDgxOEwxMy4wMjI1IDEwLjAyMjVaTTEyIDEyTDEyLjg4ODMgMTEuNTQwN0wxMS44NjU4IDkuNTYzMTlMMTAuOTc3NSAxMC4wMjI1TDEwLjA4OTIgMTAuNDgxOEwxMS4xMTE3IDEyLjQ1OTNMMTIgMTJaTTEwLjk3NzUgMTAuMDIyNUwxMS40MzY4IDkuMTM0MTlMOS40NTkyOSA4LjExMTcxTDkgOUw4LjU0MDcxIDkuODg4MjlMMTAuNTE4MiAxMC45MTA4TDEwLjk3NzUgMTAuMDIyNVpNOSA5TDkuNDU5MjkgOS44ODgyOUwxMS40MzY4IDguODY1ODFMMTAuOTc3NSA3Ljk3NzUyTDEwLjUxODIgNy4wODkyNEw4LjU0MDcxIDguMTExNzFMOSA5Wk0xMC45Nzc1IDcuOTc3NTJMMTEuODY1OCA4LjQzNjgxTDEyLjg4ODMgNi40NTkyOUwxMiA2TDExLjExMTcgNS41NDA3MUwxMC4wODkyIDcuNTE4MjRMMTAuOTc3NSA3Ljk3NzUyWiIgZmlsbD0iY3VycmVudENvbG9yIi8+Cjwvc3ZnPgo="); }
.icon-check         { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUgMTNMOSAxN0wxOSA3IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=");         mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUgMTNMOSAxN0wxOSA3IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo="); }
.icon-chevron-right { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTkgNUwxNiAxMkw5IDE5IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo="); mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTkgNUwxNiAxMkw5IDE5IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo="); }
.icon-change        { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMuOTMzNTkgMy42MjQ5M1Y4LjYyNDkzSDQuNTE1NTlNNC41MTU1OSA4LjYyNDkzQzUuMTc5NDQgNi45ODMwNiA2LjM2OTI4IDUuNjA3ODQgNy44OTg2MiA0LjcxNDc5QzkuNDI3OTcgMy44MjE3NCAxMS4yMTA0IDMuNDYxMzQgMTIuOTY2NiAzLjY5MDA3QzE0LjcyMjcgMy45MTg3OSAxNi4zNTM0IDQuNzIzNzIgMTcuNjAzIDUuOTc4N0MxOC44NTI1IDcuMjMzNjkgMTkuNjUwNCA4Ljg2Nzc5IDE5Ljg3MTYgMTAuNjI0OU00LjUxNTU5IDguNjI0OTNIOC45MzM1OU0xOS45MzM2IDE5LjYyNDlWMTQuNjI0OUgxOS4zNTI2TTE5LjM1MjYgMTQuNjI0OUMxOC42ODc4IDE2LjI2NTggMTcuNDk3NiAxNy42NCAxNS45Njg0IDE4LjUzMjJDMTQuNDM5MiAxOS40MjQ1IDEyLjY1NzMgMTkuNzg0NCAxMC45MDE3IDE5LjU1NThDOS4xNDYwNSAxOS4zMjcyIDcuNTE1NzkgMTguNTIyOCA2LjI2NjEzIDE3LjI2ODdDNS4wMTY0NiAxNi4wMTQ1IDQuMjE3OTUgMTQuMzgxNCAzLjk5NTU5IDEyLjYyNDlNMTkuMzUyNiAxNC42MjQ5SDE0LjkzMzYiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg==");        mask-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMuOTMzNTkgMy42MjQ5M1Y4LjYyNDkzSDQuNTE1NTlNNC41MTU1OSA4LjYyNDkzQzUuMTc5NDQgNi45ODMwNiA2LjM2OTI4IDUuNjA3ODQgNy44OTg2MiA0LjcxNDc5QzkuNDI3OTcgMy44MjE3NCAxMS4yMTA0IDMuNDYxMzQgMTIuOTY2NiAzLjY5MDA3QzE0LjcyMjcgMy45MTg3OSAxNi4zNTM0IDQuNzIzNzIgMTcuNjAzIDUuOTc4N0MxOC44NTI1IDcuMjMzNjkgMTkuNjUwNCA4Ljg2Nzc5IDE5Ljg3MTYgMTAuNjI0OU00LjUxNTU5IDguNjI0OTNIOC45MzM1OU0xOS45MzM2IDE5LjYyNDlWMTQuNjI0OUgxOS4zNTI2TTE5LjM1MjYgMTQuNjI0OUMxOC42ODc4IDE2LjI2NTggMTcuNDk3NiAxNy42NCAxNS45Njg0IDE4LjUzMjJDMTQuNDM5MiAxOS40MjQ1IDEyLjY1NzMgMTkuNzg0NCAxMC45MDE3IDE5LjU1NThDOS4xNDYwNSAxOS4zMjcyIDcuNTE1NzkgMTguNTIyOCA2LjI2NjEzIDE3LjI2ODdDNS4wMTY0NiAxNi4wMTQ1IDQuMjE3OTUgMTQuMzgxNCAzLjk5NTU5IDEyLjYyNDlNMTkuMzUyNiAxNC42MjQ5SDE0LjkzMzYiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg=="); }

/* ---------- Mikael-blessed product icons ---------- */
.icon-chain              { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI4IDI4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTE2LjEzMjcgMTEuODY3M0MxNS4yNTc1IDEwLjk5MjUgMTQuMDcwOCAxMC41MDEgMTIuODMzMyAxMC41MDFDMTEuNTk1OSAxMC41MDEgMTAuNDA5MSAxMC45OTI1IDkuNTM0IDExLjg2NzNMNC44NjczMyAxNi41MzRDNC40MjE2MiAxNi45NjQ1IDQuMDY2MSAxNy40Nzk0IDMuODIxNTMgMTguMDQ4OEMzLjU3Njk1IDE4LjYxODEgMy40NDgyMiAxOS4yMzA1IDMuNDQyODMgMTkuODUwMUMzLjQzNzQ1IDIwLjQ2OTggMy41NTU1MiAyMS4wODQzIDMuNzkwMTcgMjEuNjU3OEM0LjAyNDgxIDIyLjIzMTMgNC4zNzEzMiAyMi43NTIzIDQuODA5NDkgMjMuMTkwNUM1LjI0NzY2IDIzLjYyODcgNS43Njg3IDIzLjk3NTIgNi4zNDIyMSAyNC4yMDk4QzYuOTE1NzMgMjQuNDQ0NSA3LjUzMDI0IDI0LjU2MjYgOC4xNDk4NyAyNC41NTcyQzguNzY5NTEgMjQuNTUxOCA5LjM4MTg3IDI0LjQyMyA5Ljk1MTIyIDI0LjE3ODVDMTAuNTIwNiAyMy45MzM5IDExLjAzNTUgMjMuNTc4NCAxMS40NjYgMjMuMTMyN0wxMi43NTE3IDIxLjg0ODJNMTEuODY3MyAxNi4xMzI3QzEyLjc0MjUgMTcuMDA3NSAxMy45MjkyIDE3LjQ5OSAxNS4xNjY3IDE3LjQ5OUMxNi40MDQxIDE3LjQ5OSAxNy41OTA5IDE3LjAwNzUgMTguNDY2IDE2LjEzMjdMMjMuMTMyNyAxMS40NjZDMjMuOTgyNyAxMC41ODU5IDI0LjQ1MzEgOS40MDcwNSAyNC40NDI1IDguMTgzNDZDMjQuNDMxOCA2Ljk1OTg4IDIzLjk0MTEgNS43ODk0MiAyMy4wNzU4IDQuOTI0MThDMjIuMjEwNiA0LjA1ODk0IDIxLjA0MDEgMy41NjgxNSAxOS44MTY1IDMuNTU3NTJDMTguNTkzIDMuNTQ2ODkgMTcuNDE0MSA0LjAxNzI2IDE2LjUzNCA0Ljg2NzMzTDE1LjI1MDcgNi4xNTA2NyIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjwvZz4KPC9zdmc+Cg==");              mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI4IDI4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTE2LjEzMjcgMTEuODY3M0MxNS4yNTc1IDEwLjk5MjUgMTQuMDcwOCAxMC41MDEgMTIuODMzMyAxMC41MDFDMTEuNTk1OSAxMC41MDEgMTAuNDA5MSAxMC45OTI1IDkuNTM0IDExLjg2NzNMNC44NjczMyAxNi41MzRDNC40MjE2MiAxNi45NjQ1IDQuMDY2MSAxNy40Nzk0IDMuODIxNTMgMTguMDQ4OEMzLjU3Njk1IDE4LjYxODEgMy40NDgyMiAxOS4yMzA1IDMuNDQyODMgMTkuODUwMUMzLjQzNzQ1IDIwLjQ2OTggMy41NTU1MiAyMS4wODQzIDMuNzkwMTcgMjEuNjU3OEM0LjAyNDgxIDIyLjIzMTMgNC4zNzEzMiAyMi43NTIzIDQuODA5NDkgMjMuMTkwNUM1LjI0NzY2IDIzLjYyODcgNS43Njg3IDIzLjk3NTIgNi4zNDIyMSAyNC4yMDk4QzYuOTE1NzMgMjQuNDQ0NSA3LjUzMDI0IDI0LjU2MjYgOC4xNDk4NyAyNC41NTcyQzguNzY5NTEgMjQuNTUxOCA5LjM4MTg3IDI0LjQyMyA5Ljk1MTIyIDI0LjE3ODVDMTAuNTIwNiAyMy45MzM5IDExLjAzNTUgMjMuNTc4NCAxMS40NjYgMjMuMTMyN0wxMi43NTE3IDIxLjg0ODJNMTEuODY3MyAxNi4xMzI3QzEyLjc0MjUgMTcuMDA3NSAxMy45MjkyIDE3LjQ5OSAxNS4xNjY3IDE3LjQ5OUMxNi40MDQxIDE3LjQ5OSAxNy41OTA5IDE3LjAwNzUgMTguNDY2IDE2LjEzMjdMMjMuMTMyNyAxMS40NjZDMjMuOTgyNyAxMC41ODU5IDI0LjQ1MzEgOS40MDcwNSAyNC40NDI1IDguMTgzNDZDMjQuNDMxOCA2Ljk1OTg4IDIzLjk0MTEgNS43ODk0MiAyMy4wNzU4IDQuOTI0MThDMjIuMjEwNiA0LjA1ODk0IDIxLjA0MDEgMy41NjgxNSAxOS44MTY1IDMuNTU3NTJDMTguNTkzIDMuNTQ2ODkgMTcuNDE0MSA0LjAxNzI2IDE2LjUzNCA0Ljg2NzMzTDE1LjI1MDcgNi4xNTA2NyIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjwvZz4KPC9zdmc+Cg=="); }
.icon-bullet             { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTMuMzMzMzMgOC42NjY2N0w2IDExLjMzMzNMMTIuNjY2NyA0LjY2NjY3IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K");             mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTMuMzMzMzMgOC42NjY2N0w2IDExLjMzMzNMMTIuNjY2NyA0LjY2NjY3IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K"); }
.icon-arrow-after-link   { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTYgMy4zMzMzM0wxMC42NjY3IDhMNiAxMi42NjY3IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzBfNCIgeDE9IjYiIHkxPSI4IiB4Mj0iMTAuNjY2NyIgeTI9IjgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZGMEY2RiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRjUwMDUiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K");   mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTYgMy4zMzMzM0wxMC42NjY3IDhMNiAxMi42NjY3IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzBfNCIgeDE9IjYiIHkxPSI4IiB4Mj0iMTAuNjY2NyIgeTI9IjgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZGMEY2RiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRjUwMDUiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K"); }
.icon-mcp                { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTExLjUyMzMgOC40NzY2N0MxMC44OTgyIDcuODUxNzYgMTAuMDUwNSA3LjUwMDcxIDkuMTY2NjcgNy41MDA3MUM4LjI4Mjc5IDcuNTAwNzEgNy40MzUwOSA3Ljg1MTc2IDYuODEgOC40NzY2N0wzLjQ3NjY3IDExLjgxQzMuMTU4MyAxMi4xMTc1IDIuOTA0MzYgMTIuNDg1MyAyLjcyOTY2IDEyLjg5MkMyLjU1NDk3IDEzLjI5ODcgMi40NjMwMSAxMy43MzYxIDIuNDU5MTcgMTQuMTc4N0MyLjQ1NTMyIDE0LjYyMTMgMi41Mzk2NiAxNS4wNjAyIDIuNzA3MjYgMTUuNDY5OEMyLjg3NDg2IDE1Ljg3OTUgMy4xMjIzNyAxNi4yNTE3IDMuNDM1MzUgMTYuNTY0N0MzLjc0ODMzIDE2Ljg3NzYgNC4xMjA1IDE3LjEyNTEgNC41MzAxNSAxNy4yOTI3QzQuOTM5ODEgMTcuNDYwMyA1LjM3ODc0IDE3LjU0NDcgNS44MjEzNCAxNy41NDA4QzYuMjYzOTQgMTcuNTM3IDYuNzAxMzQgMTcuNDQ1IDcuMTA4MDIgMTcuMjcwM0M3LjUxNDcgMTcuMDk1NiA3Ljg4MjUxIDE2Ljg0MTcgOC4xOSAxNi41MjMzTDkuMTA4MzMgMTUuNjA1OE04LjQ3NjY3IDExLjUyMzNDOS4xMDE3NiAxMi4xNDgyIDkuOTQ5NDUgMTIuNDk5MyAxMC44MzMzIDEyLjQ5OTNDMTEuNzE3MiAxMi40OTkzIDEyLjU2NDkgMTIuMTQ4MiAxMy4xOSAxMS41MjMzTDE2LjUyMzMgOC4xOUMxNy4xMzA1IDcuNTYxMzMgMTcuNDY2NSA2LjcxOTMyIDE3LjQ1ODkgNS44NDUzM0MxNy40NTEzIDQuOTcxMzQgMTcuMTAwOCA0LjEzNTMgMTYuNDgyNyAzLjUxNzI3QzE1Ljg2NDcgMi44OTkyNCAxNS4wMjg3IDIuNTQ4NjggMTQuMTU0NyAyLjU0MTA5QzEzLjI4MDcgMi41MzM0OSAxMi40Mzg3IDIuODY5NDcgMTEuODEgMy40NzY2N0wxMC44OTMzIDQuMzkzMzMiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+Cjwvc3ZnPgo=");                mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTExLjUyMzMgOC40NzY2N0MxMC44OTgyIDcuODUxNzYgMTAuMDUwNSA3LjUwMDcxIDkuMTY2NjcgNy41MDA3MUM4LjI4Mjc5IDcuNTAwNzEgNy40MzUwOSA3Ljg1MTc2IDYuODEgOC40NzY2N0wzLjQ3NjY3IDExLjgxQzMuMTU4MyAxMi4xMTc1IDIuOTA0MzYgMTIuNDg1MyAyLjcyOTY2IDEyLjg5MkMyLjU1NDk3IDEzLjI5ODcgMi40NjMwMSAxMy43MzYxIDIuNDU5MTcgMTQuMTc4N0MyLjQ1NTMyIDE0LjYyMTMgMi41Mzk2NiAxNS4wNjAyIDIuNzA3MjYgMTUuNDY5OEMyLjg3NDg2IDE1Ljg3OTUgMy4xMjIzNyAxNi4yNTE3IDMuNDM1MzUgMTYuNTY0N0MzLjc0ODMzIDE2Ljg3NzYgNC4xMjA1IDE3LjEyNTEgNC41MzAxNSAxNy4yOTI3QzQuOTM5ODEgMTcuNDYwMyA1LjM3ODc0IDE3LjU0NDcgNS44MjEzNCAxNy41NDA4QzYuMjYzOTQgMTcuNTM3IDYuNzAxMzQgMTcuNDQ1IDcuMTA4MDIgMTcuMjcwM0M3LjUxNDcgMTcuMDk1NiA3Ljg4MjUxIDE2Ljg0MTcgOC4xOSAxNi41MjMzTDkuMTA4MzMgMTUuNjA1OE04LjQ3NjY3IDExLjUyMzNDOS4xMDE3NiAxMi4xNDgyIDkuOTQ5NDUgMTIuNDk5MyAxMC44MzMzIDEyLjQ5OTNDMTEuNzE3MiAxMi40OTkzIDEyLjU2NDkgMTIuMTQ4MiAxMy4xOSAxMS41MjMzTDE2LjUyMzMgOC4xOUMxNy4xMzA1IDcuNTYxMzMgMTcuNDY2NSA2LjcxOTMyIDE3LjQ1ODkgNS44NDUzM0MxNy40NTEzIDQuOTcxMzQgMTcuMTAwOCA0LjEzNTMgMTYuNDgyNyAzLjUxNzI3QzE1Ljg2NDcgMi44OTkyNCAxNS4wMjg3IDIuNTQ4NjggMTQuMTU0NyAyLjU0MTA5QzEzLjI4MDcgMi41MzM0OSAxMi40Mzg3IDIuODY5NDcgMTEuODEgMy40NzY2N0wxMC44OTMzIDQuMzkzMzMiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+Cjwvc3ZnPgo="); }
.icon-ai-large           { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTYuNjY2NjcgOC4zMzMzM0g2LjY3NU0xMCA4LjMzMzMzSDEwLjAwODNNMTMuMzMzMyA4LjMzMzMzSDEzLjM0MTdNNy41IDEzLjMzMzNINC4xNjY2N0MzLjcyNDY0IDEzLjMzMzMgMy4zMDA3MiAxMy4xNTc3IDIuOTg4MTYgMTIuODQ1MkMyLjY3NTU5IDEyLjUzMjYgMi41IDEyLjEwODcgMi41IDExLjY2NjdWNUMyLjUgNC41NTc5NyAyLjY3NTU5IDQuMTM0MDUgMi45ODgxNiAzLjgyMTQ5QzMuMzAwNzIgMy41MDg5MyAzLjcyNDY0IDMuMzMzMzMgNC4xNjY2NyAzLjMzMzMzSDE1LjgzMzNDMTYuMjc1NCAzLjMzMzMzIDE2LjY5OTMgMy41MDg5MyAxNy4wMTE4IDMuODIxNDlDMTcuMzI0NCA0LjEzNDA1IDE3LjUgNC41NTc5NyAxNy41IDVWMTEuNjY2N0MxNy41IDEyLjEwODcgMTcuMzI0NCAxMi41MzI2IDE3LjAxMTggMTIuODQ1MkMxNi42OTkzIDEzLjE1NzcgMTYuMjc1NCAxMy4zMzMzIDE1LjgzMzMgMTMuMzMzM0gxMS42NjY3TDcuNSAxNy41VjEzLjMzMzNaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K");           mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTYuNjY2NjcgOC4zMzMzM0g2LjY3NU0xMCA4LjMzMzMzSDEwLjAwODNNMTMuMzMzMyA4LjMzMzMzSDEzLjM0MTdNNy41IDEzLjMzMzNINC4xNjY2N0MzLjcyNDY0IDEzLjMzMzMgMy4zMDA3MiAxMy4xNTc3IDIuOTg4MTYgMTIuODQ1MkMyLjY3NTU5IDEyLjUzMjYgMi41IDEyLjEwODcgMi41IDExLjY2NjdWNUMyLjUgNC41NTc5NyAyLjY3NTU5IDQuMTM0MDUgMi45ODgxNiAzLjgyMTQ5QzMuMzAwNzIgMy41MDg5MyAzLjcyNDY0IDMuMzMzMzMgNC4xNjY2NyAzLjMzMzMzSDE1LjgzMzNDMTYuMjc1NCAzLjMzMzMzIDE2LjY5OTMgMy41MDg5MyAxNy4wMTE4IDMuODIxNDlDMTcuMzI0NCA0LjEzNDA1IDE3LjUgNC41NTc5NyAxNy41IDVWMTEuNjY2N0MxNy41IDEyLjEwODcgMTcuMzI0NCAxMi41MzI2IDE3LjAxMTggMTIuODQ1MkMxNi42OTkzIDEzLjE1NzcgMTYuMjc1NCAxMy4zMzMzIDE1LjgzMzMgMTMuMzMzM0gxMS42NjY3TDcuNSAxNy41VjEzLjMzMzNaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K"); }
.icon-data-personal      { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDE0IDE0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTkuMzMzMzMgNC4wODMzM0M5LjMzMzMzIDQuNzAyMTcgOS4wODc1IDUuMjk1NjYgOC42NDk5MiA1LjczMzI1QzguMjEyMzMgNi4xNzA4MyA3LjYxODg0IDYuNDE2NjcgNyA2LjQxNjY3QzYuMzgxMTYgNi40MTY2NyA1Ljc4NzY3IDYuMTcwODMgNS4zNTAwOCA1LjczMzI1QzQuOTEyNSA1LjI5NTY2IDQuNjY2NjcgNC43MDIxNyA0LjY2NjY3IDQuMDgzMzNDNC42NjY2NyAzLjQ2NDUgNC45MTI1IDIuODcxIDUuMzUwMDggMi40MzM0MkM1Ljc4NzY3IDEuOTk1ODMgNi4zODExNiAxLjc1IDcgMS43NUM3LjYxODg0IDEuNzUgOC4yMTIzMyAxLjk5NTgzIDguNjQ5OTIgMi40MzM0MkM5LjA4NzUgMi44NzEgOS4zMzMzMyAzLjQ2NDUgOS4zMzMzMyA0LjA4MzMzWk03IDguMTY2NjdDNS45MTcwMyA4LjE2NjY3IDQuODc4NDIgOC41OTY4NyA0LjExMjY1IDkuMzYyNjVDMy4zNDY4NyAxMC4xMjg0IDIuOTE2NjcgMTEuMTY3IDIuOTE2NjcgMTIuMjVIMTEuMDgzM0MxMS4wODMzIDExLjE2NyAxMC42NTMxIDEwLjEyODQgOS44ODczNSA5LjM2MjY1QzkuMTIxNTggOC41OTY4NyA4LjA4Mjk3IDguMTY2NjcgNyA4LjE2NjY3WiIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+Cjwvc3ZnPgo=");      mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDE0IDE0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTkuMzMzMzMgNC4wODMzM0M5LjMzMzMzIDQuNzAyMTcgOS4wODc1IDUuMjk1NjYgOC42NDk5MiA1LjczMzI1QzguMjEyMzMgNi4xNzA4MyA3LjYxODg0IDYuNDE2NjcgNyA2LjQxNjY3QzYuMzgxMTYgNi40MTY2NyA1Ljc4NzY3IDYuMTcwODMgNS4zNTAwOCA1LjczMzI1QzQuOTEyNSA1LjI5NTY2IDQuNjY2NjcgNC43MDIxNyA0LjY2NjY3IDQuMDgzMzNDNC42NjY2NyAzLjQ2NDUgNC45MTI1IDIuODcxIDUuMzUwMDggMi40MzM0MkM1Ljc4NzY3IDEuOTk1ODMgNi4zODExNiAxLjc1IDcgMS43NUM3LjYxODg0IDEuNzUgOC4yMTIzMyAxLjk5NTgzIDguNjQ5OTIgMi40MzM0MkM5LjA4NzUgMi44NzEgOS4zMzMzMyAzLjQ2NDUgOS4zMzMzMyA0LjA4MzMzWk03IDguMTY2NjdDNS45MTcwMyA4LjE2NjY3IDQuODc4NDIgOC41OTY4NyA0LjExMjY1IDkuMzYyNjVDMy4zNDY4NyAxMC4xMjg0IDIuOTE2NjcgMTEuMTY3IDIuOTE2NjcgMTIuMjVIMTEuMDgzM0MxMS4wODMzIDExLjE2NyAxMC42NTMxIDEwLjEyODQgOS44ODczNSA5LjM2MjY1QzkuMTIxNTggOC41OTY4NyA4LjA4Mjk3IDguMTY2NjcgNyA4LjE2NjY3WiIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+Cjwvc3ZnPgo="); }
.icon-data-knowledge     { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDE0IDE0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTcgMy42NDc1OFYxMS4yMzA5TTcgMTEuMjMwOUM3LjY4MTMzIDEwLjc3ODIgOC42MDY1IDEwLjUgOS42MjUgMTAuNUMxMC42NDQxIDEwLjUgMTEuNTY4NyAxMC43NzgyIDEyLjI1IDExLjIzMDlWMy42NDc1OEMxMS41Njg3IDMuMTk0OTIgMTAuNjQ0MSAyLjkxNjY3IDkuNjI1IDIuOTE2NjdDOC42MDY1IDIuOTE2NjcgNy42ODEzMyAzLjE5NDkyIDcgMy42NDc1OEM2LjMxODY3IDMuMTk0OTIgNS4zOTM1IDIuOTE2NjcgNC4zNzUgMi45MTY2N0MzLjM1NjUgMi45MTY2NyAyLjQzMTMzIDMuMTk0OTIgMS43NSAzLjY0NzU4VjExLjIzMDlDMi40MzEzMyAxMC43NzgyIDMuMzU2NSAxMC41IDQuMzc1IDEwLjVDNS4zOTM1IDEwLjUgNi4zMTg2NyAxMC43NzgyIDcgMTEuMjMwOVoiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K");     mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDE0IDE0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTcgMy42NDc1OFYxMS4yMzA5TTcgMTEuMjMwOUM3LjY4MTMzIDEwLjc3ODIgOC42MDY1IDEwLjUgOS42MjUgMTAuNUMxMC42NDQxIDEwLjUgMTEuNTY4NyAxMC43NzgyIDEyLjI1IDExLjIzMDlWMy42NDc1OEMxMS41Njg3IDMuMTk0OTIgMTAuNjQ0MSAyLjkxNjY3IDkuNjI1IDIuOTE2NjdDOC42MDY1IDIuOTE2NjcgNy42ODEzMyAzLjE5NDkyIDcgMy42NDc1OEM2LjMxODY3IDMuMTk0OTIgNS4zOTM1IDIuOTE2NjcgNC4zNzUgMi45MTY2N0MzLjM1NjUgMi45MTY2NyAyLjQzMTMzIDMuMTk0OTIgMS43NSAzLjY0NzU4VjExLjIzMDlDMi40MzEzMyAxMC43NzgyIDMuMzU2NSAxMC41IDQuMzc1IDEwLjVDNS4zOTM1IDEwLjUgNi4zMTg2NyAxMC43NzgyIDcgMTEuMjMwOVoiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K"); }
.icon-delete-after-scan  { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTE5IDdMMTguMTMzIDE5LjE0MkMxOC4wOTcxIDE5LjY0NjYgMTcuODcxMyAyMC4xMTg4IDE3LjUwMTEgMjAuNDYzNkMxNy4xMzA5IDIwLjgwODMgMTYuNjQzOSAyMSAxNi4xMzggMjFINy44NjJDNy4zNTYxNCAyMSA2Ljg2OTA3IDIwLjgwODMgNi40OTg4OSAyMC40NjM2QzYuMTI4NyAyMC4xMTg4IDUuOTAyOTIgMTkuNjQ2NiA1Ljg2NyAxOS4xNDJMNSA3TTEwIDExVjE3TTE0IDExVjE3TTE1IDdWNEMxNSAzLjczNDc4IDE0Ljg5NDYgMy40ODA0MyAxNC43MDcxIDMuMjkyODlDMTQuNTE5NiAzLjEwNTM2IDE0LjI2NTIgMyAxNCAzSDEwQzkuNzM0NzggMyA5LjQ4MDQzIDMuMTA1MzYgOS4yOTI4OSAzLjI5Mjg5QzkuMTA1MzYgMy40ODA0MyA5IDMuNzM0NzggOSA0VjdNNCA3SDIwIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K");  mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTE5IDdMMTguMTMzIDE5LjE0MkMxOC4wOTcxIDE5LjY0NjYgMTcuODcxMyAyMC4xMTg4IDE3LjUwMTEgMjAuNDYzNkMxNy4xMzA5IDIwLjgwODMgMTYuNjQzOSAyMSAxNi4xMzggMjFINy44NjJDNy4zNTYxNCAyMSA2Ljg2OTA3IDIwLjgwODMgNi40OTg4OSAyMC40NjM2QzYuMTI4NyAyMC4xMTg4IDUuOTAyOTIgMTkuNjQ2NiA1Ljg2NyAxOS4xNDJMNSA3TTEwIDExVjE3TTE0IDExVjE3TTE1IDdWNEMxNSAzLjczNDc4IDE0Ljg5NDYgMy40ODA0MyAxNC43MDcxIDMuMjkyODlDMTQuNTE5NiAzLjEwNTM2IDE0LjI2NTIgMyAxNCAzSDEwQzkuNzM0NzggMyA5LjQ4MDQzIDMuMTA1MzYgOS4yOTI4OSAzLjI5Mjg5QzkuMTA1MzYgMy40ODA0MyA5IDMuNzM0NzggOSA0VjdNNCA3SDIwIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K"); }
.icon-store-encrypted    { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTEyIDE1VjE3TTYgMjFIMThDMTguNTMwNCAyMSAxOS4wMzkxIDIwLjc4OTMgMTkuNDE0MiAyMC40MTQyQzE5Ljc4OTMgMjAuMDM5MSAyMCAxOS41MzA0IDIwIDE5VjEzQzIwIDEyLjQ2OTYgMTkuNzg5MyAxMS45NjA5IDE5LjQxNDIgMTEuNTg1OEMxOS4wMzkxIDExLjIxMDcgMTguNTMwNCAxMSAxOCAxMUg2QzUuNDY5NTcgMTEgNC45NjA4NiAxMS4yMTA3IDQuNTg1NzkgMTEuNTg1OEM0LjIxMDcxIDExLjk2MDkgNCAxMi40Njk2IDQgMTNWMTlDNCAxOS41MzA0IDQuMjEwNzEgMjAuMDM5MSA0LjU4NTc5IDIwLjQxNDJDNC45NjA4NiAyMC43ODkzIDUuNDY5NTcgMjEgNiAyMVpNMTYgMTFWN0MxNiA1LjkzOTEzIDE1LjU3ODYgNC45MjE3MiAxNC44Mjg0IDQuMTcxNTdDMTQuMDc4MyAzLjQyMTQzIDEzLjA2MDkgMyAxMiAzQzEwLjkzOTEgMyA5LjkyMTcyIDMuNDIxNDMgOS4xNzE1NyA0LjE3MTU3QzguNDIxNDMgNC45MjE3MiA4IDUuOTM5MTMgOCA3VjExSDE2WiIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjwvZz4KPC9zdmc+Cg==");    mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTEyIDE1VjE3TTYgMjFIMThDMTguNTMwNCAyMSAxOS4wMzkxIDIwLjc4OTMgMTkuNDE0MiAyMC40MTQyQzE5Ljc4OTMgMjAuMDM5MSAyMCAxOS41MzA0IDIwIDE5VjEzQzIwIDEyLjQ2OTYgMTkuNzg5MyAxMS45NjA5IDE5LjQxNDIgMTEuNTg1OEMxOS4wMzkxIDExLjIxMDcgMTguNTMwNCAxMSAxOCAxMUg2QzUuNDY5NTcgMTEgNC45NjA4NiAxMS4yMTA3IDQuNTg1NzkgMTEuNTg1OEM0LjIxMDcxIDExLjk2MDkgNCAxMi40Njk2IDQgMTNWMTlDNCAxOS41MzA0IDQuMjEwNzEgMjAuMDM5MSA0LjU4NTc5IDIwLjQxNDJDNC45NjA4NiAyMC43ODkzIDUuNDY5NTcgMjEgNiAyMVpNMTYgMTFWN0MxNiA1LjkzOTEzIDE1LjU3ODYgNC45MjE3MiAxNC44Mjg0IDQuMTcxNTdDMTQuMDc4MyAzLjQyMTQzIDEzLjA2MDkgMyAxMiAzQzEwLjkzOTEgMyA5LjkyMTcyIDMuNDIxNDMgOS4xNzE1NyA0LjE3MTU3QzguNDIxNDMgNC45MjE3MiA4IDUuOTM5MTMgOCA3VjExSDE2WiIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjwvZz4KPC9zdmc+Cg=="); }
.icon-deep-research      { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTIxIDIxTDE1IDE1TTE3IDEwQzE3IDEwLjkxOTMgMTYuODE4OSAxMS44Mjk1IDE2LjQ2NzIgMTIuNjc4OEMxNi4xMTU0IDEzLjUyODEgMTUuNTk5OCAxNC4yOTk3IDE0Ljk0OTcgMTQuOTQ5N0MxNC4yOTk3IDE1LjU5OTggMTMuNTI4MSAxNi4xMTU0IDEyLjY3ODggMTYuNDY3MkMxMS44Mjk1IDE2LjgxODkgMTAuOTE5MyAxNyAxMCAxN0M5LjA4MDc1IDE3IDguMTcwNSAxNi44MTg5IDcuMzIxMjIgMTYuNDY3MkM2LjQ3MTk0IDE2LjExNTQgNS43MDAyNiAxNS41OTk4IDUuMDUwMjUgMTQuOTQ5N0M0LjQwMDI0IDE0LjI5OTcgMy44ODQ2MyAxMy41MjgxIDMuNTMyODQgMTIuNjc4OEMzLjE4MTA2IDExLjgyOTUgMyAxMC45MTkzIDMgMTBDMyA4LjE0MzQ4IDMuNzM3NSA2LjM2MzAxIDUuMDUwMjUgNS4wNTAyNUM2LjM2MzAxIDMuNzM3NSA4LjE0MzQ4IDMgMTAgM0MxMS44NTY1IDMgMTMuNjM3IDMuNzM3NSAxNC45NDk3IDUuMDUwMjVDMTYuMjYyNSA2LjM2MzAxIDE3IDguMTQzNDggMTcgMTBaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K");      mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTIxIDIxTDE1IDE1TTE3IDEwQzE3IDEwLjkxOTMgMTYuODE4OSAxMS44Mjk1IDE2LjQ2NzIgMTIuNjc4OEMxNi4xMTU0IDEzLjUyODEgMTUuNTk5OCAxNC4yOTk3IDE0Ljk0OTcgMTQuOTQ5N0MxNC4yOTk3IDE1LjU5OTggMTMuNTI4MSAxNi4xMTU0IDEyLjY3ODggMTYuNDY3MkMxMS44Mjk1IDE2LjgxODkgMTAuOTE5MyAxNyAxMCAxN0M5LjA4MDc1IDE3IDguMTcwNSAxNi44MTg5IDcuMzIxMjIgMTYuNDY3MkM2LjQ3MTk0IDE2LjExNTQgNS43MDAyNiAxNS41OTk4IDUuMDUwMjUgMTQuOTQ5N0M0LjQwMDI0IDE0LjI5OTcgMy44ODQ2MyAxMy41MjgxIDMuNTMyODQgMTIuNjc4OEMzLjE4MTA2IDExLjgyOTUgMyAxMC45MTkzIDMgMTBDMyA4LjE0MzQ4IDMuNzM3NSA2LjM2MzAxIDUuMDUwMjUgNS4wNTAyNUM2LjM2MzAxIDMuNzM3NSA4LjE0MzQ4IDMgMTAgM0MxMS44NTY1IDMgMTMuNjM3IDMuNzM3NSAxNC45NDk3IDUuMDUwMjVDMTYuMjYyNSA2LjM2MzAxIDE3IDguMTQzNDggMTcgMTBaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K"); }
.icon-alleles-verified   { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTkgMTJMMTEgMTRMMTUgMTBNMjEgMTJDMjEgMTMuMTgxOSAyMC43NjcyIDE0LjM1MjIgMjAuMzE0OSAxNS40NDQyQzE5Ljg2MjYgMTYuNTM2MSAxOS4xOTk3IDE3LjUyODIgMTguMzY0IDE4LjM2NEMxNy41MjgyIDE5LjE5OTcgMTYuNTM2MSAxOS44NjI2IDE1LjQ0NDIgMjAuMzE0OUMxNC4zNTIyIDIwLjc2NzIgMTMuMTgxOSAyMSAxMiAyMUMxMC44MTgxIDIxIDkuNjQ3NzggMjAuNzY3MiA4LjU1NTg1IDIwLjMxNDlDNy40NjM5MiAxOS44NjI2IDYuNDcxNzcgMTkuMTk5NyA1LjYzNjA0IDE4LjM2NEM0LjgwMDMxIDE3LjUyODIgNC4xMzczOCAxNi41MzYxIDMuNjg1MDggMTUuNDQ0MkMzLjIzMjc5IDE0LjM1MjIgMyAxMy4xODE5IDMgMTJDMyA5LjYxMzA1IDMuOTQ4MjEgNy4zMjM4NyA1LjYzNjA0IDUuNjM2MDRDNy4zMjM4NyAzLjk0ODIxIDkuNjEzMDUgMyAxMiAzQzE0LjM4NjkgMyAxNi42NzYxIDMuOTQ4MjEgMTguMzY0IDUuNjM2MDRDMjAuMDUxOCA3LjMyMzg3IDIxIDkuNjEzMDUgMjEgMTJaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K");   mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTkgMTJMMTEgMTRMMTUgMTBNMjEgMTJDMjEgMTMuMTgxOSAyMC43NjcyIDE0LjM1MjIgMjAuMzE0OSAxNS40NDQyQzE5Ljg2MjYgMTYuNTM2MSAxOS4xOTk3IDE3LjUyODIgMTguMzY0IDE4LjM2NEMxNy41MjgyIDE5LjE5OTcgMTYuNTM2MSAxOS44NjI2IDE1LjQ0NDIgMjAuMzE0OUMxNC4zNTIyIDIwLjc2NzIgMTMuMTgxOSAyMSAxMiAyMUMxMC44MTgxIDIxIDkuNjQ3NzggMjAuNzY3MiA4LjU1NTg1IDIwLjMxNDlDNy40NjM5MiAxOS44NjI2IDYuNDcxNzcgMTkuMTk5NyA1LjYzNjA0IDE4LjM2NEM0LjgwMDMxIDE3LjUyODIgNC4xMzczOCAxNi41MzYxIDMuNjg1MDggMTUuNDQ0MkMzLjIzMjc5IDE0LjM1MjIgMyAxMy4xODE5IDMgMTJDMyA5LjYxMzA1IDMuOTQ4MjEgNy4zMjM4NyA1LjYzNjA0IDUuNjM2MDRDNy4zMjM4NyAzLjk0ODIxIDkuNjEzMDUgMyAxMiAzQzE0LjM4NjkgMyAxNi42NzYxIDMuOTQ4MjEgMTguMzY0IDUuNjM2MDRDMjAuMDUxOCA3LjMyMzg3IDIxIDkuNjEzMDUgMjEgMTJaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K"); }
.icon-structured         { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTggOUwxMSAxMkw4IDE1TTEzIDE1SDE2TTUgMjBIMTlDMTkuNTMwNCAyMCAyMC4wMzkxIDE5Ljc4OTMgMjAuNDE0MiAxOS40MTQyQzIwLjc4OTMgMTkuMDM5MSAyMSAxOC41MzA0IDIxIDE4VjZDMjEgNS40Njk1NyAyMC43ODkzIDQuOTYwODYgMjAuNDE0MiA0LjU4NTc5QzIwLjAzOTEgNC4yMTA3MSAxOS41MzA0IDQgMTkgNEg1QzQuNDY5NTcgNCAzLjk2MDg2IDQuMjEwNzEgMy41ODU3OSA0LjU4NTc5QzMuMjEwNzEgNC45NjA4NiAzIDUuNDY5NTcgMyA2VjE4QzMgMTguNTMwNCAzLjIxMDcxIDE5LjAzOTEgMy41ODU3OSAxOS40MTQyQzMuOTYwODYgMTkuNzg5MyA0LjQ2OTU3IDIwIDUgMjBaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K");         mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTggOUwxMSAxMkw4IDE1TTEzIDE1SDE2TTUgMjBIMTlDMTkuNTMwNCAyMCAyMC4wMzkxIDE5Ljc4OTMgMjAuNDE0MiAxOS40MTQyQzIwLjc4OTMgMTkuMDM5MSAyMSAxOC41MzA0IDIxIDE4VjZDMjEgNS40Njk1NyAyMC43ODkzIDQuOTYwODYgMjAuNDE0MiA0LjU4NTc5QzIwLjAzOTEgNC4yMTA3MSAxOS41MzA0IDQgMTkgNEg1QzQuNDY5NTcgNCAzLjk2MDg2IDQuMjEwNzEgMy41ODU3OSA0LjU4NTc5QzMuMjEwNzEgNC45NjA4NiAzIDUuNDY5NTcgMyA2VjE4QzMgMTguNTMwNCAzLjIxMDcxIDE5LjAzOTEgMy41ODU3OSAxOS40MTQyQzMuOTYwODYgMTkuNzg5MyA0LjQ2OTU3IDIwIDUgMjBaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K"); }
.icon-expanding          { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTQgNFY5SDQuNTgyTTQuNTgyIDlDNS4yNDU4NSA3LjM1ODEzIDYuNDM1NjggNS45ODI5MSA3Ljk2NTAzIDUuMDg5ODZDOS40OTQzOCA0LjE5NjgxIDExLjI3NjggMy44MzY0MSAxMy4wMzMgNC4wNjUxNEMxNC43ODkxIDQuMjkzODcgMTYuNDE5OCA1LjA5ODggMTcuNjY5NCA2LjM1Mzc4QzE4LjkxOSA3LjYwODc2IDE5LjcxNjggOS4yNDI4NiAxOS45MzggMTFNNC41ODIgOUg5TTIwIDIwVjE1SDE5LjQxOU0xOS40MTkgMTVDMTguNzU0MiAxNi42NDA5IDE3LjU2NCAxOC4wMTUgMTYuMDM0OCAxOC45MDczQzE0LjUwNTYgMTkuNzk5NSAxMi43MjM3IDIwLjE1OTUgMTAuOTY4MSAxOS45MzA5QzkuMjEyNDYgMTkuNzAyMiA3LjU4MjIgMTguODk3OSA2LjMzMjUzIDE3LjY0MzdDNS4wODI4NyAxNi4zODk2IDQuMjg0MzUgMTQuNzU2NCA0LjA2MiAxM00xOS40MTkgMTVIMTUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+Cjwvc3ZnPgo=");          mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTQgNFY5SDQuNTgyTTQuNTgyIDlDNS4yNDU4NSA3LjM1ODEzIDYuNDM1NjggNS45ODI5MSA3Ljk2NTAzIDUuMDg5ODZDOS40OTQzOCA0LjE5NjgxIDExLjI3NjggMy44MzY0MSAxMy4wMzMgNC4wNjUxNEMxNC43ODkxIDQuMjkzODcgMTYuNDE5OCA1LjA5ODggMTcuNjY5NCA2LjM1Mzc4QzE4LjkxOSA3LjYwODc2IDE5LjcxNjggOS4yNDI4NiAxOS45MzggMTFNNC41ODIgOUg5TTIwIDIwVjE1SDE5LjQxOU0xOS40MTkgMTVDMTguNzU0MiAxNi42NDA5IDE3LjU2NCAxOC4wMTUgMTYuMDM0OCAxOC45MDczQzE0LjUwNTYgMTkuNzk5NSAxMi43MjM3IDIwLjE1OTUgMTAuOTY4MSAxOS45MzA5QzkuMjEyNDYgMTkuNzAyMiA3LjU4MjIgMTguODk3OSA2LjMzMjUzIDE3LjY0MzdDNS4wODI4NyAxNi4zODk2IDQuMjg0MzUgMTQuNzU2NCA0LjA2MiAxM00xOS40MTkgMTVIMTUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+Cjwvc3ZnPgo="); }
.icon-theme              { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTEwIDIuNVYzLjMzMzMzTTEwIDE2LjY2NjdWMTcuNU0xNy41IDEwSDE2LjY2NjdNMy4zMzMzMyAxMEgyLjVNMTUuMzAzMyAxNS4zMDMzTDE0LjcxNDIgMTQuNzE0Mk01LjI4NTgzIDUuMjg1ODNMNC42OTY2NyA0LjY5NjY3TTE1LjMwMzMgNC42OTY2N0wxNC43MTQyIDUuMjg1ODNNNS4yODU4MyAxNC43MTQyTDQuNjk2NjcgMTUuMzAzM00xMy4zMzMzIDEwQzEzLjMzMzMgMTAuODg0MSAxMi45ODIxIDExLjczMTkgMTIuMzU3IDEyLjM1N0MxMS43MzE5IDEyLjk4MjEgMTAuODg0MSAxMy4zMzMzIDEwIDEzLjMzMzNDOS4xMTU5NSAxMy4zMzMzIDguMjY4MSAxMi45ODIxIDcuNjQyOTggMTIuMzU3QzcuMDE3ODYgMTEuNzMxOSA2LjY2NjY3IDEwLjg4NDEgNi42NjY2NyAxMEM2LjY2NjY3IDkuMTE1OTUgNy4wMTc4NiA4LjI2ODEgNy42NDI5OCA3LjY0Mjk4QzguMjY4MSA3LjAxNzg2IDkuMTE1OTUgNi42NjY2NyAxMCA2LjY2NjY3QzEwLjg4NDEgNi42NjY2NyAxMS43MzE5IDcuMDE3ODYgMTIuMzU3IDcuNjQyOThDMTIuOTgyMSA4LjI2ODEgMTMuMzMzMyA5LjExNTk1IDEzLjMzMzMgMTBaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K");              mask-image: url("data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU1ZHIj4KPHBhdGggaWQ9IlZlY3RvciIgZD0iTTEwIDIuNVYzLjMzMzMzTTEwIDE2LjY2NjdWMTcuNU0xNy41IDEwSDE2LjY2NjdNMy4zMzMzMyAxMEgyLjVNMTUuMzAzMyAxNS4zMDMzTDE0LjcxNDIgMTQuNzE0Mk01LjI4NTgzIDUuMjg1ODNMNC42OTY2NyA0LjY5NjY3TTE1LjMwMzMgNC42OTY2N0wxNC43MTQyIDUuMjg1ODNNNS4yODU4MyAxNC43MTQyTDQuNjk2NjcgMTUuMzAzM00xMy4zMzMzIDEwQzEzLjMzMzMgMTAuODg0MSAxMi45ODIxIDExLjczMTkgMTIuMzU3IDEyLjM1N0MxMS43MzE5IDEyLjk4MjEgMTAuODg0MSAxMy4zMzMzIDEwIDEzLjMzMzNDOS4xMTU5NSAxMy4zMzMzIDguMjY4MSAxMi45ODIxIDcuNjQyOTggMTIuMzU3QzcuMDE3ODYgMTEuNzMxOSA2LjY2NjY3IDEwLjg4NDEgNi42NjY2NyAxMEM2LjY2NjY3IDkuMTE1OTUgNy4wMTc4NiA4LjI2ODEgNy42NDI5OCA3LjY0Mjk4QzguMjY4MSA3LjAxNzg2IDkuMTE1OTUgNi42NjY2NyAxMCA2LjY2NjY3QzEwLjg4NDEgNi42NjY2NyAxMS43MzE5IDcuMDE3ODYgMTIuMzU3IDcuNjQyOThDMTIuOTgyMSA4LjI2ODEgMTMuMzMzMyA5LjExNTk1IDEzLjMzMzMgMTBaIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8L3N2Zz4K"); }

/* ---------- Status pill icons (used by recommendation-card) ---------- */
.icon-status-benign      { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTEyIDNjMi43NzkgMCA1LjM0OSAxLjU1NiA3LjI0MyA0LjA4MkMyMC45NzEgOS4zODggMjIgMTIuMzQxIDIyIDE1LjA5OGMwIDEuNDctLjI5MyAyLjcxOC0uOTAzIDMuNzQ1Yy0uNjAzIDEuMDE0LTEuNDc5IDEuNzU4LTIuNTgyIDIuMjU3Yy0xLjU5My43MTgtMy4zMzUuOS02LjUxNS45Yy0zLjE3NSAwLTQuOTItLjE4My02LjUxNC0uOWMtMS4wMTItLjQ1Ny0xLjgzMy0xLjEyLTIuNDI2LTIuMDFsLS4xNTctLjI0N0MyLjI5MyAxNy44MTUgMiAxNi41NjkgMiAxNS4wOThjMC0yLjc1NyAxLjAzLTUuNzEgMi43NTctOC4wMTZDNi42NSA0LjU1NiA5LjIyIDMgMTIgMyIvPjwvc3ZnPg==");      mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTEyIDNjMi43NzkgMCA1LjM0OSAxLjU1NiA3LjI0MyA0LjA4MkMyMC45NzEgOS4zODggMjIgMTIuMzQxIDIyIDE1LjA5OGMwIDEuNDctLjI5MyAyLjcxOC0uOTAzIDMuNzQ1Yy0uNjAzIDEuMDE0LTEuNDc5IDEuNzU4LTIuNTgyIDIuMjU3Yy0xLjU5My43MTgtMy4zMzUuOS02LjUxNS45Yy0zLjE3NSAwLTQuOTItLjE4My02LjUxNC0uOWMtMS4wMTItLjQ1Ny0xLjgzMy0xLjEyLTIuNDI2LTIuMDFsLS4xNTctLjI0N0MyLjI5MyAxNy44MTUgMiAxNi41NjkgMiAxNS4wOThjMC0yLjc1NyAxLjAzLTUuNzEgMi43NTctOC4wMTZDNi42NSA0LjU1NiA5LjIyIDMgMTIgMyIvPjwvc3ZnPg=="); }
.icon-status-protective  { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTEyIDIycS0zLjQ3NS0uODc1LTUuNzM4LTMuOTg4VDQgMTEuMVY1bDgtM2w4IDN2Ni4xcTAgMy44LTIuMjYyIDYuOTEzVDEyIDIyIi8+PC9zdmc+");  mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTEyIDIycS0zLjQ3NS0uODc1LTUuNzM4LTMuOTg4VDQgMTEuMVY1bDgtM2w4IDN2Ni4xcTAgMy44LTIuMjYyIDYuOTEzVDEyIDIyIi8+PC9zdmc+"); }
.icon-status-pathogenic  { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgODAgODAiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMjIuNzU4IDI4Ljk0YTEwLjUgMTAuNSAwIDAgMC01LjU2IDE3LjExbC42My43MjVhMTAuOCAxMC44IDAgMCAxIDIuNjAzIDguMDEzYTEwLjggMTAuOCAwIDAgMCA0LjU2NSA5Ljc4bC4zOTguMjc5YTEwLjc5IDEwLjc5IDAgMCAwIDEwLjM5NyAxLjA5NmExMC44IDEwLjggMCAwIDEgOC40MTggMGwxLjIwMy41MWExMC4yOTMgMTAuMjkzIDAgMCAwIDE0LjI3LTEwLjM2N2wtLjA2MS0uNjk4YTEyLjIyIDEyLjIyIDAgMCAxIDIuOTQ2LTkuMDY4bDUuMTM1LTUuOTE1YTYgNiAwIDAgMC0zLjE3OC05Ljc4bC00LjIwMi0uOTcyYTIwLjUzIDIwLjUzIDAgMCAxLTEyLjk1Ny05LjQxNGwtMS40OTYtMi40ODdhNi44NSA2Ljg1IDAgMCAwLTExLjczOCAwbC0zLjM5MyA1LjYzOWExMS44NSAxMS44NSAwIDAgMS03LjQ3NyA1LjQzMnptNy4yNDQgNy40NDNhNCA0IDAgMSAwIDAgOGE0IDQgMCAwIDAgMC04bTggMTZhNiA2IDAgMSAxIDEyIDBhNiA2IDAgMCAxLTEyIDBtNi0yMmEzIDMgMCAxIDAgMCA2YTMgMyAwIDAgMCAwLTYiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==");  mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgODAgODAiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMjIuNzU4IDI4Ljk0YTEwLjUgMTAuNSAwIDAgMC01LjU2IDE3LjExbC42My43MjVhMTAuOCAxMC44IDAgMCAxIDIuNjAzIDguMDEzYTEwLjggMTAuOCAwIDAgMCA0LjU2NSA5Ljc4bC4zOTguMjc5YTEwLjc5IDEwLjc5IDAgMCAwIDEwLjM5NyAxLjA5NmExMC44IDEwLjggMCAwIDEgOC40MTggMGwxLjIwMy41MWExMC4yOTMgMTAuMjkzIDAgMCAwIDE0LjI3LTEwLjM2N2wtLjA2MS0uNjk4YTEyLjIyIDEyLjIyIDAgMCAxIDIuOTQ2LTkuMDY4bDUuMTM1LTUuOTE1YTYgNiAwIDAgMC0zLjE3OC05Ljc4bC00LjIwMi0uOTcyYTIwLjUzIDIwLjUzIDAgMCAxLTEyLjk1Ny05LjQxNGwtMS40OTYtMi40ODdhNi44NSA2Ljg1IDAgMCAwLTExLjczOCAwbC0zLjM5MyA1LjYzOWExMS44NSAxMS44NSAwIDAgMS03LjQ3NyA1LjQzMnptNy4yNDQgNy40NDNhNCA0IDAgMSAwIDAgOGE0IDQgMCAwIDAgMC04bTggMTZhNiA2IDAgMSAxIDEyIDBhNiA2IDAgMCAxLTEyIDBtNi0yMmEzIDMgMCAxIDAgMCA2YTMgMyAwIDAgMCAwLTYiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg=="); }
.icon-status-risk-factor { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTEgMjFoMjJMMTIgMnptMTItM2gtMnYtMmgyem0wLTRoLTJ2LTRoMnoiLz48L3N2Zz4="); mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTEgMjFoMjJMMTIgMnptMTItM2gtMnYtMmgyem0wLTRoLTJ2LTRoMnoiLz48L3N2Zz4="); }
.icon-genetics           { -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTUgMjN2LTFxMC0zLjQ3NSAxLjQ1LTUuNjM3dDQtNC4zNjNxLTIuNTUtMi4yLTQtNC4zNjJUNSAyVjFoMnYxcTAgLjI3NS4wMTMuNTEzVDcuMDUgM2g5LjlxLjAyNS0uMjUuMDM4LS40ODhUMTcgMlYxaDJ2MXEwIDMuNDc1LTEuNDUgNS42Mzh0LTQgNC4zNjJxMi41NSAyLjIgNCA0LjM2M1QxOSAyMnYxaC0ydi0xcTAtLjI3NS0uMDEyLS41MTNUMTYuOTUgMjFoLTkuOXEtLjAyNS4yNS0uMDM3LjQ4OFQ3IDIydjF6TTguNDUgN2g3LjFxLjMyNS0uNDc1LjU2My0uOTVUMTYuNTUgNWgtOS4xcS4yLjU1LjQzNyAxLjAzOFQ4LjQ1IDdNMTIgMTAuN3EuNS0uNDI1Ljk3NS0uODV0LjktLjg1aC0zLjc1cS40MjUuNDI1LjkuODV0Ljk3NS44NU0xMC4xMjUgMTVoMy43NXEtLjQyNS0uNDI1LS45LS44NVQxMiAxMy4zcS0uNS40MjUtLjk3NS44NXQtLjkuODVNNy40NSAxOWg5LjFxLS4yLS41NS0uNDM3LTEuMDM3VDE1LjU1IDE3aC03LjFxLS4zMjUuNDc1LS41NjIuOTVUNy40NSAxOSIvPjwvc3ZnPg==");           mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTUgMjN2LTFxMC0zLjQ3NSAxLjQ1LTUuNjM3dDQtNC4zNjNxLTIuNTUtMi4yLTQtNC4zNjJUNSAyVjFoMnYxcTAgLjI3NS4wMTMuNTEzVDcuMDUgM2g5LjlxLjAyNS0uMjUuMDM4LS40ODhUMTcgMlYxaDJ2MXEwIDMuNDc1LTEuNDUgNS42Mzh0LTQgNC4zNjJxMi41NSAyLjIgNCA0LjM2M1QxOSAyMnYxaC0ydi0xcTAtLjI3NS0uMDEyLS41MTNUMTYuOTUgMjFoLTkuOXEtLjAyNS4yNS0uMDM3LjQ4OFQ3IDIydjF6TTguNDUgN2g3LjFxLjMyNS0uNDc1LjU2My0uOTVUMTYuNTUgNWgtOS4xcS4yLjU1LjQzNyAxLjAzOFQ4LjQ1IDdNMTIgMTAuN3EuNS0uNDI1Ljk3NS0uODV0LjktLjg1aC0zLjc1cS40MjUuNDI1LjkuODV0Ljk3NS44NU0xMC4xMjUgMTVoMy43NXEtLjQyNS0uNDI1LS45LS44NVQxMiAxMy4zcS0uNS40MjUtLjk3NS44NXQtLjkuODVNNy40NSAxOWg5LjFxLS4yLS41NS0uNDM3LTEuMDM3VDE1LjU1IDE3aC03LjFxLS4zMjUuNDc1LS41NjIuOTVUNy40NSAxOSIvPjwvc3ZnPg=="); }

/* ---------- Icon tile (icon-on-surface container) ---------- */
.icon-tile {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: var(--spacing-48);
  height: var(--spacing-48);
  background-color: var(--background-surface-2);
  color: var(--symbol-default);
  border-radius: var(--corner-radius-full);
}
.icon-tile--40           { width: 40px; height: 40px; }
.icon-tile--56           { width: 56px; height: 56px; border-radius: var(--corner-radius-md); }
.icon-tile--surface-1    { background-color: var(--background-surface-1); }
/* Smaller-radius variants. Per Mikael's answers (sub-token radii): the
   old sm (4px) is now xs; new sm is 8px; 12px rounds down to sm. */
.icon-tile--rounded-sm   { border-radius: var(--corner-radius-sm); }
.icon-tile--rounded-md   { border-radius: var(--corner-radius-sm); }
.icon-tile--sm           { width: 24px; height: 24px; border-radius: var(--corner-radius-xs); }

/* --- canonical/utilities/misc.css --- */
/*
 * Miscellaneous primitives — Layer 3 (ITCSS utilities).
 *
 * Pill, dropdown, accordion helpers. Each binds tokens; none introduce
 * page-specific layout.
 */

/* ---------- Pills ----------
   Generic pill primitive. `.pill` is surface-2 background + sm radius +
   label-xs caps. Modifiers for full radius, label-sm, larger size, and
   the brand-gradient fill (`Brand Gradient` style from Mikael's export).
*/
.pill {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-8);
  padding: var(--spacing-2) var(--spacing-8);
  border-radius: var(--corner-radius-xs);
  background-color: var(--background-surface-2);
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-12);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-wide);
  color: var(--text-secondary);
  text-transform: uppercase;
  white-space: nowrap;
}
.pill--full     { padding: var(--spacing-4) var(--spacing-12); border-radius: var(--corner-radius-full); }
.pill--label-sm { padding: var(--spacing-4) var(--spacing-12); font-size: var(--font-size-14); letter-spacing: var(--font-letter-spacing-wider); color: var(--text-primary); }
.pill--gradient { background-color: transparent; background-image: var(--brand-gradient); color: var(--text-primary); }
.pill--lg       { padding: var(--spacing-8) var(--spacing-12); }

/* ---------- Dropdown (overlay menu, no JS) ----------
   Wrap a <details> in `.dropdown` and place its menu (sibling of <summary>)
   inside `.dropdown-menu`. The menu absolutely positions itself under the
   trigger when open, so surrounding content never shifts. */
.dropdown { position: relative; display: inline-block; }
.dropdown-menu {
  position: absolute;
  top: calc(100% + var(--spacing-4));
  left: 0;
  z-index: 50;
  min-width: 100%;
  white-space: nowrap;
  background-color: var(--background-surface-2);
  border-radius: var(--corner-radius-lg);
  padding: var(--spacing-8);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2);
}
.dropdown-menu label {
  display: flex;
  align-items: center;
  gap: var(--spacing-8);
  padding: var(--spacing-4) var(--spacing-8);
  border-radius: var(--corner-radius-xs);
  cursor: pointer;
}
.dropdown-menu label:hover {
  background-color: var(--background-hover);
}

/* ---------- Accordion (<details>/<summary>) helpers ----------
   `.show-when-collapsed` is visible only while the details is closed,
   `.show-when-open` is visible only while it's open.
   `.summary-no-marker` strips the default disclosure triangle. */
details[open]  .show-when-collapsed { display: none; }
details:not([open]) .show-when-open { display: none; }
.summary-no-marker { list-style: none; cursor: pointer; }
.summary-no-marker::-webkit-details-marker { display: none; }

/* --- canonical/utilities/text.css --- */
/*
 * Text role utilities — Layer 3 (ITCSS utilities).
 *
 * Semantic text-color tokens exposed as utility classes. Bind only to
 * role tokens (--text-*, --symbol-*) — never to primitives.
 */

.text-primary      { color: var(--text-primary); }
.text-secondary    { color: var(--text-secondary); }
.text-tertiary     { color: var(--text-tertiary); }
.text-light        { color: var(--text-light); }
.text-disabled     { color: var(--text-disabled); }
.text-hover        { color: var(--text-hover); }
.text-protective   { color: var(--text-protective); }
.text-risk-factor  { color: var(--text-risk-factor); }
.text-symbol-light { color: var(--symbol-light); }
.text-muted        { color: var(--text-tertiary); }

/* ---------- Brand-gradient text ----------
   Paints the `Brand Gradient` Figma style onto the text via
   background-clip. `display: inline-block; width: max-content` keeps
   the box sized to the text — without it, in a flex/grid child the
   element stretches and the text samples only the leftmost slice of
   the gradient. `max-width: 100%` prevents overflow on narrow viewports. */
.text-brand {
  display: inline-block;
  width: max-content;
  max-width: 100%;
  background-image: var(--brand-gradient);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
}

/* ---------- Role composites (size + line-height + color) ----------
   Replace per-component `*-title / *-subtitle / *-description / *-empty /
   *-label / *-fine-print` recipes that all re-declared the same triple.
   Apply directly; components only override if there's a real visual
   difference. Headings (h1–h6) get their size/weight from the element
   defaults in objects/typography.css — there is no .text-h1 etc. */
.text-body {
  font-size: var(--font-size-14);
  line-height: 1.5;
  color: var(--text-primary);
}
.text-sm {
  font-size: var(--font-size-12);
  line-height: 1.4;
  color: var(--text-primary);
}
.text-label {
  font-size: var(--font-size-14);
  font-weight: var(--font-weight-500);
  line-height: 1.4;
  color: var(--text-primary);
}
.text-empty {
  font-size: var(--font-size-14);
  color: var(--text-tertiary);
  text-align: center;
}
.text-empty--padded { padding: var(--spacing-32) var(--spacing-16); }
.text-fine-print {
  font-size: var(--font-size-12);
  line-height: 1.4;
  color: var(--text-tertiary);
  text-wrap: balance;
}

/* --- canonical/components/action-button.css --- */
/*
 * Action Button — component set 70:2777.
 *
 * 40×40 circular icon button with an attached tooltip that appears on
 * hover. Markup:
 *   <button class="action-button" type="button">
 *     <span class="action-button__icon">…svg…</span>
 *     <span class="action-button__tooltip">ASK AGENT</span>
 *   </button>
 */

.action-button {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-8);
  width: 40px;
  height: 40px;
  border: 0;
  border-radius: var(--corner-radius-full);
  background-color: var(--background-surface-2);
  color: var(--symbol-default);
  cursor: pointer;
}

.action-button:hover {
  background-color: var(--background-hover);
  color: var(--symbol-hover);
}

.action-button__icon {
  width: 24px;
  height: 24px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.action-button__icon > svg { width: 100%; height: 100%; display: block; }

.action-button__tooltip {
  position: absolute;
  /* Figma: top:10, left:40 default, left:48 hover. 10 isn't in the scale
     (closest --spacing-12); 40 isn't either (closest --spacing-48, which
     happens to also match the hover position so the tooltip no longer
     animates 8px right on hover — see NOTES.md). */
  top: var(--spacing-12);
  left: var(--spacing-48);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: var(--spacing-4) var(--spacing-8);
  border-radius: var(--corner-radius-xs);
  background-color: var(--background-surface-2);
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-12);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-wide);
  color: var(--text-secondary);
  text-transform: uppercase;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
}

.action-button:hover .action-button__tooltip {
  opacity: 1;
  left: var(--spacing-48);
  color: var(--text-primary);
}

/* --- canonical/components/button.css --- */
/*
 * Button — component set 23:1936.
 *
 * 3 sizes (lg/md/sm) × 3 styles (filled/outline/grey) × hover.
 *
 * Markup:
 *   <button class="button button--lg button--filled">
 *     <span class="button__label">Get started for free</span>
 *   </button>
 * Optional icons are siblings of `.button__label`:
 *   <span class="button__icon">…svg…</span>
 *
 * The label is wrapped in a span so the Outline variant can apply a
 * background-clip:text gradient to the text without affecting the
 * button background.
 *
 * No transitions — Figma's variant matrix only defines two states
 * (Default, Hover). Smooth transitions, if wanted, must be specified
 * by Mikael. See NOTES.md, open question 8.
 */

.button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: var(--corner-radius-xs);
  cursor: pointer;
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-500);
  letter-spacing: var(--font-letter-spacing-tight);
  text-decoration: none;
  white-space: nowrap;
  background: none;
}

.button__icon {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.button__icon > svg { width: 100%; height: 100%; display: block; }

.button__label {
  display: inline-block;
  line-height: 1;
}

/* ---------- Sizes ---------- */
.button--lg {
  height: 64px;
  padding: 0 var(--spacing-48);
  gap: var(--spacing-16);
  font-size: var(--font-size-20);
}
.button--lg .button__icon { width: 24px; height: 24px; }

.button--md {
  height: 48px;
  padding: 0 var(--spacing-32);
  gap: var(--spacing-12);
  font-size: var(--font-size-16);
}
.button--md .button__icon { width: 20px; height: 20px; }

.button--sm {
  height: 32px;
  padding: 0 var(--spacing-16);
  gap: var(--spacing-8);
  font-size: var(--font-size-14);
}
.button--sm .button__icon { width: 16px; height: 16px; }

/* ---------- Block ---------- */
/* Stretch to the container width. Combines with any size modifier;
   the button's inline-flex + justify-content: center keeps the label
   (and icon) centered. */
.button--block {
  display: flex;
  width: 100%;
}

/* ---------- Filled ---------- */
/* Set color on the button itself so .button__icon (which uses
   currentColor via mask-image) matches the label text color. */
.button--filled {
  background-image: var(--brand-gradient);
  color: var(--text-light);
}
.button--filled .button__label { color: inherit; }

.button--filled:hover {
  background-image: var(--brand-gradient-hover);
}
.button--filled.button--lg:hover { filter: drop-shadow(0 0 18px var(--effect-button-shadow)); }
.button--filled.button--md:hover { filter: drop-shadow(0 0 14px var(--effect-button-shadow)); }
.button--filled.button--sm:hover { filter: drop-shadow(0 0 10px var(--effect-button-shadow)); }

/* ---------- Outline ---------- */
.button--outline {
  background-color: var(--background-button-base);
  border: var(--stroke-weight-1) solid var(--color-pink-600);
}
.button--outline .button__label {
  background-image: var(--brand-gradient);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
}
.button--outline:hover { border-color: var(--color-orange-600); }
.button--outline:hover .button__label {
  background-image: var(--brand-gradient-hover);
}
/* Only the Large + Outline + Hover variant has the wide glow. */
.button--outline.button--lg:hover {
  box-shadow: 0 0 36px 0 var(--effect-button-shadow);
}

/* ---------- Grey ---------- */
.button--grey {
  background-color: var(--background-surface-2);
  color: var(--text-primary);
}
.button--grey .button__label { color: inherit; }
.button--grey:hover { background-color: var(--background-hover); }

/* Outline buttons: icon color cannot use background-clip:text trick;
   set it to the rest-state pink so it matches the gradient text closely. */
.button--outline { color: var(--color-pink-600); }
.button--outline:hover { color: var(--color-orange-600); }

/* --- canonical/components/gene-chip.css --- */
/*
 * Gene Chip — component set 70:2462.
 *
 * Markup:
 *   <span class="gene-chip">
 *     <span class="gene-chip__rsid">rs2802292</span>
 *     <span class="gene-chip__groups">
 *       <span class="gene-chip__group">
 *         <span class="gene-chip__icon">…svg…</span>
 *         <span class="gene-chip__text">FOXO3</span>
 *       </span>
 *       <span class="gene-chip__group">
 *         <span class="gene-chip__icon">…svg…</span>
 *         <span class="gene-chip__text">GT</span>
 *       </span>
 *     </span>
 *   </span>
 *
 * The 8px corner radius is a literal value in Figma — it's NOT in the
 * `Corner Radius/*` token scale (which only defines 4 / 32 / 9999).
 * See NOTES.md, open question 9.
 */

.gene-chip {
  display: inline-flex;
  align-items: flex-start;
  justify-content: flex-end;
  gap: var(--spacing-4);
  padding: var(--spacing-8) var(--spacing-12);
  border-radius: var(--corner-radius-sm);
  border: var(--stroke-weight-1) solid var(--border-subtle);
  background: transparent;
}

.gene-chip:hover,
.gene-chip--hover {
  border-color: transparent;
  background-color: var(--background-hover);
}

.gene-chip__rsid {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-14);
  line-height: 1.149999976158142;
  letter-spacing: var(--font-letter-spacing-normal);
  color: var(--text-primary);
}

.gene-chip__groups {
  display: inline-flex;
  align-items: flex-start;
  gap: var(--spacing-8);
}

.gene-chip__group {
  display: inline-flex;
  align-items: center;
  justify-content: flex-end;
}

.gene-chip__icon {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.gene-chip__icon > svg { width: 100%; height: 100%; display: block; }

.gene-chip__text {
  font-family: var(--font-family-mono);
  font-weight: var(--font-weight-500);
  font-size: var(--font-size-12);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-normal);
  color: var(--text-secondary);
  text-align: right;
}

/* --- canonical/components/recommendation-card.css --- */
/*
 * Recommendation Card — node 70:2696.
 *
 * Outer width is rendered fluid (100%). The Figma instance is 1134px
 * wide, but that's demo data, not the card's intrinsic geometry.
 *
 * PROTECTIVE now binds to --text-protective. PATHOGENIC is the Figma
 * literal #8fa97c (handled "as to prefer" per Mikael until the
 * recommendations page is finished and the formal pathogenic-status
 * tokens land).
 */

.recommendation-card {
  display: flex;
  align-items: stretch;
  width: 100%;
  background-color: var(--background-surface-1);
  border-radius: var(--corner-radius-lg);
  overflow: clip;
}

.recommendation-card__inner {
  display: flex;
  align-items: flex-start;
  gap: var(--spacing-32);
  padding: var(--spacing-32);
  flex: 1 0 0;
  min-width: 0;
}

.recommendation-card__rail {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: var(--spacing-16);
  flex-shrink: 0;
}

.recommendation-card__content {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--spacing-12);
  flex: 1 0 0;
  min-width: 0;
}

.recommendation-card__meta-row {
  display: flex;
  align-items: center;
  gap: var(--spacing-8);
  width: 100%;
  flex-wrap: wrap;
}

.recommendation-card__category {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-14);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-wider);
  color: var(--text-primary);
  text-transform: uppercase;
  flex: 1 0 0;
  min-width: 0;
}

.recommendation-card__title-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--spacing-8);
  width: 100%;
}

.recommendation-card__title {
  font-family: var(--font-family-display);
  font-weight: var(--font-weight-700);
  font-size: var(--font-size-20);
  line-height: 1.149999976158142;
  letter-spacing: var(--font-letter-spacing-tight);
  color: var(--text-primary);
  margin: 0;
}

.recommendation-card__body {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-400);
  font-size: var(--font-size-16);
  line-height: 1.25;
  letter-spacing: var(--font-letter-spacing-normal);
  color: var(--text-secondary);
  width: 100%;
}
.recommendation-card__body p { margin: 0; }
.recommendation-card__body p + p { margin-top: var(--spacing-8); }

.recommendation-card__footer {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  /* Figma: 6px. Not in the spacing scale (closest --spacing-8). */
  padding-top: var(--spacing-8);
  width: 100%;
}

.recommendation-card__footer-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--spacing-8);
  width: 100%;
}

.recommendation-card__effect-caption {
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-12);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-wide);
  text-transform: uppercase;
  text-align: right;
}
.recommendation-card__effect-caption > .from   { color: var(--text-tertiary); display: block; }
.recommendation-card__effect-caption > .target { color: var(--text-secondary); display: block; }

/* ---------- Status pill ---------- */
.status-pill {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-8);
  padding: var(--spacing-2) var(--spacing-8);
  border-radius: var(--corner-radius-xs);
  font-family: var(--font-family-body);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-14);
  line-height: 1;
  letter-spacing: var(--font-letter-spacing-wider);
  text-transform: uppercase;
}
.status-pill__icon {
  width: 16px;
  height: 16px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.status-pill__icon > svg { width: 100%; height: 100%; display: block; }

.status-pill--benign      { color: var(--text-secondary); }
.status-pill--protective  { color: var(--text-protective); }
.status-pill--pathogenic  { color: #8fa97c; } /* not in figma — pathogenic awaiting formal token */
.status-pill--risk-factor { color: var(--text-risk-factor); }

/* `.evidence-pill` was a duplicate of the generic `.pill` (see
   utilities.css). Use `.pill` directly instead. */

/* ============================================================== */
/* provisional/ — gem-owned, awaiting Figma blessing */
/* ============================================================== */

/* --- provisional/settings/status-palette.css --- */
/*
 * Note: app-owned color contract.
 *
 * Status: the brand gem only ships `.status-pill --benign|--protective|
 * --pathogenic|--risk-factor` (clinical-significance vocabulary) and has
 * no general semantic status palette. Consumers need 7 tones across at
 * least 13 vocabulary axes (clinical, evidence, synthesis, concern,
 * autopilot-run-status, autopilot-post-status, autopilot-content-type,
 * autopilot-reply-class, analytics-event, action-status, snp-effect,
 * consequence, offspring-analysis). All vocabularies fold cleanly onto
 * these 7 tones via the badge mapping (see provisional/objects/badge.css).
 *
 * Migrate when: the gem ships --status-{critical,warning,caution,
 * positive,info,accent,neutral}-{surface,text} tokens authored by Mikael.
 * Provisional tokens here then alias to the gem and disappear.
 *
 * Authority — surfaces bind to Mikael's primitives (no literal hex).
 * Where Mikael has shipped a tinted-surface primitive (spring-green-
 * 15-40, cyan-*-30/40, azure-33-40, violet-35-40, orange-gene-25-40)
 * we use it. Where he hasn't (the warm reds for critical/warning) we
 * use his pink/orange ramps at deep/dark steps.
 *
 * Text uses --text-primary in both themes (grey-950 in light, grey-50
 * in dark) for uniform high-contrast readability. The colored tone
 * lives in the surface; pairing it with a same-family saturated text
 * (azure-66 on azure-33-40, etc.) collapsed contrast badly. Round-2
 * Q1c asks Mikael whether he wants saturated colored text restored
 * once he ships explicit text variants matched to each surface.
 */

:root,
.theme-dark {
  /* Critical — pathogenic, high-risk, failure, critical-concern,
     increased-effect, absent/high (snp-card). */
  --status-critical-surface: var(--color-pink-950);
  --status-critical-text:    var(--text-primary);

  /* Warning — likely-pathogenic, warning-concern, decreased-effect,
     reduced/poor (snp-card), repost (autopilot), promotional (replies). */
  --status-warning-surface: var(--color-orange-900);
  --status-warning-text:    var(--text-primary);

  /* Caution — risk-factor, caution-concern, moderate-evidence,
     intermediate (action), altered-effect, upload (analytics),
     pending/partial (autopilot). */
  --status-caution-surface: var(--color-orange-gene-25-40);
  --status-caution-text:    var(--text-primary);

  /* Positive — protective, established-evidence, cited-synthesis,
     normal/beneficial (action), guaranteed (offspring), signup
     (analytics), posted/success (autopilot). */
  --status-positive-surface: var(--color-spring-green-15-40);
  --status-positive-text:    var(--text-primary);

  /* Info — strong-evidence, fast/rapid (snp-card), running (autopilot),
     login (analytics), post (autopilot type), other (reply class),
     guideline marker. */
  --status-info-surface: var(--color-azure-33-40);
  --status-info-text:    var(--text-primary);

  /* Accent — slow (snp-card), thread (autopilot type), payment
     (analytics), carrier (offspring), hypothetical-synthesis (collapsed
     from indigo). */
  --status-accent-surface: var(--color-violet-35-40);
  --status-accent-text:    var(--text-primary);

  /* Neutral — benign, default, preliminary-evidence, skipped
     (autopilot), page-view (analytics). */
  --status-neutral-surface: var(--color-grey-800);
  --status-neutral-text:    var(--text-primary);

  /* Panel surfaces — used by provisional/objects/panel.css.
     Dark-mode panel contrasts against --background-base (grey-950)
     by stepping up to surface-1 (grey-900). */
  --panel-surface:         var(--color-grey-900);
  --panel-surface-admin:   var(--color-grey-800);
  --panel-surface-subtle:  color-mix(in srgb, var(--color-grey-900) 50%, transparent);
  --panel-border:          var(--color-grey-700);
}

.theme-light {
  /* Light-mode status palette. All text uses --text-primary (grey-950)
     for uniform high-contrast readability against the tinted surfaces. */
  --status-critical-surface: var(--color-pink-100);
  --status-critical-text:    var(--text-primary);

  --status-warning-surface: var(--color-orange-100);
  --status-warning-text:    var(--text-primary);

  --status-caution-surface: var(--color-orange-gene-25-40);
  --status-caution-text:    var(--text-primary);

  --status-positive-surface: var(--color-spring-green-15-40);
  --status-positive-text:    var(--text-primary);

  --status-info-surface: var(--color-azure-33-40);
  --status-info-text:    var(--text-primary);

  --status-accent-surface: var(--color-violet-35-40);
  --status-accent-text:    var(--text-primary);

  --status-neutral-surface: var(--color-grey-200);
  --status-neutral-text:    var(--text-primary);

  /* Panel surfaces — light mode. */
  --panel-surface:         var(--color-white-solid);
  --panel-surface-admin:   var(--color-white-solid);
  --panel-surface-subtle:  var(--color-grey-50);
  --panel-border:          var(--color-grey-200);
}

/* --- provisional/objects/admin-table.css --- */
/*
 * Note: app-owned structural primitive.
 *
 * Status: unifies the 5 admin-table clones (admin-autopilot-{show,
 * runs, replies, queue}-table + analytics-events-table) into a single
 * .admin-table primitive that styles its descendant thead/tbody/th/td
 * elements via element selectors. Eliminates ~50 per-page sub-element
 * classes.
 *
 * Cell-variation slot classes:
 *   td (default):            px-4 py-2 + body text color
 *   td.is-muted:             time/position cells (gray + whitespace-nowrap)
 *   td.is-mono:              short mono-id cells (font-mono text-xs)
 *   td.is-mono-truncate:     long mono-prop cells (truncate + max-w-xs)
 *   tr.is-align-top:         rows whose cells should align to top
 *
 * Migrate when: gem ships a generic data-table primitive.
 */

.admin-table {
  width: 100%;
  font-size: var(--font-size-14);

  & thead { background-color: var(--background-surface-1); }

  & th {
    text-align: left;
    padding: var(--spacing-8) var(--spacing-16);
    color: var(--text-secondary);
    font-weight: var(--font-weight-500);
  }

  & tbody > tr + tr { border-top: var(--stroke-weight-1) solid var(--border-subtle); }
  & tbody tr:hover { background-color: var(--background-hover); }
  & tr.is-align-top { vertical-align: top; }

  & td {
    padding: var(--spacing-8) var(--spacing-16);
    color: var(--text-primary);

    &.is-muted { color: var(--text-tertiary); white-space: nowrap; }

    &.is-mono,
    &.is-mono-truncate {
      font-family: var(--font-family-mono);
      font-size: var(--font-size-12);
      color: var(--text-tertiary);
    }
    &.is-mono-truncate {
      max-width: 20rem; /* Note: bespoke truncate width */
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    &.is-wide { max-width: 28rem; /* Note: bespoke wide cell */ }
  }
}

/* --- provisional/objects/back-link.css --- */
/*
 * Note: app-owned structural primitive.
 *
 * Status: unifies 11+ per-page back-link classes (each repeating the
 * same `inline-flex items-center gap-1 text-sm` recipe with one of two
 * color families) into a single .back-link primitive plus a .back-link-icon
 * slot. Two tones cover the families:
 *   - default: prominent teal — remapped to brand pink-600
 *   - --muted: gray-500/400 hover:gray-700/300
 *   - --muted-to-teal: gray-500/400 hover:teal-700/400 (MFA pages)
 *
 * Migrate when: gem ships a link-back / breadcrumb-back primitive.
 */

.back-link {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-4);
  font-size: var(--font-size-14);
  color: var(--text-secondary);

  &:hover { color: var(--text-primary); }

  &.back-link--muted,
  &.back-link--muted-to-teal { color: var(--text-tertiary); }
  &.back-link--muted:hover { color: var(--text-primary); }
}
html.theme-dark .back-link       { color: var(--text-secondary); }
html.theme-dark .back-link:hover { color: var(--text-primary); }

.back-link-icon { width: 1rem; height: 1rem; }

/* --- provisional/objects/badge.css --- */
/*
 * Note: app-owned structural primitive.
 *
 * Status: unifies 24 distinct badge classes across 15 component files
 * (~110 ERB callsites) into a single .badge primitive with a small,
 * orthogonal modifier set. Replaces the per-vocabulary classes
 * (.clinical-badge--*, .evidence-badge--*, .snp-card-status-badge--*,
 * .admin-autopilot-runs-status-badge--*, etc.) that proliferated as
 * sibling components evolved.
 *
 * The brand gem ships only `.status-pill --benign|--protective|
 * --pathogenic|--risk-factor` (clinical-significance vocabulary).
 * This primitive covers 13+ vocabulary axes via 7 semantic tones.
 *
 * Tones bind to --status-{tone}-{surface,text} (see settings/_colors.css).
 *
 * Migrate when: gem ships a generic badge/pill primitive with the same
 * tone axes. .badge here aliases to the gem class, then disappears.
 * The corresponding tokens in settings/_colors.css migrate alongside.
 */

.badge {
  display: inline-block;
  padding: var(--spacing-2) var(--spacing-8);  /* py-0.5 px-2 */
  border-radius: var(--corner-radius-sm);
  font-size: var(--font-size-12);        /* text-xs */
  line-height: 1rem;
  font-weight: var(--font-weight-500);          /* medium */
  background-color: var(--status-neutral-surface);
  color: var(--status-neutral-text);

  /* Tones */
  &.badge--critical { background-color: var(--status-critical-surface); color: var(--status-critical-text); }
  &.badge--warning  { background-color: var(--status-warning-surface);  color: var(--status-warning-text);  }
  &.badge--caution  { background-color: var(--status-caution-surface);  color: var(--status-caution-text);  }
  &.badge--positive { background-color: var(--status-positive-surface); color: var(--status-positive-text); }
  &.badge--info     { background-color: var(--status-info-surface);     color: var(--status-info-text);     }
  &.badge--accent   { background-color: var(--status-accent-surface);   color: var(--status-accent-text);   }
  &.badge--neutral  { background-color: var(--status-neutral-surface);  color: var(--status-neutral-text);  }

  /* Shape modifiers */
  &.badge--pill { border-radius: var(--corner-radius-full); }
  &.badge--sm   { padding: var(--spacing-2) var(--spacing-4); }  /* px-1.5 py-0.5 */
}

/* --- provisional/objects/container.css --- */
/* objects/_container.css — bounded-width content containers.
 *
 * The vertical's ERB uses two container patterns that don't match
 * brand's `.container` (1296px max + 48px gutter):
 *   - `max-w-6xl mx-auto px-4` (72rem max + 16px gutter) — generic chrome
 *   - `max-w-3xl mx-auto px-4` (48rem max + 16px gutter) — narrow reading width
 *
 * Both ship here as named classes so ERB can stop reaching for Tailwind
 * utilities to assemble them.
 *
 * Note: replace when geneops-brand ships a `.container-{wide,narrow}`
 * size system that covers the 1152px and 768px tiers.
 */

.container-wide,
.container-narrow {
  width: 100%;
  margin-inline: auto;
  padding-inline: var(--spacing-16);
  box-sizing: border-box;
}

.container-wide   { max-width: var(--width-1296); }  /* replaces `max-w-6xl mx-auto px-4` */
.container-narrow { max-width: 48rem; /* Note: 768px tier, not in brand width tokens */ }  /* replaces `max-w-3xl mx-auto px-4` */

/* --- provisional/objects/disclosure.css --- */
/*
 * Note: app-owned structural primitive.
 *
 * Status: unifies the <details>/<summary> disclosure pattern (custom
 * marker hidden, hover surface, chevron rotation on open, show-when-
 * open/closed inverse pair) used in actions-results, category-show,
 * and other expandable sections. Uses native CSS `details[open] >
 * summary` selectors to scope behavior — nesting is handled correctly
 * (each summary's chevron/toggles respond to its own parent details).
 *
 * Migrate when: gem ships a disclosure primitive.
 */

.disclosure-summary {
  cursor: pointer;
  list-style: none;
  user-select: none;
  transition: background-color 0.15s ease;

  &::-webkit-details-marker { display: none; }
  &:hover { background-color: var(--background-hover); }
}

.disclosure-chevron {
  width: 1.25rem; height: 1.25rem;
  color: var(--symbol-disabled);
  transition: transform 0.2s ease;
  flex-shrink: 0;
  /* SVGs default to baseline alignment which puts the chevron above the
     text in non-flex containers (the section-summary toggle row). In
     flex containers (sub-summary), align-items: center wins and this is
     a no-op. */
  vertical-align: middle;

  &.disclosure-chevron--sm { width: 1rem; height: 1rem; }
}

details[open] > summary .disclosure-chevron { transform: rotate(180deg); }

/* Show/hide inverse pair — meant for spans inside <summary>. */
.disclosure-show-when-open   { display: none; }
.disclosure-show-when-closed { display: inline; }
details[open] > summary .disclosure-show-when-open   { display: inline; }
details[open] > summary .disclosure-show-when-closed { display: none; }

/* --- provisional/objects/form.css --- */
/* objects/_form.css — form structural primitives.
 *
 * Replaces the per-page *-form / *-field-label / *-field-input / *-submit
 * recipes repeated across auth, mfa, invite, connection-share, and
 * upload forms. Apply on the element directly; tone/color overrides
 * stay page-local.
 *
 * Field label/help styling lives in objects/_text.css (.text-label,
 * .text-fine-print, .text-sm). This file owns the inputs and submit.
 *
 * Note: belongs in the brand gem (universal form chrome every
 * vertical needs). Move when gem ships an equivalent.
 */

/* Vertical stack of fields. Mirrors brand's .stack-N but with a fixed
 * default form-cadence; opt into a tighter cadence with .form-stack--sm. */
.form-stack > * + * { margin-top: var(--spacing-24); }
.form-stack--sm > * + * { margin-top: var(--spacing-16); }

/* One field row — label above, input below. */
.form-field {
  display: block;

  & > label { display: block; margin-bottom: var(--spacing-8); }
  & > label.is-tight { margin-bottom: var(--spacing-4); }
}

/* The input itself — full-width padded bordered surface. */
.form-input {
  width: 100%;
  padding: var(--spacing-12) var(--spacing-16);
  border: var(--stroke-weight-1) solid var(--border-default);
  border-radius: var(--corner-radius-sm);
  background-color: var(--background-surface-1);
  color: var(--text-primary);

  &::placeholder { color: var(--text-tertiary); }
  &:focus {
    outline: none;
    box-shadow: 0 0 0 2px var(--color-pink-600);
    border-color: var(--color-pink-600);
  }

  /* Compact variant for inline forms (mfa-show disable, invite). */
  &.form-input--sm { padding: var(--spacing-8) var(--spacing-12); }

  /* Code-entry variant — centered monospace with letter-spacing
   * (used by totp + mfa-setup verify). */
  &.form-input--code {
    text-align: center;
    font-size: var(--font-size-18);
    line-height: 1.75rem;
    letter-spacing: 0.1em;
    font-family: var(--font-family-mono);
  }
}

/* Full-width submit button — composes on top of brand .button.
 * Apply as `class="button button--md button--filled form-submit"`. */
.form-submit {
  width: 100%;
  cursor: pointer;
}

/* --- provisional/objects/link-inline.css --- */
/*
 * Note: app-owned structural primitive.
 *
 * Status: unifies 20+ in-prose teal link classes across components into
 * a single .link-inline primitive with two hover idioms:
 *   - default:   text-teal-700 → brand pink-600
 *   - --darken:  teal-700 hover:teal-900 → pink-600 hover:pink-800
 *
 * Migrate when: gem ships a generic inline-link primitive.
 */

.link-inline {
  color: var(--text-primary);
  text-decoration: none;

  &:hover { text-decoration: underline; }

  &.link-inline--darken:hover {
    text-decoration: none;
    color: var(--text-hover);
  }
}
html.theme-dark .link-inline { color: var(--text-primary); }
html.theme-dark .link-inline--darken:hover { color: var(--text-hover); }

/* --- provisional/objects/notice.css --- */
/*
 * Note: app-owned structural primitive.
 *
 * Status: unifies notice/banner card recipes (border-2 + colored leading
 * icon + tone-cascading title/text/link/dismiss children) across
 * shared/_genome_notices (3 toned variants) + account-show notices/
 * banners/flash + page-legal-notice + account-confirm-destroy-warning
 * into a single .notice primitive with --{warn,info,danger,success,
 * accent,brand} tone modifiers that cascade to slot children.
 *
 * Tones bind to --status-{tone}-{surface,text} (see settings/_colors.css)
 * — same palette as .badge, so the two primitives stay visually
 * coherent across the app.
 *
 * The brand gem ships no notice/banner equivalent.
 *
 * Migrate when: gem ships a notice/alert primitive with matching
 * tone + slot model. .notice here aliases to the gem class, then
 * disappears.
 */

.notice {
  background-color: var(--panel-surface);
  border: var(--stroke-weight-2) solid var(--panel-border);
  border-radius: var(--corner-radius-sm); /* was 0.5rem (8px), off-scale → sm */
  padding: var(--spacing-16);
  margin-bottom: var(--spacing-24);

  /* Size variant. */
  &.notice--lg {
    padding: var(--spacing-16);
    border-radius: var(--corner-radius-md);
    margin-bottom: var(--spacing-0);
  }

  /* Tone borders + base text color (cascades to slot children below).
   * Tones bind to the shared --status-*-{surface,text} palette. We use
   * the tone's text color for both border and base copy — surface is
   * reserved for cascading slot children. */
  &.notice--warn    { border-color: var(--status-warning-text);  color: var(--status-warning-text); }
  &.notice--info    { border-color: var(--status-info-text);     color: var(--status-info-text); }
  &.notice--danger  { border-color: var(--status-critical-text); color: var(--status-critical-text); }
  &.notice--success { border-color: var(--status-positive-text); color: var(--status-positive-text); }
  &.notice--accent  { border-color: var(--status-accent-text);   color: var(--status-accent-text); }
}

/* Slots — color is inherited from the notice tone (above). */
.notice-row     { display: flex; align-items: flex-start; gap: var(--spacing-12); }
.notice-icon    { width: 1.25rem; height: 1.25rem; margin-top: var(--spacing-2); flex-shrink: 0; }
.notice-body    { flex: 1; }
.notice-title   { font-size: var(--font-size-14); font-weight: var(--font-weight-500); }
.notice-text    { font-size: var(--font-size-14); margin-top: var(--spacing-4); }
.notice-actions { display: flex; align-items: center; gap: var(--spacing-16); margin-top: var(--spacing-8); }
.notice-link    { display: inline-block; font-size: var(--font-size-14); font-weight: var(--font-weight-500); text-decoration: underline; }
.notice-dismiss { font-size: var(--font-size-14); }

/* --- provisional/objects/panel.css --- */
/*
 * Note: app-owned structural primitive.
 *
 * Status: unifies 40+ distinct section-card classes across 30+ component
 * files into a single .panel primitive with an orthogonal modifier set
 * (size, surface, state, accent border). Replaces the per-page named
 * variants (.account-show-card, .connections-index-card, .payments-new-card,
 * .insights-widget, etc.) that proliferated as sibling pages were built.
 *
 * The brand gem ships .surface-card with a fixed padding/radius; this
 * primitive covers the broader padding scale (xs/sm/md/lg/xl plus
 * responsive sm: breakpoints) and the admin-vs-vertical dark-surface
 * fork.
 *
 * Surface tokens bind to --panel-{surface,surface-admin,surface-subtle,
 * border} (see settings/_colors.css). Accent borders route through the
 * shared --status-*-text palette so they stay in sync with notice/badge.
 *
 * Migrate when: gem ships a panel primitive with matching size +
 * surface + clickable modifiers. .panel here aliases to the gem class,
 * then disappears. The corresponding tokens in settings/_colors.css
 * migrate alongside.
 */

.panel {
  background-color: var(--panel-surface);
  border: var(--stroke-weight-1) solid var(--panel-border);
  border-radius: var(--corner-radius-md);
}

/* Size modifiers — control padding only. */
.panel--xs { padding: var(--spacing-12); }
.panel--sm { padding: var(--spacing-16); }
.panel--md { padding: var(--spacing-16); }
.panel--lg { padding: var(--spacing-24); }
.panel--xl { padding: var(--spacing-32); }

/* Responsive size modifiers (p-N base → sm:p-N at ≥640px). */
.panel--responsive-md { padding: var(--spacing-16); }
.panel--responsive-lg { padding: var(--spacing-16); }
.panel--responsive-xl { padding: var(--spacing-32); }

@media (min-width: 640px) {
  .panel--responsive-md { padding: var(--spacing-24); }
  .panel--responsive-lg { padding: var(--spacing-32); }
  .panel--responsive-xl { padding: var(--spacing-32); }
}

/* Surface variants. */
.panel--admin  { background-color: var(--panel-surface-admin); }
.panel--subtle { background-color: var(--panel-surface-subtle); }

/* Radius variant. */
.panel--radius-lg { border-radius: var(--corner-radius-sm); }   /* was 0.5rem (8px), off-scale → sm */

/* State variants. */
.panel--flush     { padding: var(--spacing-0); overflow: hidden; }
.panel--elevated  { box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); }
.panel--clickable {
  display: block;
  transition: box-shadow 0.15s ease-out;
}
.panel--clickable:hover {
  box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
}

/* Accent borders (notice-card pattern — full-card variant of .notice).
 * Tones route through the same --status-*-text palette as .notice. */
.panel--accent-info,
.panel--accent-warn,
.panel--accent-success,
.panel--accent-danger { border-width: var(--stroke-weight-2); }
.panel--accent-info    { border-color: var(--status-info-text); }
.panel--accent-warn    { border-color: var(--status-warning-text); }
.panel--accent-success { border-color: var(--status-positive-text); }
.panel--accent-danger  { border-color: var(--status-critical-text); }

/* Slot children — apply on descendants of .panel. Collapses the ~60
 * per-page *-card-{title,header,split,description,subtitle} recipes. */
.panel-title {
  font-size: var(--font-size-18);
  font-weight: var(--font-weight-600);
  line-height: 1.4;
  margin-bottom: var(--spacing-16);

  /* Inside .panel-header / .panel-split the wrapper owns the spacing. */
  .panel-header &,
  .panel-split  & { margin-bottom: var(--spacing-0); }
}
.panel-subtitle    { color: var(--text-secondary); margin-top: var(--spacing-4); }
.panel-description { color: var(--text-secondary); margin-bottom: var(--spacing-16); }
.panel-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--spacing-16);
}
.panel-split {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

/* --- provisional/objects/prose.css --- */
/* objects/_prose.css — minimal prose ruleset.
 *
 * Replaces @tailwindcss/typography's `.prose` plugin output (which was
 * being absorbed via @apply in 13 component classes). Hand-written to
 * cover the rich-text needs of:
 *   - legal-body (terms/privacy pages)
 *   - agent-doc-prose, message-assistant-bubble (agent chat)
 *   - actions-{list,interaction,consolidated,simple}-prose (action cards)
 *   - reader-card-{article,preview-prose} (paper reader)
 *   - snp-show-{body,preview,genotype-card-explanation}-prose
 *   - category-intro-prose
 *
 * Apply by adding `prose` (+ `prose-sm` for the small variant) to the
 * element's HTML class attribute. Component classes layer color/spacing
 * overrides on top.
 *
 * Note: replace when geneops-brand ships a `.prose` primitive.
 */

.prose {
  color: var(--text-primary);
  /* Width is controlled by the surrounding container (e.g. .measure-740,
     .app-main); .prose itself doesn't constrain. The previous 65ch cap
     was making text-heavy pages render at ~520px regardless of wrapper. */
  font-size: var(--font-size-16);
  line-height: 1.75;

  & p, & ul, & ol, & blockquote { margin-block: 1.25em; }

  & h1, & h2, & h3, & h4 {
    font-weight: var(--font-weight-700);
    line-height: 1.25;
    margin-top: 1.5em;
    margin-bottom: 0.5em;
  }
  & h1 { font-size: 2.25em; }
  & h2 { font-size: 1.5em; }
  & h3 { font-size: 1.25em; }
  & h4 { font-size: 1em; }

  & a {
    color: var(--text-primary);
    text-decoration: underline;
    font-weight: var(--font-weight-500);

    &:hover { color: var(--text-secondary); }
  }

  & strong { font-weight: var(--font-weight-600); }
  & em { font-style: italic; }

  & ul, & ol { padding-left: 1.625em; }
  & ul { list-style-type: disc; }
  & ol { list-style-type: decimal; }
  & li { margin-block: 0.5em; }
  & li::marker { color: var(--text-tertiary); }

  & code {
    font-family: var(--font-family-mono);
    font-size: 0.875em;
    background-color: var(--background-surface-1);
    padding: 0.125em 0.375em;
    border-radius: var(--corner-radius-sm);
  }

  & pre {
    background-color: var(--color-grey-900);
    color: var(--color-grey-100);
    padding: 1em;
    border-radius: var(--corner-radius-sm); /* was 0.5rem (8px), off-scale → sm */
    overflow-x: auto;
    font-size: 0.875em;
    line-height: 1.5;

    & code {
      background: transparent;
      padding: var(--spacing-0);
      color: inherit;
      font-size: inherit;
      border-radius: 0;
    }
  }

  & blockquote {
    border-left: 4px solid var(--border-subtle);
    padding-left: 1em;
    font-style: italic;
    color: var(--text-secondary);
  }

  & hr {
    border: 0;
    border-top: var(--stroke-weight-1) solid var(--border-subtle);
    margin-block: 2em;
  }

  & > :first-child { margin-top: var(--spacing-0); }
  & > :last-child { margin-bottom: var(--spacing-0); }

  /* Tables — minimal markdown-shaped table styling. Used by legal pages
     (privacy/terms) and any other long-form content that may include a
     table. Borders use semantic tokens so the dark fork is automatic. */
  & table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--font-size-14);
    margin-block: 1.25em;
  }
  & thead th {
    text-align: left;
    font-weight: var(--font-weight-500);
    padding: var(--spacing-8) var(--spacing-16) var(--spacing-8) 0;
    border-bottom: var(--stroke-weight-1) solid var(--border-default);
  }
  & tbody td {
    padding: var(--spacing-8) var(--spacing-16) var(--spacing-8) 0;
    color: var(--text-secondary);
    border-bottom: var(--stroke-weight-1) solid var(--border-subtle);
  }
  & tbody tr:last-child td { border-bottom: 0; }
  & thead th:last-child,
  & tbody td:last-child { padding-right: 0; }

  /* Definition lists — used for label/value rows (e.g. legal contact). */
  & dl { margin-block: 1.25em; display: flex; flex-direction: column; gap: var(--spacing-8); }
  & dl > div { display: flex; gap: var(--spacing-16); }
  & dt { color: var(--text-tertiary); width: 8rem; flex-shrink: 0; font-size: var(--font-size-14); }
  & dd { font-size: var(--font-size-14); }
}

/* Small variant — used for inline help text, chat messages, card-embedded prose. */
.prose-sm {
  font-size: var(--font-size-14);
  line-height: 1.7;

  & h1 { font-size: 2em; }
  & h2 { font-size: 1.375em; }
  & h3 { font-size: 1.125em; }
  & h4 { font-size: 1em; }
  & p, & ul, & ol, & blockquote { margin-block: 1.14em; }
  & li { margin-block: 0.4em; }
}

/* --- provisional/objects/responsive-overlay.css --- */
/* objects/_responsive-overlay.css — responsive overrides for brand utilities.
 *
 * The geneops-brand gem ships desktop-only — no @media rules anywhere
 * except .headline-xxl. The vertical adapts brand fixed-grid utilities
 * for narrow viewports. Breakpoints:
 *   - 3-up grids reflow at 1024px (three cards crush before that)
 *   - 2-up grids and rows reflow at 768px
 *   - Stacked cards tighten to 16px gap on mobile (matches container edge)
 *   - .headline-xl/lg + section padding step down below 640px
 */

/* 3-up grids reflow earlier — three cards crush before 1024px. */
@media (max-width: 1023px) {
  .grid-3-32 {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--spacing-16);
  }
}

/* Tablet and below — collapse remaining multi-col grids to 1 column,
   allow horizontal rows to wrap, shrink container padding so cards
   don't touch the viewport edge. Stacked-card gap drops to 16px to
   match Mikael's mobile rhythm. */
@media (max-width: 767px) {
  .container { padding-inline: var(--spacing-16); }
  .grid-2-32,
  .grid-4-32 {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--spacing-16);
  }
  .row-8, .row-12, .row-16, .row-24, .row-32, .row-48 { flex-wrap: wrap; }
  .padded-48     { padding: var(--spacing-24); }
  .surface-card  { padding: var(--spacing-24); }
  .bordered-left { border-left: 0; border-top: var(--stroke-weight-1) solid var(--border-subtle); }

  /* Anchored pills — drop absolute positioning so they push content
     down instead of clipping. Specifically the "Early bird pricing"
     pill on the Lifetime card (card-anchor--top-right-inset) overlaps
     the headline below ~600px. */
  .card-anchor--top-right-inset {
    position: static;
    white-space: normal;
    align-self: flex-start;
  }

  /* Stats row: 2 per row on mobile instead of 1 (the brand's wrap-24-48
     utility otherwise collapses to a single column on narrow viewports). */
  .flex-wrap-24-48 {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--spacing-24);
    justify-items: center;
    padding-block: var(--spacing-32);
  }

  /* Surface-card row layouts (CTA banner): stack vertically on mobile. */
  .surface-card.row-32 {
    flex-direction: column;
    align-items: stretch;
  }

  /* List bullets: keep icon + text inline so long text wraps under the
     text column. */
  li.row-8, li.row-12, li.row-16 {
    flex-wrap: nowrap;

    & > .icon { flex-shrink: 0; }
  }
}

/* Phone — brand 0.3.0 owns .headline-xxl responsive scaling (100→60→32).
   The vertical still tightens secondary headlines and section padding
   below 640. */
@media (max-width: 639px) {
  .headline-xl  { font-size: var(--font-size-32); line-height: 1.1; }
  .headline-lg  { font-size: var(--font-size-32); line-height: 1.15; }
  .subtitle-lg  { font-size: var(--font-size-18); line-height: 1.4; }
  .hero {
    padding-top: calc(var(--spacing-80) + var(--spacing-24));
    padding-bottom: var(--spacing-48);
  }
  .section        { padding-block: var(--spacing-48); }
  .section--tight { padding-block: var(--spacing-32); }
}

/* --- provisional/utilities/animate-highlight.css --- */
/*
 * Note: app-owned utility — gem has no equivalent.
 *
 * Status: brief amber flash applied to newly saved/updated docs in the
 * agent workspace. Light + dark keyframe variants.
 *
 * Migrate when: gem ships an equivalent attention-flash animation token.
 */

@keyframes highlight-flash {
  0% { background-color: var(--color-amber-100); }
  100% { background-color: transparent; }
}

@keyframes highlight-flash-dark {
  0% { background-color: color-mix(in srgb, var(--color-amber-900) 40%, transparent); }
  100% { background-color: transparent; }
}

.animate-highlight {
  animation: highlight-flash 2s ease-out;
}

.dark .animate-highlight {
  animation-name: highlight-flash-dark;
}

/* --- provisional/utilities/drag-active.css --- */
/*
 * Note: app-owned utility — gem has no equivalent.
 *
 * Status: drag-and-drop visual feedback for the genome upload dropzone.
 * Light + dark variants.
 *
 * Migrate when: gem ships a `.drop-target--active` primitive (or
 * equivalent --background-drop-active / --border-drop-active tokens).
 */

.drag-active {
  border-color: var(--color-blue-400);
  background-color: var(--color-blue-50);
}

.dark .drag-active {
  border-color: var(--color-blue-500);
  background-color: color-mix(in srgb, var(--color-blue-900) 30%, transparent);
}

/* --- provisional/utilities/input-gradient-focus.css --- */
/*
 * Note: app-owned utility — gem has no equivalent.
 *
 * Status: replaces focus:ring-* on form inputs with the brand's
 * pink→orange gradient border (same two-layer background-clip trick as
 * .bordered-gradient-brand). The inner fill follows the input's surface
 * via --input-fill, which flips between light and html.theme-dark.
 *
 * Migrate when: gem ships a `--focus-gradient` token set or a
 * `.input--gradient-focus` primitive.
 */

.input-gradient-focus { --input-fill: var(--color-white-solid); }
html.theme-dark .input-gradient-focus { --input-fill: var(--color-grey-800); }

.input-gradient-focus:focus,
.input-gradient-focus:focus-visible {
  border-color: transparent;
  background-image:
    linear-gradient(var(--input-fill), var(--input-fill)),
    var(--brand-gradient);
  background-origin: border-box;
  background-clip: padding-box, border-box;
}

/* --- provisional/utilities/logo-mono.css --- */
/*
 * Note: app-owned utility — gem has no equivalent.
 *
 * Status: mask-based currentColor logo render used by the logo strip
 * (`.logo-mono` applied to <img>-like elements with mask-image:url("…")).
 *
 * Migrate when: gem ships an equivalent currentColor logo primitive.
 */

.logo-mono {
  display: inline-block;
  background-color: currentColor;
  -webkit-mask-size: contain;
  mask-size: contain;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
}

/* --- provisional/utilities/nav-progressive-blur.css --- */
/*
 * Note: app-owned utility — gem has no equivalent.
 *
 * Status: progressive backdrop blur for the fixed top nav. Mirrors the
 * brand's `.site-nav::before` blur effect (12px backdrop-filter on a
 * pseudo-element masked top-opaque → bottom-transparent) but without
 * the PNG tint — the vertical wants pure blur, no color overlay.
 * `position` is intentionally omitted so the element's own `fixed` wins;
 * the pseudo's `absolute` resolves against the nav as a positioned
 * ancestor.
 *
 * Migrate when: brand exposes a tint-less variant of the same effect.
 */

.nav-progressive-blur {
  isolation: isolate;
}

.nav-progressive-blur::before {
  content: "";
  position: absolute;
  inset: var(--spacing-0);
  bottom: -5rem;
  -webkit-backdrop-filter: blur(12px);
          backdrop-filter: blur(12px);
  -webkit-mask-image: linear-gradient(to bottom, rgb(0 0 0) 0%, rgb(0 0 0 / 0) 100%);
          mask-image: linear-gradient(to bottom, rgb(0 0 0) 0%, rgb(0 0 0 / 0) 100%);
  pointer-events: none;
  z-index: -1;
}

/* --- provisional/utilities/object-utilities.css --- */
/*
 * Generic display/visibility utilities not yet in the Mikael-blessed
 * canonical set. Most of these formerly lived in the home vertical's
 * objects/_utilities.css. Promote individually as Mikael adds them to
 * Figma. Duplicates of canonical (.text-center, .uppercase, .truncate,
 * .grow, .no-underline) were dropped on migration.
 */

.hidden       { display: none; }

/* Align-items override modifiers for canonical .row-N (which defaults
   to center). Parallels canonical's .row-between / .row-end. */
.row-start    { align-items: flex-start; }
.row-baseline { align-items: baseline; }
.row-center   { justify-content: center; }

.shrink-0     { flex-shrink: 0; }

.opacity-50 { opacity: 0.5; }
.opacity-75 { opacity: 0.75; }
.opacity-80 { opacity: 0.8; }

/* Responsive hide. `-sm-` breakpoint is 40rem; `-lg-` is 64rem.
   `-down` hides at and below; `-up` hides at and above. */
@media (max-width: 39.99rem) { .hidden-sm-down { display: none; } }
@media (min-width: 40rem)    { .hidden-sm-up   { display: none; } }
@media (max-width: 63.99rem) { .hidden-lg-down { display: none; } }
@media (min-width: 64rem)    { .hidden-lg-up   { display: none; } }

/* --- provisional/utilities/scrollbar-hidden.css --- */
/*
 * Note: app-owned utility — gem has no equivalent.
 *
 * Status: two names for the same behavior coexist (`.scrollbar-hidden` from
 * the legacy app/assets/stylesheets/application.css and `.scrollbar-hide`
 * from app/assets/tailwind/application.css). Different callsites use each.
 *
 * Migrate when: gem ships a `.scrollbar-hide` utility, OR phase-3
 * consolidation picks one name and the markup is updated to match.
 */

.scrollbar-hidden,
.scrollbar-hide {
  scrollbar-width: none;
  -ms-overflow-style: none;

  &::-webkit-scrollbar { display: none; }
}

/* --- provisional/utilities/sidenote.css --- */
/*
 * Note: app-owned utility — gem has no equivalent.
 *
 * Status: Tufte-style sidenotes for the annotated article / paper view.
 * The .sidenote-ref inline marker is visible at all viewports; the
 * .sidenote body floats into the right margin only at >=64rem.
 *
 * Migrate when: gem ships a sidenote object/component (unlikely — this
 * is content-specific and may live here long-term).
 */

.sidenote-ref {
  color: var(--color-teal-700);
  font-weight: var(--font-weight-600);
  font-size: var(--font-size-12);
  margin-left: 1px;
  cursor: default;
}
.dark .sidenote-ref { color: var(--color-teal-400); }

.sidenote { display: none; }

@media (min-width: 64rem) {
  .annotated-prose { padding-right: 10rem; }

  .sidenote {
    display: block;
    float: right;
    clear: right;
    width: 9rem;
    margin: var(--spacing-0) -10rem var(--spacing-12) var(--spacing-8);
    font-size: var(--font-size-12);
    line-height: 1.4;
    color: var(--color-gray-500);

    & sup {
      color: var(--color-teal-700);
      font-weight: var(--font-weight-600);
      margin-right: var(--spacing-2);
    }

    & a {
      color: var(--color-teal-700);
      word-break: break-all;

      &:hover { color: var(--color-teal-900); }
    }
  }
  .dark .sidenote { color: var(--color-gray-400); }
  .dark .sidenote sup,
  .dark .sidenote a { color: var(--color-teal-400); }
  .dark .sidenote a:hover { color: var(--color-teal-300); }

  .sidenote-annotation {
    display: block;
    margin-top: var(--spacing-2);
    color: var(--color-gray-500);
  }
  .dark .sidenote-annotation { color: var(--color-gray-400); }
}

/* --- provisional/utilities/turbo-frame.css --- */
/* utilities/_turbo-frame.css — Dim turbo-frame contents while loading.
 *
 * Targets the framework's own attribute selector, not a utility class.
 * Loaded last to override any per-frame styling on the dimmed state.
 */
turbo-frame[busy] {
  opacity: 0.4;
  pointer-events: none;
  transition: opacity 0.15s ease-out;
}
