/* Token Harvester: design tokens harvested from templates/ and static/. Every value below was a raw literal in
   the site; the rewrite replaced those literals with var(--token). Change a value here and every use follows.
   Loaded on every page (before _ui_v2_head.html so the reviewer theme can still override). */
:root {
  --mnm-bg: #f8fafc;
  --mnm-bg-2: #f1f5f9;
  /* Dev pick 10 (2026-10-01, Joseph, /start's services section: "white background, replace with
     what we use for masonery page") -> PKS-4 (2026-10-01 7:51 PM, Joseph: "No, I meant /summer's
     look instead"). /summer has no season override of its own for --mnm-bg -- its services section
     already sits on this plain base tone, unmoved from the value right above -- so this token just
     pins that tone on /start's services section regardless of the page's actual current-season
     look, the same way the chimney-pointed token it replaces (--mnm-bg-masonry) used to. */
  --mnm-bg-summer: #f8fafc;
  --mnm-bg-3: rgba(0,0,0,.22);
  --mnm-bg-black: rgba(0,0,0,.32);
  --mnm-bg-black-2: rgba(0,0,0,0.45);
  --mnm-bg-black-3: rgba(0,0,0,.55);
  --mnm-bg-black-4: rgba(0,0,0,.7);
  --mnm-bg-black-5: rgba(0,0,0,.88);
  --mnm-bg-black-6: rgba(0,0,0,0.92);
  --mnm-bg-black-7: rgba(0,0,0,0.94);
  --mnm-bg-blue: rgba(37,99,235,0.18);
  --mnm-bg-blue-dark: rgba(30,58,138,0.55);
  --mnm-bg-cyan: var(--mnm-ink-cyan);
  --mnm-bg-cyan-line: #0891b2;
  --mnm-bg-cyan-pale: #ecfeff;
  --mnm-bg-cyan-pale-2: #ccfbf1;
  --mnm-bg-cyan-pale-2-b: #cffafe;
  --mnm-bg-cyan-pale-b: #f0fdfa;
  --mnm-bg-cyan-text: var(--mnm-ink-cyan);
  --mnm-bg-green: #047857;
  --mnm-bg-green-2: rgba(22,163,74,0.15);
  --mnm-bg-green-b: #0f766e;
  --mnm-bg-green-fill: #047857;
  --mnm-bg-orange: rgba(161,98,7,0.22);
  --mnm-bg-orange-2: rgba(249,115,22,0.12);
  --mnm-bg-orange-dark: rgba(120,53,15,0.22);
  --mnm-bg-orange-light: rgba(251,191,36,.08);
  --mnm-bg-orange-pale: #fed7aa;
  --mnm-bg-pink-pale: #fce7f3;
  --mnm-bg-red: rgba(220,38,38,0.15);
  --mnm-bg-red-2: #c0392b;
  --mnm-bg-red-3: rgba(185,28,28,0.10);
  --mnm-bg-slate-dark: rgba(15,23,42,.55);
  --mnm-bg-slate-dark-10: rgba(15,23,42,0.8);
  --mnm-bg-slate-dark-11: rgba(15,23,42,.9);
  --mnm-bg-slate-dark-12: rgba(15,23,42,.92);
  --mnm-bg-slate-dark-2: rgba(15,23,42,.78);
  --mnm-bg-slate-dark-3: rgba(15,23,42,.88);
  --mnm-bg-slate-dark-4: rgba(15,23,42,0.96);
  --mnm-bg-slate-dark-5: #020617;
  --mnm-bg-slate-dark-6: rgba(15,23,42,.18);
  --mnm-bg-slate-dark-7: rgba(15,23,42,0.7);
  --mnm-bg-slate-dark-8: rgba(15,23,42,0.85);
  --mnm-bg-slate-dark-9: rgba(15,23,42,.62);
  --mnm-bg-slate-pale: rgba(238,242,255,0.97);
  --mnm-bg-violet: #a855f7;
  --mnm-bg-violet-2: #9333ea;
  --mnm-bg-violet-pale: #ede9fe;
  --mnm-bg-violet-pale-b: #faf5ff;
  --mnm-bg-violet-pale-c: #e0e7ff;
  --mnm-bg-violet-pale-d: #f5f3ff;
  --mnm-bg-violet-pale-e: #f3e8ff;
  --mnm-bg-white: rgba(255,255,255,0.1);
  --mnm-bg-white-10: rgba(255,255,255,.2);
  --mnm-bg-white-11: rgba(255,255,255,0.97);
  --mnm-bg-white-2: rgba(255,255,255,0.18);
  --mnm-bg-white-3: rgba(255,255,255,0.04);
  --mnm-bg-white-4: rgba(255,255,255,0.15);
  --mnm-bg-white-5: rgba(255,255,255,0.98);
  --mnm-bg-white-6: rgba(255,255,255,0.05);
  --mnm-bg-white-7: rgba(255,255,255,.25);
  --mnm-bg-white-8: rgba(255,255,255,.92);
  --mnm-bg-white-9: rgba(255,255,255,0.06);
  --mnm-brand: var(--mnm-brand-3);
  --mnm-brand-2: #b91c1c;
  --mnm-brand-2-fill: #b91c1c;
  --mnm-brand-3: #1d4ed8;
  --mnm-brand-3-fill: #1d4ed8;
  --mnm-brand-4: rgba(220,38,38,0.4);
  --mnm-brand-5: rgba(220,38,38,0.5);
  --mnm-brand-6: #60a5fa;
  --mnm-brand-7: rgba(255,255,255,0.8);
  --mnm-brand-fill: #2563eb;
  --mnm-brand-ink: #ffffff;
  --mnm-brand-line: #2563eb;
  --mnm-danger: var(--mnm-brand-2);
  /* SG-4 (Joseph, 2026-09-23): 'Brick average for accents, red only for alerts.' The customer pages' accent (buttons,
     tiles, icons, links, the active step) is its own role; --mnm-danger stays red for alerts only. Each season /
     design sets its own accent: summer = brick average (= materials.css --mat-brick-avg), main page = copper
     (design_blueprint.css), winter = deep brass (season_winter.css), chimney = silver (season_chimney.css). */
  --mnm-accent: #823f34;   /* P18: was #9c4c3e (the brick average, 5.7:1 on --mnm-bg); darker brick for 7:1 under its small labels and action lines (7.4:1 on --mnm-bg, white on it 7.8:1) */
  --mnm-accent-soft: #f5ebe9;
  --mnm-accent-soft-2: #efdfdb;
  --mnm-accent-line: #d7b7b0;
  --mnm-accent-on-dark: #dd9280;   /* SG-4: the accent on dark grounds (hero word, dark-section labels/icons): a light brick, 7.2:1 on navy */
  --mnm-danger-10: rgba(0,0,0,0.6);
  --mnm-danger-11: #ef4444;
  --mnm-danger-12: #450a0a;
  --mnm-danger-12-b: #451a03;
  --mnm-danger-13: rgba(239,68,68,0.15);
  --mnm-danger-14: rgba(239,68,68,0.4);
  --mnm-danger-2: #991b1b;
  --mnm-danger-3: #fef2f2;
  --mnm-danger-3-b: #fee2e2;
  --mnm-danger-4: #fca5a5;
  --mnm-danger-4-text: #fca5a5;
  --mnm-danger-5: #fecaca;
  --mnm-danger-6: #8c7002;
  --mnm-danger-6-fill: #fde68a;
  --mnm-danger-6-fill-b: #ffe066;
  --mnm-danger-7: #7c2d12;
  --mnm-danger-7-b: #78350f;
  --mnm-danger-7-c: #7f1d1d;
  --mnm-danger-7-fill-c: #7f1d1d;
  --mnm-danger-8: #14532d;
  --mnm-danger-9: #1e3a5f;
  --mnm-faint: #94a3b8;
  --mnm-font: -apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  --mnm-font-mono: monospace;
  --mnm-fs-0_5em: 0.5em;
  --mnm-fs-0_75rem: 0.75rem;
  --mnm-fs-0_7rem: 0.7rem;
  --mnm-fs-0_7rem-b: 0.72rem;
  --mnm-fs-0_7rem-c: .65rem;
  --mnm-fs-0_8rem: 0.8rem;
  --mnm-fs-0_8rem-b: .85rem;
  --mnm-fs-0_8rem-c: 0.82rem;
  --mnm-fs-10pt: 10pt;
  --mnm-fs-10pt-b: 10.5pt;
  --mnm-fs-10px: 10px;
  --mnm-fs-10px-b: 9.5px;
  --mnm-fs-11pt: 11pt;
  --mnm-fs-11pt-b: 11.5pt;
  --mnm-fs-12pt: 12pt;
  --mnm-fs-12px: 12px;
  --mnm-fs-12px-b: 11.5px;
  --mnm-fs-13pt: 13pt;
  --mnm-fs-14pt: 14pt;
  --mnm-fs-14px: 14px;
  --mnm-fs-14px-b: 14.5px;
  --mnm-fs-16px: 16px;
  --mnm-fs-17px: 17px;
  --mnm-fs-18pt: 18pt;
  --mnm-fs-19px: 19px;
  --mnm-fs-20pt: 20pt;
  --mnm-fs-20px: 20px;
  --mnm-fs-21px: 21px;
  --mnm-fs-22pt: 22pt;
  --mnm-fs-24px: 24px;
  --mnm-fs-26pt: 26pt;
  --mnm-fs-26px: 26px;
  --mnm-fs-28px: 28px;
  --mnm-fs-30px: 30px;
  --mnm-fs-32px: 32px;
  --mnm-fs-36px: 36px;
  --mnm-fs-38px: 38px;
  --mnm-fs-40px: 40px;
  --mnm-fs-42px: 42px;
  --mnm-fs-44px: 44px;
  --mnm-fs-48px: 48px;
  --mnm-fs-54px: 54px;
  --mnm-fs-64px: 64px;
  --mnm-fs-7px: 7px;
  --mnm-fs-8pt: 8pt;
  --mnm-fs-8px: 8px;
  --mnm-fs-9pt: 9pt;
  --mnm-fs-9pt-b: 9.5pt;
  --mnm-fs-9pt-c: 8.5pt;
  --mnm-fs-9px: 9px;
  --mnm-fs-lg: 18px;
  --mnm-fs-md: 15px;
  --mnm-fs-sm: 13px;
  --mnm-fs-sm-b: 12.5px;
  --mnm-fs-sm-c: 13.5px;
  --mnm-fs-xl: 22px;
  --mnm-fs-xs: 11px;
  --mnm-fs-xs-b: 10.5px;
  --mnm-info: #0ea5e9;
  --mnm-map-trace: #ff4444;   /* report 111: the customer's red trace on the quote map (the value quote.js always used) */
  --mnm-map-pick: #ffd400;    /* report 125: the building the customer selected on the quote map (highlight) */
  --mnm-map-outline: #ffffff; /* report 125: the other selectable building outlines (faint, over the aerial) */
  --mnm-map-ref: #94a3b8;     /* report 139: the house kept for reference on a service that does not measure it (greyed) */
  --mnm-map-cut: #22d3ee;     /* report 139: a cut line and the other piece(s) of an outline cut in two */
  --mnm-map-bar: rgba(15,23,42,.82);   /* report 155 (crisp look): the dark tool pills and captions over the map */
  /* report 146: the map lab's layers (/map-lab, test site only). Heights h1-h7 match tools/maplab_build.py HEIGHT_BANDS. */
  --mnm-lab-h1: #440154;  --mnm-lab-h2: #443983;  --mnm-lab-h3: #31688e;  --mnm-lab-h4: #21918c;
  --mnm-lab-h5: #35b779;  --mnm-lab-h6: #90d743;  --mnm-lab-h7: #fde725;
  --mnm-lab-roof: #f97316;       /* LiDAR roof cells (maplab_build.py ROOF_RGB) */
  --mnm-lab-tree: #16a34a;       /* LiDAR tree cells (maplab_build.py TREE_RGB) */
  --mnm-lab-offset: #f43f5e;     /* offset arrows */
  --mnm-lab-moved: #a3e635;      /* Microsoft outlines moved by the offset */
  --mnm-lab-osm: #60a5fa;        /* OpenStreetMap outlines */
  --mnm-lab-sq: #f472b6;         /* LiDAR roofs squared */
  --mnm-lab-jag: #fb923c;        /* LiDAR roofs as cells */
  --mnm-lab-pin: #c084fc;        /* LiDAR-only pin outlines */
  --mnm-lab-split-ml: #e11d48;   /* split: multi-level (report 140) */
  --mnm-lab-split-cur: #8b5cf6;  /* split: report 130's detector */
  --mnm-lab-cut: #0ea5e9;        /* "two buildings" LiDAR gap cut */
  --mnm-lab-neck: #14b8a6;       /* "two buildings" narrow-join cut */
  --mnm-lab-shape: #f59e0b;      /* shape signal, strong */
  --mnm-lab-shape-weak: #fde68a; /* shape signal, weak */
  --mnm-lab-tile-on: #22c55e;    /* LiDAR tile loaded */
  --mnm-lab-tile-off: #94a3b8;   /* LiDAR tile listed, not loaded */
  --mnm-lab-sv: #ffd400;         /* Street View camera and its view line */
  --mnm-ink: #0f172a;
  --mnm-ink-2: #1e293b;
  --mnm-ink-2-b: #172033;
  --mnm-ink-2-c: #253047;
  --mnm-ink-3: #000000;
  --mnm-ink-3-line: #000000;
  --mnm-ink-4: #111111;
  --mnm-ink-5: var(--mnm-danger-11);
  --mnm-ink-6: #0c4a6e;
  --mnm-ink-blue: #4338ca;
  --mnm-ink-blue-2: #0369a1;
  --mnm-ink-blue-3: var(--mnm-muted-2);
  --mnm-ink-blue-4: var(--mnm-brand-3);
  --mnm-ink-blue-5: #4f46e5;
  --mnm-ink-blue-dark: #1e3a8a;
  --mnm-ink-blue-dark-2: #3730a3;
  --mnm-ink-blue-light: #38bdf8;
  --mnm-ink-cyan: #0e7490;
  --mnm-ink-cyan-dark: #134e4a;
  --mnm-ink-green: var(--mnm-bg-green-b);
  --mnm-ink-grey: #777777;
  --mnm-ink-grey-2: #888888;
  --mnm-ink-orange: #a16207;
  --mnm-ink-red: #9d174d;
  --mnm-ink-red-b: #9f1239;
  --mnm-ink-violet: #7c3aed;
  --mnm-ink-violet-2: #6d28d9;
  --mnm-ink-violet-3: #a78bfa;
  --mnm-ink-violet-dark: #6b21a8;
  --mnm-ink-violet-fill: #7c3aed;
  --mnm-ink-violet-line: #7c3aed;
  --mnm-ink-white: rgba(255,255,255,0.75);
  --mnm-ink-white-2: rgba(255,255,255,0.7);
  --mnm-line: #e2e8f0;
  --mnm-line-2: #cbd5e1;
  --mnm-line-2-b: #bfdbfe;
  --mnm-line-2-c: #d0d7de;
  --mnm-line-2-text: #cbd5e1;
  --mnm-line-3: #444444;
  --mnm-line-4: #666666;
  --mnm-line-5: #cccccc;
  --mnm-line-6: #999999;
  --mnm-line-7: #aaaaaa;
  --mnm-line-b: #dbeafe;
  --mnm-line-blue-light: #c7d2fe;
  --mnm-line-blue-light-2: #7dd3fc;
  --mnm-line-blue-light-b: #ddd6fe;
  --mnm-line-blue-light-c: #c7d7f7;
  --mnm-line-blue-pale: #bae6fd;
  --mnm-line-c: #e3f0fb;
  --mnm-line-cyan: var(--mnm-bg-green-b);
  --mnm-line-cyan-pale: #99f6e4;
  --mnm-line-grey-light: #eef2f6;
  --mnm-line-grey-light-2: #dddddd;
  --mnm-line-grey-light-c: #e8e8e8;
  --mnm-line-grey-light-d: #eeeeee;
  --mnm-line-grey-light-fill-b: #f0f4f8;
  --mnm-line-grey-light-fill-e: #eef0f3;
  --mnm-line-grey-light-fill-f: #eef2f7;
  --mnm-line-orange: #78716c;
  --mnm-line-orange-2: #f97316;
  --mnm-line-orange-light: #fbbf24;
  --mnm-line-red: var(--mnm-warning-7);
  --mnm-line-red-2: #db2777;
  --mnm-line-red-3: rgba(220,38,38,0.3);
  --mnm-line-red-4: rgba(248,113,113,0.25);
  --mnm-line-red-5: rgba(248,113,113,0.35);
  --mnm-line-red-6: rgba(248,113,113,0.5);
  --mnm-line-slate-dark: rgba(15,23,42,.32);
  --mnm-line-violet: #8b5cf6;
  --mnm-line-violet-light: #c4b5fd;
  --mnm-line-violet-pale: #e9d5ff;
  --mnm-line-white: rgba(255,255,255,0.08);
  --mnm-line-white-2: rgba(255,255,255,0.12);
  --mnm-line-yellow-light: #eab308;
  /* P18 (report 93): small text (under 14 px) needs 7:1. #64748b gave 4.8:1 on white and #475569 6.9:1 on --mnm-bg-2,
     so both greys on light grounds are now one value that clears 7:1 on white, --mnm-bg and --mnm-bg-2 (7.8 / 7.5 /
     7.1). This is CF-4's held "--mnm-muted -> muted-2" (23 Sept): the dark-ground uses that held it now take the
     -ondark set below by rule (hero sub-lines, footer, careers hero). Was: muted #64748b, muted-2 #475569. */
  --mnm-muted: var(--mnm-muted-2);
  --mnm-muted-2: #455367;

  /* ---- ON-DARK COUNTERPARTS -------------------------------------------------
     Joseph, 2026-09-21, granting this: "You have permission to change tokens and
     add dark/light versions as needed."

     The greys above are tuned for text on a LIGHT card. Several of them are also
     used as text on a DARK band -- .hiring-section has a navy gradient and sets
     colour inline from --mnm-muted-2 -- and one value cannot clear 4.5:1 against
     both a near-white and a near-black ground. It is not a close call: it is
     arithmetically impossible.

     This was found four separate times in one afternoon: once by me on the
     chimney hero badge, and once each by all three main-page design concepts,
     which all had to patch around it locally. So the fix belongs here, in the
     token set, rather than in each theme.

     Use the -ondark value wherever the text sits on navy, soot or ink. Contrast
     against --mnm-navy #0f172a: muted-ondark 7.4:1, muted-2-ondark 9.6:1,
     faint-ondark 5.9:1, text-ondark 11.2:1.
     -------------------------------------------------------------------------- */
  --mnm-muted-ondark:   #94a3b8;
  --mnm-muted-2-ondark: #cbd5e1;
  --mnm-faint-ondark:   #7d93ab;
  --mnm-text-ondark:    #e2e8f0;

  /* ---- SITE FOOTER (P18, report 93) ------------------------------------------
     One footer on every customer page (templates/_footer.html). Its text is 11-13 px, so every pair below
     clears 7:1, not 4.5:1 (Joseph, 2026-09-24: "especially since the text is so small you probably want to bump
     the limit there"). DARK tone = the landing pages' footer; LIGHT tone = pages whose own ground is light
     (quote, legal, estimate, portal, careers). season_winter.css, season_chimney.css and design_blueprint.css
     re-point these; no rule ever names a colour for the footer. Summer ratios, measured on the page:
     dark text 7.9:1, link 13.6:1 on #020617; light text 7.2:1, link 10.3:1 on #f8fafc. */
  --mnm-footer-dark-bg:     var(--mnm-bg-slate-dark-5);
  --mnm-footer-dark-text:   var(--mnm-muted-ondark);
  --mnm-footer-dark-link:   var(--mnm-muted-2-ondark);
  --mnm-footer-dark-strong: var(--mnm-text-ondark);
  --mnm-footer-dark-hover:  var(--mnm-brand-ink);
  --mnm-footer-light-bg:     var(--mnm-bg);
  --mnm-footer-light-text:   var(--mnm-muted-2);
  --mnm-footer-light-link:   var(--mnm-text);
  --mnm-footer-light-strong: var(--mnm-ink);
  --mnm-footer-light-hover:  var(--mnm-ink);
  --mnm-footer-light-line:   var(--mnm-line);
  --mnm-muted-3: #374151;
  --mnm-bg-grey-mid: #4b5563;   /* the 404 page's medium-dark grey (Joseph 2026-10-01: "the background should be a medium darkness grey") */
  --mnm-muted-4: #eff6ff;
  --mnm-muted-4-b: #e0f2fe;
  --mnm-muted-4-c: #f0f9ff;
  --mnm-muted-4-d: #eef2ff;
  --mnm-muted-4-e: #f0f4ff;
  --mnm-muted-4-f: #f0f7ff;
  --mnm-muted-5: #1e40af;
  --mnm-muted-6: #555555;
  --mnm-muted-6-b: #57534e;
  --mnm-muted-7: rgba(255,255,255,0.85);
  --mnm-muted-8: #93c5fd;
  --mnm-muted-9: rgba(255,255,255,.65);
  --mnm-navy: #0f172a;
  --mnm-navy-b: #0b1220;
  /* Radius re-judge (2026-09-23): every one of these value-named tokens that had NO remaining reference
     anywhere in templates/ or static/ once the role rewrite below landed was removed outright (19 names:
     -0px, -100px, -11px, -14px, -16px, -18px, -2px, -5px, -7px, -9px, -bottom-10/12/14, -left-8, -right-8,
     -top-10/12/14/18 -- checked with `git grep -c` on this commit, zero hits each). The names below are KEPT
     because something still reads them: bare --mnm-radius and --mnm-radius-sm by the /ui/v2 reviewer theme
     (static/v2/*.css, out of scope for this family -- a separate, staff-only theme); -10px/-20px/-3px/-4px/
     -6px by a Bootstrap-table component or a print-only template (both left alone by roles.py on purpose,
     see tools/families/radius/roles.py's TABLE_BOOTSTRAP_RE and this family's NC-4 print exclusion); -50 by
     every corner roles.classify() correctly declined to guess is a circle (no avatar/round/dot/swatch word in
     its selector -- "may be a deliberate ellipse on a non-square box", roles.py's own words) plus the one
     main-page chat-launcher escape that must stay literal (static/materials.css); -pill is kept under its own
     name because it already equals the pill ROLE's own canonical value (999px) -- one name now doing both
     jobs, not a duplicate token. */
  --mnm-radius: 12px;
  --mnm-radius-10px: 10px;
  --mnm-radius-20px: 20px;
  --mnm-radius-3px: 3px;
  --mnm-radius-4px: 4px;
  --mnm-radius-50: 50%;
  --mnm-radius-6px: 6px;
  --mnm-radius-pill: 999px;
  --mnm-radius-sm: 8px;

  /* ===== BEGIN radius roles (re-judged 2026-09-23, Joseph's answer to radius_token_layer_choice: "swap to
     the role-named layer"). What job a corner does, not what number it happens to be. See
     tools/families/radius/ (scan.py resolves the value layer below to these; roles.py classifies by
     selector context; judge.py/apply.py plan and splice the rewrite) and docs/STYLE_GUIDE.md section 5.1.
     --mnm-radius-pill already existed above with this exact value -- kept as one name, now doing both jobs,
     not duplicated. --mnm-radius-full is never repointed by design_blueprint.css's "square the corners"
     block: it draws true circles (avatars, dots), which stay round even on the main page. ===== */
  --mnm-radius-0: 0;             /* zero -- square by intent: table cells, full-bleed strips */
  --mnm-radius-small: 4px;       /* small markers: dots, keycaps, compact badges/tags, small thumbnails */
  --mnm-radius-control: 8px;     /* every control: button, input, select, textarea, summary row */
  --mnm-radius-container: 12px;  /* every container: card, panel, modal, sheet, banner, bubble */
  --mnm-radius-full: 50%;        /* a circle: avatar, dot, round icon button (selector says so, not just the value) */
  /* ===== END radius roles ===== */

  --mnm-shade-black: rgba(0,0,0,.07);
  --mnm-shade-black-10: rgba(0,0,0,.05);
  --mnm-shade-black-11: rgba(0,0,0,0.03);
  --mnm-shade-black-12: rgba(0,0,0,.18);
  --mnm-shade-black-13: rgba(0,0,0,.35);
  --mnm-shade-black-14: rgba(0,0,0,0.5);
  --mnm-shade-black-15: rgba(0,0,0,.12);
  --mnm-shade-black-16: rgba(0,0,0,.28);
  --mnm-shade-black-2: rgba(0,0,0,0.3);
  --mnm-shade-black-3: rgba(0,0,0,.25);
  --mnm-shade-black-4: rgba(0,0,0,0.08);
  --mnm-shade-black-5: rgba(0,0,0,.1);
  --mnm-shade-black-6: rgba(0,0,0,0.04);
  --mnm-shade-black-7: rgba(0,0,0,.4);
  --mnm-shade-black-8: rgba(0,0,0,0.15);
  --mnm-shade-black-9: rgba(0,0,0,0.2);
  --mnm-shade-blue: rgba(37,99,235,0.15);
  --mnm-shade-blue-10: rgba(67,56,202,0.28);
  --mnm-shade-blue-2: rgba(37,99,235,.12);
  --mnm-shade-blue-3: rgba(67,56,202,0.3);
  --mnm-shade-blue-4: rgba(59,130,246,0.12);
  --mnm-shade-blue-5: rgba(29,78,216,.15);
  --mnm-shade-blue-6: rgba(37,99,235,.1);
  --mnm-shade-blue-7: rgba(59,130,246,.15);
  --mnm-shade-blue-8: rgba(59,130,246,0.25);
  --mnm-shade-blue-9: rgba(67,56,202,0.18);
  --mnm-shade-green: rgba(22,163,74,.25);
  --mnm-shade-green-2: rgba(21,128,61,.35);
  --mnm-shade-green-3: rgba(22,163,74,.22);
  --mnm-shade-green-4: rgba(22,163,74,.4);
  --mnm-shade-green-dark: rgba(6,95,70,0.25);
  --mnm-shade-red: rgba(192,57,43,0.1);
  --mnm-shade-red-2: rgba(220,38,38,0.1);
  --mnm-shade-red-3: rgba(220,38,38,.2);
  --mnm-shade-red-4: rgba(220,38,38,0.6);
  --mnm-shade-slate-dark: rgba(15,23,42,.04);
  --mnm-shade-slate-dark-2: rgba(15,23,42,.10);
  --mnm-shade-slate-dark-3: rgba(16,32,46,.05);
  --mnm-shade-violet: rgba(124,58,237,0.18);
  --mnm-shadow-lg: 0 2px 12px var(--mnm-shade-black-5);
  --mnm-shadow-md: 0 1px 6px var(--mnm-shade-black);
  --mnm-shadow-sm: 0 1px 4px var(--mnm-warning-4);
  --mnm-success: var(--mnm-success-2);
  --mnm-success-2: #15803d;
  --mnm-success-2-fill: #15803d;
  --mnm-success-3: #166534;
  --mnm-success-3-b: #065f46;
  --mnm-success-4: #f0fdf4;
  --mnm-success-4-b: #dcfce7;
  --mnm-success-4-c: #ecfdf5;
  --mnm-success-5: #22c55e;
  --mnm-success-6: #bbf7d0;
  --mnm-success-6-b: #d1fae5;
  --mnm-success-6-text: #bbf7d0;
  --mnm-success-6-text-b: #d1fae5;
  --mnm-success-6-text-c: #a7f3d0;
  --mnm-success-7: #86efac;
  --mnm-success-8: rgba(34,197,94,0.15);
  --mnm-success-9: rgba(34,197,94,0.4);
  --mnm-success-fill: var(--mnm-success-2);
  --mnm-success-line: #16a34a;
  /* report 160 (EL-8b, the ONE new token this pass adds): the translucent white line-items panel inside the
     quote flow's green "Your Rough Estimate" card (quote.js, buildReview()) -- nothing existing is both
     white and this translucent (closest, --mnm-bg-white-7, is rgba(255,255,255,.25); --mnm-bg-white-8 is
     rgba(255,255,255,.92)), so this formalises the exact value quote.js already used as a literal. */
  --mnm-success-overlay: rgba(255,255,255,.6);
  --mnm-surface: #ffffff;
  --mnm-surface-d: #fafbfc;
  --mnm-surface-e: #f8f8f8;
  --mnm-surface-f: #f8faff;
  --mnm-surface-g: #fafafa;
  --mnm-surface-h: #f9fafb;
  --mnm-surface-i: #fcfdff;
  --mnm-surface-j: #fff7f6;
  --mnm-text: #334155;
  --mnm-unspecified-navy: #0f172a;
  --mnm-unspecified-red: #dc2626;
  --mnm-warning: #f59e0b;
  --mnm-warning-2: #92400e;
  --mnm-warning-2-b: #854d0e;
  --mnm-warning-2-c: #9a3412;
  --mnm-warning-3: #fef3c7;
  --mnm-warning-3-b: #fef9c3;
  --mnm-warning-4: rgba(0,0,0,.06);
  --mnm-warning-5: #fcd34d;
  --mnm-warning-5-b: #fde047;
  --mnm-warning-5-c: #ffd700;
  --mnm-warning-6: #3b82f6;
  --mnm-warning-6-text: #3b82f6;
  --mnm-warning-7: #b45309;
  --mnm-warning-7-line: #b45309;
  --mnm-warning-8: #fffbeb;
  --mnm-warning-8-b: #fff7ed;
  --mnm-warning-8-c: #fefce8;
  --mnm-warning-9: var(--mnm-warning-7);
  --mnm-warning-b: #f0a500;
  --mnm-warning-fill: #f59e0b;
  --mnm-warning-text: #f59e0b;

  /* P20 (report 96): the availability calendar's "winter services" day marker (was "off-season", a
     grey diagonal stripe -- Joseph 2026-09-24 wanted it renamed and "slightly winter-themed", not a
     second theme). An icy blue-white tint plus a faint frost/snowflake pattern (SVG data-URI using
     currentColor, so no hex lives in that rule); the day number itself stays --mnm-ink for contrast. */
  --mnm-avail-winter-bg: #eaf6fd;
  --mnm-avail-winter-line: #8fc6e6;

  /* Report 137 (P30 build 2): the office's roof-pitch page. One colour per source, drawn over the aerial (cyan and
     violet both stand out on roofs, grass and trees), and report 109's four pitch bands (below 4, 4-6, 7-9, 10-12). */
  --mnm-pitch-lidar: #0891b2;
  --mnm-pitch-solar: #a21caf;
  --mnm-pitch-halo: #ffffff;
  --mnm-pitch-b0: #60a5fa;
  --mnm-pitch-b1: #22c55e;
  --mnm-pitch-b2: #f59e0b;
  --mnm-pitch-b3: #ef4444;
}
